handler-playable-sdk 0.5.26 → 0.5.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CFNCYJKB.js → chunk-EZMANCHN.js} +211 -105
- package/dist/cli/brand-dna.mjs +1 -1
- package/dist/cli/canva-import.mjs +1 -1
- package/dist/cli/cleanup-assets.mjs +1 -1
- package/dist/cli/fix-scales.mjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/screen-helper.mjs +1 -1
- package/dist/cli/setup-library.mjs +1 -1
- package/dist/cli/student-helper.mjs +1 -1
- package/dist/cli/sync-screens.mjs +1 -1
- package/dist/cli/validate-assets.mjs +1 -1
- package/dist/cli/validate.mjs +1 -1
- package/dist/index.cjs +195 -89
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +13 -13
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +17 -17
- package/dist/three/index.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Ho=Object.create;var Ut=Object.defineProperty;var No=Object.getOwnPropertyDescriptor;var Fo=Object.getOwnPropertyNames;var Bo=Object.getPrototypeOf,Uo=Object.prototype.hasOwnProperty;var de=(a,e)=>()=>(a&&(e=a(a=0)),e);var ht=(a,e)=>{for(var t in e)Ut(a,t,{get:e[t],enumerable:!0})},Ma=(a,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fo(e))!Uo.call(a,n)&&n!==t&&Ut(a,n,{get:()=>e[n],enumerable:!(i=No(e,n))||i.enumerable});return a};var qe=(a,e,t)=>(t=a!=null?Ho(Bo(a)):{},Ma(e||!a||!a.__esModule?Ut(t,"default",{value:a,enumerable:!0}):t,a)),Go=a=>Ma(Ut({},"__esModule",{value:!0}),a);var pe,un=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Zo(){var a,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(a=document.querySelector("script"))==null?void 0:a.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function Qo(){try{if(typeof window!="undefined"){let a=await fetch("./build-settings.json");if(a.ok){let e=await a.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function es(){try{if(typeof window!="undefined"){let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function ts(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ue).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ue)),ue;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ue={...window.INLINE_ASSETS},ue;if(!(N==="publish"&&oe!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!gn){let e=typeof window!="undefined"?new URL("inline-assets.js",window.location.href).href:"./inline-assets.js";console.log("[AssetLoader] Loading inline assets from:",e),gn=(async()=>{try{try{let r=await import(e+"?t="+Date.now());if(r.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(r.INLINE_ASSETS)),r.INLINE_ASSETS}catch(r){console.warn("[AssetLoader] ES module import failed, trying text parse:",r)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let r=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await gn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function hn(a){return a===null||typeof a!="object"||(Object.freeze(a),Object.values(a).forEach(e=>hn(e))),a}function is(a=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=a,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,a,e),n.strokeStyle="#000",n.strokeRect(0,0,a,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",a/2,e/2),ge.Texture.from(i)}function fn(a,e){dr.set(a,e)}var ge,lr,cr,Ie,N,oe,Ee,ue,gn,dr,je,Wt=de(()=>{"use strict";ge=require("pixi.js");un();lr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",cr=Zo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=cr?"publish":lr,oe=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(N=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ee=es();Ee!=null&&Ee.buildMode&&(N=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(oe=Ee.assetsInlined);Qo().then(a=>{a!=null&&a.buildMode&&a.buildMode!==N&&(N=a.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(a==null?void 0:a.assetsInlined)!==void 0&&(oe=a.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${lr}, Runtime: ${cr?"publish":"dev"}, Effective: ${N}`);ue={},gn=null;dr=new Map;je=class{static async load(e,t,i,n){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${N}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await ts(),l=s[e];if(!l&&n&&(l=s[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),N==="publish"&&oe!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=dr.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}try{let d;switch(t.type){case"image":d=await this.loadImage(t.path,l);break;case"json":d=await this.loadJSON(t.path,l),d=hn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(N==="dev"){let r=t==="image"?is():hn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};fn("image",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ge.Assets.load(e)}let o=a;return(n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),ge.Assets.load(e||o)});fn("json",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=a;if((n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let s=await fetch(o);if(!s.ok)throw new Error(`JSON fetch failed: ${a}`);return s.json()})});var ur={};ht(ur,{AssetTextures:()=>se,initAssetTextures:()=>yn});function yn(a,e){pr.init(a,e),typeof window!="undefined"&&(window.__AssetTextures=se)}var bn,pr,se,Ke=de(()=>{"use strict";Wt();bn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var o;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let h=await je.load(s,c,t,u);this.textures.set(s,h),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?n.push(p()):r.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let r=()=>n.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},pr=new bn,se=new Proxy(pr,{get(a,e){return e in a&&typeof a[e]=="function"?a[e].bind(a):a.get(e)},set(a,e,t){return a.set(e,t),!0}})});var Xe={};ht(Xe,{applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>te,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,deepClone:()=>G,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Et,getOverrideMode:()=>xt,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setOverrideMode:()=>En});function ii(){return typeof window=="undefined"?null:window.__editableConfig||null}function vr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function br(a,e){var t,i;if(!a)return null;try{if(a instanceof Map)return(t=a.get(e))!=null?t:null;if(typeof a=="object")return(i=a[e])!=null?i:null}catch{}return null}function ks(a,e,t){if(a){if(a instanceof Map){a.set(e,t);return}typeof a=="object"&&(a[e]=t)}}function wr(a,e){for(let t of e)wt(a,t.path,t.value)}function xr(a){var s;if(typeof window=="undefined")return;let e=ii();if(!e)return;let t=vr(),i=(s=t?br(t.objects,a):null)!=null?s:br(e.objects,a);if(!i)return;let n=G(i),r=Y().filter(l=>l.objectId===a);try{wr(n,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",a,l);return}ks(e.objects,a,n);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(a,n)}catch{}}function Ps(){var n;if(typeof window=="undefined")return;let a=ii();if(!(a!=null&&a.engine))return;let e=vr(),t=G(((n=e==null?void 0:e.engine)!=null?n:a.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{wr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=a.engine;for(let o of Object.keys(r))o in t||delete r[o];for(let[o,s]of Object.entries(t))r[o]=s}catch{a.engine=t}}function _s(){if(typeof window=="undefined")return"unknown";let a=window;return typeof a.__HANDLER_PROJECT_ID=="string"?a.__HANDLER_PROJECT_ID:"handler-default"}function Er(){return`handler_preview_config_overrides::${_s()}`}function Ms(){if(typeof window=="undefined")return[];try{let a=window.localStorage.getItem(Er());if(!a)return[];let e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}}function ni(a){if(typeof window!="undefined")try{window.localStorage.setItem(Er(),JSON.stringify(a))}catch{}}function xt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function En(a){if(typeof window!="undefined"){window.__enableConfigOverrides=a;try{window.localStorage.setItem(Sr,a?"true":"false")}catch{}}}function Ae(a,e={}){var u,h;let{objectId:t,path:i,value:n}=a,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ii();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(h=(u=l.objects)==null?void 0:u.get)==null?void 0:h.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=Is(c,i),wt(c,i,n)}catch(f){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},f);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),d.length>Os&&d.shift(),o){let f=Y(),g=f.findIndex(m=>m.objectId===t&&m.sceneId===a.sceneId&&m.path===i);g>=0?f[g].value=n:f.push(a),window.__configOverrides=f,ni(f),xt()||En(!0)}r||console.log("[CONFIG] Applied override:",a),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:a}))}function Ce(a,e={}){let t=e.emitEvent!==!1,i=[];for(let n of a)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Ae(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:a.length}}))}}function te(){window.__configOverrides=[],window.__configChanges=[],ni([]),console.log("[CONFIG] Cleared all overrides")}function Ar(a){let e=Y().filter(i=>i.objectId!==a);window.__configOverrides=e,ni(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==a),xr(a),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:a}}))}function ai(a,e){let t=Y().filter(n=>n.objectId!==a||n.path!==e);window.__configOverrides=t,ni(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==a||n.path!==e),a?xr(a):Ps(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:a,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Ms()),window.__configOverrides||[])}function wt(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i){if(r[s]!==void 0&&typeof r[s]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${s})`);r[s]=(o=r[s])!=null?o:{},r=r[s]}r[n]=t}function Is(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function G(a){if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(a instanceof Set)return new Set([...a].map(t=>G(t)));if(ArrayBuffer.isView(a))return a.slice();if(a instanceof Array)return a.map(t=>G(t));if(a instanceof Map){let t=new Map;return a.forEach((i,n)=>t.set(n,G(i))),t}let e={};for(let t in a)Object.prototype.hasOwnProperty.call(a,t)&&(e[t]=G(a[t]));return e}function ze(){let a=window.__editableConfigBaseline;if(!a){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return yr(e)}return yr(a)}function yr(a){let e={objects:{},scenes:{},engine:G(a.engine||{})},t=a.objects;if(t instanceof Map)t.forEach((r,o)=>{e.objects[o]=G(r)});else if(t&&typeof t=="object")for(let r in t)e.objects[r]=G(t[r]);let i=a.scenes;if(i instanceof Map)i.forEach((r,o)=>{e.scenes[o]=G(r)});else if(i&&typeof i=="object")for(let r in i)e.scenes[r]=G(i[r]);let n=Y();for(let r of n)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),wt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),wt(e.scenes[r.sceneId],r.path,r.value)):wt(e.engine,r.path,r.value);return e}function Et(){let a=Y(),e=new Set;for(let t of a)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:a.length,hasChanges:a.length>0,overrides:a}}async function ri(a){let e=ze(),t={};for(let[n,r]of Object.entries(e.objects)){let o=r,s=n;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${n}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,r]of Object.entries(e.scenes)){let o=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:a})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}te();try{let n=ii();n&&(window.__editableConfigBaseline=G(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function St(){te(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}te(),window.location.reload()}var Sr,Os,Cr,K=de(()=>{"use strict";Sr="handler_preview_override_mode";if(typeof window!="undefined"){let a=window.localStorage.getItem(Sr);window.__enableConfigOverrides=a===null?!0:a==="true"}Os=500;Cr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function js(a,e){try{if(typeof a=="object"&&a!==null)return a;if(typeof a!="string")return null;if(a.startsWith("data:")){let i=a.indexOf(",");if(i===-1)return null;let n=a.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let r=a.slice(i+1),o=n.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=a.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(a):null}catch{return null}}function Rs(a){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=a.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of n){let o=e[r];if(o){let s=js(o,r);if(s!==null)return s}}return null}async function At(a){if(Sn.has(a)&&!An)return console.log(`[CONFIG] Using cached config for: "${a}"`),Sn.get(a);if(console.log(`[CONFIG] loadConfigFile called with: "${a}", MODE: ${H.toUpperCase()}, CACHE: ${An?"DISABLED":"ENABLED"}`),H==="publish"){let i=Rs(a);return i?(console.log(`[CONFIG] \u2713 Loaded ${a} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${a} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${a}"`);let e;H==="brand"?e=[`./${a.split("/").pop()||a}`,`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=An?"no-store":"force-cache";for(let n of e)try{let r=await fetch(n,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${a} via ${n}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${a}; using defaults`),{}})();return Sn.set(a,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let a=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of a)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await At(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Te(a){console.log(`[CONFIG] Loading object config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/objects/${a}.json`;return await At(e)}async function li(a){let e=new Map;if(a.objects&&Array.isArray(a.objects)){for(let t of a.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Te(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Te(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let a=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(a.map(i=>{let n=`engine.${i}.json`,r=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return At(r)})),t=Object.fromEntries(a.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(a.map(i=>{var o;let n=(o=t[i])!=null?o:{},r=Object.keys(n);return[i,r.length>0?r:"empty"]}))),t}async function Cn(){return await At(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(a="scene.main"){console.log(`[CONFIG] Loading scene config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/scenes/${a}.json`;return await At(e)}function Je(a,e){let t=[];if(!a.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])a.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,r]of Object.entries(a)){if(n==="identity")continue;let o=e.get(n);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function De(a,e){let t={...a},i=["identity","transform","render"];for(let[n,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...r.defaults,...t[n]});return t}function Q(a,e,t,i){return typeof a!="number"||!Number.isFinite(a)?e:Math.min(Math.max(a,t),i)}function Lr(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,-2e3,2e3),y:Q(a[1],e.y,-2e3,2e3)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,-2e3,2e3),y:Q(i,e.y,-2e3,2e3)}}function zs(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,0,1),y:Q(a[1],e.y,0,1)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,0,1),y:Q(i,e.y,0,1)}}function Ds(a){if(Array.isArray(a))return{x:Q(a[0],.5,-10,10),y:Q(a[1],.5,-10,10)};if(a&&typeof a=="object"){let{x:e,y:t}=a;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof a=="string"?a:null}async function be(a="scene.main",e){var l,c,p,d,u,h,f,g,m,y,b,v,w,E;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await si(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await di(a);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(n);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[x,A]of o.entries()){let S=De(A,t),P=Je(S,t);P.valid||console.warn(`Object ${x} validation errors:`,P.errors),(c=S.transform)!=null&&c.position&&(S.transform.position=Lr(S.transform.position,{x:0,y:0})),(p=S.transform)!=null&&p.offset&&(S.transform.offset=Lr(S.transform.offset,{x:0,y:0})),((d=S.transform)==null?void 0:d.anchor)!==void 0&&(S.transform.anchor=Ds(S.transform.anchor)),((u=S.transform)==null?void 0:u.position_ratio)!==void 0&&S.transform.position_ratio!==null&&(S.transform.position_ratio=zs(S.transform.position_ratio,{x:.5,y:.5})),o.set(x,S)}if(e){if(e.objects)for(let[x,A]of e.objects.entries())o.set(x,A);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(h=r.splash)!=null?h:{},...(f=e.engine.splash)!=null?f:{}})}let s={objects:o,engine:r,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=De(s,t))),i.length>0&&xt()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((g=r.runtime)!=null?g:{}),assets:Object.keys((m=r.assets)!=null?m:{}),splash:Object.keys((y=r.splash)!=null?y:{}),loading:Object.keys((b=r.loading)!=null?b:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((w=r.tutorial)!=null?w:{}),endgame:Object.keys((E=r.endgame)!=null?E:{})},scene:n.scene_id||"unknown"}),s}function Tn(a){var t,i,n,r,o,s,l,c,p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$,C;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[_,M]of a.objects.entries()){let q=((t=M.identity)==null?void 0:t.id)||_;q.includes("character")&&(e.gameplay.character_pos=((i=M.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=M.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((o=(r=M.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=M.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=M.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=M.gun||{},e.gameplay.gunmuzzle=((d=M.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=M.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((h=M.effects)==null?void 0:h.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=M),q.includes("ice")&&(e.gameplay.melt=M.melt||{},e.gameplay.melt_anchor=((f=M.transform)==null?void 0:f.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((g=M.transform)==null?void 0:g.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=M.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((y=M.effects)==null?void 0:y.physics_chunks)||{},e.gameplay.melting_particles=((b=M.effects)==null?void 0:b.melting_particles)||{},e.gameplay.hard_ice=M.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=M),q.includes("crack")&&(e.gameplay.crack=M),q.includes("hand")&&(e.gameplay.hand=((v=M.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=M.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=M.transform)==null?void 0:E.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((x=M.gameplay)==null?void 0:x.tuning)||{},e.gameplay.danger_pos=((A=M.transform)==null?void 0:A.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((P=(S=M.gameplay)==null?void 0:S.tuning)==null?void 0:P.danger_pulse)||{},e.gameplay.hazard_height=((L=(I=M.gameplay)==null?void 0:I.tuning)==null?void 0:L.hazard_height)||140)}return e.gameplay.timeline=((T=a.engine.runtime)==null?void 0:T.timeline)||{},e.gameplay.drag_surface=((j=a.engine.runtime)==null?void 0:j.drag_surface)||{},e.gameplay.background=((O=a.engine.runtime)==null?void 0:O.background)||{},e.gameplay.ui_styles=((D=a.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((R=a.engine.runtime)==null?void 0:R.label_pulse)||{},e.ui=(($=a.engine.runtime)==null?void 0:$.ui)||{},e.theme=((C=a.engine.runtime)==null?void 0:C.theme)||{},e.assets=a.engine.assets||{},e}var Tr,H,Sn,An,Ln=de(()=>{"use strict";K();Tr=null,H="dev";if(typeof window!="undefined"){let a=window.__BUILD_SETTINGS__;if(a!=null&&a.buildMode)Tr=a,H=a.buildMode,console.log("[CONFIG] Loaded inline build settings:",a,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Tr=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);Sn=new Map,An=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function kn(a,e){let t=[];function i(n,r,o=""){if(n!==r){if(typeof n!=typeof r){t.push(`${o}: type changed`);return}if(typeof n=="object"&&n!==null&&r!==null){let s=new Set([...Object.keys(n),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in n?l in r?i(n[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(a,e),t}function Pn(a,e,t,i){let n={...t};for(let[r,o]of i.entries())n[r]&&o.defaults&&(n[r]={...o.defaults,...n[r]});return n}var Ct,$e,_n=de(()=>{"use strict";Ct=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},$e=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let r=await n.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function On(a){if(typeof window=="undefined")return;let e=typeof Mn!="undefined"&&!!Mn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,r=!1,o=null;if(t){o=new $e;let f=window.__configWatcher;f!=null&&f.stop&&f.stop(),window.__configWatcher=o}let s=new Set,l=f=>{var y,b;if(!o)return;let g=new Set;g.add("configs/engine/engine.runtime.json"),g.add("configs/engine/engine.assets.json"),g.add("configs/engine/engine.splash.json"),g.add("configs/scenes/scene.main.json");let m=(b=(y=f.scene)==null?void 0:y.objects)!=null?b:[];for(let v of m)v!=null&&v.object_config&&g.add(`configs/objects/${v.object_config}.json`);for(let v of s)g.has(v)||o.unwatch(v);for(let v of g)s.has(v)||o.watch(v,w=>h(w));s=g},c=new Set,p=!1,d=async f=>{let g=await Te(f),m=De(g,a.activeConfig.schemas),y=Je(m,a.activeConfig.schemas);y.valid||console.warn(`[HOT-RELOAD] ${f} validation errors:`,y.errors),await a.liveEditBridge.applyObjectConfig(f,m)};async function u(f){if(!r){r=!0;try{if(p||c.size===0){a.audioSystem.destroy();let g=await be("scene.main");a.setActiveConfig(g),a.gameObjectManager.updateConfig(g),a.CustomAssets.updateConfig(g),await a.CustomAssets.ready();let m=a.createAudioSystem(g);a.setAudioSystem(m),window.__audioSystem=m,await m.start(),a.liveEditBridge.rebuildIndexes(),l(g),console.log(`[GAME] Hot-reload complete (${f})`)}else{let g=Array.from(c);c.clear();for(let m of g)await d(m);console.log(`[GAME] Hot-reload updated objects: ${g.join(", ")}`)}}catch(g){console.warn("[GAME] Hot-reload failed:",g)}finally{r=!1,p=!1,c.clear()}}}function h(f){f.type==="object"&&f.objectId?c.add(f.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(f.type)},120)}e&&Mn.hot.on("config-change",()=>{h({type:"hmr"})}),t&&(l(a.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Mn,kr=de(()=>{"use strict";_n();Ln();Mn={}});var Pr={};ht(Pr,{ConfigWatcher:()=>$e,DefaultReloadStrategy:()=>Ct,applyDefaults:()=>De,diffConfigs:()=>kn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,setupHotReload:()=>On,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});var pi=de(()=>{"use strict";Ln();_n();kr()});var ho={};ht(ho,{AssetEditorModal:()=>pa});var pa,ua=de(()=>{"use strict";pa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
1
|
+
"use strict";var No=Object.create;var Ut=Object.defineProperty;var Fo=Object.getOwnPropertyDescriptor;var Bo=Object.getOwnPropertyNames;var Uo=Object.getPrototypeOf,Go=Object.prototype.hasOwnProperty;var de=(a,e)=>()=>(a&&(e=a(a=0)),e);var ft=(a,e)=>{for(var t in e)Ut(a,t,{get:e[t],enumerable:!0})},Oa=(a,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Bo(e))!Go.call(a,n)&&n!==t&&Ut(a,n,{get:()=>e[n],enumerable:!(i=Fo(e,n))||i.enumerable});return a};var qe=(a,e,t)=>(t=a!=null?No(Uo(a)):{},Oa(e||!a||!a.__esModule?Ut(t,"default",{value:a,enumerable:!0}):t,a)),qo=a=>Oa(Ut({},"__esModule",{value:!0}),a);var pe,gn=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Qo(){var a,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(a=document.querySelector("script"))==null?void 0:a.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function es(){try{if(typeof window!="undefined"){let a=await fetch("./build-settings.json");if(a.ok){let e=await a.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function ts(){try{if(typeof window!="undefined"){let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function is(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ue).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ue)),ue;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ue={...window.INLINE_ASSETS},ue;if(!(N==="publish"&&oe!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!hn){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),hn=(async()=>{try{try{let r=await import(e+"?t="+Date.now());if(r.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(r.INLINE_ASSETS)),r.INLINE_ASSETS}catch(r){console.warn("[AssetLoader] ES module import failed, trying text parse:",r)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let r=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await hn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function fn(a){return a===null||typeof a!="object"||(Object.freeze(a),Object.values(a).forEach(e=>fn(e))),a}function ns(a=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=a,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,a,e),n.strokeStyle="#000",n.strokeRect(0,0,a,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",a/2,e/2),ge.Texture.from(i)}function mn(a,e){pr.set(a,e)}var ge,cr,dr,Ie,N,oe,Ee,ue,hn,pr,je,Wt=de(()=>{"use strict";ge=require("pixi.js");gn();cr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",dr=Qo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=dr?"publish":cr,oe=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(N=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ee=ts();Ee!=null&&Ee.buildMode&&(N=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(oe=Ee.assetsInlined);es().then(a=>{a!=null&&a.buildMode&&a.buildMode!==N&&(N=a.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(a==null?void 0:a.assetsInlined)!==void 0&&(oe=a.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${cr}, Runtime: ${dr?"publish":"dev"}, Effective: ${N}`);ue={},hn=null;pr=new Map;je=class{static async load(e,t,i,n){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${N}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await is(),l=s[e];if(!l&&n&&(l=s[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),N==="publish"&&oe!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=pr.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}try{let d;switch(t.type){case"image":d=await this.loadImage(t.path,l);break;case"json":d=await this.loadJSON(t.path,l),d=fn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(N==="dev"){let r=t==="image"?ns():fn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};mn("image",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ge.Assets.load(e)}let o=a;return(n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),ge.Assets.load(e||o)});mn("json",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=a;if((n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let s=await fetch(o);if(!s.ok)throw new Error(`JSON fetch failed: ${a}`);return s.json()})});var gr={};ft(gr,{AssetTextures:()=>se,initAssetTextures:()=>vn});function vn(a,e){ur.init(a,e),typeof window!="undefined"&&(window.__AssetTextures=se)}var yn,ur,se,Ke=de(()=>{"use strict";Wt();yn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var o;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let g=await je.load(s,c,t,u);this.textures.set(s,g),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?n.push(p()):r.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let r=()=>n.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},ur=new yn,se=new Proxy(ur,{get(a,e){return e in a&&typeof a[e]=="function"?a[e].bind(a):a.get(e)},set(a,e,t){return a.set(e,t),!0}})});var Je={};ft(Je,{applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Cr,configOverrideManager:()=>Tr,deepClone:()=>V,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Xe,getOverrideMode:()=>Et,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setOverrideMode:()=>Sn});function ii(){return typeof window=="undefined"?null:window.__editableConfig||null}function wr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function yr(a,e){var t,i;if(!a)return null;try{if(a instanceof Map)return(t=a.get(e))!=null?t:null;if(typeof a=="object")return(i=a[e])!=null?i:null}catch{}return null}function Ps(a,e,t){if(a){if(a instanceof Map){a.set(e,t);return}typeof a=="object"&&(a[e]=t)}}function xr(a,e){for(let t of e)xt(a,t.path,t.value)}function Er(a){var s;if(typeof window=="undefined")return;let e=ii();if(!e)return;let t=wr(),i=(s=t?yr(t.objects,a):null)!=null?s:yr(e.objects,a);if(!i)return;let n=V(i),r=Y().filter(l=>l.objectId===a);try{xr(n,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",a,l);return}Ps(e.objects,a,n);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(a,n)}catch{}}function Ms(){var n;if(typeof window=="undefined")return;let a=ii();if(!(a!=null&&a.engine))return;let e=wr(),t=V(((n=e==null?void 0:e.engine)!=null?n:a.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{xr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=a.engine;for(let o of Object.keys(r))o in t||delete r[o];for(let[o,s]of Object.entries(t))r[o]=s}catch{a.engine=t}}function _s(){if(typeof window=="undefined")return"unknown";let a=window;return typeof a.__HANDLER_PROJECT_ID=="string"?a.__HANDLER_PROJECT_ID:"handler-default"}function Sr(){return`handler_preview_config_overrides::${_s()}`}function Os(){if(typeof window=="undefined")return[];try{let a=window.localStorage.getItem(Sr());if(!a)return[];let e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}}function ni(a){if(typeof window!="undefined")try{window.localStorage.setItem(Sr(),JSON.stringify(a))}catch{}}function Et(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Sn(a){if(typeof window!="undefined"){window.__enableConfigOverrides=a;try{window.localStorage.setItem(Ar,a?"true":"false")}catch{}}}function Ae(a,e={}){var u,g;let{objectId:t,path:i,value:n}=a,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ii();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=js(c,i),xt(c,i,n)}catch(f){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},f);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),d.length>Is&&d.shift(),o){let f=Y(),h=f.findIndex(m=>m.objectId===t&&m.sceneId===a.sceneId&&m.path===i);h>=0?f[h].value=n:f.push(a),window.__configOverrides=f,ni(f),Et()||Sn(!0)}r||console.log("[CONFIG] Applied override:",a),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:a}))}function Ce(a,e={}){let t=e.emitEvent!==!1,i=[];for(let n of a)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Ae(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:a.length}}))}}function ee(){window.__configOverrides=[],window.__configChanges=[],ni([]),console.log("[CONFIG] Cleared all overrides")}function Cr(a){let e=Y().filter(i=>i.objectId!==a);window.__configOverrides=e,ni(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==a),Er(a),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:a}}))}function ai(a,e){let t=Y().filter(n=>n.objectId!==a||n.path!==e);window.__configOverrides=t,ni(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==a||n.path!==e),a?Er(a):Ms(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:a,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Os()),window.__configOverrides||[])}function xt(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i){if(r[s]!==void 0&&typeof r[s]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${s})`);r[s]=(o=r[s])!=null?o:{},r=r[s]}r[n]=t}function js(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function V(a){if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(a instanceof Set)return new Set([...a].map(t=>V(t)));if(ArrayBuffer.isView(a))return a.slice();if(a instanceof Array)return a.map(t=>V(t));if(a instanceof Map){let t=new Map;return a.forEach((i,n)=>t.set(n,V(i))),t}let e={};for(let t in a)Object.prototype.hasOwnProperty.call(a,t)&&(e[t]=V(a[t]));return e}function ze(){let a=window.__editableConfigBaseline;if(!a){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return vr(e)}return vr(a)}function vr(a){let e={objects:{},scenes:{},engine:V(a.engine||{})},t=a.objects;if(t instanceof Map)t.forEach((r,o)=>{e.objects[o]=V(r)});else if(t&&typeof t=="object")for(let r in t)e.objects[r]=V(t[r]);let i=a.scenes;if(i instanceof Map)i.forEach((r,o)=>{e.scenes[o]=V(r)});else if(i&&typeof i=="object")for(let r in i)e.scenes[r]=V(i[r]);let n=Y();for(let r of n)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),xt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),xt(e.scenes[r.sceneId],r.path,r.value)):xt(e.engine,r.path,r.value);return e}function Xe(){let a=Y(),e=new Set;for(let t of a)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:a.length,hasChanges:a.length>0,overrides:a}}async function ri(a){let e=ze(),t={};for(let[n,r]of Object.entries(e.objects)){let o=r,s=n;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${n}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,r]of Object.entries(e.scenes)){let o=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:a})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ee();try{let n=ii();n&&(window.__editableConfigBaseline=V(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function St(){ee(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}ee(),window.location.reload()}var Ar,Is,Tr,X=de(()=>{"use strict";Ar="handler_preview_override_mode";if(typeof window!="undefined"){let a=window.localStorage.getItem(Ar);window.__enableConfigOverrides=a===null?!0:a==="true"}Is=500;Tr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function Rs(a,e){try{if(typeof a=="object"&&a!==null)return a;if(typeof a!="string")return null;if(a.startsWith("data:")){let i=a.indexOf(",");if(i===-1)return null;let n=a.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let r=a.slice(i+1),o=n.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=a.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(a):null}catch{return null}}function zs(a){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=a.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of n){let o=e[r];if(o){let s=Rs(o,r);if(s!==null)return s}}return null}async function At(a){if(An.has(a)&&!Cn)return console.log(`[CONFIG] Using cached config for: "${a}"`),An.get(a);if(console.log(`[CONFIG] loadConfigFile called with: "${a}", MODE: ${H.toUpperCase()}, CACHE: ${Cn?"DISABLED":"ENABLED"}`),H==="publish"){let i=zs(a);return i?(console.log(`[CONFIG] \u2713 Loaded ${a} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${a} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${a}"`);let e;H==="brand"?e=[`./${a.split("/").pop()||a}`,`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=Cn?"no-store":"force-cache";for(let n of e)try{let r=await fetch(n,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${a} via ${n}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${a}; using defaults`),{}})();return An.set(a,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let a=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of a)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await At(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Te(a){console.log(`[CONFIG] Loading object config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/objects/${a}.json`;return await At(e)}async function li(a){let e=new Map;if(a.objects&&Array.isArray(a.objects)){for(let t of a.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Te(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Te(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let a=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(a.map(i=>{let n=`engine.${i}.json`,r=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return At(r)})),t=Object.fromEntries(a.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(a.map(i=>{var o;let n=(o=t[i])!=null?o:{},r=Object.keys(n);return[i,r.length>0?r:"empty"]}))),t}async function Tn(){return await At(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(a="scene.main"){console.log(`[CONFIG] Loading scene config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/scenes/${a}.json`;return await At(e)}function Ze(a,e){let t=[];if(!a.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])a.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,r]of Object.entries(a)){if(n==="identity")continue;let o=e.get(n);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function De(a,e){let t={...a},i=["identity","transform","render"];for(let[n,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...r.defaults,...t[n]});return t}function te(a,e,t,i){return typeof a!="number"||!Number.isFinite(a)?e:Math.min(Math.max(a,t),i)}function kr(a,e){if(Array.isArray(a))return{x:te(a[0],e.x,-2e3,2e3),y:te(a[1],e.y,-2e3,2e3)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:te(t,e.x,-2e3,2e3),y:te(i,e.y,-2e3,2e3)}}function Ds(a,e){if(Array.isArray(a))return{x:te(a[0],e.x,0,1),y:te(a[1],e.y,0,1)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:te(t,e.x,0,1),y:te(i,e.y,0,1)}}function $s(a){if(Array.isArray(a))return{x:te(a[0],.5,-10,10),y:te(a[1],.5,-10,10)};if(a&&typeof a=="object"){let{x:e,y:t}=a;return{x:te(e,.5,-10,10),y:te(t,.5,-10,10)}}return typeof a=="string"?a:null}async function be(a="scene.main",e){var l,c,p,d,u,g,f,h,m,b,y,v,w,A;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await si(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await di(a);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(n);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[L,D]of o.entries()){let x=De(D,t),P=Ze(x,t);P.valid||console.warn(`Object ${L} validation errors:`,P.errors),(c=x.transform)!=null&&c.position&&(x.transform.position=kr(x.transform.position,{x:0,y:0})),(p=x.transform)!=null&&p.offset&&(x.transform.offset=kr(x.transform.offset,{x:0,y:0})),((d=x.transform)==null?void 0:d.anchor)!==void 0&&(x.transform.anchor=$s(x.transform.anchor)),((u=x.transform)==null?void 0:u.position_ratio)!==void 0&&x.transform.position_ratio!==null&&(x.transform.position_ratio=Ds(x.transform.position_ratio,{x:.5,y:.5})),o.set(L,x)}if(e){if(e.objects)for(let[L,D]of e.objects.entries())o.set(L,D);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(f=e.engine.splash)!=null?f:{}})}let s={objects:o,engine:r,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=De(s,t))),i.length>0&&Et()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((h=r.runtime)!=null?h:{}),assets:Object.keys((m=r.assets)!=null?m:{}),splash:Object.keys((b=r.splash)!=null?b:{}),loading:Object.keys((y=r.loading)!=null?y:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((w=r.tutorial)!=null?w:{}),endgame:Object.keys((A=r.endgame)!=null?A:{})},scene:n.scene_id||"unknown"}),s}function Ln(a){var t,i,n,r,o,s,l,c,p,d,u,g,f,h,m,b,y,v,w,A,L,D,x,P,_,S,E,k,T,M,O,z,C;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[I,j]of a.objects.entries()){let F=((t=j.identity)==null?void 0:t.id)||I;F.includes("character")&&(e.gameplay.character_pos=((i=j.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=j.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((o=(r=j.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=j.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=j.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(F.includes("gun")||F.includes("flame"))&&(e.gameplay.gun=j.gun||{},e.gameplay.gunmuzzle=((d=j.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=j.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=j.effects)==null?void 0:g.flame)||{}),F.includes("diamond")&&(e.gameplay.diamond=j),F.includes("ice")&&(e.gameplay.melt=j.melt||{},e.gameplay.melt_anchor=((f=j.transform)==null?void 0:f.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=j.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=j.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=j.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=j.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=j.hard_ice||{}),F.includes("water")&&(e.gameplay.water_drops=j),F.includes("crack")&&(e.gameplay.crack=j),F.includes("hand")&&(e.gameplay.hand=((v=j.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=j.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((A=j.transform)==null?void 0:A.scale)||1.5),F.includes("hazard")&&(e.gameplay.hazard=((L=j.gameplay)==null?void 0:L.tuning)||{},e.gameplay.danger_pos=((D=j.transform)==null?void 0:D.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((P=(x=j.gameplay)==null?void 0:x.tuning)==null?void 0:P.danger_pulse)||{},e.gameplay.hazard_height=((S=(_=j.gameplay)==null?void 0:_.tuning)==null?void 0:S.hazard_height)||140)}return e.gameplay.timeline=((E=a.engine.runtime)==null?void 0:E.timeline)||{},e.gameplay.drag_surface=((k=a.engine.runtime)==null?void 0:k.drag_surface)||{},e.gameplay.background=((T=a.engine.runtime)==null?void 0:T.background)||{},e.gameplay.ui_styles=((M=a.engine.runtime)==null?void 0:M.ui_styles)||{},e.gameplay.label_pulse=((O=a.engine.runtime)==null?void 0:O.label_pulse)||{},e.ui=((z=a.engine.runtime)==null?void 0:z.ui)||{},e.theme=((C=a.engine.runtime)==null?void 0:C.theme)||{},e.assets=a.engine.assets||{},e}var Lr,H,An,Cn,kn=de(()=>{"use strict";X();Lr=null,H="dev";if(typeof window!="undefined"){let a=window.__BUILD_SETTINGS__;if(a!=null&&a.buildMode)Lr=a,H=a.buildMode,console.log("[CONFIG] Loaded inline build settings:",a,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Lr=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);An=new Map,Cn=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Pn(a,e){let t=[];function i(n,r,o=""){if(n!==r){if(typeof n!=typeof r){t.push(`${o}: type changed`);return}if(typeof n=="object"&&n!==null&&r!==null){let s=new Set([...Object.keys(n),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in n?l in r?i(n[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(a,e),t}function Mn(a,e,t,i){let n={...t};for(let[r,o]of i.entries())n[r]&&o.defaults&&(n[r]={...o.defaults,...n[r]});return n}var Ct,$e,_n=de(()=>{"use strict";Ct=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},$e=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let r=await n.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function In(a){if(typeof window=="undefined")return;let e=typeof On!="undefined"&&!!On.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,r=!1,o=null;if(t){o=new $e;let f=window.__configWatcher;f!=null&&f.stop&&f.stop(),window.__configWatcher=o}let s=new Set,l=f=>{var b,y;if(!o)return;let h=new Set;h.add("configs/engine/engine.runtime.json"),h.add("configs/engine/engine.assets.json"),h.add("configs/engine/engine.splash.json"),h.add("configs/scenes/scene.main.json");let m=(y=(b=f.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of s)h.has(v)||o.unwatch(v);for(let v of h)s.has(v)||o.watch(v,w=>g(w));s=h},c=new Set,p=!1,d=async f=>{let h=await Te(f),m=De(h,a.activeConfig.schemas),b=Ze(m,a.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${f} validation errors:`,b.errors),await a.liveEditBridge.applyObjectConfig(f,m)};async function u(f){if(!r){r=!0;try{if(p||c.size===0){a.audioSystem.destroy();let h=await be("scene.main");a.setActiveConfig(h),a.gameObjectManager.updateConfig(h),a.CustomAssets.updateConfig(h),await a.CustomAssets.ready();let m=a.createAudioSystem(h);a.setAudioSystem(m),window.__audioSystem=m,await m.start(),a.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${f})`)}else{let h=Array.from(c);c.clear();for(let m of h)await d(m);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{r=!1,p=!1,c.clear()}}}function g(f){f.type==="object"&&f.objectId?c.add(f.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(f.type)},120)}e&&On.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(a.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var On,Pr=de(()=>{"use strict";_n();kn();On={}});var Mr={};ft(Mr,{ConfigWatcher:()=>$e,DefaultReloadStrategy:()=>Ct,applyDefaults:()=>De,diffConfigs:()=>Pn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Tn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Mn,setupHotReload:()=>In,toLegacyFormat:()=>Ln,validateObjectConfig:()=>Ze});var pi=de(()=>{"use strict";kn();_n();Pr()});var fo={};ft(fo,{AssetEditorModal:()=>ua});var ua,ga=de(()=>{"use strict";ua=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
2
2
|
<div class="asset-editor-card">
|
|
3
3
|
<div class="asset-editor-header">
|
|
4
4
|
<div>
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
<button class="debug-btn primary" data-modal-apply>Apply</button>
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
46
|
-
`,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(o=>{o.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(o=>{o.addEventListener("click",s=>{let c=s.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var wl={};ht(wl,{COLORS:()=>ce,ConfigWatcher:()=>$e,DebugPanel:()=>It,DefaultReloadStrategy:()=>Ct,Handler:()=>ne,PlayableLoadingScreen:()=>Wi,PreviewShell:()=>Gi,STROKE_WIDTH:()=>Eo,THEME:()=>So,applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>De,baseLottie:()=>cn,bootstrap:()=>cl,clearConfigOverrides:()=>te,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,createPreviewShell:()=>fa,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>Rn,devicePresets:()=>jn,diffConfigs:()=>kn,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Et,getOverrideMode:()=>xt,getPresetById:()=>He,getPresetsByCategory:()=>$s,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setBootstrapDependencies:()=>sl,setOverrideMode:()=>En,setupHotReload:()=>On,setupLiveEditBridge:()=>qi,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});module.exports=Go(wl);var xe={};function Gt(a,e,t=!1){xe[a]||(xe[a]=[]),xe[a].push({fn:e,once:t})}function rn(a,e){if(xe[a]){if(!e){delete xe[a];return}xe[a]=xe[a].filter(t=>t.fn!==e)}}function qt(a,...e){let t=xe[a];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(a,i.fn)}function X(a,e){Gt(a,e,!0)}var B=null,ee=[],Ve=null;function ja(a){B=a,ee=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function Ra(){var a,e,t;return{endpoint:(B==null?void 0:B.endpoint)||"",transport:(B==null?void 0:B.transport)||"beacon",batchSize:(a=B==null?void 0:B.batchSize)!=null?a:10,flushIntervalMs:(e=B==null?void 0:B.flushIntervalMs)!=null?e:300,maxQueue:(t=B==null?void 0:B.maxQueue)!=null?t:200,debug:!!(B!=null&&B.debug)}}async function Oa(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function on(a,e){let t=Ra();if(e&&t.endpoint){if(ee.push(a),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){Ia();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,Ia()},t.flushIntervalMs))}}async function Ia(){let a=Ra();if(!a.endpoint||ee.length===0)return;let e=ee.splice(0,a.batchSize);await Oa(a.endpoint,{events:e},a.transport,a.debug),ee.length>0&&await Oa(a.endpoint,{events:ee.splice(0,a.batchSize)},a.transport,a.debug)}function za(a){return Math.max(0,Math.min(1,a))}function qo(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ft(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Vo(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function Da(a,e,t){try{a[e]=t}catch{}}function Wo(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function $a(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ha(a,e){let t=Wo(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Na(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ft();for(let h of Array.from(a)){if(h.killed||h.paused)continue;let f=p-h.startMs-h.delayMs;if(f<0)continue;let g=h.durationMs>0?f/h.durationMs:1,m=za(g),y=h.repeat>=0?h.repeat+1:1,b=h.repeat>0?Math.min(Math.floor(g),y-1):0;if(h.repeat>0&&g>=1){let E=g-b;m=za(E)}let v=h.ease(m);h.yoyo&&b%2===1&&(v=1-v);for(let E of h.props)Da(h.target,E.key,E.from+(E.to-E.from)*v);h.scaleFrom&&h.scaleTo&&$a(h.target,{x:h.scaleFrom.x+(h.scaleTo.x-h.scaleFrom.x)*v,y:h.scaleFrom.y+(h.scaleTo.y-h.scaleFrom.y)*v});try{(d=h.onUpdate)==null||d.call(h)}catch{}if(g>=y){o(h);try{(u=h.onComplete)==null||u.call(h)}catch{}}}},l=(p,d,u)=>{var E;let h=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),g=qo(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,y=d.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let x of Object.keys(d)){if(b.has(x))continue;let A=d[x];typeof A=="number"&&v.push({key:x,from:Vo(p,x),to:A})}let w=Ha(p,d);return{target:p,startMs:ft(),delayMs:f,durationMs:h,ease:g,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:y,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ft())},resume:()=>{var g;if(!u.paused)return;let h=(g=u.pauseAtMs)!=null?g:ft(),f=ft()-h;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let h of Object.keys(d)){let f=d[h];h==="scale"||h==="scaleX"||h==="scaleY"||typeof f=="number"&&Da(p,h,f)}let u=Ha(p,d);u.to&&$a(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,h=!1,f=[],g=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let v=typeof b=="string"?b.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=b=>{d.push(b);let v=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);u=Math.max(u,b.atMs+v)},y={to(b,v,w){return m({kind:"to",target:b,vars:v,atMs:g(w)}),y},fromTo(b,v,w,E){return m({kind:"fromTo",target:b,vars:w,from:v,atMs:g(E)}),y},play(){var b,v;if(h)return y;h=!0,f=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(b=w.from)!=null?b:{}),f.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return y},pause(){for(let b of f)b.pause();return y},kill(){for(let b of f)b.kill();f=[],h=!1}};return p.paused||y.play(),y}};return c}function Fa(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=Na()}catch{}}var Ba={name:"handler-playable-sdk",version:"0.5.26",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var J=0,Ko=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,Wa=J++,Ya=J++,Ka=J++,Xa=J++,Ja=J++,Za=J++,Qa=J++,F=Ko;function er(){return F===Ua}function tr(){return F===Ga}function ir(){return F===qa}function nr(){return F===Va}function We(){return F===Wa}function Ye(){return F===Ya}function ar(){return F===Ka}function rr(){return F===Xa}function or(){return F===Ja}function sn(){return F===Za}function ln(){return F===Qa}function sr(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=Ua;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=Ga;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=qa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=Va)}catch{}else if(e==="mintegral")window.gameReady&&(F=Wa);else if(e==="tapjoy")window.TJ_API&&(F=Ya);else if(e==="tiktok")window.openAppStore&&(F=Ka);else if(e==="smadex")try{window.smxTracking&&(F=Xa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ja)}catch{}else e==="vungle"?F=Za:(a==="nucleo"||e==="nucleo")&&(F=Qa)}var Vt=qe(require("lottie-web"),1),cn=Vt.default;typeof window!="undefined"&&(window.lottie=Vt.default,window.__baseLottie=Vt.default);var Xo=require("pixi.js");var dn=require("pixi.js");var Jo=null;function pn(a){Jo=a}Wt();un();var mt=require("pixi.js");Wt();var ns=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",mn=ns;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${mn}`))}}catch{}function as(a){var t,i,n,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let s=a.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Se=class{static async create(e,t,i){var l,c,p,d,u,h,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${mn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let g=new mt.Container;return this.applyTransform(g,t==null?void 0:t.transform,t),g}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let o=await je.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new mt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((h=o.constructor)==null?void 0:h.name)==="Container"||o instanceof mt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let g=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let y of g)try{let b=await fetch(y);if(b.ok){s=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",y,"type:",(f=s==null?void 0:s.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=as(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var bt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};var ss=qe(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ss);Ke();var Yt=require("pixi.js");Ke();var vn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new bt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Se.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Se.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ls=new vn,cs=new Proxy(ls,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});Ke();var gr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Xt={scale:1,position:1},xn=[];function ps(a,e,t,i,n,r,o){xn.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,o,!1)}function us(){xn.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*he.scaleFactor;t(a,he.width,he.height,i,n,!0,!1)})}function wn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),he.width=a,he.height=e,he.scaleFactor=Math.min(a/he.designWidth,1.15),Xt.scale=he.scaleFactor,Xt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Xt.scale.toFixed(3)}`),us()}var vt={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function gs(a,e,t){let i=vt[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function hs(){return vt}var fs={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Kt(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function Jt(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Kt(a[0],e.x),y:Kt(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Kt(i.x,e.x),y:Kt(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=fs[i])!=null?t:e}return e}function hr(a,e,t,i={}){var h,f,g,m,y,b;let n=Jt(t),r=(h=i.inset)!=null?h:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((g=r.left)!=null?g:0)+o.x,l=((m=r.right)!=null?m:0)+o.x,c=((y=r.top)!=null?y:0)+o.y,p=((b=r.bottom)!=null?b:0)+o.y,d=Math.max(0,a-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function fr(a,e,t,i={}){var g,m,y,b,v,w;let n=(g=i.inset)!=null?g:{},r=(m=i.padding)!=null?m:{x:0,y:0},o=((y=n.left)!=null?y:0)+r.x,s=((b=n.right)!=null?b:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((w=n.bottom)!=null?w:0)+r.y,p=Math.max(0,a-o-s),d=Math.max(0,e-l-c),u=Jt(t,{x:.5,y:.5}),h=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:o+p*h,y:l+d*f}}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,wn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),wn(window.innerWidth,window.innerHeight),window.updateDebugConfig=gs,window.getDebugConfig=hs,window.copyConfig=Ts,window.applyConfig=yt,window.applyConfigForRatio=Ls,window.positionAtBottom=mr,window.positionAtTop=ys,window.positionAtCenter=vs,window.positionAtLeft=ws,window.positionAtRight=xs,window.positionAtBottomLeft=Es,window.positionAtBottomRight=Ss,window.positionAtTopLeft=As,window.positionAtTopRight=Cs,window.applyPositionContract=bs,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Zt(a,e,t=0){return a*e+t}function Qt(a,e,t=0){return a*(1-e)+t}function ei(a,e,t=0){return a*e+t}function ti(a,e,t=0){return a*(1-e)+t}function Z(a,e=0){return a/2+e}function ms(a,e){return a*e}function bs(a,e,t,i){var o,s,l,c,p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P;let n=0,r=0;switch(i.type){case"top":n=Z(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Zt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Z(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Qt(t,i.percent,(h=(u=i.offset)==null?void 0:u.y)!=null?h:0);break;case"left":n=ei(e,i.percent,(g=(f=i.offset)==null?void 0:f.x)!=null?g:0),r=Z(t,(y=(m=i.offset)==null?void 0:m.y)!=null?y:0);break;case"right":n=ti(e,i.percent,(v=(b=i.offset)==null?void 0:b.x)!=null?v:0),r=Z(t,(E=(w=i.offset)==null?void 0:w.y)!=null?E:0);break;case"center":n=Z(e,(A=(x=i.offset)==null?void 0:x.x)!=null?A:0),r=Z(t,(P=(S=i.offset)==null?void 0:S.y)!=null?P:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function mr(a,e,t,i=.2,n=1,r=!0,o=!1){let s=ms(t,i),l=Qt(t,i/2);fe(a,Z(e),l);let c=r?n*he.scaleFactor:n;me(a,c),o&&!xn.find(p=>p.element===a)&&ps(a,mr,e,t,i,n,r)}function ys(a,e,t,i=.1,n=1){fe(a,Z(e),Zt(t,i)),me(a,n)}function vs(a,e,t,i=0,n=0,r=1){fe(a,Z(e,i),Z(t,n)),me(a,r)}function ws(a,e,t,i=.1,n=1){fe(a,ei(e,i),Z(t)),me(a,n)}function xs(a,e,t,i=.1,n=1){fe(a,ti(e,i),Z(t)),me(a,n)}function Es(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Qt(t,i)),me(a,r)}function Ss(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Qt(t,i)),me(a,r)}function As(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Zt(t,i)),me(a,r)}function Cs(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Zt(t,i)),me(a,r)}function fe(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function me(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var Re={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function Ts(a){return a&&Re[a]?JSON.parse(JSON.stringify(Re[a])):JSON.parse(JSON.stringify(vt))}function yt(a){Object.keys(a).forEach(e=>{let t=e;vt[t]&&a[t]&&Object.assign(vt[t],a[t])}),console.log("Config applied:",a)}function Ls(a,e){let t=a/e;t>1.6?(yt(Re.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(yt(Re.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(yt(Re.square),console.log("Applied SQUARE config for ratio:",t)):(yt(Re.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=Re,a.resolveAnchorVec2=a.resolveAnchorVec2||Jt,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||hr,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||fr}pi();function U(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Yc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:U(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:U(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:U(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:U(360,780)}],Kc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:U(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:U(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:U(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:U(412,915)}],Xc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:U(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:U(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:U(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:U(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:U(800,1280)}],In=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:U(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:U(768,1024),mraidScale:.7}];var jn=[...In],Rn=[{category:"playable",label:"Playable Ad",devices:In}],ui=In[0];function He(a){return jn.find(e=>e.id===a)||ui}function $s(a){return jn.filter(e=>e.category===a)}K();var Ze=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=r(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ae({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function zn(a){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var r;let i=(r=t.target.files)==null?void 0:r[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=a.category||"misc",c=`${(a.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let h=window.refreshAssetLibrary;typeof h=="function"&&await h(),await a.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var gi=class{constructor(){this.updateManager=new Ze}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),r=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");zn({objectId:e,category:r,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,r)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],r=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Hs=["loading","start","gameplay","tutorial","endgame"],Ns=["environment","ui","character","system","backgrounds"],Fs=["bg","world","ui"],_r={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},hi=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
46
|
+
`,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(o=>{o.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(o=>{o.addEventListener("click",s=>{let c=s.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var xl={};ft(xl,{COLORS:()=>ce,ConfigWatcher:()=>$e,DebugPanel:()=>It,DefaultReloadStrategy:()=>Ct,Handler:()=>ae,PlayableLoadingScreen:()=>Yi,PreviewShell:()=>qi,STROKE_WIDTH:()=>So,THEME:()=>Ao,applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>De,baseLottie:()=>dn,bootstrap:()=>dl,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Cr,configOverrideManager:()=>Tr,createPreviewShell:()=>ma,deepClone:()=>V,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>zn,devicePresets:()=>Rn,diffConfigs:()=>Pn,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Xe,getOverrideMode:()=>Et,getPresetById:()=>He,getPresetsByCategory:()=>Hs,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Tn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Mn,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setBootstrapDependencies:()=>ll,setOverrideMode:()=>Sn,setupHotReload:()=>In,setupLiveEditBridge:()=>Vi,toLegacyFormat:()=>Ln,validateObjectConfig:()=>Ze});module.exports=qo(xl);var xe={};function Gt(a,e,t=!1){xe[a]||(xe[a]=[]),xe[a].push({fn:e,once:t})}function on(a,e){if(xe[a]){if(!e){delete xe[a];return}xe[a]=xe[a].filter(t=>t.fn!==e)}}function qt(a,...e){let t=xe[a];if(t)for(let i of[...t])i.fn(...e),i.once&&on(a,i.fn)}function J(a,e){Gt(a,e,!0)}var G=null,ie=[],Ve=null;function Ra(a){G=a,ie=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function za(){var a,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(a=G==null?void 0:G.batchSize)!=null?a:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function Ia(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function sn(a,e){let t=za();if(e&&t.endpoint){if(ie.push(a),ie.length>t.maxQueue&&(ie=ie.slice(ie.length-t.maxQueue)),ie.length>=t.batchSize){ja();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,ja()},t.flushIntervalMs))}}async function ja(){let a=za();if(!a.endpoint||ie.length===0)return;let e=ie.splice(0,a.batchSize);await Ia(a.endpoint,{events:e},a.transport,a.debug),ie.length>0&&await Ia(a.endpoint,{events:ie.splice(0,a.batchSize)},a.transport,a.debug)}function Da(a){return Math.max(0,Math.min(1,a))}function Vo(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function mt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Wo(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function $a(a,e,t){try{a[e]=t}catch{}}function Yo(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function Ha(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Na(a,e){let t=Yo(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Fa(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=mt();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=Da(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let A=h-y;m=Da(A)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let A of g.props)$a(g.target,A.key,A.from+(A.to-A.from)*v);g.scaleFrom&&g.scaleTo&&Ha(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){o(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var A;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((A=u==null?void 0:u.delayMsOverride)!=null?A:0)),h=Vo(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let L of Object.keys(d)){if(y.has(L))continue;let D=d[L];typeof D=="number"&&v.push({key:L,from:Wo(p,L),to:D})}let w=Na(p,d);return{target:p,startMs:mt(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=mt())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:mt(),f=mt()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&$a(p,g,f)}let u=Na(p,d);u.to&&Ha(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,w){return m({kind:"to",target:y,vars:v,atMs:h(w)}),b},fromTo(y,v,w,A){return m({kind:"fromTo",target:y,vars:w,from:v,atMs:h(A)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(y=w.from)!=null?y:{}),f.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function Ba(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=Fa()}catch{}}var Ua={name:"handler-playable-sdk",version:"0.5.28",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var Z=0,Xo=Z++,Ga=Z++,qa=Z++,Va=Z++,Wa=Z++,Ya=Z++,Ka=Z++,Xa=Z++,Ja=Z++,Za=Z++,Qa=Z++,er=Z++,B=Xo;function tr(){return B===Ga}function ir(){return B===qa}function nr(){return B===Va}function ar(){return B===Wa}function We(){return B===Ya}function Ye(){return B===Ka}function rr(){return B===Xa}function or(){return B===Ja}function sr(){return B===Za}function ln(){return B===Qa}function cn(){return B===er}function lr(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),B=Ga;return}catch{}else if(a==="dapi")try{dapi.isReady(),B=qa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(B=Va)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(B=Wa)}catch{}else if(e==="mintegral")window.gameReady&&(B=Ya);else if(e==="tapjoy")window.TJ_API&&(B=Ka);else if(e==="tiktok")window.openAppStore&&(B=Xa);else if(e==="smadex")try{window.smxTracking&&(B=Ja)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(B=Za)}catch{}else e==="vungle"?B=Qa:(a==="nucleo"||e==="nucleo")&&(B=er)}var Vt=qe(require("lottie-web"),1),dn=Vt.default;typeof window!="undefined"&&(window.lottie=Vt.default,window.__baseLottie=Vt.default);var Jo=require("pixi.js");var pn=require("pixi.js");var Zo=null;function un(a){Zo=a}Wt();gn();var bt=require("pixi.js");Wt();var as=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",bn=as;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(bn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${bn}`))}}catch{}function rs(a){var t,i,n,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let s=a.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Se=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${bn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new bt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let o=await je.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new bt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof bt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){s=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=s==null?void 0:s.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=rs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var yt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};var ls=qe(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ls);Ke();var Yt=require("pixi.js");Ke();var wn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new yt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Se.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Se.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},cs=new wn,ds=new Proxy(cs,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});Ke();var hr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Xt={scale:1,position:1},En=[];function us(a,e,t,i,n,r,o){En.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,o,!1)}function gs(){En.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*he.scaleFactor;t(a,he.width,he.height,i,n,!0,!1)})}function xn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),he.width=a,he.height=e,he.scaleFactor=Math.min(a/he.designWidth,1.15),Xt.scale=he.scaleFactor,Xt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Xt.scale.toFixed(3)}`),gs()}var wt={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function hs(a,e,t){let i=wt[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function fs(){return wt}var ms={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Kt(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function Jt(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Kt(a[0],e.x),y:Kt(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Kt(i.x,e.x),y:Kt(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=ms[i])!=null?t:e}return e}function fr(a,e,t,i={}){var g,f,h,m,b,y;let n=Jt(t),r=(g=i.inset)!=null?g:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((h=r.left)!=null?h:0)+o.x,l=((m=r.right)!=null?m:0)+o.x,c=((b=r.top)!=null?b:0)+o.y,p=((y=r.bottom)!=null?y:0)+o.y,d=Math.max(0,a-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function mr(a,e,t,i={}){var h,m,b,y,v,w;let n=(h=i.inset)!=null?h:{},r=(m=i.padding)!=null?m:{x:0,y:0},o=((b=n.left)!=null?b:0)+r.x,s=((y=n.right)!=null?y:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((w=n.bottom)!=null?w:0)+r.y,p=Math.max(0,a-o-s),d=Math.max(0,e-l-c),u=Jt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*f}}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,xn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),xn(window.innerWidth,window.innerHeight),window.updateDebugConfig=hs,window.getDebugConfig=fs,window.copyConfig=Ls,window.applyConfig=vt,window.applyConfigForRatio=ks,window.positionAtBottom=br,window.positionAtTop=vs,window.positionAtCenter=ws,window.positionAtLeft=xs,window.positionAtRight=Es,window.positionAtBottomLeft=Ss,window.positionAtBottomRight=As,window.positionAtTopLeft=Cs,window.positionAtTopRight=Ts,window.applyPositionContract=ys,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Zt(a,e,t=0){return a*e+t}function Qt(a,e,t=0){return a*(1-e)+t}function ei(a,e,t=0){return a*e+t}function ti(a,e,t=0){return a*(1-e)+t}function Q(a,e=0){return a/2+e}function bs(a,e){return a*e}function ys(a,e,t,i){var o,s,l,c,p,d,u,g,f,h,m,b,y,v,w,A,L,D,x,P;let n=0,r=0;switch(i.type){case"top":n=Q(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Zt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Q(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Qt(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ei(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),r=Q(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=ti(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=Q(t,(A=(w=i.offset)==null?void 0:w.y)!=null?A:0);break;case"center":n=Q(e,(D=(L=i.offset)==null?void 0:L.x)!=null?D:0),r=Q(t,(P=(x=i.offset)==null?void 0:x.y)!=null?P:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function br(a,e,t,i=.2,n=1,r=!0,o=!1){let s=bs(t,i),l=Qt(t,i/2);fe(a,Q(e),l);let c=r?n*he.scaleFactor:n;me(a,c),o&&!En.find(p=>p.element===a)&&us(a,br,e,t,i,n,r)}function vs(a,e,t,i=.1,n=1){fe(a,Q(e),Zt(t,i)),me(a,n)}function ws(a,e,t,i=0,n=0,r=1){fe(a,Q(e,i),Q(t,n)),me(a,r)}function xs(a,e,t,i=.1,n=1){fe(a,ei(e,i),Q(t)),me(a,n)}function Es(a,e,t,i=.1,n=1){fe(a,ti(e,i),Q(t)),me(a,n)}function Ss(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Qt(t,i)),me(a,r)}function As(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Qt(t,i)),me(a,r)}function Cs(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Zt(t,i)),me(a,r)}function Ts(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Zt(t,i)),me(a,r)}function fe(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function me(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var Re={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function Ls(a){return a&&Re[a]?JSON.parse(JSON.stringify(Re[a])):JSON.parse(JSON.stringify(wt))}function vt(a){Object.keys(a).forEach(e=>{let t=e;wt[t]&&a[t]&&Object.assign(wt[t],a[t])}),console.log("Config applied:",a)}function ks(a,e){let t=a/e;t>1.6?(vt(Re.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(vt(Re.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(vt(Re.square),console.log("Applied SQUARE config for ratio:",t)):(vt(Re.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=Re,a.resolveAnchorVec2=a.resolveAnchorVec2||Jt,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||fr,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||mr}pi();function q(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Kc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],Xc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Jc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],jn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var Rn=[...jn],zn=[{category:"playable",label:"Playable Ad",devices:jn}],ui=jn[0];function He(a){return Rn.find(e=>e.id===a)||ui}function Hs(a){return Rn.filter(e=>e.category===a)}X();var Qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=r(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ae({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Dn(a){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var r;let i=(r=t.target.files)==null?void 0:r[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=a.category||"misc",c=`${(a.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await a.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var gi=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),r=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");Dn({objectId:e,category:r,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,r)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],r=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Ns=["loading","start","gameplay","tutorial","endgame"],Fs=["environment","ui","character","system","backgrounds"],Bs=["bg","world","ui"],_r={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},hi=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
47
47
|
<div class="wizard-card">
|
|
48
48
|
<div class="wizard-header">
|
|
49
49
|
<div class="wizard-title">
|
|
@@ -95,19 +95,19 @@
|
|
|
95
95
|
<div class="wizard-field-group">
|
|
96
96
|
<label class="wizard-label required">Category</label>
|
|
97
97
|
<select class="wizard-select" data-field="category">
|
|
98
|
-
${
|
|
98
|
+
${Fs.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
99
99
|
</select>
|
|
100
100
|
</div>
|
|
101
101
|
<div class="wizard-field-group">
|
|
102
102
|
<label class="wizard-label required">Screen</label>
|
|
103
103
|
<select class="wizard-select" data-field="screenId">
|
|
104
|
-
${
|
|
104
|
+
${Ns.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
105
105
|
</select>
|
|
106
106
|
</div>
|
|
107
107
|
<div class="wizard-field-group">
|
|
108
108
|
<label class="wizard-label required">Layer</label>
|
|
109
109
|
<select class="wizard-select" data-field="layer">
|
|
110
|
-
${
|
|
110
|
+
${Bs.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
111
111
|
</select>
|
|
112
112
|
</div>
|
|
113
113
|
</div>
|
|
@@ -293,7 +293,7 @@
|
|
|
293
293
|
<div class="wizard-type-icon">${t}</div>
|
|
294
294
|
<div class="wizard-type-name">${i}</div>
|
|
295
295
|
</button>
|
|
296
|
-
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var r;let i=t.target,n=i.dataset.action||((r=i.closest("[data-action]"))==null?void 0:r.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let r=n.dataset.assetAction;r&&(t.preventDefault(),this.handleAssetAction(r))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let r=n.dataset.objectType;r&&this.setObjectType(r)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";
|
|
296
|
+
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var r;let i=t.target,n=i.dataset.action||((r=i.closest("[data-action]"))==null?void 0:r.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let r=n.dataset.assetAction;r&&(t.preventDefault(),this.handleAssetAction(r))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let r=n.dataset.objectType;r&&this.setObjectType(r)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";Dn({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=_r[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let r=n+1;return`
|
|
297
297
|
<div class="wizard-step-indicator">
|
|
298
298
|
<span class="wizard-step-dot ${r===this.state.step?"active":r<this.state.step?"completed":""}"></span>
|
|
299
299
|
<span class="wizard-step-label">Step ${r}</span>
|
|
@@ -348,7 +348,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
348
348
|
</div>
|
|
349
349
|
<div class="panel-resize-handle-v" data-panel-resize-v></div>
|
|
350
350
|
</div>
|
|
351
|
-
`}initialize(e,t){var r,o,s,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let
|
|
351
|
+
`}initialize(e,t){var r,o,s,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var v;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let w=window.__editableObjectConfigs;w&&typeof w.get=="function"&&(b=(v=w.get(h))!=null?v:null)}let y=this.inferScreen(h,b);this.showContextMenu(h,y,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,r.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(n=Array.from(d.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));n.forEach(d=>{var P,_,S,E;let u=typeof t=="function"?t(d):null;if(!u){let k=window.__editableObjectConfigs;k&&typeof k.get=="function"&&(u=(P=k.get(d))!=null?P:null)}let g=(((_=u==null?void 0:u.identity)==null?void 0:_.category)||"scene").toString(),f=(((S=u==null?void 0:u.identity)==null?void 0:S.id)||d).toString(),h=g.toLowerCase(),m=f.toLowerCase(),b=h.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(f||d),v=((E=u==null?void 0:u.render)==null?void 0:E.visible)===!1||(u==null?void 0:u.enabled)===!1,w=this.getObjectType(u),A={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:w},L=this.inferScreen(A.id,u);if(this.screenFilter!=="all"&&L!==this.screenFilter||!(!r||A.id.toLowerCase().includes(r)||A.label.toLowerCase().includes(r)))return;(A.isUnused?l:s)[L].push(A)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
|
|
352
352
|
${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
|
|
353
353
|
`,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var s,l;let i=window.__HANDLER_SCREEN_INDEX,n=(s=i==null?void 0:i.instanceToScreen)==null?void 0:s[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${r}`.toLowerCase();return o.includes("loading")?"loading":o.includes("start")?"start":o.includes("tutorial")?"tutorial":o.includes("endgame")||o.includes("end_card")||o.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,r,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&r.endsWith(".json")?"animation":((s=(o=e.render)==null?void 0:o.asset)==null?void 0:s.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(r=>{var p,d;let o=typeof i=="function"?i(r.id):null;if(!o){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(o=(p=u.get(r.id))!=null?p:null)}let s=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(o),c=(d=o==null?void 0:o.ui)!=null&&d.text?`"${o.ui.text.substring(0,12)}${o.ui.text.length>12?"...":""}"`:"";return`
|
|
354
354
|
<button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
|
|
@@ -466,7 +466,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
466
466
|
</div>
|
|
467
467
|
</div>
|
|
468
468
|
</div>
|
|
469
|
-
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let o=r.dataset.nudge,s=this.getNudgeStep();switch(o){case"up":(l=this.options)==null||l.onNudge(0,-s);break;case"down":(c=this.options)==null||c.onNudge(0,s);break;case"left":(p=this.options)==null||p.onNudge(-s,0);break;case"right":(d=this.options)==null||d.onNudge(s,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let s=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Tt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&r.slots.length>0)for(let c of r.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let
|
|
469
|
+
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let o=r.dataset.nudge,s=this.getNudgeStep();switch(o){case"up":(l=this.options)==null||l.onNudge(0,-s);break;case"down":(c=this.options)==null||c.onNudge(0,s);break;case"left":(p=this.options)==null||p.onNudge(-s,0);break;case"right":(d=this.options)==null||d.onNudge(s,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let s=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Tt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&r.slots.length>0)for(let c of r.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(r.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
|
|
470
470
|
<div class="scene-panel library-panel panel-accent-purple" data-panel="library">
|
|
471
471
|
<div class="scene-panel-header" data-panel-handle>
|
|
472
472
|
<div class="panel-title">
|
|
@@ -485,7 +485,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
485
485
|
</div>
|
|
486
486
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
487
487
|
</div>
|
|
488
|
-
`}initialize(e,t){var r,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let o=document.createElement("div");o.className="slot-current";let s=document.createElement("img");s.src=`/raw/${e.currentAsset}?t=${t}`,s.alt=e.displayName,s.className="slot-thumbnail",s.onerror=()=>{s.style.display="none"},o.appendChild(s),r.appendChild(o);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let h=document.createElement("button");h.className="slot-upload",h.title="Upload new asset",h.textContent="\u{1F4E4}",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(h);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let g=document.createElement("span");if(g.className="slot-expand-icon",g.textContent=i?"\u25BC":"\u25B6",d.appendChild(g),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let r=`raw/library/${e.libraryFolder}/${t}`;n.onPick(r),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let r=await this.fileToDataUrl(i);if(!r){alert("Failed to read file");return}let s=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",s,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${s}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${s}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${s}.png`),e.currentAsset=`${s}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(r){console.error("[Library] \u274C Upload error:",r),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var vi=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var wi=class{render(e,t,i,n){let r=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
|
|
488
|
+
`}initialize(e,t){var r,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let o=document.createElement("div");o.className="slot-current";let s=document.createElement("img");s.src=`/raw/${e.currentAsset}?t=${t}`,s.alt=e.displayName,s.className="slot-thumbnail",s.onerror=()=>{s.style.display="none"},o.appendChild(s),r.appendChild(o);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let r=`raw/library/${e.libraryFolder}/${t}`;n.onPick(r),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let r=await this.fileToDataUrl(i);if(!r){alert("Failed to read file");return}let s=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",s,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${s}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${s}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${s}.png`),e.currentAsset=`${s}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(r){console.error("[Library] \u274C Upload error:",r),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var vi=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var wi=class{render(e,t,i,n){let r=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
|
|
489
489
|
<div class="inspector-property" data-property-type="image">
|
|
490
490
|
<div class="inspector-property-header">
|
|
491
491
|
<label class="inspector-label">${r}</label>
|
|
@@ -555,7 +555,59 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
555
555
|
<span>${this.formatLabel(t)}</span>
|
|
556
556
|
</label>
|
|
557
557
|
</div>
|
|
558
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ci=class{render(e,t,i,n){if(
|
|
558
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ci=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let o=Array.isArray(i)?i:[],s=o.map((c,p)=>{let d=`${n}.${p}`,u=`
|
|
559
|
+
<button class="inspector-button inspector-button-small"
|
|
560
|
+
data-logic-remove="true"
|
|
561
|
+
data-object-id="${e}"
|
|
562
|
+
data-property-path="${n}"
|
|
563
|
+
data-index="${p}">
|
|
564
|
+
Remove
|
|
565
|
+
</button>
|
|
566
|
+
`;if(c&&typeof c=="object"&&!Array.isArray(c)){let f=this.registry.renderProperty(e,"logic",c,d);return`
|
|
567
|
+
<div class="inspector-array-item inspector-logic-item">
|
|
568
|
+
<div class="inspector-array-item-header">
|
|
569
|
+
<span>Logic ${p+1}</span>
|
|
570
|
+
${u}
|
|
571
|
+
</div>
|
|
572
|
+
<div class="inspector-array-item-body">
|
|
573
|
+
${f}
|
|
574
|
+
</div>
|
|
575
|
+
</div>
|
|
576
|
+
`}let g=typeof c=="string"?c:JSON.stringify(c);return`
|
|
577
|
+
<div class="inspector-array-item inspector-logic-item">
|
|
578
|
+
<div class="inspector-array-item-header">
|
|
579
|
+
<span>Logic ${p+1}</span>
|
|
580
|
+
${u}
|
|
581
|
+
<button class="inspector-button inspector-button-small"
|
|
582
|
+
data-logic-convert="true"
|
|
583
|
+
data-object-id="${e}"
|
|
584
|
+
data-property-path="${n}"
|
|
585
|
+
data-index="${p}">
|
|
586
|
+
Convert
|
|
587
|
+
</button>
|
|
588
|
+
</div>
|
|
589
|
+
<div class="inspector-array-item-body inspector-array-item-raw">
|
|
590
|
+
${g}
|
|
591
|
+
</div>
|
|
592
|
+
</div>
|
|
593
|
+
`}).join(""),l=`
|
|
594
|
+
<button class="inspector-button"
|
|
595
|
+
data-logic-add="true"
|
|
596
|
+
data-object-id="${e}"
|
|
597
|
+
data-property-path="${n}">
|
|
598
|
+
Add Logic
|
|
599
|
+
</button>
|
|
600
|
+
`;return`
|
|
601
|
+
<div class="inspector-property inspector-property-array">
|
|
602
|
+
<label class="inspector-property-label">${this.formatLabel(t)} (${o.length} items)</label>
|
|
603
|
+
<div class="inspector-array-list">
|
|
604
|
+
${s||'<div class="inspector-array-empty">Empty array</div>'}
|
|
605
|
+
</div>
|
|
606
|
+
<div class="inspector-array-actions">
|
|
607
|
+
${l}
|
|
608
|
+
</div>
|
|
609
|
+
</div>
|
|
610
|
+
`}if(!Array.isArray(i)||i.length===0)return`
|
|
559
611
|
<div class="inspector-property inspector-property-array">
|
|
560
612
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
561
613
|
<div class="inspector-array-empty">Empty array</div>
|
|
@@ -581,7 +633,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
581
633
|
${r.join("")}
|
|
582
634
|
</div>
|
|
583
635
|
</div>
|
|
584
|
-
`}renderLogic(e,t,i,n){let r=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let
|
|
636
|
+
`}renderLogic(e,t,i,n){let r=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=o&&!l.includes(o)?[o,...l]:l;r.push(`
|
|
585
637
|
<div class="inspector-property inspector-property-text">
|
|
586
638
|
<label class="inspector-property-label">Id</label>
|
|
587
639
|
<div class="inspector-input-group">
|
|
@@ -590,45 +642,55 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
590
642
|
data-object-id="${e}"
|
|
591
643
|
data-logic-id-selector="true">
|
|
592
644
|
<option value="" ${o?"":"selected"}>None</option>
|
|
593
|
-
${c.map(
|
|
645
|
+
${c.map(u=>`<option value="${u}" ${u===o?"selected":""}>${u}</option>`).join("")}
|
|
594
646
|
</select>
|
|
595
647
|
</div>
|
|
596
648
|
</div>
|
|
597
|
-
`);for(let
|
|
649
|
+
`);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${f}.${b}`,w=s[b];if((b==="targetId"||b==="inputId")&&typeof y=="string"){let A=this.registry.getObjectIds(),L=y||"",D=L&&!A.includes(L)?[L,...A]:A;m.push(`
|
|
598
650
|
<div class="inspector-property inspector-property-text">
|
|
599
|
-
<label class="inspector-property-label">${this.formatLabel(
|
|
651
|
+
<label class="inspector-property-label">${this.formatLabel(b)}</label>
|
|
600
652
|
<div class="inspector-input-group">
|
|
601
653
|
<select class="inspector-component-select inspector-input"
|
|
602
|
-
data-property-path="${
|
|
654
|
+
data-property-path="${v}"
|
|
603
655
|
data-object-id="${e}">
|
|
604
|
-
<option value="" ${
|
|
605
|
-
${
|
|
656
|
+
<option value="" ${L?"":"selected"}>None</option>
|
|
657
|
+
${D.map(x=>`<option value="${x}" ${x===L?"selected":""}>${x}</option>`).join("")}
|
|
606
658
|
</select>
|
|
607
659
|
</div>
|
|
608
660
|
</div>
|
|
609
|
-
`);continue}if(Array.isArray(
|
|
661
|
+
`);continue}if(Array.isArray(w)&&w.length)m.push(`
|
|
610
662
|
<div class="inspector-property inspector-property-text">
|
|
611
|
-
<label class="inspector-property-label">${this.formatLabel(
|
|
663
|
+
<label class="inspector-property-label">${this.formatLabel(b)}</label>
|
|
612
664
|
<div class="inspector-input-group">
|
|
613
665
|
<select class="inspector-component-select inspector-input"
|
|
614
|
-
data-property-path="${
|
|
666
|
+
data-property-path="${v}"
|
|
615
667
|
data-object-id="${e}">
|
|
616
|
-
${
|
|
668
|
+
${w.map(A=>`<option value="${String(A)}" ${String(A)===String(y)?"selected":""}>${String(A)}</option>`).join("")}
|
|
617
669
|
</select>
|
|
618
670
|
</div>
|
|
619
671
|
</div>
|
|
620
|
-
`);else{let
|
|
672
|
+
`);else{let A=this.registry.renderProperty(e,b,y,v);A&&m.push(A)}}m.length&&r.push(`
|
|
621
673
|
<div class="inspector-property inspector-property-object">
|
|
622
674
|
<div class="inspector-object-header">Props</div>
|
|
623
675
|
<div class="inspector-object-body">
|
|
624
|
-
${
|
|
676
|
+
${m.join("")}
|
|
625
677
|
</div>
|
|
626
678
|
</div>
|
|
627
|
-
`);continue}let h=this.registry.renderProperty(e,
|
|
679
|
+
`);continue}let h=this.registry.renderProperty(e,u,g,f);h&&r.push(h)}if(r.length===0)return"";let d=!/(^|\.)logic\.\d+$/.test(n)?`
|
|
680
|
+
<div class="inspector-array-actions">
|
|
681
|
+
<button class="inspector-button"
|
|
682
|
+
data-logic-add="true"
|
|
683
|
+
data-object-id="${e}"
|
|
684
|
+
data-property-path="${n}">
|
|
685
|
+
Add Logic
|
|
686
|
+
</button>
|
|
687
|
+
</div>
|
|
688
|
+
`:"";return`
|
|
628
689
|
<div class="inspector-property inspector-property-object">
|
|
629
690
|
<div class="inspector-object-header">${this.formatLabel(t)}</div>
|
|
630
691
|
<div class="inspector-object-body">
|
|
631
692
|
${r.join("")}
|
|
693
|
+
${d}
|
|
632
694
|
</div>
|
|
633
695
|
</div>
|
|
634
696
|
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Li=class{render(e,t,i,n,r){let o=i==null?"":String(i),s=Array.from(new Set(r.map(c=>String(c)))),l=o&&!s.includes(o)?[o,...s]:s;return`
|
|
@@ -686,7 +748,42 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
686
748
|
</div>
|
|
687
749
|
</div>
|
|
688
750
|
</div>
|
|
689
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
751
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Mi=class{constructor(e){this.registry=e}render(e,t,i,n){let r=Array.isArray(i)?i:[],s=["",...this.registry.getObjectIds()],l=r.map((c,p)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=s.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
|
|
752
|
+
<div class="inspector-row" style="gap:8px; align-items:center;">
|
|
753
|
+
<select class="inspector-select inspector-input"
|
|
754
|
+
data-property-path="${n}.${p}.templateId"
|
|
755
|
+
data-object-id="${e}">
|
|
756
|
+
${g}
|
|
757
|
+
</select>
|
|
758
|
+
<input type="number"
|
|
759
|
+
class="inspector-input"
|
|
760
|
+
style="width:72px;"
|
|
761
|
+
value="${u}"
|
|
762
|
+
placeholder="weight"
|
|
763
|
+
data-property-path="${n}.${p}.weight"
|
|
764
|
+
data-object-id="${e}" />
|
|
765
|
+
<button type="button"
|
|
766
|
+
class="inspector-btn inspector-btn-sm"
|
|
767
|
+
data-spawntemplates-remove="true"
|
|
768
|
+
data-object-id="${e}"
|
|
769
|
+
data-property-path="${n}"
|
|
770
|
+
data-index="${p}">Remove</button>
|
|
771
|
+
</div>
|
|
772
|
+
`}).join("");return`
|
|
773
|
+
<div class="inspector-property inspector-property-object">
|
|
774
|
+
<div class="inspector-object-header">${this.formatLabel(t)}</div>
|
|
775
|
+
<div class="inspector-object-body">
|
|
776
|
+
${l||'<div class="inspector-text-sm" style="opacity:0.7;">No templates.</div>'}
|
|
777
|
+
<div class="inspector-row" style="margin-top:8px;">
|
|
778
|
+
<button type="button"
|
|
779
|
+
class="inspector-btn inspector-btn-sm primary"
|
|
780
|
+
data-spawntemplates-add="true"
|
|
781
|
+
data-object-id="${e}"
|
|
782
|
+
data-property-path="${n}">Add Template</button>
|
|
783
|
+
</div>
|
|
784
|
+
</div>
|
|
785
|
+
</div>
|
|
786
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var _i=class{constructor(){this.typeDetector=new vi,this.imageRenderer=new wi,this.colorRenderer=new xi,this.numberRenderer=new Ei,this.textRenderer=new Si,this.booleanRenderer=new Ai,this.arrayRenderer=new Ci(this),this.objectRenderer=new Ti(this),this.selectRenderer=new Li,this.jsonRenderer=new ki,this.spawnPointsRenderer=new Pi,this.spawnTemplatesRenderer=new Mi(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,r=n==null?void 0:n.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let f=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,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"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},p=l[t];if(p&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,p);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&typeof i=="string"){let f=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...f])}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 Us(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Oi=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new _i,this.updateManager=new Qe,this.quickActions=new gi;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
690
787
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
|
|
691
788
|
<div class="scene-panel-header" data-panel-handle>
|
|
692
789
|
<div class="panel-title">
|
|
@@ -747,7 +844,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
747
844
|
${r.join("")}
|
|
748
845
|
</div>
|
|
749
846
|
</div>
|
|
750
|
-
`}renderMotionSection(e,t,i){var
|
|
847
|
+
`}renderMotionSection(e,t,i){var g;let n=[],r=t!=null?t:{},o=(g=r.intro)!=null?g:{},s=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",l=`
|
|
751
848
|
<div class="inspector-motion-presets">
|
|
752
849
|
<span class="inspector-subsection-title">Intro Motions</span>
|
|
753
850
|
<div class="inspector-motion-buttons">
|
|
@@ -764,23 +861,23 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
764
861
|
<button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
|
|
765
862
|
${this.motionSimpleMode?"Simple":"Advanced"}
|
|
766
863
|
</button>
|
|
767
|
-
`,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let
|
|
864
|
+
`,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let h=f.split(".").filter(Boolean),m=r;for(let v of h)m=m==null?void 0:m[v];let b=h[h.length-1],y=`${i}.${f}`;return this.rendererRegistry.renderProperty(e,b,m,y)};if(this.motionSimpleMode){let f=d("enabled");f&&n.push(f);let h=[],m=d("intro.enabled"),b=d("intro.type"),y=d("intro.duration"),v=d("intro.easing");m&&h.push(m),b&&h.push(b),y&&h.push(y),v&&h.push(v),h.length&&n.push(`
|
|
768
865
|
<div class="inspector-subsection">
|
|
769
866
|
<div class="inspector-subsection-title">Intro</div>
|
|
770
867
|
<div class="inspector-subsection-content">
|
|
771
868
|
${s}
|
|
772
869
|
${p}
|
|
773
|
-
${
|
|
870
|
+
${h.join("")}
|
|
774
871
|
</div>
|
|
775
872
|
</div>
|
|
776
|
-
`);let w=d("pulse.enabled"),
|
|
873
|
+
`);let w=d("pulse.enabled"),A=d("swing.enabled"),L=d("continuousMove.enabled"),D=d("continuousRotate.enabled"),x=d("orbit.enabled"),P=[w,A,L,D,x].filter(Boolean).join("");P&&n.push(`
|
|
777
874
|
<div class="inspector-subsection">
|
|
778
875
|
<div class="inspector-subsection-title">Continuous</div>
|
|
779
876
|
<div class="inspector-subsection-content">
|
|
780
|
-
${
|
|
877
|
+
${P}
|
|
781
878
|
</div>
|
|
782
879
|
</div>
|
|
783
|
-
`)}else for(let f in r){let
|
|
880
|
+
`)}else for(let f in r){let h=r[f],m=`${i}.${f}`,b=this.rendererRegistry.renderProperty(e,f,h,m);b&&n.push(b)}return n.length===0?"":`
|
|
784
881
|
<div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
|
|
785
882
|
<div class="inspector-section-header" data-section-toggle="motion">
|
|
786
883
|
<span class="inspector-section-arrow">\u25BC</span>
|
|
@@ -793,17 +890,17 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
793
890
|
${n.join("")}
|
|
794
891
|
</div>
|
|
795
892
|
</div>
|
|
796
|
-
`}attachEventListeners(){var f,g,m,y;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Bs((b,v,w)=>{var E,x;this.updateManager.updateProperty(b,v,w),(x=(E=this.options)==null?void 0:E.onPropertyChange)==null||x.call(E,b,v,w)},300);e.forEach(b=>{let v=E=>{var P,I;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId;if(A&&S){let L=x.value;if(x.type==="checkbox")L=x.checked;else if(x.type==="number"){if(L=parseFloat(x.value),isNaN(L))return}else if(x.dataset.json==="true")try{L=JSON.parse(x.value)}catch{return}x.type==="text"||x.type==="range"||x.tagName==="TEXTAREA"?t(S,A,L):(this.updateManager.updateProperty(S,A,L),(I=(P=this.options)==null?void 0:P.onPropertyChange)==null||I.call(P,S,A,L))}},w=b.dataset.propertyPath;w==="logic.id"||w!=null&&w.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",w),b.addEventListener("change",async E=>{var O;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId,P=x.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",P),!A||!S)return;await this.updateManager.updateProperty(S,A,P),console.log("[Inspector v1.0.0] Logic ID updated");let I=window,L=(O=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:O[P],T=this.getDefaultPropsForLogic(P,L);console.log("[Inspector v1.0.0] New logic default props:",T);let j=A.replace(".id",".props");await this.updateManager.updateProperty(S,j,T),console.log("[Inspector v1.0.0] Logic props updated to:",T),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(S)})):(b.addEventListener("change",v),(b.tagName==="INPUT"||b.tagName==="TEXTAREA")&&b.addEventListener("input",v))}),this.contentContainer.querySelectorAll("[data-action]").forEach(b=>{b.addEventListener("click",v=>{let w=v.target,E=w.dataset.action,x=w.dataset.path,A=w.dataset.object;E&&x&&A&&this.quickActions.handleAction(E,A,x)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(b=>{b.addEventListener("click",v=>{var x,A;let w=v.target,E=w.dataset.sectionToggle||((x=w.closest("[data-section-toggle]"))==null?void 0:x.getAttribute("data-section-toggle"));if(E){let S=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${E}"]`);S==null||S.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(b=>{b.addEventListener("click",async v=>{let E=v.currentTarget.dataset.motionPreset;!E||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,E)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(b=>{b.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let s=this.contentContainer.querySelector("[data-motion-simple-toggle]");s==null||s.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath;if(!E||!x)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(E);if(!S)return;let P=this.updateManager.getNestedProperty(S,x),I=Array.isArray(P)?[...P]:[];I.push({x:0,y:0}),await this.updateManager.updateProperty(E,x,I),this.loadObject(E)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath,A=Number(w.dataset.index||"-1");if(!E||!x||A<0)return;let S=window.getEditableObjectConfig,P=S==null?void 0:S(E);if(!P)return;let I=this.updateManager.getNestedProperty(P,x);if(!Array.isArray(I))return;let L=I.filter((T,j)=>j!==A);await this.updateManager.updateProperty(E,x,L),this.loadObject(E)})});let p=(f=this.root)==null?void 0:f.querySelector("[data-inspector-advanced]");p==null||p.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let d=(g=this.root)==null?void 0:g.querySelector("[data-convert-toggle]");d==null||d.addEventListener("click",()=>{var v;let b=(v=this.root)==null?void 0:v.querySelector("[data-convert-menu]");b==null||b.classList.toggle("hidden")});let u=(m=this.contentContainer)==null?void 0:m.querySelector("[data-inspector-add-component-btn]"),h=(y=this.contentContainer)==null?void 0:y.querySelector("[data-inspector-component-select]");u==null||u.addEventListener("click",async()=>{let b=h.value;b&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,b)})}getMotionDefaults(){var i,n,r,o;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(o=(r=t.motion)==null?void 0:r.defaults)!=null?o:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let r=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:r},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),r={...(s=i.motion)!=null?s:n},o={...(l=r.intro)!=null?l:{}};r.enabled=!0,o.enabled=!0,r.intro=o,await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=i.render)==null?void 0:r.asset)==null?void 0:o.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
893
|
+
`}attachEventListeners(){var w,A,L,D;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Us((x,P,_)=>{var S,E;this.updateManager.updateProperty(x,P,_),(E=(S=this.options)==null?void 0:S.onPropertyChange)==null||E.call(S,x,P,_)},300),i=x=>x?/(^|\.)logic(\.\d+)?\.id$/.test(x):!1;e.forEach(x=>{let P=S=>{var M,O;let E=S.target,k=E.dataset.propertyPath,T=E.dataset.objectId;if(k&&T){let z=E.value;if(E.type==="checkbox")z=E.checked;else if(E.type==="number"){if(z=parseFloat(E.value),isNaN(z))return}else if(E.dataset.json==="true")try{z=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(T,k,z):(this.updateManager.updateProperty(T,k,z),(O=(M=this.options)==null?void 0:M.onPropertyChange)==null||O.call(M,T,k,z))}},_=x.dataset.propertyPath;i(_)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",_),x.addEventListener("change",async S=>{var j;let E=S.target,k=E.dataset.propertyPath,T=E.dataset.objectId,M=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",M),!k||!T)return;await this.updateManager.updateProperty(T,k,M),console.log("[Inspector v1.0.0] Logic ID updated");let O=window,z=(j=O==null?void 0:O.__HANDLER_LOGIC_META)==null?void 0:j[M],C=this.getDefaultPropsForLogic(M,z);console.log("[Inspector v1.0.0] New logic default props:",C);let I=k.replace(/\.id$/,".props");await this.updateManager.updateProperty(T,I,C),console.log("[Inspector v1.0.0] Logic props updated to:",C),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(T)})):(x.addEventListener("change",P),(x.tagName==="INPUT"||x.tagName==="TEXTAREA")&&x.addEventListener("input",P))}),this.contentContainer.querySelectorAll("[data-action]").forEach(x=>{x.addEventListener("click",P=>{let _=P.target,S=_.dataset.action,E=_.dataset.path,k=_.dataset.object;S&&E&&k&&this.quickActions.handleAction(S,k,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(x=>{x.addEventListener("click",P=>{var E,k;let _=P.target,S=_.dataset.sectionToggle||((E=_.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(S){let T=(k=this.contentContainer)==null?void 0:k.querySelector(`[data-section="${S}"]`);T==null||T.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(x=>{x.addEventListener("click",async P=>{let S=P.currentTarget.dataset.motionPreset;!S||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,S)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(x=>{x.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(x=>{x.addEventListener("click",async P=>{let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),O=Array.isArray(M)?[...M]:[];O.push({x:0,y:0}),await this.updateManager.updateProperty(S,E,O),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(x=>{x.addEventListener("click",async P=>{let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath,k=Number(_.dataset.index||"-1");if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let O=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(O))return;let z=O.filter((C,I)=>I!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(x=>{x.addEventListener("click",async P=>{let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),O=Array.isArray(M)?[...M]:[];O.push({templateId:"",weight:1}),await this.updateManager.updateProperty(S,E,O),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(x=>{x.addEventListener("click",async P=>{var C;let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath,k=Number((C=_.dataset.index)!=null?C:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let O=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(O))return;let z=O.filter((I,j)=>j!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(x=>{x.addEventListener("click",async P=>{var F;let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),O=Array.isArray(M)?[...M]:M!=null?[M]:[],z=this.getDefaultLogicId(),C=window,I=(F=C==null?void 0:C.__HANDLER_LOGIC_META)==null?void 0:F[z],j=this.getDefaultPropsForLogic(z,I);O.push({id:z,props:j}),await this.updateManager.updateProperty(S,E,O),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(x=>{x.addEventListener("click",async P=>{var C;let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath,k=Number((C=_.dataset.index)!=null?C:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let O=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(O))return;let z=O.filter((I,j)=>j!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(x=>{x.addEventListener("click",async P=>{var U,K;let _=P.target,S=_.dataset.objectId,E=_.dataset.propertyPath,k=Number((U=_.dataset.index)!=null?U:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let O=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(O))return;let z=O[k];if(typeof z!="string")return;let C=window,I=(K=C==null?void 0:C.__HANDLER_LOGIC_META)==null?void 0:K[z],j=this.getDefaultPropsForLogic(z,I),F=[...O];F[k]={id:z,props:j},await this.updateManager.updateProperty(S,E,F),this.loadObject(S)})});let m=(w=this.root)==null?void 0:w.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(A=this.root)==null?void 0:A.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var P;let x=(P=this.root)==null?void 0:P.querySelector("[data-convert-menu]");x==null||x.classList.toggle("hidden")});let y=(L=this.contentContainer)==null?void 0:L.querySelector("[data-inspector-add-component-btn]"),v=(D=this.contentContainer)==null?void 0:D.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let x=v.value;x&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,x)})}getMotionDefaults(){var i,n,r,o;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(o=(r=t.motion)==null?void 0:r.defaults)!=null?o:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let r=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:r},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),r={...(s=i.motion)!=null?s:n},o={...(l=r.intro)!=null?l:{}};r.enabled=!0,o.enabled=!0,r.intro=o,await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=i.render)==null?void 0:r.asset)==null?void 0:o.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
797
894
|
<div class="inspector-empty">
|
|
798
895
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
799
896
|
<span class="inspector-empty-text">${e}</span>
|
|
800
897
|
</div>
|
|
801
|
-
`)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215},Collectable:{targetId:"",collectRadius:50,particleEffect:"",autoDestroy:!0,collectSound:""},Spawner:{templateId:"",spawnPattern:"continuous",spawnRate:1e3,poolSize:20,positionSource:"spawner",targetId:"",targetOffset:{x:0,y:0},customPosition:{x:0,y:0},randomBounds:{x:[-100,100],y:[-100,100]},spawnPoints:[],spawnPointMode:"cycle",movementMode:"velocity",velocity:{x:0,y:-300},lifetime:2e3},Damageable:{hitTemplateId:"",hitRadius:50,hp:1,invulnMs:150,flashAlpha:.3,flashDurationMs:100,hitScale:1,hitScaleDurationMs:120,knockback:{x:0,y:0},hpLabelId:"",autoDestroy:!0,destroyEffect:"",destroySound:"",hitEvent:"",destroyEvent:"",hitPopupText:"",hitPopupColor:"#ffffff",hitPopupFontSize:20,hitPopupDurationMs:600,hitPopupOffset:{x:0,y:-20},hitPopupRise:30,hitPopupTemplateId:""}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",logic:"\u{1F3AE}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
898
|
+
`)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultLogicId(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],i=["SwerveMove","DragSnap","JoystickMove","DragToWin"],n=[...t,...i].map(r=>String(r)).filter(r=>r.trim().length>0);return n.length?n[0]:"SwerveMove"}catch{return"SwerveMove"}}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215},Collectable:{targetId:"",collectRadius:50,particleEffect:"",autoDestroy:!0,collectSound:""},Spawner:{templateId:"",spawnTemplates:[],spawnPattern:"continuous",spawnRate:1e3,poolSize:20,positionSource:"spawner",targetId:"",targetOffset:{x:0,y:0},customPosition:{x:0,y:0},randomBounds:{x:[-100,100],y:[-100,100]},spawnPoints:[],spawnPointMode:"cycle",movementMode:"velocity",velocity:{x:0,y:-300},lifetime:2e3},Damageable:{hitTemplateId:"",hitRadius:50,hp:1,invulnMs:150,flashAlpha:.3,flashDurationMs:100,hitScale:1,hitScaleDurationMs:120,knockback:{x:0,y:0},hpLabelId:"",autoDestroy:!0,destroyEffect:"",destroySound:"",hitEvent:"",destroyEvent:"",hitPopupText:"",hitPopupColor:"#ffffff",hitPopupFontSize:20,hitPopupDurationMs:600,hitPopupOffset:{x:0,y:-20},hitPopupRise:30,hitPopupTemplateId:""}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",logic:"\u{1F3AE}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
802
899
|
<div class="inspector-empty">
|
|
803
900
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
804
901
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
805
902
|
</div>
|
|
806
|
-
`)}};var
|
|
903
|
+
`)}};var qr=qe(require("jszip"),1);function $n(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function Or(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ir(a){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=a})}async function Ii(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await $n(n),o=await Ir(r),s=Or(r);return console.log("[ImageUtils] Success resolution:",o==null?void 0:o.width,"x",o==null?void 0:o.height,"mime:",s.mimeType),{base64:s.base64,mimeType:s.mimeType,dataUrl:r,width:(e=o==null?void 0:o.width)!=null?e:0,height:(t=o==null?void 0:o.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Le(a){var e,t;try{let i=await $n(a),n=await Ir(i),r=Or(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function Hn(a){return $n(a).then(e=>e).catch(()=>null)}function Nn(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(n),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function et(a,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=a}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],g=o[d+1],f=o[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function jr(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function Rr(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function Gs(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?Rr((r=t.split("/").pop())!=null?r:t):void 0}function qs(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(n=W(e.id))!=null?n:a,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Fn(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let o of a){if(typeof o=="string"){let s=Rr((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=Gs(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(n=W(o.role))!=null?n:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(a)){let r=[];for(let[o,s]of Object.entries(a)){let l=qs(o,s,e);l&&r.push(l)}return r}return[]}function Vs(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function Ws(a){if(ye(a.brand_dna)&&ye(a.brand_dna.colors))return a.brand_dna;if(ye(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),ye(a.fonts)&&(e.fonts=a.fonts),e}}function Ys(a){var t;let e=new Map;for(let i of a){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Bn(a,e={}){var o,s,l;let t=a.filter(ye),i=(s=(o=t.map(Vs).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(Ws).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Fn(c.layers,"visual element")),"assets"in c&&r.push(...Fn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...Fn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Ys(r)}}var zr=require("@google/genai");async function ji(a,e,t=[],i={}){var n,r,o,s,l,c,p;try{if(!(a!=null&&a.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let d=new zr.GoogleGenAI({apiKey:a}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:g}),h="",m=(o=(r=(n=f.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:o.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(s=d.message)!=null&&s.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}var Dr=require("@google/genai");async function tt(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Dr.GoogleGenAI({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function $r(a){let e=a.brandAssets.map(r=>{let o=`- ${r.id}: ${r.role}`;return r.layout&&(o+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),o}).join(`
|
|
807
904
|
`)||"None",t=a.brandDna?`Colors: ${JSON.stringify(a.brandDna.colors)}, Style: ${a.brandDna.style||"not specified"}`:"Not provided",i=a.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
|
|
808
905
|
`),n="";if(a.brandConfig){let r=a.brandConfig,o=[];r.splash&&o.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&o.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&o.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),o.length>0&&(n=`
|
|
809
906
|
BRAND CONTENT:
|
|
@@ -867,7 +964,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
|
|
|
867
964
|
}
|
|
868
965
|
]
|
|
869
966
|
}
|
|
870
|
-
`.trim()}function
|
|
967
|
+
`.trim()}function Hr(a){var n,r;let e=(n=a.brandDna)!=null&&n.colors?`Primary: ${a.brandDna.colors.primary}, Secondary: ${a.brandDna.colors.secondary||"N/A"}, Accent: ${a.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((r=a.brandDna)==null?void 0:r.style)||"modern gaming style",i=a.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
|
|
871
968
|
TASK: ${a.prompt}
|
|
872
969
|
|
|
873
970
|
BRAND STYLE:
|
|
@@ -888,7 +985,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
888
985
|
|
|
889
986
|
OUTPUT:
|
|
890
987
|
Generate the requested asset matching the brand style.${a.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
891
|
-
`.trim()}function
|
|
988
|
+
`.trim()}function Nr(a){return a.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 Fr(a,e){return!(a.includes("background")&&(a.includes("_1")||a.includes("splash")||a.includes("endgame")||a.includes("main"))||e==="text"||e==="effects"&&a.includes("particle"))}async function Br(a){var o,s;let e=Nr(a.gameObjects),t={gamePrompt:a.gamePrompt,gameObjects:e,brandAssets:a.manifest.assets,brandDna:a.manifest.brand_dna,brandName:a.manifest.brand_name},i=$r(t),n=[];if(a.flatDesignDataUrl)try{let l=Ur(a.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 r;try{r=await ji(a.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(o=l.message)!=null&&o.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(s=l.message)!=null&&s.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Ks(r,a.gameObjects)}function Ks(a,e){try{let t=a,i=a.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=a.match(/\{[\s\S]*\}/);r&&(t=r[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:a,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:a,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:a,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Un(a,e,t={}){var n;let i=e.mappings.filter(r=>r.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let r=0;r<i.length;r++){let o=i[r];(n=t.onProgress)==null||n.call(t,r+1,i.length,o.game_object);try{let s=await Xs(a,o);o.output_dataUrl=s,o.status="Generated \u2713"}catch(s){console.error(`[Pipeline] Failed to generate ${o.game_object}:`,s),o.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Xs(a,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&a.manifest){let s=a.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=a.assetFiles.get(s.file);if(l){let c=await Le(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(a.flatDesignDataUrl){let s=Ur(a.flatDesignDataUrl);s&&t.push(s)}let i=Fr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:a.manifest.brand_dna,needsTransparency:i},r=Hr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await tt(a.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await et(o)||o}function Ur(a){let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Gr(a,e){let t=a.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,r])=>({id:n,file:String(r),role:"visual element"})):i=[],a.assets=i;for(let n of i){let r=e.get(n.file);if(r){let o=await Le(r);o&&(n.dataUrl=o.dataUrl)}}}var Ri=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
|
|
892
989
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
893
990
|
<div class="scene-panel-header" data-panel-handle>
|
|
894
991
|
<div class="panel-title">
|
|
@@ -1004,15 +1101,15 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1004
1101
|
</div>
|
|
1005
1102
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
1006
1103
|
</div>
|
|
1007
|
-
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,o,s,l,c,p,d,u,
|
|
1104
|
+
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,o,s,l,c,p,d,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",h=>{this.handleZipUpload(h)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(w=>w.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(w=>w.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await qr.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Bn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of r){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
|
|
1008
1105
|
\u{1F3F7}\uFE0F Brand: ${((s=this.normalizedManifest)==null?void 0:s.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let r=n.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},n.onerror=r=>{console.error("FileReader error:",r),i(r)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let r of e){let o=r.category||"misc";n[o]||(n[o]=[]),i.libraryAssets[o]||(i.libraryAssets[o]=[]),i.libraryAssets[o].some(l=>l.filename===r.filename)||(i.libraryAssets[o].unshift({filename:r.filename,displayName:r.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${r.filename} to registry category ${o}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let s=await o.text(),l=JSON.parse(s);this.uploadedJsons.set(o.name,l),l.layers?n+=`\u2705 Layers: ${o.name}
|
|
1009
1106
|
`:l.brand_dna||l.colors?n+=`\u2705 Brand: ${o.name}
|
|
1010
1107
|
`:n+=`\u2705 Loaded: ${o.name}
|
|
1011
1108
|
`}catch{n+=`\u274C Error in ${o.name}
|
|
1012
|
-
`}try{this.normalizedManifest=
|
|
1109
|
+
`}try{this.normalizedManifest=Bn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
|
|
1013
1110
|
\u{1F4E6} Normalized manifest: ${o} assets`,n+=`
|
|
1014
1111
|
\u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:o,brandName:this.normalizedManifest.brand_name})}catch(o){console.error("[BrandVision] Failed to normalize manifest:",o),this.normalizedManifest=null,n+=`
|
|
1015
|
-
\u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,o;let i=(r=e.target.files)==null?void 0:r[0];if(!i)return;let n=await Le(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let s=(o=this.root)==null?void 0:o.querySelector("[data-vision-flat-preview]");s&&(s.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,r,o,s,l,c;if(this.isAnalyzing)return;let e=(r=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:r.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await
|
|
1112
|
+
\u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,o;let i=(r=e.target.files)==null?void 0:r[0];if(!i)return;let n=await Le(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let s=(o=this.root)==null?void 0:o.querySelector("[data-vision-flat-preview]");s&&(s.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,r,o,s,l,c;if(this.isAnalyzing)return;let e=(r=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:r.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Gr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await Br(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(o=d.parseError)!=null?o:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(s=this.mappingResult)==null?void 0:s.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Un(r,this.mappingResult,{onProgress:(o,s,l)=>{this.setStatus("apply",`Generating ${o}/${s}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var s;let e=(s=this.root)==null?void 0:s.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),o=n?`
|
|
1016
1113
|
<div class="vision-raw-block">
|
|
1017
1114
|
<div class="inspector-text-sm" style="white-space: pre-wrap;">
|
|
1018
1115
|
\u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
|
|
@@ -1022,7 +1119,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1022
1119
|
</div>
|
|
1023
1120
|
`:"";e.innerHTML=`
|
|
1024
1121
|
${o}
|
|
1025
|
-
${this.mappingResult.mappings.map(l=>{var
|
|
1122
|
+
${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!f,m=`
|
|
1026
1123
|
<select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
|
|
1027
1124
|
<option value="">Select brand asset\u2026</option>
|
|
1028
1125
|
${r.replace(`value="${p}"`,`value="${p}" selected`)}
|
|
@@ -1063,7 +1160,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1063
1160
|
</div>
|
|
1064
1161
|
<div class="vision-mapping-preview">
|
|
1065
1162
|
<div class="inspector-text-sm" style="opacity:0.8;">Preview</div>
|
|
1066
|
-
${
|
|
1163
|
+
${h?`<img src="${f}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
|
|
1067
1164
|
</div>
|
|
1068
1165
|
</div>
|
|
1069
1166
|
|
|
@@ -1074,8 +1171,8 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1074
1171
|
</div>
|
|
1075
1172
|
</div>
|
|
1076
1173
|
`}).join("")}
|
|
1077
|
-
`}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,r=this.getPreviewValueForMapping(n);if(!r.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,r.value):r.value;o&&(await this.stageEngineAssetOverride(n,o),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(r=>r.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(r=this.mappingResult)==null?void 0:r.mappings.find(o=>o.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,r,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,r,o;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(o=(r=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:o.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let s={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await
|
|
1078
|
-
`)}var
|
|
1174
|
+
`}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,r=this.getPreviewValueForMapping(n);if(!r.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,r.value):r.value;o&&(await this.stageEngineAssetOverride(n,o),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(r=>r.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(r=this.mappingResult)==null?void 0:r.mappings.find(o=>o.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,r,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,r,o;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(o=(r=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:o.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let s={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Un(s,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(s){console.error("[BrandVision] generateOne failed:",s),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(X(),Je));i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let o=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(o!=null&&o.success)||!(o!=null&&o.path))return console.error("[BrandVision] Save to library failed:",(o==null?void 0:o.error)||o),null;let s=window.addAssetToRegistry;typeof s=="function"&&s(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(o.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let o=n.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let r=n==null?void 0:n.categories;if(Array.isArray(r)&&r.length>0){let o=e.toLowerCase(),s=l=>r.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||r[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||r[0]}}let 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 r;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=(r=this.root)==null?void 0:r.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,r=s=>{let l=Math.max(300,n+(s.clientX-i));this.root.style.width=`${l}px`},o=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",o)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",o)})}refresh(){}};function Vr(a,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${a}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
1175
|
+
`)}var Js=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],Zs=["cta_hint","cta_label_end"],Wr=[{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"}],Qs=["brand.primary","brand.heading","brand.body","brand.warning"],zi=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`
|
|
1079
1176
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
1080
1177
|
<div class="scene-panel-header" data-panel-handle>
|
|
1081
1178
|
<div class="panel-title">
|
|
@@ -1143,7 +1240,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1143
1240
|
<path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
|
|
1144
1241
|
<path d="M5 14v4h14v-4h2v6H3v-6h2z" />
|
|
1145
1242
|
</svg>
|
|
1146
|
-
`;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let
|
|
1243
|
+
`;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,s,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(o),r.appendChild(s),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Js.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=i,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=i,s.className="customize-color-text",s.dataset.colorTextKey=t,o.addEventListener("input",()=>{s.value=o.value}),s.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(s.value)&&(o.value=s.value)}),n.appendChild(r),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Qs.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=e==null?void 0:e[t])!=null?o:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",Zs.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.readUiValue(e,t))!=null?o:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(s=this.textsContainer)==null||s.appendChild(i)}),Wr.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let o=document.createElement("input");o.type="text",o.value=(s=this.getObjectTextValue(i))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,n.appendChild(r),n.appendChild(o),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=i.replace("_"," ");let o=document.createElement("input");o.type=i.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[i])!=null?s:""),o.className="customize-input",o.dataset.audioKey=i,i.includes("file")&&(o.placeholder="audio file path"),n.appendChild(r),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let o of n){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),o=n;for(let s of r){if(o==null)return null;o=o[s]}return typeof o=="string"?o:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(s=>{let l=s;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(s=>{let l=s,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(s=>{let l=s,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(r[c]=l.value)});let o={};this.root.querySelectorAll("[data-audio-key]").forEach(s=>{let l=s,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);o[c]=isNaN(p)?0:p}else o[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(s=>{let l=s,c=l.dataset.objectTextKey;if(!c)return;let p=Wr.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:r,fonts:n,audio:o}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await Ii(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,r,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(r=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=i==null?void 0:i.dataUrl)!=null?o:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(r.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(r),n.appendChild(s),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var o,s;let i=t,n=i.dataset.assetKey,r=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var s,l,c,p,d,u,g,f,h,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
|
|
1147
1244
|
<div class="ai-modal-card">
|
|
1148
1245
|
<div class="ai-modal-header">
|
|
1149
1246
|
<div>
|
|
@@ -1214,7 +1311,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1214
1311
|
</div>
|
|
1215
1312
|
</div>
|
|
1216
1313
|
</div>
|
|
1217
|
-
`;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",y=>{y.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var y;return(y=this.aiReferenceInput)==null?void 0:y.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiStrengthInput)==null?void 0:b.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=y)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiBgToleranceInput)==null?void 0:b.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=y),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var b,v,w;let y=(w=(v=(b=this.aiReferenceInput)==null?void 0:b.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=y,this.aiReferenceName&&(this.aiReferenceName.textContent=y?`${y.name} (loaded)`:"Optional"),y&&this.setAiStatus(`Reference attached: ${y.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(h=this.aiApplyBtn)==null||h.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(g=this.aiCropBtn)==null||g.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P,I,L,T,j;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(h=this.aiModelSelect)==null?void 0:h.value)!=null?f:"gemini-2.5-flash-image",i=(y=(m=(g=this.aiPromptInput)==null?void 0:g.value)==null?void 0:m.trim())!=null?y:"",n=(v=(b=this.aiRemoveBgToggle)==null?void 0:b.checked)!=null?v:!1,r=n,o=n,s=Number((E=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((x=l==null?void 0:l.value)==null?void 0:x.trim())||((A=this.aiBaseValue)==null?void 0:A.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let O=null,D=(S=this.getSelectedAssetKey())!=null?S:"unknown",R=(P=this.aiUseOutputToggle)!=null&&P.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let ae=Hn(this.aiOutputDataUrl,"ai-output.png");if(ae){let re=await Le(ae);re&&(O={input:{base64:re.base64,mimeType:re.mimeType},dataUrl:re.dataUrl,width:re.width,height:re.height})}}if(O||(O=await this.getImageDataFromAsset(c)),!O){this.setAiStatus("Unable to load the base image.");return}let $=[O.input],C=!1;if(this.aiReferenceFile){let ae=await Le(this.aiReferenceFile);ae?($.push({base64:ae.base64,mimeType:ae.mimeType}),C=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=qr(i,{includeReference:C,includeMagenta:r,changeLevel:s}),M=(T=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?T:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:D,base:R,reference:M});let q=Ir(O.width,O.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await et(e,_,$,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",V==null?void 0:V.length),this.aiRawOutputDataUrl=V,await this.refreshAiOutputFromRaw()}catch(O){console.error("[CustomizePanel] AI Generate Error:",O),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((j=this.aiStatusEl)==null?void 0:j.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Qe(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(y){console.warn("[CustomizePanel] Setup-library endpoint not available:",y)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let h=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),g=this.getSelectedAssetInput();if(g&&(g.value=c.path,this.handleAssetValueChange((s=g.dataset.assetKey)!=null?s:"",g)),h&&f){console.log("[CustomizePanel] Applying saved asset to object:",h,f);let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(c.path);await y(h,v,n)}else this.applyObjectPropertyValue(h,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&(console.log("[CustomizePanel] Highlighting slot in library:",h,n),setTimeout(()=>{m(h,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Hn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let o=await $n(r);o&&this.setAiOutput(o)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let o=await $n(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(y){console.warn("[CustomizePanel] Setup-library not available:",y)}let h=window.refreshAssetLibrary;typeof h=="function"&&await h(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),g=this.inferPathFromAssetKey(i);if(f&&g){let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(d.path);await y(f,v,c)}else this.applyObjectPropertyValue(f,g,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
1314
|
+
`;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,w;let b=(w=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,f,h,m,b,y,v,w,A,L,D,x,P,_,S,E,k;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=n,o=n,s=Number((A=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?A:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((L=l==null?void 0:l.value)==null?void 0:L.trim())||((D=this.aiBaseValue)==null?void 0:D.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let T=null,M=(x=this.getSelectedAssetKey())!=null?x:"unknown",O=(P=this.aiUseOutputToggle)!=null&&P.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl){let K=Nn(this.aiOutputDataUrl,"ai-output.png");if(K){let re=await Le(K);re&&(T={input:{base64:re.base64,mimeType:re.mimeType},dataUrl:re.dataUrl,width:re.width,height:re.height})}}if(T||(T=await this.getImageDataFromAsset(c)),!T){this.setAiStatus("Unable to load the base image.");return}let z=[T.input],C=!1;if(this.aiReferenceFile){let K=await Le(this.aiReferenceFile);K?(z.push({base64:K.base64,mimeType:K.mimeType}),C=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let I=Vr(i,{includeReference:C,includeMagenta:r,changeLevel:s}),j=(E=(S=this.aiReferenceFile)==null?void 0:S.name)!=null?E:"none";console.info("[AI] Final prompt:",I),console.info("[AI] Image sources:",{assetKey:M,base:O,reference:j});let F=jr(T.width,T.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let U=await tt(e,I,z,{aspectRatio:F,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",U==null?void 0:U.length),this.aiRawOutputDataUrl=U,await this.refreshAiOutputFromRaw()}catch(T){console.error("[CustomizePanel] AI Generate Error:",T),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((k=this.aiStatusEl)==null?void 0:k.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await et(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((s=h.dataset.assetKey)!=null?s:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Nn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let o=await Hn(r);o&&this.setAiOutput(o)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let o=await Hn(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(f,v,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
1218
1315
|
<div class="asset-preview-card">
|
|
1219
1316
|
<div class="asset-preview-header">
|
|
1220
1317
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -1230,7 +1327,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1230
1327
|
<img class="asset-preview-ai-image" alt="AI output preview">
|
|
1231
1328
|
</div>
|
|
1232
1329
|
</div>
|
|
1233
|
-
`;let o=r.querySelector(".asset-preview-body"),s=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(s==null||s.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=r=>{var u,
|
|
1330
|
+
`;let o=r.querySelector(".asset-preview-body"),s=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(s==null||s.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=r=>{var u,g;r.preventDefault();let o=r.clientX,s=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=f=>{let h=f.clientX-o,m=Math.min(c,Math.max(l,s+h));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var h,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,r=URL.createObjectURL(e),o=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(o!=null&&o.naturalWidth)||!(o!=null&&o.naturalHeight))return null;let s=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
|
|
1234
1331
|
<div class="asset-crop-card" style="width:${p}px;">
|
|
1235
1332
|
<div class="asset-crop-header">
|
|
1236
1333
|
<div>
|
|
@@ -1242,11 +1339,11 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1242
1339
|
<div class="asset-crop-body">
|
|
1243
1340
|
<div class="asset-crop-column">
|
|
1244
1341
|
<div class="asset-crop-label">Crop</div>
|
|
1245
|
-
<canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(
|
|
1342
|
+
<canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
|
|
1246
1343
|
</div>
|
|
1247
1344
|
<div class="asset-crop-column">
|
|
1248
1345
|
<div class="asset-crop-label">Compare</div>
|
|
1249
|
-
<canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(
|
|
1346
|
+
<canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
|
|
1250
1347
|
</div>
|
|
1251
1348
|
</div>
|
|
1252
1349
|
<div class="asset-crop-controls">
|
|
@@ -1260,7 +1357,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1260
1357
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
1261
1358
|
</div>
|
|
1262
1359
|
</div>
|
|
1263
|
-
`;let
|
|
1360
|
+
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),A=c.querySelector(".asset-crop-zoom-value"),L=c.querySelector(".asset-crop-close"),D=c.querySelector(".asset-crop-cancel"),x=c.querySelector(".asset-crop-apply"),P=c.querySelector(".asset-crop-reset");if(!y||!v||!w||!A){l(null);return}let _=y.getContext("2d"),S=v.getContext("2d");if(!_||!S){l(null);return}let E=o.naturalWidth,k=o.naturalHeight,T=Math.max(y.width/E,y.height/k),M=1,O=0,z=0,C=!1,I=0,j=0,F=0,U=0,K=()=>{let $=T*M,_e=Math.max(0,(E*$-y.width)/2),Be=Math.max(0,(k*$-y.height)/2);O=Math.min(_e,Math.max(-_e,O)),z=Math.min(Be,Math.max(-Be,z))},re=()=>{let $=T*M;_.clearRect(0,0,y.width,y.height);let _e=y.width/2-E*$/2+O,Be=y.height/2-k*$/2+z;if(_.drawImage(o,_e,Be,E*$,k*$),S.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let Ge=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),rn=v.width/2-s.naturalWidth*Ge/2,ht=v.height/2-s.naturalHeight*Ge/2;S.drawImage(s,rn,ht,s.naturalWidth*Ge,s.naturalHeight*Ge)}else S.fillStyle="rgba(255, 255, 255, 0.04)",S.fillRect(0,0,v.width,v.height),S.strokeStyle="rgba(255, 255, 255, 0.08)",S.strokeRect(4,4,v.width-8,v.height-8);let gt=v.width/y.width*(T*M),Ue=O*(v.width/y.width),Bt=z*(v.height/y.height),nn=v.width/2-E*gt/2+Ue,an=v.height/2-k*gt/2+Bt;S.save(),S.globalAlpha=.7,S.drawImage(o,nn,an,E*gt,k*gt),S.restore()},_a=()=>{O=0,z=0,K(),re()};w.addEventListener("input",()=>{M=Number(w.value),A.textContent=`${M.toFixed(2)}\xD7`,K(),re()}),y.addEventListener("pointerdown",$=>{C=!0,I=$.clientX,j=$.clientY,F=O,U=z,y.setPointerCapture($.pointerId)}),y.addEventListener("pointermove",$=>{C&&(O=F+($.clientX-I),z=U+($.clientY-j),K(),re())}),y.addEventListener("pointerup",$=>{C=!1,y.releasePointerCapture($.pointerId)}),y.addEventListener("pointerleave",()=>{C=!1});let en=()=>{c.remove()},tn=()=>{en(),l(null)},Do=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let _e=$.getContext("2d");if(!_e){en(),l(null);return}let Be=M,Ue=Math.max($.width/E,$.height/k)*Be,Bt=$.width/y.width,nn=O*Bt,an=z*Bt,Ge=$.width/2-E*Ue/2+nn,rn=$.height/2-k*Ue/2+an;_e.drawImage(o,Ge,rn,E*Ue,k*Ue);let ht=await new Promise($o=>{$.toBlob(Ho=>$o(Ho),e.type||"image/png")});if(en(),!ht){l(null);return}l(new File([ht],e.name,{type:ht.type}))};L==null||L.addEventListener("click",tn),D==null||D.addEventListener("click",tn),P==null||P.addEventListener("click",_a),x==null||x.addEventListener("click",()=>{Do()}),c.addEventListener("click",$=>{$.target===c&&tn()}),document.body.appendChild(c),_a()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var Di=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
1264
1361
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
1265
1362
|
<div class="scene-panel-header" data-panel-handle>
|
|
1266
1363
|
<div class="panel-title">
|
|
@@ -1326,10 +1423,10 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1326
1423
|
</div>
|
|
1327
1424
|
</div>
|
|
1328
1425
|
</div>
|
|
1329
|
-
`}initialize(e,t){var b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var _;let C=window.getEditableEngineConfig;if(typeof C=="function"){let M=C();return(_=M==null?void 0:M.loading)!=null?_:{}}return{}})(),r=(b=this.root)==null?void 0:b.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{background_color:o.value})}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((x=n.overlay_alpha)!=null?x:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var _,M;let C=Number(s.value);l&&(l.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{overlay_alpha:C})}));let c=(A=this.root)==null?void 0:A.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{text:c.value})}));let p=(S=this.root)==null?void 0:S.querySelector("#loading-text-scale"),d=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,M;let C=Number(p.value);d&&(d.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{text_scale:C})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{enabled:u.checked})}));let h=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");h&&(h.checked=n.blur_enabled!==!1,h.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_enabled:h.checked})}));let f=(j=this.root)==null?void 0:j.querySelector("#loading-blur-strength"),g=(O=this.root)==null?void 0:O.querySelector("#loading-blur-strength-value");f&&(f.value=String((D=n.blur_strength)!=null?D:8),g&&(g.textContent=f.value),f.addEventListener("input",()=>{var C,_;g&&(g.textContent=f.value),(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_strength:Number(f.value)})}));let m=(R=this.root)==null?void 0:R.querySelector("#loading-show-btn"),y=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onShowLoadingScreen)==null||_.call(C)}),y==null||y.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onHideLoadingScreen)==null||_.call(C)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Lt=require("pixi.js");Ke();K();async function Wr(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let h=e.replace(/s$/,"");return u.startsWith(h)||u.includes(h)});for(let u of p)se[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let h=d.get(u);if(h){let f=((n=h.getDisplayObject)==null?void 0:n.call(h))||h.pixiObject||h;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Yr(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(m=>m.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Lt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,h=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(h)||m.includes(h));for(let m of f)se[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let g=window.gameObjectManager;if(g)for(let m of f){let y=g.get(m);if(y){let b=((n=y.getDisplayObject)==null?void 0:n.call(y))||y.pixiObject||y;b!=null&&b.texture&&(b.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Kr(a,e,t,i){var n,r,o,s,l,c,p,d,u,h,f,g,m,y,b;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),E=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",E);let x=await Lt.Assets.load(E);if(!x){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),se[v]=x,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let A=window.CustomAssets;A!=null&&A[v]&&(A[v].texture=x,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let S=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!S),S){let I=Array.from(((n=S.keys)==null?void 0:n.call(S))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let L=S.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!L),L){let T=((r=L.getDisplayObject)==null?void 0:r.call(L))||L.pixiObject||L.pixi||L,j=(o=T==null?void 0:T.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",T),console.log("[LIBRARY] displayObject type:",j),console.log("[LIBRARY] has texture?",!!(T!=null&&T.texture)),T!=null&&T.texture)T.texture=x,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(j==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:O}=await import("pixi.js"),D=T.parent,R=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,T))!=null?l:0,$={x:T.x,y:T.y},C={x:(p=(c=T.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=T.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(f=(h=T.scale)==null?void 0:h.x)!=null?f:1,y:(m=(g=T.scale)==null?void 0:g.y)!=null?m:1},M=(y=T.alpha)!=null?y:1,q=(b=T.visible)!=null?b:!0,V=new O(x);V.anchor.set(C.x,C.y),V.position.set($.x,$.y),V.scale.set(_.x,_.y),V.alpha=M,V.visible=q,D&&(D.removeChild(T),D.addChildAt(V,R),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=V),L.pixi&&(L.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(T!=null&&T.children){let O=T.children.find(D=>D.texture);O?(O.texture=x,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let P=`raw/library/${i}/${t}`;Ae({objectId:v,path:"render.asset.path",value:P}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",P)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Xr(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}se[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Ae({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var _t=require("pixi.js");var Un=require("pixi.js"),ke=()=>window.debugConfig||{},Jr=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),Zr=()=>window.resolveScreenAnchorPoint||(()=>new Un.Point),Qr=()=>window.resolveScreenRatioPoint||(()=>new Un.Point);function eo(a){Di(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a))))}function to(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),Pt(a)}function Di(a){return a.isDebugOpen}function $i(a){var r,o,s;if(!Di(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a));let e=Gn(a);if(!e){kt(a,null),Pt(a);return}let t=qn(a,e);if(!t){kt(a,null),Pt(a);return}let i=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Vn(a,t);kt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),a.highlightObject?Xn(a,t):Zn(a),a.highlightAnchor&&n?Jn(a,n):Qn(a)}function Gn(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function qn(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function Mt(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Vn(a,e){var o,s;let t=Mt(a);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Wn(a);if(!n)return null;if(i.position_ratio!=null)return Qr()(n.width,n.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Zr()(n.width,n.height,r)}function Wn(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function Yn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new _t.Graphics,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function Kn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new _t.Graphics,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function Xn(a,e){var n;let t=Yn(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Jn(a,e){let t=Kn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Zn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function Qn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function Pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function kt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function io(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function no(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[n]=t}function ea(a){var i,n,r,o,s;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=a.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ni(a){let e=ke();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function ao(a){window.location.reload()}function Fi(a){let e=JSON.stringify(ke(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function ro(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(pi(),Pr)),d=(((t=(await s("scene.main")).scene)==null?void 0:t.objects)||[]).find(h=>h.object_config===e||h.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Hi(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Hi(a,o),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Hi(a,e){var d,u,h,f,g,m,y,b,v,w;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),o=a.container.querySelector("#config-anchor-y"),l=ea(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((h=l==null?void 0:l.x)!=null?h:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(g=e.transform)==null?void 0:g.scale)!=null?m:1));let c=(w=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(b=e.render)==null?void 0:b.anchor)!=null?w:{x:.5,y:.5},p=Jr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function oo(a){var l,c,p,d,u,h,f,g,m,y;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(h=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?h:"1",r=(g=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?g:"0.5",o=(y=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?y:"0.5",s=`${e}:
|
|
1426
|
+
`}initialize(e,t){var y,v,w,A,L,D,x,P,_,S,E,k,T,M,O,z;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var I;let C=window.getEditableEngineConfig;if(typeof C=="function"){let j=C();return(I=j==null?void 0:j.loading)!=null?I:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{background_color:o.value})}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(A=this.root)==null?void 0:A.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((L=n.overlay_alpha)!=null?L:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var I,j;let C=Number(s.value);l&&(l.textContent=C.toFixed(2)),(j=(I=this.options)==null?void 0:I.onUpdateLoading)==null||j.call(I,{overlay_alpha:C})}));let c=(D=this.root)==null?void 0:D.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{text:c.value})}));let p=(x=this.root)==null?void 0:x.querySelector("#loading-text-scale"),d=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale-value");p&&(p.value=String((_=n.text_scale)!=null?_:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var I,j;let C=Number(p.value);d&&(d.textContent=C.toFixed(2)),(j=(I=this.options)==null?void 0:I.onUpdateLoading)==null||j.call(I,{text_scale:C})}));let u=(S=this.root)==null?void 0:S.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{blur_enabled:g.checked})}));let f=(k=this.root)==null?void 0:k.querySelector("#loading-blur-strength"),h=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength-value");f&&(f.value=String((M=n.blur_strength)!=null?M:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var C,I;h&&(h.textContent=f.value),(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{blur_strength:Number(f.value)})}));let m=(O=this.root)==null?void 0:O.querySelector("#loading-show-btn"),b=(z=this.root)==null?void 0:z.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onShowLoadingScreen)==null||I.call(C)}),b==null||b.addEventListener("click",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onHideLoadingScreen)==null||I.call(C)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Lt=require("pixi.js");Ke();X();async function Yr(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)se[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Kr(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(m=>m.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Lt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)se[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Xr(a,e,t,i){var n,r,o,s,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),A=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",A);let L=await Lt.Assets.load(A);if(!L){console.error("[LIBRARY] Failed to load texture:",A);return}console.log("[LIBRARY] \u2705 Texture loaded"),se[v]=L,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let D=window.CustomAssets;D!=null&&D[v]&&(D[v].texture=L,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let x=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!x),x){let _=Array.from(((n=x.keys)==null?void 0:n.call(x))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",_);let S=x.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!S),S){let E=((r=S.getDisplayObject)==null?void 0:r.call(S))||S.pixiObject||S.pixi||S,k=(o=E==null?void 0:E.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",k),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=L,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(k==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:T}=await import("pixi.js"),M=E.parent,O=(l=(s=M==null?void 0:M.getChildIndex)==null?void 0:s.call(M,E))!=null?l:0,z={x:E.x,y:E.y},C={x:(p=(c=E.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=E.anchor)==null?void 0:d.y)!=null?u:.5},I={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},j=(b=E.alpha)!=null?b:1,F=(y=E.visible)!=null?y:!0,U=new T(L);U.anchor.set(C.x,C.y),U.position.set(z.x,z.y),U.scale.set(I.x,I.y),U.alpha=j,U.visible=F,M&&(M.removeChild(E),M.addChildAt(U,O),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),S.pixiObject&&(S.pixiObject=U),S.pixi&&(S.pixi=U),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let T=E.children.find(M=>M.texture);T?(T.texture=L,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let P=`raw/library/${i}/${t}`;Ae({objectId:v,path:"render.asset.path",value:P}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",P)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Jr(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}se[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Ae({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var Mt=require("pixi.js");var Gn=require("pixi.js"),ke=()=>window.debugConfig||{},Zr=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),Qr=()=>window.resolveScreenAnchorPoint||(()=>new Gn.Point),eo=()=>window.resolveScreenRatioPoint||(()=>new Gn.Point);function to(a){$i(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>Hi(a))))}function io(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),Pt(a)}function $i(a){return a.isDebugOpen}function Hi(a){var r,o,s;if(!$i(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>Hi(a));let e=qn(a);if(!e){kt(a,null),Pt(a);return}let t=Vn(a,e);if(!t){kt(a,null),Pt(a);return}let i=new Mt.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Wn(a,t);kt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),a.highlightObject?Jn(a,t):Qn(a),a.highlightAnchor&&n?Zn(a,n):ea(a)}function qn(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Vn(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function _t(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Wn(a,e){var o,s;let t=_t(a);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Yn(a);if(!n)return null;if(i.position_ratio!=null)return eo()(n.width,n.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Qr()(n.width,n.height,r)}function Yn(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function Kn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new Mt.Graphics,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function Xn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new Mt.Graphics,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function Jn(a,e){var n;let t=Kn(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Zn(a,e){let t=Xn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Qn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function ea(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function Pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function kt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function no(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function ao(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[n]=t}function ta(a){var i,n,r,o,s;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=a.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Fi(a){let e=ke();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function ro(a){window.location.reload()}function Bi(a){let e=JSON.stringify(ke(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function oo(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(pi(),Mr)),d=(((t=(await s("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Ni(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Ni(a,o),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Ni(a,e){var d,u,g,f,h,m,b,y,v,w;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),o=a.container.querySelector("#config-anchor-y"),l=ta(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(w=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?w:{x:.5,y:.5},p=Zr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function so(a){var l,c,p,d,u,g,f,h,m,b;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",o=(b=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",s=`${e}:
|
|
1330
1427
|
position: (${t}, ${i})
|
|
1331
1428
|
scale: ${n}
|
|
1332
|
-
anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(b=>console.error("[DEBUG] Failed to copy config values:",b))}async function ta(a,e){var d,u,h,f,g,m,y,b,v,w,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(h=a.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?f:0),r=Number((m=(g=a.container.querySelector("#config-scale"))==null?void 0:g.value)!=null?m:1),o=Number((b=(y=a.container.querySelector("#config-anchor-x"))==null?void 0:y.value)!=null?b:.5),s=Number((w=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Xe));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=Mt(a);ea(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let x=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);x?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,x)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function so(a,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Xe));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let h=p.split("."),f=c;for(let g=0;g<h.length-1;g++){let m=h[g];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[h[h.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function lo(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ta(a,{silent:!0})},150))}var Qs=3e3;function Ot(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,r=0,o=0,s=0,l=0,c=0,p=0,d=h=>{if(!n)return;let f=i.getBoundingClientRect();a.style.left=`${h.clientX-f.left-c}px`,a.style.top=`${h.clientY-f.top-p}px`},u=()=>{n&&(n=!1,a.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",h=>{if(h.button!==0)return;let f=h.target;if(f!=null&&f.closest("button, input, select, textarea"))return;h.preventDefault();let g=a.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",a.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:g.left,top:g.top,width:g.width,height:g.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:h.clientX,y:h.clientY}),c=h.clientX-g.left,p=h.clientY-g.top,console.log("[DRAG] offset:",{x:c,y:p});let y=g.left-m.left,b=g.top-m.top;console.log("[DRAG] targetPosition:",{left:y,top:b}),a.style.left=`${y}px`,a.style.top=`${b}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++Qs),n=!0,a.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function co(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{var b;if(!c)return;let h=u.clientX-s,f=u.clientY-l,g=Math.max(i,r+h),m=Math.max(n,o+f);a.style.width=`${g}px`,(b=a.closest(".preview-shell"))!=null&&b.classList.contains("layout-fixed")||(a.style.height=`${m}px`),t==null||t(g,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let h=a.getBoundingClientRect();r=h.width,o=h.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function ia(a,e){var g,m,y,b;let t=(y=(m=(g=a.container)==null?void 0:g.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?y:e.offsetParent;if(!t||(b=a.container)!=null&&b.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),h=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(h)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function tt(a){var i,n;if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;if(ia(a,e),(i=a.container)!=null&&i.classList.contains("layout-fixed")){let r=localStorage.getItem("preview_workbench_state"),o={activeTab:a.activeTab};if(r)try{o={...JSON.parse(r),activeTab:a.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:a.activeTab,width:e.style.width,height:(n=a.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Bi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,r;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(r=a.container)==null?void 0:r.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),ia(a,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function na(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",ia(a,e),tt(a))}function po(a){var n,r,o;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=a.toggleDebug)==null||s.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=a.toggleDebug)==null?void 0:s.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Ni(a)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>Fi(a)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;a.activeTab=l,aa(a),tt(a)})}),oa(a,e),ra(a,e)}function aa(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function ra(a,e){ie(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ie(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ie(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ie(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ie(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ie(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ie(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ie(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ie(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ke();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function uo(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ot(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{tt(a),na(a,e)},10)}));let i=a.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),r=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ot(i,n,a.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{na(a,i)},10)})),i&&r&&co(i,r);let o=a.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&Ot(o,s,a.debugOverlay);let l=a.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ot(l,c,a.debugOverlay),Bi(a)}function oa(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ie(a,e,t,i,n){let r=e.querySelector(`#${t}`),o=e.querySelector(n);if(!r||!o)return;let s=io(ke(),i);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),no(ke(),i,l)})}K();var Ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Et(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let p of n){let d=p.objectId||"Engine";r[d]||(r[d]=[]),r[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1429
|
+
anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function ia(a,e){var d,u,g,f,h,m,b,y,v,w,A;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),r=Number((m=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),o=Number((y=(b=a.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((w=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(X(),Je));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=_t(a);ta(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let L=(A=window.getEditableObjectConfig)==null?void 0:A.call(window,t);L?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,L)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function lo(a,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(X(),Je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function co(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ia(a,{silent:!0})},150))}var el=3e3;function Ot(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,r=0,o=0,s=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();a.style.left=`${g.clientX-f.left-c}px`,a.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,a.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=a.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",a.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let b=h.left-m.left,y=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),a.style.left=`${b}px`,a.style.top=`${y}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++el),n=!0,a.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function po(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{var y;if(!c)return;let g=u.clientX-s,f=u.clientY-l,h=Math.max(i,r+g),m=Math.max(n,o+f);a.style.width=`${h}px`,(y=a.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(a.style.height=`${m}px`),t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=a.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function na(a,e){var h,m,b,y;let t=(b=(m=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=a.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function it(a){var i,n;if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;if(na(a,e),(i=a.container)!=null&&i.classList.contains("layout-fixed")){let r=localStorage.getItem("preview_workbench_state"),o={activeTab:a.activeTab};if(r)try{o={...JSON.parse(r),activeTab:a.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:a.activeTab,width:e.style.width,height:(n=a.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Ui(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,r;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(r=a.container)==null?void 0:r.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),na(a,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function aa(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",na(a,e),it(a))}function uo(a){var n,r,o;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=a.toggleDebug)==null||s.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=a.toggleDebug)==null?void 0:s.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Fi(a)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>Bi(a)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;a.activeTab=l,ra(a),it(a)})}),sa(a,e),oa(a,e)}function ra(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function oa(a,e){ne(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ne(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ne(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ne(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ne(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ne(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ne(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ne(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ne(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ke();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function go(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ot(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{it(a),aa(a,e)},10)}));let i=a.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),r=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ot(i,n,a.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{aa(a,i)},10)})),i&&r&&po(i,r);let o=a.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&Ot(o,s,a.debugOverlay);let l=a.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ot(l,c,a.debugOverlay),Ui(a)}function sa(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ne(a,e,t,i,n){let r=e.querySelector(`#${t}`),o=e.querySelector(n);if(!r||!o)return;let s=no(ke(),i);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),ao(ke(),i,l)})}X();var Gi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Xe(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let p of n){let d=p.objectId||"Engine";r[d]||(r[d]=[]),r[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1333
1430
|
<div class="config-persistence-panel">
|
|
1334
1431
|
<!-- Status Footer (Always Visible) -->
|
|
1335
1432
|
<div class="persistence-status-footer">
|
|
@@ -1351,13 +1448,20 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1351
1448
|
</div>
|
|
1352
1449
|
</div>
|
|
1353
1450
|
|
|
1451
|
+
${t?`
|
|
1452
|
+
<div class="staging-banner">
|
|
1453
|
+
<span class="banner-icon">\u26A0\uFE0F</span>
|
|
1454
|
+
<span class="banner-text">You have staged changes (not saved).</span>
|
|
1455
|
+
</div>
|
|
1456
|
+
`:""}
|
|
1457
|
+
|
|
1354
1458
|
<div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
|
|
1355
1459
|
${t?`
|
|
1356
1460
|
<div class="status-box">
|
|
1357
1461
|
<span class="status-badge">UNAPPLIED</span>
|
|
1358
1462
|
<span class="status-text">${i} staging changes</span>
|
|
1359
1463
|
</div>
|
|
1360
|
-
<div class="status-action-hint">
|
|
1464
|
+
<div class="status-action-hint">Review below before applying to project</div>
|
|
1361
1465
|
`:`
|
|
1362
1466
|
<div class="status-box">
|
|
1363
1467
|
<span class="status-badge success">READY</span>
|
|
@@ -1371,18 +1475,18 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1371
1475
|
id="create-version-btn"
|
|
1372
1476
|
class="persistence-btn primary-action"
|
|
1373
1477
|
${t?"":"disabled"}
|
|
1374
|
-
title="
|
|
1478
|
+
title="Creates a new version snapshot with backup. Safe for production use."
|
|
1375
1479
|
>
|
|
1376
|
-
\u{1F4DD}
|
|
1480
|
+
\u{1F4DD} Save As New Version
|
|
1377
1481
|
</button>
|
|
1378
1482
|
|
|
1379
1483
|
<button
|
|
1380
1484
|
id="apply-current-btn"
|
|
1381
1485
|
class="persistence-btn secondary-action"
|
|
1382
1486
|
${t?"":"disabled"}
|
|
1383
|
-
title="
|
|
1487
|
+
title="${this.currentVersion?`Updates the currently active version: ${this.currentVersion}`:"Applies changes to Original configs"}"
|
|
1384
1488
|
>
|
|
1385
|
-
\u{1F4BE}
|
|
1489
|
+
\u{1F4BE} Apply to Current Source${this.currentVersion?` (${this.currentVersion})`:" (Original)"}
|
|
1386
1490
|
</button>
|
|
1387
1491
|
</div>
|
|
1388
1492
|
|
|
@@ -1457,36 +1561,34 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1457
1561
|
`}
|
|
1458
1562
|
|
|
1459
1563
|
<div class="persistence-footer">
|
|
1460
|
-
<div class="footer-row">
|
|
1461
|
-
<span class="footer-label">Last Applied:</span>
|
|
1462
|
-
<span class="footer-value">${s}</span>
|
|
1463
|
-
</div>
|
|
1464
1564
|
<div class="footer-secondary-actions">
|
|
1465
|
-
<button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"}>Reload State</button>
|
|
1466
|
-
<button id="reset-to-original-btn" class="footer-btn danger">Factory Reset (Pristine)</button>
|
|
1565
|
+
<button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"} title="Discard changes and reload last applied state">Reload State</button>
|
|
1566
|
+
<button id="reset-to-original-btn" class="footer-btn danger" title="Restore to original pristine configs from backup">Factory Reset (Pristine)</button>
|
|
1567
|
+
<button id="discard-all-overrides-btn" class="footer-btn" ${t?"":"disabled"} title="Discard all staged overrides">Discard All Overrides</button>
|
|
1467
1568
|
</div>
|
|
1468
1569
|
</div>
|
|
1469
1570
|
|
|
1470
1571
|
<div class="persistence-info">
|
|
1471
|
-
<p><strong>
|
|
1572
|
+
<p><strong>Apply Options:</strong></p>
|
|
1472
1573
|
<ul>
|
|
1473
|
-
<li><strong>
|
|
1474
|
-
<li><strong>Apply to Current
|
|
1475
|
-
<li><strong>Apply to BASE (Dev Only)</strong> - Directly edits base configs without versioning (use Git for safety)</li>
|
|
1574
|
+
<li><strong>Save As New Version</strong> - Creates a new version snapshot with backup (safe for production). Clears overrides after save.</li>
|
|
1575
|
+
<li><strong>Apply to Current Source</strong> - Writes to ${this.currentVersion?`version "${this.currentVersion}"`:"Original configs"}. Clears overrides after apply.</li>
|
|
1576
|
+
${this.isDevelopmentMode?"<li><strong>Apply to BASE (Dev Only)</strong> - Directly edits base configs without versioning (use Git for safety)</li>":""}
|
|
1476
1577
|
</ul>
|
|
1578
|
+
<p class="info-hint"><strong>Version Switching:</strong> Always clears overrides and reloads from selected Source.</p>
|
|
1477
1579
|
</div>
|
|
1478
1580
|
</div>
|
|
1479
|
-
`}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var
|
|
1581
|
+
`}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var g;if(e.getAttribute("disabled")!==null)return;if(!Xe().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
|
|
1480
1582
|
|
|
1481
1583
|
This will:
|
|
1482
1584
|
\u2022 Create a new version snapshot
|
|
1483
1585
|
\u2022 Include all current changes
|
|
1484
1586
|
\u2022 Clear staged overrides after save
|
|
1485
|
-
\u2022 Set the new version as active`))try{let
|
|
1587
|
+
\u2022 Set the new version as active`))try{let f=localStorage.getItem("handler_last_version_name")||"",m=((g=prompt("Version name (e.g. v1.2.0, test_2024):",f))!=null?g:"").trim();if(!m){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",m),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ri(m),ee(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(f){console.error("[ConfigPersistence] Create version failed:",f),alert(`\u274C Failed to create version: ${f.message}`),e.textContent="\u{1F4DD} SAVE AS NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(t.getAttribute("disabled")!==null)return;let d=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
|
|
1486
1588
|
|
|
1487
|
-
This will write all staged changes to ${
|
|
1589
|
+
This will write all staged changes to ${d}.
|
|
1488
1590
|
|
|
1489
|
-
After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let
|
|
1591
|
+
After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=ze(),f={};for(let[b,y]of Object.entries(g.objects)){let v=y,w=b;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${b}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=w),f[`objects/${w}.json`]=v}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,y]of Object.entries(g.scenes)){let v=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${v}.json`]=y}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}ee(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
|
|
1490
1592
|
|
|
1491
1593
|
This will DIRECTLY MODIFY base configuration files.
|
|
1492
1594
|
|
|
@@ -1496,21 +1598,25 @@ This is ONLY for active development.
|
|
|
1496
1598
|
|
|
1497
1599
|
Make sure your project is under Git version control.
|
|
1498
1600
|
|
|
1499
|
-
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let
|
|
1601
|
+
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let u=ze(),g={};for(let[h,m]of Object.entries(u.objects)){let b=m,y=h;/^(json\.|ui\.|effects\.|engine\.)/.test(y)||(y=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=y),g[`objects/${y}.json`]=b}u.engine&&(u.engine.runtime&&(g["engine/engine.runtime.json"]=u.engine.runtime),u.engine.assets&&(g["engine/engine.assets.json"]=u.engine.assets),u.engine.splash&&(g["engine/engine.splash.json"]=u.engine.splash),u.engine.loading&&(g["engine/engine.loading.json"]=u.engine.loading),u.engine.start&&(g["engine/engine.start.json"]=u.engine.start),u.engine.tutorial&&(g["engine/engine.tutorial.json"]=u.engine.tutorial),u.engine.endgame&&(g["engine/engine.endgame.json"]=u.engine.endgame),!u.engine.runtime&&!u.engine.assets&&(g["engine/engine.json"]=u.engine));for(let[h,m]of Object.entries(u.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Apply to base failed:",u),alert(`\u274C Apply to base failed: ${u.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let u=d.dataset.removePath,g=d.dataset.removeId;ai(g||void 0,u)})});let o=this.container.querySelector("#clear-all-overrides"),s=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(ee(),St(),this.refreshPanel())};o==null||o.addEventListener("click",l),s==null||s.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&St()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await oi()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
|
|
1500
1602
|
<div class="notify-icon">\u2705</div>
|
|
1501
1603
|
<div class="notify-content">
|
|
1502
1604
|
<strong>${i}</strong>
|
|
1503
1605
|
<span>Project files updated.</span>
|
|
1504
1606
|
</div>
|
|
1505
|
-
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){if(confirm(`Switch to version "${e||"original"}"?
|
|
1607
|
+
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,r,o;let t=Xe();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
|
|
1608
|
+
|
|
1609
|
+
You have ${t.overrideCount} staged changes that will be discarded.
|
|
1506
1610
|
|
|
1507
|
-
|
|
1611
|
+
Options:
|
|
1612
|
+
OK = Discard staged overrides and switch
|
|
1613
|
+
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=(r=this.container)==null?void 0:r.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let s=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!s.ok){let l=await s.json();throw new Error(l.error||"Failed to switch version")}ee(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(s){alert(`\u274C Failed to switch version: ${s.message}`);let l=(o=this.container)==null?void 0:o.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
|
|
1508
1614
|
|
|
1509
1615
|
This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
|
|
1510
1616
|
|
|
1511
1617
|
This cannot be undone unless you have git commits or backups.
|
|
1512
1618
|
|
|
1513
|
-
Are you absolutely sure?`))try{let t=ze(),i={};for(let[r,o]of Object.entries(t.objects)){let s=o,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}
|
|
1619
|
+
Are you absolutely sure?`))try{let t=ze(),i={};for(let[r,o]of Object.entries(t.objects)){let s=o,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var It=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new mi;this.sceneToolsPanel=new bi;this.nudgePanel=new yi;this.inspectorPanel=new Oi;this.libraryPanel=new Tt;this.libraryPanelDocked=new Tt;this.brandVisionPanel=new Ri;this.customizeSettingsPanel=new zi;this.configPersistencePanel=new Gi;this.loadingScreenPanel=new Di}applyAssetChange(e,t){return Yr(this,e,t)}resetAsset(e){return Kr(this,e)}applySlotAsset(e,t,i){return Xr(this,e,t,i)}resetSlotAsset(e,t,i){return Jr(this,e,t,i)}startObjectVisuals(){return to(this)}stopObjectVisuals(){return io(this)}shouldRunObjectVisuals(){return $i(this)}updateObjectVisuals(){return Hi(this)}getSelectedInstanceId(){return qn(this)}getDisplayObjectById(e){return Vn(this,e)}getSelectedObjectConfig(){return _t(this)}getConfigAnchorWorldPoint(e){return Wn(this,e)}getScreenSize(){return Yn(this)}ensureBoundsGfx(){return Kn(this)}ensureAnchorGfx(){return Xn(this)}drawBounds(e){return Jn(this,e)}drawAnchor(e){return Zn(this,e)}clearBounds(){return Qn(this)}clearAnchor(){return ea(this)}clearObjectVisuals(){return Pt(this)}updateObjectInfo(e){return kt(this,e)}resetDebugConfig(){return Fi(this)}applyDebugConfig(){return ro(this)}exportDebugConfig(){return Bi(this)}loadObjectConfig(e){return oo(this,e)}fillConfigViewer(e){return Ni(this,e)}copyConfigValues(){return so(this)}applyObjectConfig(e){return ia(this,e)}applyCustomizeSettings(e,t){return lo(this,e,t)}scheduleObjectAutoApply(){return co(this)}setupDebugEventListeners(){return uo(this)}setupDebugInputListeners(e){return oa(this,e)}setupPanelLayout(){return go(this)}setupCollapsiblePanels(e){return sa(this,e)}setupRangeInput(e,t,i,n){return ne(this,e,t,i,n)}updateWorkbenchTabs(){return ra(this)}saveWorkbenchState(){return it(this)}loadWorkbenchState(){return Ui(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let r=localStorage.getItem("preview_workbench_state");if(r){let o=JSON.parse(r);o.activeTab&&(this.activeTab=o.activeTab)}}catch(r){console.warn("[PREVIEW] Failed to load workbench tab state",r)}this.sceneObjectsPanel.initialize(e,{onSelect:r=>this.handleObjectSelect(r)}),this.libraryPanel.initialize(e,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)})),this.inspectorPanel.initialize(e,{onPropertyChange:(r,o,s)=>{console.log("[Inspector] Property changed:",r,o,s)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let r="/dashboard";window.location.pathname!==r&&(window.location.href=r)}),this.customizeSettingsPanel.initialize(e,{onApply:(r,o)=>this.applyCustomizeSettings(r,o)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:r=>{this.highlightObject=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:r=>{this.highlightAnchor=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(r,o)=>this.nudgeSelectedObject(r,o),onShowSplash:()=>{let r=window;typeof r.__previewShowSplash=="function"&&r.__previewShowSplash()},onUpdateSplash:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:r})}}),this.nudgePanel.initialize(e,{onNudge:async(r,o)=>{var g,f,h,m,b,y;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=s.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+r,p=((h=l==null?void 0:l.y)!=null?h:0)+o,{applyConfigOverride:d}=await Promise.resolve().then(()=>(X(),Je));d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,w=(y=(b=(m=v==null?void 0:v.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?y:s;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async r=>{var d,u,g,f,h;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let s=(u=(d=o.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,s+r),{applyConfigOverride:c}=await Promise.resolve().then(()=>(X(),Je));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:o;await p(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let r=window;typeof r.__previewShowLoading=="function"?r.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let r=window;typeof r.__previewHideLoading=="function"?r.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:r}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(r):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(r,o,s,l)=>{this.customizeSettingsPanel.openAiEditor(r,o,s,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=r=>this.selectObject(r),window.addEventListener("config:changed",r=>{var o,s;((o=r.detail)==null?void 0:o.action)!=="remove"&&((s=r.detail)==null?void 0:s.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(r,o,s)=>this.applySlotAsset(r,o,s),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let r=window.getActiveConfig;if(typeof r=="function"){let s=r();return((o=s==null?void 0:s.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(r,o)=>{let s=window.getEditableAssets;if(typeof s=="function"){let l=s();if(l!=null&&l.libraryAssets&&(l.libraryAssets[r]||(l.libraryAssets[r]=[]),!l.libraryAssets[r].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[r].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${r}`)}}},window.__highlightLibrarySlot=(r,o)=>{this.libraryPanel.highlightSlot(r,o)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
|
|
1514
1620
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
1515
1621
|
<div class="debug-workbench" id="debug-workbench">
|
|
1516
1622
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -1557,7 +1663,7 @@ Are you absolutely sure?`))try{let t=ze(),i={};for(let[r,o]of Object.entries(t.o
|
|
|
1557
1663
|
${this.sceneToolsPanel.render()}
|
|
1558
1664
|
${this.nudgePanel.render()}
|
|
1559
1665
|
</div>
|
|
1560
|
-
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=r.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function
|
|
1666
|
+
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=r.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function tl(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function il(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function nl(a){return`
|
|
1561
1667
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
1562
1668
|
|
|
1563
1669
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -1574,9 +1680,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
|
|
|
1574
1680
|
${a?`
|
|
1575
1681
|
ADDITIONAL RULES/NOTES:
|
|
1576
1682
|
${a}`:""}
|
|
1577
|
-
`.trim()}function
|
|
1578
|
-
`);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let
|
|
1579
|
-
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ne="handler_api_key_";var
|
|
1683
|
+
`.trim()}function ho(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let o=await tl(r),s=il(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};a.push(l),n.push(l)}return n},getSources(){return a.slice()},async analyze(i,n,r){if(a.length===0)throw new Error("No screenshots to analyze.");let o=nl(n),s=a.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await ji(i,o,s,{model:r}),c=e,p=[],d=l.split(`
|
|
1684
|
+
`);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(f=>{p.includes(f.toUpperCase())||p.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
|
|
1685
|
+
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ne="handler_api_key_";var nt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${Ne}${e}`;localStorage.setItem(r,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ne}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ne}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ne}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ne)){let n=i.substring(Ne.length),r=localStorage.getItem(i);if(r){let o=JSON.parse(r);e.push({service:n,label:o.label,created:o.created,lastUsed:o.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ne)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},la=()=>nt.getKey("gemini"),ca=(a,e)=>nt.setKey("gemini",a,e),al=()=>nt.hasKey("gemini");window.ApiKeyStorage=nt;window.getGeminiApiKey=la;window.setGeminiApiKey=ca;window.hasGeminiApiKey=al;var pa=class{constructor(){this.modal=null;this.options=null;this.analyzer=ho();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=`
|
|
1580
1686
|
<div class="ai-modal-card">
|
|
1581
1687
|
<div class="ai-modal-header">
|
|
1582
1688
|
<div class="ai-modal-actions">
|
|
@@ -1657,12 +1763,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
|
|
|
1657
1763
|
</div>
|
|
1658
1764
|
`,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var s;let r=n.target;switch(r.dataset.action||((s=r.closest("[data-action]"))==null?void 0:s.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let r=n.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let o=r.closest(".ai-gallery-item"),s=parseInt(o.dataset.index||"-1");s>=0&&this.selectImage(s)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
|
|
1659
1765
|
|
|
1660
|
-
Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let o=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await
|
|
1766
|
+
Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let o=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await Ii(this.options.currentValue);c&&(o=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let s=await tt(r,this.currentPrompt,o,{aspectRatio:"1:1"}),l=await et(s);this.generatedImages.push(l||s),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
|
|
1661
1767
|
<div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
|
|
1662
1768
|
<img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
|
|
1663
1769
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
1664
1770
|
</div>
|
|
1665
|
-
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=
|
|
1771
|
+
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=la();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return ca(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},da=null;window.__openAiEditor=function(a,e,t,i){da||(da=new pa),da.open({objectId:a,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(a,i.path,n);else{let o=window.getEditableObjectConfig,s=o==null?void 0:o(a);if(s){let l=i.path.split("."),c=s;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};ga();var ha=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
1666
1772
|
<div class="asset-preview-card">
|
|
1667
1773
|
<div class="asset-preview-header">
|
|
1668
1774
|
<div class="asset-preview-title">${n}</div>
|
|
@@ -1689,7 +1795,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1689
1795
|
<source src="${n}" type="audio/wav">
|
|
1690
1796
|
Your browser does not support the audio element.
|
|
1691
1797
|
</audio>
|
|
1692
|
-
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(
|
|
1798
|
+
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(ga(),fo)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(a){new ha().open(a)};var fa=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
|
|
1693
1799
|
<div class="asset-crop-card">
|
|
1694
1800
|
<div class="asset-crop-header">
|
|
1695
1801
|
<div>
|
|
@@ -1740,7 +1846,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1740
1846
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
1741
1847
|
</div>
|
|
1742
1848
|
</div>
|
|
1743
|
-
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(n,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new ha().open(a)};var Gi=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[He("playable-portrait"),He("iphone-14"),He("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new It,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=He(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,r=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,r,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,r+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let h=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${h} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,r=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
1849
|
+
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(n,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new fa().open(a)};var qi=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[He("playable-portrait"),He("iphone-14"),He("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new It,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=He(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,r=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,r,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,r+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,r=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
1744
1850
|
<div class="preview-toolbar">
|
|
1745
1851
|
<div class="preview-toolbar-left">
|
|
1746
1852
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -1749,7 +1855,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1749
1855
|
<div class="preview-toolbar-center">
|
|
1750
1856
|
<div class="device-selector-wrapper">
|
|
1751
1857
|
<select class="device-dropdown" id="device-select">
|
|
1752
|
-
${
|
|
1858
|
+
${zn.map(i=>`
|
|
1753
1859
|
<optgroup label="${i.label}">
|
|
1754
1860
|
${i.devices.map(n=>`
|
|
1755
1861
|
<option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
|
|
@@ -1901,7 +2007,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1901
2007
|
</div>
|
|
1902
2008
|
|
|
1903
2009
|
</div>
|
|
1904
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var h,f,g,m,y,b,v,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",E=>{if(this.viewMode==="compare")return;let x=E.target.value;this.setDevice(x)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",E=>{let x=E.target.value;this.setTheme(x)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.viewToggle;x&&this.setViewMode(x)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.layoutToggle;x&&this.setLayoutMode(x)})}),(h=e.querySelector("#rotate-btn"))==null||h.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(g=e.querySelector("#zoom-out-btn"))==null||g.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.dockTab;if(!x)return;l.forEach(S=>S.classList.remove("active")),E.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(S=>{let P=S.dataset.dockPanel;S.classList.toggle("active",P===x)})})}),(y=e.querySelector("#console-clear"))==null||y.addEventListener("click",()=>this.clearConsole()),(b=e.querySelector("#corner-zoom-in-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let r=this.container.querySelector("#console-badge");if(r){let o=this.consoleMessages.filter(s=>s.type==="error").length;r.textContent=o>0?`${o}!`:"0",r.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,o;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(r-l)/2,d=(o-c)/2;n.clearRect(0,0,r,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function fa(a={}){let e=new Gi(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ma(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function fo(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function al(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function mo(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};al(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,o):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=o)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let s=t.anchor;if(s&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(s):typeof s=="object"&&s.x!==void 0&&s.y!==void 0?d=s:Array.isArray(s)&&s.length===2&&(d={x:s[0],y:s[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function bo(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=ma(e),i=r=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?r.filter(c=>l[c]===o):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>bo(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ma((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ma((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,h,f;let o=(h=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?h:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function rl(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,o,s;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Ke(),ur))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let h=window.CustomAssets;(r=h==null?void 0:h[t])!=null&&r.texture&&(h[t].texture=u);let f=window.gameObjectManager,g=(o=f==null?void 0:f.get)==null?void 0:o.call(f,t);if(g){let m=((s=g.getDisplayObject)==null?void 0:s.call(g))||g.pixiObject||g.pixi||g;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let y=m.children.find(b=>b==null?void 0:b.texture);y!=null&&y.texture&&(y.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))n.push({path:`start.${r}`,value:o});n.length&&Ce(n,{silent:!0,persist:!0,emitEvent:!0})}}function qi(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Se.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let h=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),h}),typeof window!="undefined"&&(rl(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=fo(d);mo(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=fo(l);mo(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,bo(r))}};return n.rebuildIndexes(),n}K();var wo=qe(require("lottie-web"),1);pn(cn);typeof window!="undefined"&&!window.lottie&&(window.lottie=wo.default);var nt=null,ol=async()=>{if(!nt){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);nt=JSON.parse(i)}else nt=JSON.parse(e);return nt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}nt=await(await fetch("./handler.config.json")).json()}return nt},wa,Rt,xo,at,ya,va;function sl(a){wa=a.initGame,Rt=a.CustomAssets,xo=a.updateScreenState,at=a.globalResponsiveMultipliers,ya=a.layout,va=a.clearResponsiveElements}var Vi="web_embed",jt="https://example.com",yo={profile_id:Vi},Pe=null,le=null,ba={width:0,height:0},ll=!0,cl=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await ol();yo={...a.ids||{},profile_id:Vi},jt=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[Vi])==null?void 0:p.destination_url)||jt,Oe.init({ids:yo,profile:Vi,destinationUrl:jt});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=fa({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),vo()},onRefresh:vo});let h=le.getGameContainer();h&&(e=h),window.addEventListener("handler-preview:screen",f=>{var v,w,E,x,A,S,P,I,L,T,j;let g=window.gameApp,m=window.gameObjectManager,{width:y,height:b}=f.detail;if(ba.width=y,ba.height=b,xo(y,b),!(!g||!g.renderer)){m&&s(g,m);try{g.renderer.resize(y,b);let O=g.view;O&&(O.style.width="100%",O.style.height="100%",O.style.display="block")}catch(O){console.warn("[SCREEN] Error resizing renderer:",O);return}if(t&&m&&ya)try{let O=(v=window.__mainContainer)!=null?v:g.stage,D=(P=(S=(x=window.__tutorialLabel)!=null?x:(E=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:E.call(w))!=null?S:(A=m.get("label_1"))==null?void 0:A.pixiObject)!=null?P:m.get("label_1"),R=m.get("background_1"),$=(j=(T=(L=window.__background)!=null?L:(I=R==null?void 0:R.getDisplayObject)==null?void 0:I.call(R))!=null?T:R==null?void 0:R.pixiObject)!=null?j:R;if(O){let C=O===g.stage;ya({mainContainer:O,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:g},t,0,ba,m,{skipMainContainerTransform:C})}}catch(O){console.warn("[SCREEN] Error in layout:",O)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=G(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(h=>setTimeout(h,100)),t=await be("scene.main"));let i=await wa(e,t,jt,le);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Rt})}catch(h){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",h)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(at.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(Pe,n);async function o(){try{let h=async b=>{let v=b.startsWith("/")?b:`/${b}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let E=await w.text();try{return JSON.parse(E)}catch{return null}},f=await h("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let g=f.screens;if(!g||typeof g!="object")return;let m={},y={};for(let[b,v]of Object.entries(g)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let E=await h(w),x=E==null?void 0:E.elements;if(!Array.isArray(x))continue;let A=x.map(S=>S==null?void 0:S.instance_id).filter(S=>typeof S=="string");m[b]=A;for(let S of A)y[S]||(y[S]=b)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:y},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(h,f){if(ll){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),h.stage){let m=function(y,b=0){if(!y||!y.children)return;let v=" ".repeat(b);y.children.forEach((w,E)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let x=w.scale.x||1,A=w.scale.y||1;w.__originalScale||(w.__originalScale={x,y:A},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${x.toFixed(3)}, ${A.toFixed(3)}`));let S=w.__originalScale.x*at.scale,P=w.__originalScale.y*at.scale;typeof w.scale.set=="function"?w.scale.set(S,P):(w.scale.x=S,w.scale.y=P),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${x.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,b+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${w.constructor.name})`)})};var g=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(h.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(h){if(h!==void 0){at.scale=h,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${h.toFixed(3)}`);let f=window.gameApp,g=window.gameObjectManager;f&&g?(s(f,g),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!g}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},vo=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{va&&va()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=le.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof Rt.resetScene=="function"&&Rt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),wa(r,s,jt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Rt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Eo=1.25,So={fontFamily:"Inter, system-ui, sans-serif"};var Wi=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
|
|
2010
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,y,v,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",A=>{if(this.viewMode==="compare")return;let L=A.target.value;this.setDevice(L)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",A=>{let L=A.target.value;this.setTheme(L)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.viewToggle;L&&this.setViewMode(L)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.layoutToggle;L&&this.setLayoutMode(L)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.dockTab;if(!L)return;l.forEach(x=>x.classList.remove("active")),A.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(x=>{let P=x.dataset.dockPanel;x.classList.toggle("active",P===L)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let r=this.container.querySelector("#console-badge");if(r){let o=this.consoleMessages.filter(s=>s.type==="error").length;r.textContent=o>0?`${o}!`:"0",r.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,o;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(r-l)/2,d=(o-c)/2;n.clearRect(0,0,r,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function ma(a={}){let e=new qi(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}X();function ba(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function mo(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function rl(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function bo(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};rl(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,o):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=o)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let s=t.anchor;if(s&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(s):typeof s=="object"&&s.x!==void 0&&s.y!==void 0?d=s:Array.isArray(s)&&s.length===2&&(d={x:s[0],y:s[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function yo(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=ba(e),i=r=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?r.filter(c=>l[c]===o):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>yo(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ba((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ba((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,f;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function ol(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,o,s;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Ke(),gr))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(o=f==null?void 0:f.get)==null?void 0:o.call(f,t);if(h){let m=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))n.push({path:`start.${r}`,value:o});n.length&&Ce(n,{silent:!0,persist:!0,emitEvent:!0})}}function Vi(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Se.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(ol(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=mo(d);bo(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=mo(l);bo(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,yo(r))}};return n.rebuildIndexes(),n}X();var xo=qe(require("lottie-web"),1);un(dn);typeof window!="undefined"&&!window.lottie&&(window.lottie=xo.default);var at=null,sl=async()=>{if(!at){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);at=JSON.parse(i)}else at=JSON.parse(e);return at}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}at=await(await fetch("./handler.config.json")).json()}return at},xa,Rt,Eo,rt,va,wa;function ll(a){xa=a.initGame,Rt=a.CustomAssets,Eo=a.updateScreenState,rt=a.globalResponsiveMultipliers,va=a.layout,wa=a.clearResponsiveElements}var Wi="web_embed",jt="https://example.com",vo={profile_id:Wi},Pe=null,le=null,ya={width:0,height:0},cl=!0,dl=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await sl();vo={...a.ids||{},profile_id:Wi},jt=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[Wi])==null?void 0:p.destination_url)||jt,Oe.init({ids:vo,profile:Wi,destinationUrl:jt});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=ma({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),wo()},onRefresh:wo});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,w,A,L,D,x,P,_,S,E,k;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(ya.width=b,ya.height=y,Eo(b,y),!(!h||!h.renderer)){m&&s(h,m);try{h.renderer.resize(b,y);let T=h.view;T&&(T.style.width="100%",T.style.height="100%",T.style.display="block")}catch(T){console.warn("[SCREEN] Error resizing renderer:",T);return}if(t&&m&&va)try{let T=(v=window.__mainContainer)!=null?v:h.stage,M=(P=(x=(L=window.__tutorialLabel)!=null?L:(A=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:A.call(w))!=null?x:(D=m.get("label_1"))==null?void 0:D.pixiObject)!=null?P:m.get("label_1"),O=m.get("background_1"),z=(k=(E=(S=window.__background)!=null?S:(_=O==null?void 0:O.getDisplayObject)==null?void 0:_.call(O))!=null?E:O==null?void 0:O.pixiObject)!=null?k:O;if(T){let C=T===h.stage;va({mainContainer:T,label:M,background:z,backgroundTexture:(z==null?void 0:z.texture)||null,app:h},t,0,ya,m,{skipMainContainerTransform:C})}}catch(T){console.warn("[SCREEN] Error in layout:",T)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=V(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await be("scene.main"));let i=await xa(e,t,jt,le);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=Vi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Rt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(rt.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(Pe,n);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let A=await w.text();try{return JSON.parse(A)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let A=await g(w),L=A==null?void 0:A.elements;if(!Array.isArray(L))continue;let D=L.map(x=>x==null?void 0:x.instance_id).filter(x=>typeof x=="string");m[y]=D;for(let x of D)b[x]||(b[x]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,f){if(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: ${rt.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((w,A)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let L=w.scale.x||1,D=w.scale.y||1;w.__originalScale||(w.__originalScale={x:L,y:D},console.log(`${v}[RESPONSIVE] Stored original scale for child[${A}]: ${L.toFixed(3)}, ${D.toFixed(3)}`));let x=w.__originalScale.x*rt.scale,P=w.__originalScale.y*rt.scale;typeof w.scale.set=="function"?w.scale.set(x,P):(w.scale.x=x,w.scale.y=P),console.log(`${v}[RESPONSIVE] Child[${A}] scale: ${L.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,y+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${A}] has no scale (type: ${w.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){rt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(s(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},wo=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{wa&&wa()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=le.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof Rt.resetScene=="function"&&Rt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=V(s)),xa(r,s,jt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Vi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Rt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();X();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},So=1.25,Ao={fontFamily:"Inter, system-ui, sans-serif"};var Yi=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=`
|
|
1905
2011
|
position: fixed;
|
|
1906
2012
|
inset: 0;
|
|
1907
2013
|
display: flex;
|
|
@@ -1976,11 +2082,11 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1976
2082
|
margin-top: 8px;
|
|
1977
2083
|
padding: 0 4px;
|
|
1978
2084
|
opacity: 0.4;
|
|
1979
|
-
`;for(let u=0;u<9;u++){let
|
|
2085
|
+
`;for(let u=0;u<9;u++){let g=document.createElement("div");g.style.cssText=`
|
|
1980
2086
|
width: 1.5px;
|
|
1981
2087
|
background-color: black;
|
|
1982
2088
|
height: ${u%4===0?"6px":"2px"};
|
|
1983
|
-
`,c.appendChild(
|
|
2089
|
+
`,c.appendChild(g)}n.appendChild(r),n.appendChild(s),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
|
|
1984
2090
|
position: absolute;
|
|
1985
2091
|
top: 48px;
|
|
1986
2092
|
width: 600px;
|
|
@@ -1989,7 +2095,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1989
2095
|
left: 50%;
|
|
1990
2096
|
transform: translateX(-50%);
|
|
1991
2097
|
overflow: visible;
|
|
1992
|
-
`,"HANDLER".split("").forEach((u,
|
|
2098
|
+
`,"HANDLER".split("").forEach((u,g)=>{let f=document.createElement("div");f.textContent=u,f.style.cssText=`
|
|
1993
2099
|
position: absolute;
|
|
1994
2100
|
width: 28px;
|
|
1995
2101
|
height: 40px;
|
|
@@ -2003,7 +2109,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2003
2109
|
display: flex;
|
|
2004
2110
|
align-items: center;
|
|
2005
2111
|
justify-content: center;
|
|
2006
|
-
animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][
|
|
2112
|
+
animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][g]}s;
|
|
2007
2113
|
`,p.appendChild(f)}),t.appendChild(n),t.appendChild(p),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
|
|
2008
2114
|
position: absolute;
|
|
2009
2115
|
bottom: 48px;
|
|
@@ -2100,7 +2206,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2100
2206
|
0%, 100% { opacity: 1; }
|
|
2101
2207
|
50% { opacity: 0.3; }
|
|
2102
2208
|
}
|
|
2103
|
-
`,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var xa=Ba.version,dl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);Fa();var _o={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Mo=Math.random().toString(36).slice(2),st=null,rt={..._o},Oo="web_embed",Ca={},Dt,Ea=!1,zt=!1,Ht=!1,Io=!1,Pa=1,Ki=0,Zi=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),Ta=lt>ct,we=!1,$t=!1,Ao=!1,Co=!1,Sa=!1,Xi=null,Fe=null,La=!1,ka=!1,Yi=new Map;function jo(){if(!Fe)return null;let a=Date.now()-Fe;return!Number.isFinite(a)||a<0?null:a}function Aa(a){if(La)return;let e=jo();e!==null&&(La=!0,k("session_time",{duration_ms:e,reason:a}))}function To(){if(st)return st;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),st=a,a}function Ji(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Ro(a,e){return{event_name:a,ts:Date.now(),session_id:Mo,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:Oo==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function k(a,e){let t=Ji(a),i=Ro(t,e);on(i,!!Ca.analytics),qt(t,i),t!==a&&qt(a,i)}function Nt(){Xi&&(Xi(lt,ct),Xi=null)}function dt(a){Pa=a,k("volume",a)}function pt(a){a&&(Io=!0),!Ht&&(Ht=!0,k("pause"),dt(0))}function Ft(a){!a&&Io||Ht&&(Ht=!1,k("resume"),dt(Pa))}function _e(a,e){lt=Math.floor(a||window.innerWidth),ct=Math.floor(e||window.innerHeight),Ta=lt>ct,k("resize",{width:lt,height:ct})}function pl(){if(er())try{let a=mraid.getMaxSize();_e(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ft():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();dt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&dt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Zi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function ul(){if(tr())try{let a=dapi.getScreenSize();_e(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ft():pt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(dt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>dt(t?1:0)),Zi=!0,dapi.isViewable())we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Lo(){let a=()=>{we||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt(),$t&&($t=!1,ne.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ft(),a()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),Zi=!0}function gl(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Ao=!0),!(Ao&&e instanceof MouseEvent)&&(Ki+=1,ka||(ka=!0,k("first_interaction",{count:Ki})),k("interaction",Ki))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function ko(a){var i,n,r,o,s,l,c,p,d,u,h,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(ir())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(or())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(rr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(g){console.warn("Smadex redirect failed",g)}else if(nr()){let g=window.ExitApi;g&&typeof g.exit=="function"?g.exit(a||ot||""):a&&window.open(a)}else We()?(u=window.install)==null||u.call(window):ar()?(h=window.openAppStore)==null||h.call(window):sn()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function hl(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;X("view",()=>e(t.mraid_viewable)),X("start",()=>e(t.game_viewable)),X("engagement",()=>e(t.engagement));let i=()=>e(t.complete);X("complete",i),Gt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),X("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;X("view",()=>e(t.Ad_Load_Start)),X("start",()=>e(t.Ad_Viewable)),X("engagement",()=>e(t.First_Engagement)),X("complete",()=>e(t.Gameplay_Complete)),X("cta_click",()=>e(t.DSP_Click)),X("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function fl(){if(!Ye())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{ne.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Po(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function ml(){We()&&(window.mintGameStart=()=>{Ft(!0),_e()},window.mintGameClose=()=>{pt(!0)})}function bl(){if(!ln())return;let a=window.NUC;!a||!a.trigger||(ne.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,ot)}),ne.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var ne={init(a={},e){var t;if(Oo=a.profile||"web_embed",Ca=a.consent||{},rt={..._o,...a.ids||{}},st=a.rootEl||st,Dt=void 0,ja((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),Fe=null,La=!1,ka=!1,Yi.clear(),ot=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Xi=e),k("init"),document.body.oncontextmenu=()=>!1,To(),vl(st),sr(),pl(),ul(),!Zi){if(document.readyState==="complete")Lo();else if(!Co){Co=!0;let i=()=>{Lo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}gl(),hl(),fl(),ml(),bl(),console.log(`%c @handler/playable-sdk %c v${xa} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),we&&!ve&&(k("boot"),k("view"),k("ready"),$t&&($t=!1,ne.start()),ve=!0),ve=we},getRoot(){return To()},get version(){return xa},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return Ta},get isReady(){return ve},get isStarted(){return Ea},get isPaused(){return Ht},get isFinished(){return zt},get volume(){return Pa},get interactions(){return Ki},on(a,e){Gt(Ji(a),e)},off(a,e){rn(Ji(a),e)},start(){var a,e;if(!Ea){if(!we){$t=!0;return}if(Ea=!0,Fe||(Fe=Date.now()),k("start"),_e(),We())pt(),(a=window.gameReady)==null||a.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ta?"landscape":"portrait",buildID:xa})}}},finish(){var a,e;zt||(zt=!0,k("complete"),Aa("complete"),We()?(a=window.gameEnd)==null||a.call(window):sn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Po())},install(a){if(!zt){zt=!0,Ye()?(Po(),setTimeout(()=>ne.install(a),300)):(k("complete"),setTimeout(()=>ne.install(a),0));return}Sa||(Sa=!0,setTimeout(()=>Sa=!1,500),k("cta_click"),k("conversion"),Aa("cta"),ko(a||ot))},emit(a,e){let t=Ji(a);if(!dl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Ro(t,e);on(i,!!Ca.analytics),qt(t,i)},gameStart(){ne.start()},gameEnd(){ne.finish()},ctaClick(a,e){k("cta_click",{url:a||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&ko(a||ot)},ctaShow(a){k("cta_show",a)},ctaDismiss(a){k("cta_dismiss",a)},getGameTimeMs(){return jo()},endSession(a="manual"){Aa(a)},setAttribution(a){Dt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(yl(`${Mo}:${a}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:a},rt.variant_id=i,k("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){Fe||(Fe=Date.now()),k("level_start",{level_id:a,...e})},levelComplete(a,e){k("level_complete",{level_id:a,...e})},levelFail(a,e){k("level_fail",{level_id:a,...e})},checkpoint(a,e){k("checkpoint",{checkpoint_id:a,...e})},reward(a,e){k("reward",{reward_id:a,...e})},tutorialStart(a,e){k("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){k("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){k("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&Yi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=Yi.get(a);if(!i)return;Yi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){k("engagement",{action:"timer",key:a,duration_ms:n,...t});return}k(e,{key:a,duration_ms:n,...t})}},fps(a,e){k("fps",{value:a,...e})},memory(a,e){k("memory",{bytes:a,...e})},assetLoadStart(a,e){k("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){k("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){k("error",{code:a,message:e,...t})},retry(){var a,e,t;if(We())(a=window.gameRetry)==null||a.call(window);else if(ln()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}k("engagement",{action:"retry"})},pause(){pt(!0)},resume(){Ft(!0)},resize(a,e){_e(a,e)}},Oe=ne;function yl(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function vl(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2209
|
+
`,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 Ea=Ua.version,pl=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"]);Ba();var _o={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Oo=Math.random().toString(36).slice(2),lt=null,ot={..._o},Io="web_embed",Ta={},Dt,Sa=!1,zt=!1,Ht=!1,jo=!1,Ma=1,Xi=0,Qi=!1,ve=!1,st="",ct=Math.floor(window.innerWidth),dt=Math.floor(window.innerHeight),La=ct>dt,we=!1,$t=!1,Co=!1,To=!1,Aa=!1,Ji=null,Fe=null,ka=!1,Pa=!1,Ki=new Map;function Ro(){if(!Fe)return null;let a=Date.now()-Fe;return!Number.isFinite(a)||a<0?null:a}function Ca(a){if(ka)return;let e=Ro();e!==null&&(ka=!0,R("session_time",{duration_ms:e,reason:a}))}function Lo(){if(lt)return lt;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),lt=a,a}function Zi(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function zo(a,e){return{event_name:a,ts:Date.now(),session_id:Oo,deployment_id:ot.deployment_id,variant_id:ot.variant_id,export_profile_id:ot.profile_id,instance_id:ot.instance_id||"default",env:Io==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function R(a,e){let t=Zi(a),i=zo(t,e);sn(i,!!Ta.analytics),qt(t,i),t!==a&&qt(a,i)}function Nt(){Ji&&(Ji(ct,dt),Ji=null)}function pt(a){Ma=a,R("volume",a)}function ut(a){a&&(jo=!0),!Ht&&(Ht=!0,R("pause"),pt(0))}function Ft(a){!a&&jo||Ht&&(Ht=!1,R("resume"),pt(Ma))}function Me(a,e){ct=Math.floor(a||window.innerWidth),dt=Math.floor(e||window.innerHeight),La=ct>dt,R("resize",{width:ct,height:dt})}function ul(){if(tr())try{let a=mraid.getMaxSize();Me(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ft():ut()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();pt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&pt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Qi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt();else{let t=()=>{we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function gl(){if(ir())try{let a=dapi.getScreenSize();Me(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ft():ut()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(pt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>pt(t?1:0)),Qi=!0,dapi.isViewable())we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt();else{let t=()=>{we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function ko(){let a=()=>{we||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt(),$t&&($t=!1,ae.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ft(),a()):ut()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),Qi=!0}function hl(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Co=!0),!(Co&&e instanceof MouseEvent)&&(Xi+=1,Pa||(Pa=!0,R("first_interaction",{count:Xi})),R("interaction",Xi))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function Po(a){var i,n,r,o,s,l,c,p,d,u,g,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(nr())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(sr())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(or())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(ar()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||st||""):a&&window.open(a)}else We()?(u=window.install)==null||u.call(window):rr()?(g=window.openAppStore)==null||g.call(window):ln()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function fl(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;J("view",()=>e(t.mraid_viewable)),J("start",()=>e(t.game_viewable)),J("engagement",()=>e(t.engagement));let i=()=>e(t.complete);J("complete",i),Gt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),J("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;J("view",()=>e(t.Ad_Load_Start)),J("start",()=>e(t.Ad_Viewable)),J("engagement",()=>e(t.First_Engagement)),J("complete",()=>e(t.Gameplay_Complete)),J("cta_click",()=>e(t.DSP_Click)),J("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function ml(){if(!Ye())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Mo(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function bl(){We()&&(window.mintGameStart=()=>{Ft(!0),Me()},window.mintGameClose=()=>{ut(!0)})}function yl(){if(!cn())return;let a=window.NUC;!a||!a.trigger||(ae.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,st)}),ae.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var ae={init(a={},e){var t;if(Io=a.profile||"web_embed",Ta=a.consent||{},ot={..._o,...a.ids||{}},lt=a.rootEl||lt,Dt=void 0,Ra((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),Fe=null,ka=!1,Pa=!1,Ki.clear(),st=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ji=e),R("init"),document.body.oncontextmenu=()=>!1,Lo(),wl(lt),lr(),ul(),gl(),!Qi){if(document.readyState==="complete")ko();else if(!To){To=!0;let i=()=>{ko(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}hl(),fl(),ml(),bl(),yl(),console.log(`%c @handler/playable-sdk %c v${Ea} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),we&&!ve&&(R("boot"),R("view"),R("ready"),$t&&($t=!1,ae.start()),ve=!0),ve=we},getRoot(){return Lo()},get version(){return Ea},get maxWidth(){return ct},get maxHeight(){return dt},get isLandscape(){return La},get isReady(){return ve},get isStarted(){return Sa},get isPaused(){return Ht},get isFinished(){return zt},get volume(){return Ma},get interactions(){return Xi},on(a,e){Gt(Zi(a),e)},off(a,e){on(Zi(a),e)},start(){var a,e;if(!Sa){if(!we){$t=!0;return}if(Sa=!0,Fe||(Fe=Date.now()),R("start"),Me(),We())ut(),(a=window.gameReady)==null||a.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:La?"landscape":"portrait",buildID:Ea})}}},finish(){var a,e;zt||(zt=!0,R("complete"),Ca("complete"),We()?(a=window.gameEnd)==null||a.call(window):ln()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Mo())},install(a){if(!zt){zt=!0,Ye()?(Mo(),setTimeout(()=>ae.install(a),300)):(R("complete"),setTimeout(()=>ae.install(a),0));return}Aa||(Aa=!0,setTimeout(()=>Aa=!1,500),R("cta_click"),R("conversion"),Ca("cta"),Po(a||st))},emit(a,e){let t=Zi(a);if(!pl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=zo(t,e);sn(i,!!Ta.analytics),qt(t,i)},gameStart(){ae.start()},gameEnd(){ae.finish()},ctaClick(a,e){R("cta_click",{url:a||st,manual:!0}),(e==null?void 0:e.open)!==!1&&Po(a||st)},ctaShow(a){R("cta_show",a)},ctaDismiss(a){R("cta_dismiss",a)},getGameTimeMs(){return Ro()},endSession(a="manual"){Ca(a)},setAttribution(a){Dt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(vl(`${Oo}:${a}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:a},ot.variant_id=i,R("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){Fe||(Fe=Date.now()),R("level_start",{level_id:a,...e})},levelComplete(a,e){R("level_complete",{level_id:a,...e})},levelFail(a,e){R("level_fail",{level_id:a,...e})},checkpoint(a,e){R("checkpoint",{checkpoint_id:a,...e})},reward(a,e){R("reward",{reward_id:a,...e})},tutorialStart(a,e){R("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){R("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){R("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&Ki.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=Ki.get(a);if(!i)return;Ki.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:a,duration_ms:n,...t});return}R(e,{key:a,duration_ms:n,...t})}},fps(a,e){R("fps",{value:a,...e})},memory(a,e){R("memory",{bytes:a,...e})},assetLoadStart(a,e){R("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){R("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){R("error",{code:a,message:e,...t})},retry(){var a,e,t;if(We())(a=window.gameRetry)==null||a.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)}R("engagement",{action:"retry"})},pause(){ut(!0)},resume(){Ft(!0)},resize(a,e){Me(a,e)}},Oe=ae;function vl(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function wl(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2104
2210
|
(function(){
|
|
2105
2211
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
2106
2212
|
function unlock(){
|