handler-playable-sdk 0.3.76 → 0.3.80
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-GNO7ZYE4.js → chunk-FGCCF57M.js} +39 -37
- 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 +31 -29
- package/dist/index.css +17 -10
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +4 -4
- package/dist/pixi/index.css +17 -10
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +1 -1
- package/dist/three/index.css +17 -10
- 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 Io=Object.create;var Ft=Object.defineProperty;var jo=Object.getOwnPropertyDescriptor;var Ro=Object.getOwnPropertyNames;var Do=Object.getPrototypeOf,$o=Object.prototype.hasOwnProperty;var de=(n,e)=>()=>(n&&(e=n(n=0)),e);var ht=(n,e)=>{for(var t in e)Ft(n,t,{get:e[t],enumerable:!0})},La=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ro(e))!$o.call(n,a)&&a!==t&&Ft(n,a,{get:()=>e[a],enumerable:!(i=jo(e,a))||i.enumerable});return n};var Ve=(n,e,t)=>(t=n!=null?Io(Do(n)):{},La(e||!n||!n.__esModule?Ft(t,"default",{value:n,enumerable:!0}):t,n)),zo=n=>La(Ft({},"__esModule",{value:!0}),n);var pe,ln=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Vo(){var n,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(n=document.querySelector("script"))==null?void 0:n.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 Wo(){try{if(typeof window!="undefined"){let n=await fetch("./build-settings.json");if(n.ok){let e=await n.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function Yo(){try{if(typeof window!="undefined"){let n=new XMLHttpRequest;if(n.open("GET","./build-settings.json",!1),n.send(),n.status===200&&n.responseText){let e=JSON.parse(n.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function Ko(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${H}`),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(!(H==="publish"&&re!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!cn){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),cn=(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 a=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let r=a[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await cn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function dn(n){return n===null||typeof n!="object"||(Object.freeze(n),Object.values(n).forEach(e=>dn(e))),n}function Xo(n=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=n,i.height=e;let a=i.getContext("2d");return a.fillStyle=`#${t.toString(16).padStart(6,"0")}`,a.fillRect(0,0,n,e),a.strokeStyle="#000",a.strokeRect(0,0,n,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",n/2,e/2),ge.Texture.from(i)}function pn(n,e){or.set(n,e)}var ge,ar,rr,Ie,H,re,Ee,ue,cn,or,je,Vt=de(()=>{"use strict";ge=require("pixi.js");ln();ar=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",rr=Vo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,H=rr?"publish":ar,re=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(H=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${H}`));Ee=Yo();Ee!=null&&Ee.buildMode&&(H=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${H}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(re=Ee.assetsInlined);Wo().then(n=>{n!=null&&n.buildMode&&n.buildMode!==H&&(H=n.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${H}`)),(n==null?void 0:n.assetsInlined)!==void 0&&(re=n.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${ar}, Runtime: ${rr?"publish":"dev"}, Effective: ${H}`);ue={},cn=null;or=new Map;je=class{static async load(e,t,i,a){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${H}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await Ko(),l=s[e];if(!l&&a&&(l=s[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),H==="publish"&&re!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=or.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=dn(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=H==="publish",a=i&&re!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${H}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=H==="publish",a=i&&re!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${H}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(H==="dev"){let r=t==="image"?Xo():dn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};pn("image",async(n,e)=>{let t=H==="publish",i=t&&re!==!1,a=H==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${H}, isPublishMode: ${t}, isBrandMode: ${a}, 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: ${n}`);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=n;return(a||r)&&n&&!n.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=n,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${n}" as-is`)):(o=`assets/${n}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${n}" -> "${o}"`))),ge.Assets.load(e||o)});pn("json",async(n,e)=>{let t=H==="publish",i=t&&re!==!1,a=H==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${H}, isPublishMode: ${t}, isBrandMode: ${a}, 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: ${n}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=n;if((a||r)&&n&&!n.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=n,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${n}" as-is`)):(o=`assets/${n}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${n}" -> "${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: ${n}`);return s.json()})});var lr={};ht(lr,{AssetTextures:()=>oe,initAssetTextures:()=>hn});function hn(n,e){sr.init(n,e),typeof window!="undefined"&&(window.__AssetTextures=oe)}var gn,sr,oe,Xe=de(()=>{"use strict";Vt();gn=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"]),a=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let g=await je.load(s,c,t,u);this.textures.set(s,g),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?a.push(p()):r.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let a=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(a.length===0)return;this.ready().catch(()=>{});let r=()=>a.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:a}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},sr=new gn,oe=new Proxy(sr,{get(n,e){return e in n&&typeof n[e]=="function"?n[e].bind(n):n.get(e)},set(n,e,t){return n.set(e,t),!0}})});var Je={};ht(Je,{applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>xr,configOverrideManager:()=>wr,deepClone:()=>G,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>wt,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setOverrideMode:()=>yn});function ti(){return typeof window=="undefined"?null:window.__editableConfig||null}function fr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function gr(n,e){var t,i;if(!n)return null;try{if(n instanceof Map)return(t=n.get(e))!=null?t:null;if(typeof n=="object")return(i=n[e])!=null?i:null}catch{}return null}function Es(n,e,t){if(n){if(n instanceof Map){n.set(e,t);return}typeof n=="object"&&(n[e]=t)}}function mr(n,e){for(let t of e)xt(n,t.path,t.value)}function br(n){var s;if(typeof window=="undefined")return;let e=ti();if(!e)return;let t=fr(),i=(s=t?gr(t.objects,n):null)!=null?s:gr(e.objects,n);if(!i)return;let a=G(i),r=Y().filter(l=>l.objectId===n);try{mr(a,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",n,l);return}Es(e.objects,n,a);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(n,a)}catch{}}function As(){var a;if(typeof window=="undefined")return;let n=ti();if(!(n!=null&&n.engine))return;let e=fr(),t=G(((a=e==null?void 0:e.engine)!=null?a:n.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{mr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=n.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{n.engine=t}}function Ss(){if(typeof window=="undefined")return"unknown";let n=window;return typeof n.__HANDLER_PROJECT_ID=="string"?n.__HANDLER_PROJECT_ID:"handler-default"}function yr(){return`handler_preview_config_overrides::${Ss()}`}function Cs(){if(typeof window=="undefined")return[];try{let n=window.localStorage.getItem(yr());if(!n)return[];let e=JSON.parse(n);return Array.isArray(e)?e:[]}catch{return[]}}function ii(n){if(typeof window!="undefined")try{window.localStorage.setItem(yr(),JSON.stringify(n))}catch{}}function wt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function yn(n){if(typeof window!="undefined"){window.__enableConfigOverrides=n;try{window.localStorage.setItem(vr,n?"true":"false")}catch{}}}function Se(n,e={}){var u,g;let{objectId:t,path:i,value:a}=n,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ti();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:a});let p;try{p=Ls(c,i),xt(c,i,a)}catch(m){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:a},m);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:a,ts:Date.now()}),d.length>Ts&&d.shift(),o){let m=Y(),h=m.findIndex(f=>f.objectId===t&&f.sceneId===n.sceneId&&f.path===i);h>=0?m[h].value=a:m.push(n),window.__configOverrides=m,ii(m),wt()||yn(!0)}r||console.log("[CONFIG] Applied override:",n),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:n}))}function Ce(n,e={}){let t=e.emitEvent!==!1,i=[];for(let a of n)a!=null&&a.objectId&&typeof a.objectId=="string"&&i.push(a.objectId),Se(a,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let a=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:a,count:n.length}}))}}function se(){window.__configOverrides=[],window.__configChanges=[],ii([]),console.log("[CONFIG] Cleared all overrides")}function xr(n){let e=Y().filter(i=>i.objectId!==n);window.__configOverrides=e,ii(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==n),br(n),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:n}}))}function ni(n,e){let t=Y().filter(a=>a.objectId!==n||a.path!==e);window.__configOverrides=t,ii(t);let i=window.__configChanges||[];window.__configChanges=i.filter(a=>a.objectId!==n||a.path!==e),n?br(n):As(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:n,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Cs()),window.__configOverrides||[])}function xt(n,e,t){var o;let i=e.split("."),a=i.pop(),r=n;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[a]=t}function Ls(n,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,n)}function G(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(n instanceof Set)return new Set([...n].map(t=>G(t)));if(ArrayBuffer.isView(n))return n.slice();if(n instanceof Array)return n.map(t=>G(t));if(n instanceof Map){let t=new Map;return n.forEach((i,a)=>t.set(a,G(i))),t}let e={};for(let t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=G(n[t]));return e}function De(){let n=window.__editableConfigBaseline;if(!n){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return hr(e)}return hr(n)}function hr(n){let e={objects:{},scenes:{},engine:G(n.engine||{})},t=n.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=n.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 a=Y();for(let r of a)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),xt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),xt(e.scenes[r.sceneId],r.path,r.value)):xt(e.engine,r.path,r.value);return e}function ai(){let n=Y(),e=new Set;for(let t of n)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:n.length,hasChanges:n.length>0,overrides:n}}async function ri(n){let e=De(),t={};for(let[a,r]of Object.entries(e.objects)){let o=r,s=a;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[a,r]of Object.entries(e.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:n})});if(!i.ok){let a=await i.json();throw new Error(`Apply failed: ${a.error||"Unknown error"}`)}se();try{let a=ti();a&&(window.__editableConfigBaseline=G(a))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function Et(){se(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}se(),window.location.reload()}var vr,Ts,wr,K=de(()=>{"use strict";vr="handler_preview_override_mode";if(typeof window!="undefined"){let n=window.localStorage.getItem(vr);window.__enableConfigOverrides=n===null?!0:n==="true"}Ts=500;wr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function ks(n,e){try{if(typeof n=="object"&&n!==null)return n;if(typeof n!="string")return null;if(n.startsWith("data:")){let i=n.indexOf(",");if(i===-1)return null;let a=n.slice(0,i);if(!a.includes("application/json")&&!a.includes("text/plain"))return null;let r=n.slice(i+1),o=a.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=n.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(n):null}catch{return null}}function _s(n){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=n.replace(/^\.\/+/,""),i=t.split("/").pop()||t,a=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of a){let o=e[r];if(o){let s=ks(o,r);if(s!==null)return s}}return null}async function At(n){if(vn.has(n)&&!xn)return console.log(`[CONFIG] Using cached config for: "${n}"`),vn.get(n);if(console.log(`[CONFIG] loadConfigFile called with: "${n}", MODE: ${z.toUpperCase()}, CACHE: ${xn?"DISABLED":"ENABLED"}`),z==="publish"){let i=_s(n);return i?(console.log(`[CONFIG] \u2713 Loaded ${n} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${n} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}z==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${n}"`);let e;z==="brand"?e=[`./${n.split("/").pop()||n}`,`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.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=xn?"no-store":"force-cache";for(let a of e)try{let r=await fetch(a,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${n} via ${a}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${a} (mode: ${z}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${n}; using defaults`),{}})();return vn.set(n,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let n=["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 n)try{let i=z==="publish"||z==="brand"?t.split("/").pop()||t:`configs/${t}`,a=await At(i);a.component&&(e.set(a.component,a),console.log(`[CONFIG] \u2713 Schema loaded: ${a.component} ${z==="publish"||z==="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(n){console.log(`[CONFIG] Loading object config: ${n}`);let e=z==="publish"||z==="brand"?`${n}.json`:`configs/objects/${n}.json`;return await At(e)}async function li(n){let e=new Map;if(n.objects&&Array.isArray(n.objects)){for(let t of n.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let a=await Te(i);(!a||Object.keys(a).length===0)&&i!==t.instance_id&&(a=await Te(t.instance_id)),!a||Object.keys(a).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),a=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...a,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let n=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(n.map(i=>{let a=`engine.${i}.json`,r=z==="publish"||z==="brand"?a:`configs/engine/${a}`;return At(r)})),t=Object.fromEntries(n.map((i,a)=>[i,e[a]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(n.map(i=>{var o;let a=(o=t[i])!=null?o:{},r=Object.keys(a);return[i,r.length>0?r:"empty"]}))),t}async function wn(){return await At(z==="publish"||z==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(n="scene.main"){console.log(`[CONFIG] Loading scene config: ${n}`);let e=z==="publish"||z==="brand"?`${n}.json`:`configs/scenes/${n}.json`;return await At(e)}function Ze(n,e){let t=[];if(!n.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let a of i.required||[])n.identity[a]||t.push(`Missing required identity field: ${a}`);for(let[a,r]of Object.entries(n)){if(a==="identity")continue;let o=e.get(a);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${a}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${a}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${a}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function $e(n,e){let t={...n},i=["identity","transform","render"];for(let[a,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(a)||t[a])&&(t[a]||(t[a]={}),t[a]={...r.defaults,...t[a]});return t}function Q(n,e,t,i){return typeof n!="number"||!Number.isFinite(n)?e:Math.min(Math.max(n,t),i)}function Ar(n,e){if(Array.isArray(n))return{x:Q(n[0],e.x,-2e3,2e3),y:Q(n[1],e.y,-2e3,2e3)};if(!n||typeof n!="object")return e;let{x:t,y:i}=n;return{x:Q(t,e.x,-2e3,2e3),y:Q(i,e.y,-2e3,2e3)}}function Ms(n,e){if(Array.isArray(n))return{x:Q(n[0],e.x,0,1),y:Q(n[1],e.y,0,1)};if(!n||typeof n!="object")return e;let{x:t,y:i}=n;return{x:Q(t,e.x,0,1),y:Q(i,e.y,0,1)}}function Ps(n){if(Array.isArray(n))return{x:Q(n[0],.5,-10,10),y:Q(n[1],.5,-10,10)};if(n&&typeof n=="object"){let{x:e,y:t}=n;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof n=="string"?n:null}async function be(n="scene.main",e){var l,c,p,d,u,g,m,h,f,b,y,v,x,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 a=await di(n);console.log(`[CONFIG] Scene config loaded: ${((l=a.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(a);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[w,S]of o.entries()){let C=$e(S,t),O=Ze(C,t);O.valid||console.warn(`Object ${w} validation errors:`,O.errors),(c=C.transform)!=null&&c.position&&(C.transform.position=Ar(C.transform.position,{x:0,y:0})),(p=C.transform)!=null&&p.offset&&(C.transform.offset=Ar(C.transform.offset,{x:0,y:0})),((d=C.transform)==null?void 0:d.anchor)!==void 0&&(C.transform.anchor=Ps(C.transform.anchor)),((u=C.transform)==null?void 0:u.position_ratio)!==void 0&&C.transform.position_ratio!==null&&(C.transform.position_ratio=Ms(C.transform.position_ratio,{x:.5,y:.5})),o.set(w,C)}if(e){if(e.objects)for(let[w,S]of e.objects.entries())o.set(w,S);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(m=e.engine.splash)!=null?m:{}})}let s={objects:o,engine:r,scene:a,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=$e(s,t))),i.length>0&&wt()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((h=r.runtime)!=null?h:{}),assets:Object.keys((f=r.assets)!=null?f:{}),splash:Object.keys((b=r.splash)!=null?b:{}),loading:Object.keys((y=r.loading)!=null?y:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((x=r.tutorial)!=null?x:{}),endgame:Object.keys((E=r.endgame)!=null?E:{})},scene:a.scene_id||"unknown"}),s}function En(n){var t,i,a,r,o,s,l,c,p,d,u,g,m,h,f,b,y,v,x,E,w,S,C,O,B,M,T,I,P,D,j,$,A;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[k,_]of n.objects.entries()){let q=((t=_.identity)==null?void 0:t.id)||k;q.includes("character")&&(e.gameplay.character_pos=((i=_.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((a=_.transform)==null?void 0:a.scale)||1,e.gameplay.character_anim_speed=((o=(r=_.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=_.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=_.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=_.gun||{},e.gameplay.gunmuzzle=((d=_.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=_.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=_.effects)==null?void 0:g.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=_),q.includes("ice")&&(e.gameplay.melt=_.melt||{},e.gameplay.melt_anchor=((m=_.transform)==null?void 0:m.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=_.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((f=_.effects)==null?void 0:f.hybrid_melting)||{},e.gameplay.physics_chunks=((b=_.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=_.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=_.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=_),q.includes("crack")&&(e.gameplay.crack=_),q.includes("hand")&&(e.gameplay.hand=((v=_.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((x=_.transform)==null?void 0:x.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=_.transform)==null?void 0:E.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((w=_.gameplay)==null?void 0:w.tuning)||{},e.gameplay.danger_pos=((S=_.transform)==null?void 0:S.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((O=(C=_.gameplay)==null?void 0:C.tuning)==null?void 0:O.danger_pulse)||{},e.gameplay.hazard_height=((M=(B=_.gameplay)==null?void 0:B.tuning)==null?void 0:M.hazard_height)||140)}return e.gameplay.timeline=((T=n.engine.runtime)==null?void 0:T.timeline)||{},e.gameplay.drag_surface=((I=n.engine.runtime)==null?void 0:I.drag_surface)||{},e.gameplay.background=((P=n.engine.runtime)==null?void 0:P.background)||{},e.gameplay.ui_styles=((D=n.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((j=n.engine.runtime)==null?void 0:j.label_pulse)||{},e.ui=(($=n.engine.runtime)==null?void 0:$.ui)||{},e.theme=((A=n.engine.runtime)==null?void 0:A.theme)||{},e.assets=n.engine.assets||{},e}var Er,z,vn,xn,An=de(()=>{"use strict";K();Er=null,z="dev";if(typeof window!="undefined"){let n=window.__BUILD_SETTINGS__;if(n!=null&&n.buildMode)Er=n,z=n.buildMode,console.log("[CONFIG] Loaded inline build settings:",n,"buildMode:",z);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Er=t,z=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",z)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",z)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",z);vn=new Map,xn=z==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Sn(n,e){let t=[];function i(a,r,o=""){if(a!==r){if(typeof a!=typeof r){t.push(`${o}: type changed`);return}if(typeof a=="object"&&a!==null&&r!==null){let s=new Set([...Object.keys(a),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in a?l in r?i(a[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(n,e),t}function Cn(n,e,t,i){let a={...t};for(let[r,o]of i.entries())a[r]&&o.defaults&&(a[r]={...o.defaults,...a[r]});return a}var St,ze,Tn=de(()=>{"use strict";St=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},ze=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,a=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(a.ok){let r=await a.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(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 a=e.charCodeAt(i);t=(t<<5)-t+a,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function kn(n){if(typeof window=="undefined")return;let e=typeof Ln!="undefined"&&!!Ln.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let a=null,r=!1,o=null;if(t){o=new ze;let m=window.__configWatcher;m!=null&&m.stop&&m.stop(),window.__configWatcher=o}let s=new Set,l=m=>{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 f=(y=(b=m.scene)==null?void 0:b.objects)!=null?y:[];for(let v of f)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of s)h.has(v)||o.unwatch(v);for(let v of h)s.has(v)||o.watch(v,x=>g(x));s=h},c=new Set,p=!1,d=async m=>{let h=await Te(m),f=$e(h,n.activeConfig.schemas),b=Ze(f,n.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${m} validation errors:`,b.errors),await n.liveEditBridge.applyObjectConfig(m,f)};async function u(m){if(!r){r=!0;try{if(p||c.size===0){n.audioSystem.destroy();let h=await be("scene.main");n.setActiveConfig(h),n.gameObjectManager.updateConfig(h),n.CustomAssets.updateConfig(h),await n.CustomAssets.ready();let f=n.createAudioSystem(h);n.setAudioSystem(f),window.__audioSystem=f,await f.start(),n.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${m})`)}else{let h=Array.from(c);c.clear();for(let f of h)await d(f);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{r=!1,p=!1,c.clear()}}}function g(m){m.type==="object"&&m.objectId?c.add(m.objectId):p=!0,a&&window.clearTimeout(a),a=window.setTimeout(()=>{u(m.type)},120)}e&&Ln.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(n.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Ln,Sr=de(()=>{"use strict";Tn();An();Ln={}});var Cr={};ht(Cr,{ConfigWatcher:()=>ze,DefaultReloadStrategy:()=>St,applyDefaults:()=>$e,diffConfigs:()=>Sn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>wn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Cn,setupHotReload:()=>kn,toLegacyFormat:()=>En,validateObjectConfig:()=>Ze});var pi=de(()=>{"use strict";An();Tn();Sr()});var so={};ht(so,{AssetEditorModal:()=>sa});var sa,la=de(()=>{"use strict";sa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,a){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=a,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
1
|
+
"use strict";var Io=Object.create;var Ft=Object.defineProperty;var jo=Object.getOwnPropertyDescriptor;var Ro=Object.getOwnPropertyNames;var Do=Object.getPrototypeOf,$o=Object.prototype.hasOwnProperty;var de=(n,e)=>()=>(n&&(e=n(n=0)),e);var ht=(n,e)=>{for(var t in e)Ft(n,t,{get:e[t],enumerable:!0})},La=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ro(e))!$o.call(n,a)&&a!==t&&Ft(n,a,{get:()=>e[a],enumerable:!(i=jo(e,a))||i.enumerable});return n};var Ve=(n,e,t)=>(t=n!=null?Io(Do(n)):{},La(e||!n||!n.__esModule?Ft(t,"default",{value:n,enumerable:!0}):t,n)),zo=n=>La(Ft({},"__esModule",{value:!0}),n);var pe,ln=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Vo(){var n,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(n=document.querySelector("script"))==null?void 0:n.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 Wo(){try{if(typeof window!="undefined"){let n=await fetch("./build-settings.json");if(n.ok){let e=await n.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function Yo(){try{if(typeof window!="undefined"){let n=new XMLHttpRequest;if(n.open("GET","./build-settings.json",!1),n.send(),n.status===200&&n.responseText){let e=JSON.parse(n.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function Ko(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${H}`),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(!(H==="publish"&&re!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!cn){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),cn=(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 a=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let r=a[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await cn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function dn(n){return n===null||typeof n!="object"||(Object.freeze(n),Object.values(n).forEach(e=>dn(e))),n}function Xo(n=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=n,i.height=e;let a=i.getContext("2d");return a.fillStyle=`#${t.toString(16).padStart(6,"0")}`,a.fillRect(0,0,n,e),a.strokeStyle="#000",a.strokeRect(0,0,n,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",n/2,e/2),ge.Texture.from(i)}function pn(n,e){or.set(n,e)}var ge,ar,rr,Ie,H,re,Ee,ue,cn,or,je,Vt=de(()=>{"use strict";ge=require("pixi.js");ln();ar=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",rr=Vo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,H=rr?"publish":ar,re=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(H=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${H}`));Ee=Yo();Ee!=null&&Ee.buildMode&&(H=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${H}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(re=Ee.assetsInlined);Wo().then(n=>{n!=null&&n.buildMode&&n.buildMode!==H&&(H=n.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${H}`)),(n==null?void 0:n.assetsInlined)!==void 0&&(re=n.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${ar}, Runtime: ${rr?"publish":"dev"}, Effective: ${H}`);ue={},cn=null;or=new Map;je=class{static async load(e,t,i,a){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${H}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await Ko(),l=s[e];if(!l&&a&&(l=s[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),H==="publish"&&re!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=or.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=dn(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=H==="publish",a=i&&re!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${H}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=H==="publish",a=i&&re!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${H}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(H==="dev"){let r=t==="image"?Xo():dn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};pn("image",async(n,e)=>{let t=H==="publish",i=t&&re!==!1,a=H==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${H}, isPublishMode: ${t}, isBrandMode: ${a}, 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: ${n}`);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=n;return(a||r)&&n&&!n.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=n,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${n}" as-is`)):(o=`assets/${n}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${n}" -> "${o}"`))),ge.Assets.load(e||o)});pn("json",async(n,e)=>{let t=H==="publish",i=t&&re!==!1,a=H==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${H}, isPublishMode: ${t}, isBrandMode: ${a}, 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: ${n}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=n;if((a||r)&&n&&!n.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=n,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${n}" as-is`)):(o=`assets/${n}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${n}" -> "${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: ${n}`);return s.json()})});var lr={};ht(lr,{AssetTextures:()=>oe,initAssetTextures:()=>hn});function hn(n,e){sr.init(n,e),typeof window!="undefined"&&(window.__AssetTextures=oe)}var gn,sr,oe,Xe=de(()=>{"use strict";Vt();gn=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"]),a=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let g=await je.load(s,c,t,u);this.textures.set(s,g),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?a.push(p()):r.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let a=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(a.length===0)return;this.ready().catch(()=>{});let r=()=>a.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:a}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},sr=new gn,oe=new Proxy(sr,{get(n,e){return e in n&&typeof n[e]=="function"?n[e].bind(n):n.get(e)},set(n,e,t){return n.set(e,t),!0}})});var Je={};ht(Je,{applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>xr,configOverrideManager:()=>wr,deepClone:()=>G,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>wt,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setOverrideMode:()=>yn});function ti(){return typeof window=="undefined"?null:window.__editableConfig||null}function fr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function gr(n,e){var t,i;if(!n)return null;try{if(n instanceof Map)return(t=n.get(e))!=null?t:null;if(typeof n=="object")return(i=n[e])!=null?i:null}catch{}return null}function Es(n,e,t){if(n){if(n instanceof Map){n.set(e,t);return}typeof n=="object"&&(n[e]=t)}}function mr(n,e){for(let t of e)xt(n,t.path,t.value)}function br(n){var s;if(typeof window=="undefined")return;let e=ti();if(!e)return;let t=fr(),i=(s=t?gr(t.objects,n):null)!=null?s:gr(e.objects,n);if(!i)return;let a=G(i),r=Y().filter(l=>l.objectId===n);try{mr(a,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",n,l);return}Es(e.objects,n,a);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(n,a)}catch{}}function As(){var a;if(typeof window=="undefined")return;let n=ti();if(!(n!=null&&n.engine))return;let e=fr(),t=G(((a=e==null?void 0:e.engine)!=null?a:n.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{mr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=n.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{n.engine=t}}function Ss(){if(typeof window=="undefined")return"unknown";let n=window;return typeof n.__HANDLER_PROJECT_ID=="string"?n.__HANDLER_PROJECT_ID:"handler-default"}function yr(){return`handler_preview_config_overrides::${Ss()}`}function Cs(){if(typeof window=="undefined")return[];try{let n=window.localStorage.getItem(yr());if(!n)return[];let e=JSON.parse(n);return Array.isArray(e)?e:[]}catch{return[]}}function ii(n){if(typeof window!="undefined")try{window.localStorage.setItem(yr(),JSON.stringify(n))}catch{}}function wt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function yn(n){if(typeof window!="undefined"){window.__enableConfigOverrides=n;try{window.localStorage.setItem(vr,n?"true":"false")}catch{}}}function Se(n,e={}){var u,g;let{objectId:t,path:i,value:a}=n,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ti();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:a});let p;try{p=Ls(c,i),xt(c,i,a)}catch(m){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:a},m);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:a,ts:Date.now()}),d.length>Ts&&d.shift(),o){let m=Y(),h=m.findIndex(f=>f.objectId===t&&f.sceneId===n.sceneId&&f.path===i);h>=0?m[h].value=a:m.push(n),window.__configOverrides=m,ii(m),wt()||yn(!0)}r||console.log("[CONFIG] Applied override:",n),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:n}))}function Ce(n,e={}){let t=e.emitEvent!==!1,i=[];for(let a of n)a!=null&&a.objectId&&typeof a.objectId=="string"&&i.push(a.objectId),Se(a,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let a=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:a,count:n.length}}))}}function se(){window.__configOverrides=[],window.__configChanges=[],ii([]),console.log("[CONFIG] Cleared all overrides")}function xr(n){let e=Y().filter(i=>i.objectId!==n);window.__configOverrides=e,ii(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==n),br(n),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:n}}))}function ni(n,e){let t=Y().filter(a=>a.objectId!==n||a.path!==e);window.__configOverrides=t,ii(t);let i=window.__configChanges||[];window.__configChanges=i.filter(a=>a.objectId!==n||a.path!==e),n?br(n):As(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:n,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Cs()),window.__configOverrides||[])}function xt(n,e,t){var o;let i=e.split("."),a=i.pop(),r=n;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[a]=t}function Ls(n,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,n)}function G(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(n instanceof Set)return new Set([...n].map(t=>G(t)));if(ArrayBuffer.isView(n))return n.slice();if(n instanceof Array)return n.map(t=>G(t));if(n instanceof Map){let t=new Map;return n.forEach((i,a)=>t.set(a,G(i))),t}let e={};for(let t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=G(n[t]));return e}function De(){let n=window.__editableConfigBaseline;if(!n){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return hr(e)}return hr(n)}function hr(n){let e={objects:{},scenes:{},engine:G(n.engine||{})},t=n.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=n.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 a=Y();for(let r of a)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),xt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),xt(e.scenes[r.sceneId],r.path,r.value)):xt(e.engine,r.path,r.value);return e}function ai(){let n=Y(),e=new Set;for(let t of n)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:n.length,hasChanges:n.length>0,overrides:n}}async function ri(n){let e=De(),t={};for(let[a,r]of Object.entries(e.objects)){let o=r,s=a;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[a,r]of Object.entries(e.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:n})});if(!i.ok){let a=await i.json();throw new Error(`Apply failed: ${a.error||"Unknown error"}`)}se();try{let a=ti();a&&(window.__editableConfigBaseline=G(a))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function Et(){se(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}se(),window.location.reload()}var vr,Ts,wr,K=de(()=>{"use strict";vr="handler_preview_override_mode";if(typeof window!="undefined"){let n=window.localStorage.getItem(vr);window.__enableConfigOverrides=n===null?!0:n==="true"}Ts=500;wr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function ks(n,e){try{if(typeof n=="object"&&n!==null)return n;if(typeof n!="string")return null;if(n.startsWith("data:")){let i=n.indexOf(",");if(i===-1)return null;let a=n.slice(0,i);if(!a.includes("application/json")&&!a.includes("text/plain"))return null;let r=n.slice(i+1),o=a.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=n.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(n):null}catch{return null}}function _s(n){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=n.replace(/^\.\/+/,""),i=t.split("/").pop()||t,a=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of a){let o=e[r];if(o){let s=ks(o,r);if(s!==null)return s}}return null}async function At(n){if(vn.has(n)&&!xn)return console.log(`[CONFIG] Using cached config for: "${n}"`),vn.get(n);if(console.log(`[CONFIG] loadConfigFile called with: "${n}", MODE: ${z.toUpperCase()}, CACHE: ${xn?"DISABLED":"ENABLED"}`),z==="publish"){let i=_s(n);return i?(console.log(`[CONFIG] \u2713 Loaded ${n} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${n} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}z==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${n}"`);let e;z==="brand"?e=[`./${n.split("/").pop()||n}`,`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.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=xn?"no-store":"force-cache";for(let a of e)try{let r=await fetch(a,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${n} via ${a}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${a} (mode: ${z}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${n}; using defaults`),{}})();return vn.set(n,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let n=["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 n)try{let i=z==="publish"||z==="brand"?t.split("/").pop()||t:`configs/${t}`,a=await At(i);a.component&&(e.set(a.component,a),console.log(`[CONFIG] \u2713 Schema loaded: ${a.component} ${z==="publish"||z==="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(n){console.log(`[CONFIG] Loading object config: ${n}`);let e=z==="publish"||z==="brand"?`${n}.json`:`configs/objects/${n}.json`;return await At(e)}async function li(n){let e=new Map;if(n.objects&&Array.isArray(n.objects)){for(let t of n.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let a=await Te(i);(!a||Object.keys(a).length===0)&&i!==t.instance_id&&(a=await Te(t.instance_id)),!a||Object.keys(a).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),a=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...a,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let n=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(n.map(i=>{let a=`engine.${i}.json`,r=z==="publish"||z==="brand"?a:`configs/engine/${a}`;return At(r)})),t=Object.fromEntries(n.map((i,a)=>[i,e[a]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(n.map(i=>{var o;let a=(o=t[i])!=null?o:{},r=Object.keys(a);return[i,r.length>0?r:"empty"]}))),t}async function wn(){return await At(z==="publish"||z==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(n="scene.main"){console.log(`[CONFIG] Loading scene config: ${n}`);let e=z==="publish"||z==="brand"?`${n}.json`:`configs/scenes/${n}.json`;return await At(e)}function Ze(n,e){let t=[];if(!n.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let a of i.required||[])n.identity[a]||t.push(`Missing required identity field: ${a}`);for(let[a,r]of Object.entries(n)){if(a==="identity")continue;let o=e.get(a);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${a}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${a}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${a}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function $e(n,e){let t={...n},i=["identity","transform","render"];for(let[a,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(a)||t[a])&&(t[a]||(t[a]={}),t[a]={...r.defaults,...t[a]});return t}function Q(n,e,t,i){return typeof n!="number"||!Number.isFinite(n)?e:Math.min(Math.max(n,t),i)}function Ar(n,e){if(Array.isArray(n))return{x:Q(n[0],e.x,-2e3,2e3),y:Q(n[1],e.y,-2e3,2e3)};if(!n||typeof n!="object")return e;let{x:t,y:i}=n;return{x:Q(t,e.x,-2e3,2e3),y:Q(i,e.y,-2e3,2e3)}}function Ps(n,e){if(Array.isArray(n))return{x:Q(n[0],e.x,0,1),y:Q(n[1],e.y,0,1)};if(!n||typeof n!="object")return e;let{x:t,y:i}=n;return{x:Q(t,e.x,0,1),y:Q(i,e.y,0,1)}}function Ms(n){if(Array.isArray(n))return{x:Q(n[0],.5,-10,10),y:Q(n[1],.5,-10,10)};if(n&&typeof n=="object"){let{x:e,y:t}=n;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof n=="string"?n:null}async function be(n="scene.main",e){var l,c,p,d,u,g,m,h,f,b,y,v,x,w;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 a=await di(n);console.log(`[CONFIG] Scene config loaded: ${((l=a.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(a);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[E,C]of o.entries()){let A=$e(C,t),M=Ze(A,t);M.valid||console.warn(`Object ${E} validation errors:`,M.errors),(c=A.transform)!=null&&c.position&&(A.transform.position=Ar(A.transform.position,{x:0,y:0})),(p=A.transform)!=null&&p.offset&&(A.transform.offset=Ar(A.transform.offset,{x:0,y:0})),((d=A.transform)==null?void 0:d.anchor)!==void 0&&(A.transform.anchor=Ms(A.transform.anchor)),((u=A.transform)==null?void 0:u.position_ratio)!==void 0&&A.transform.position_ratio!==null&&(A.transform.position_ratio=Ps(A.transform.position_ratio,{x:.5,y:.5})),o.set(E,A)}if(e){if(e.objects)for(let[E,C]of e.objects.entries())o.set(E,C);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(m=e.engine.splash)!=null?m:{}})}let s={objects:o,engine:r,scene:a,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=$e(s,t))),i.length>0&&wt()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((h=r.runtime)!=null?h:{}),assets:Object.keys((f=r.assets)!=null?f:{}),splash:Object.keys((b=r.splash)!=null?b:{}),loading:Object.keys((y=r.loading)!=null?y:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((x=r.tutorial)!=null?x:{}),endgame:Object.keys((w=r.endgame)!=null?w:{})},scene:a.scene_id||"unknown"}),s}function En(n){var t,i,a,r,o,s,l,c,p,d,u,g,m,h,f,b,y,v,x,w,E,C,A,M,B,P,T,I,O,D,j,$,S;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[k,_]of n.objects.entries()){let q=((t=_.identity)==null?void 0:t.id)||k;q.includes("character")&&(e.gameplay.character_pos=((i=_.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((a=_.transform)==null?void 0:a.scale)||1,e.gameplay.character_anim_speed=((o=(r=_.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=_.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=_.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=_.gun||{},e.gameplay.gunmuzzle=((d=_.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=_.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=_.effects)==null?void 0:g.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=_),q.includes("ice")&&(e.gameplay.melt=_.melt||{},e.gameplay.melt_anchor=((m=_.transform)==null?void 0:m.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=_.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((f=_.effects)==null?void 0:f.hybrid_melting)||{},e.gameplay.physics_chunks=((b=_.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=_.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=_.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=_),q.includes("crack")&&(e.gameplay.crack=_),q.includes("hand")&&(e.gameplay.hand=((v=_.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((x=_.transform)==null?void 0:x.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((w=_.transform)==null?void 0:w.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((E=_.gameplay)==null?void 0:E.tuning)||{},e.gameplay.danger_pos=((C=_.transform)==null?void 0:C.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((M=(A=_.gameplay)==null?void 0:A.tuning)==null?void 0:M.danger_pulse)||{},e.gameplay.hazard_height=((P=(B=_.gameplay)==null?void 0:B.tuning)==null?void 0:P.hazard_height)||140)}return e.gameplay.timeline=((T=n.engine.runtime)==null?void 0:T.timeline)||{},e.gameplay.drag_surface=((I=n.engine.runtime)==null?void 0:I.drag_surface)||{},e.gameplay.background=((O=n.engine.runtime)==null?void 0:O.background)||{},e.gameplay.ui_styles=((D=n.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((j=n.engine.runtime)==null?void 0:j.label_pulse)||{},e.ui=(($=n.engine.runtime)==null?void 0:$.ui)||{},e.theme=((S=n.engine.runtime)==null?void 0:S.theme)||{},e.assets=n.engine.assets||{},e}var Er,z,vn,xn,An=de(()=>{"use strict";K();Er=null,z="dev";if(typeof window!="undefined"){let n=window.__BUILD_SETTINGS__;if(n!=null&&n.buildMode)Er=n,z=n.buildMode,console.log("[CONFIG] Loaded inline build settings:",n,"buildMode:",z);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Er=t,z=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",z)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",z)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",z);vn=new Map,xn=z==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Sn(n,e){let t=[];function i(a,r,o=""){if(a!==r){if(typeof a!=typeof r){t.push(`${o}: type changed`);return}if(typeof a=="object"&&a!==null&&r!==null){let s=new Set([...Object.keys(a),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in a?l in r?i(a[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(n,e),t}function Cn(n,e,t,i){let a={...t};for(let[r,o]of i.entries())a[r]&&o.defaults&&(a[r]={...o.defaults,...a[r]});return a}var St,ze,Tn=de(()=>{"use strict";St=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},ze=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,a=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(a.ok){let r=await a.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(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 a=e.charCodeAt(i);t=(t<<5)-t+a,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function kn(n){if(typeof window=="undefined")return;let e=typeof Ln!="undefined"&&!!Ln.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let a=null,r=!1,o=null;if(t){o=new ze;let m=window.__configWatcher;m!=null&&m.stop&&m.stop(),window.__configWatcher=o}let s=new Set,l=m=>{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 f=(y=(b=m.scene)==null?void 0:b.objects)!=null?y:[];for(let v of f)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of s)h.has(v)||o.unwatch(v);for(let v of h)s.has(v)||o.watch(v,x=>g(x));s=h},c=new Set,p=!1,d=async m=>{let h=await Te(m),f=$e(h,n.activeConfig.schemas),b=Ze(f,n.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${m} validation errors:`,b.errors),await n.liveEditBridge.applyObjectConfig(m,f)};async function u(m){if(!r){r=!0;try{if(p||c.size===0){n.audioSystem.destroy();let h=await be("scene.main");n.setActiveConfig(h),n.gameObjectManager.updateConfig(h),n.CustomAssets.updateConfig(h),await n.CustomAssets.ready();let f=n.createAudioSystem(h);n.setAudioSystem(f),window.__audioSystem=f,await f.start(),n.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${m})`)}else{let h=Array.from(c);c.clear();for(let f of h)await d(f);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{r=!1,p=!1,c.clear()}}}function g(m){m.type==="object"&&m.objectId?c.add(m.objectId):p=!0,a&&window.clearTimeout(a),a=window.setTimeout(()=>{u(m.type)},120)}e&&Ln.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(n.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Ln,Sr=de(()=>{"use strict";Tn();An();Ln={}});var Cr={};ht(Cr,{ConfigWatcher:()=>ze,DefaultReloadStrategy:()=>St,applyDefaults:()=>$e,diffConfigs:()=>Sn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>wn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Cn,setupHotReload:()=>kn,toLegacyFormat:()=>En,validateObjectConfig:()=>Ze});var pi=de(()=>{"use strict";An();Tn();Sr()});var so={};ht(so,{AssetEditorModal:()=>sa});var sa,la=de(()=>{"use strict";sa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,a){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=a,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 a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let 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:a=>{this.onApplyCallback&&this.onApplyCallback(a),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var pl={};ht(pl,{COLORS:()=>ce,ConfigWatcher:()=>ze,DebugPanel:()=>Ot,DefaultReloadStrategy:()=>St,Handler:()=>ie,PlayableLoadingScreen:()=>Ui,PreviewShell:()=>Ni,STROKE_WIDTH:()=>mo,THEME:()=>bo,applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>$e,baseLottie:()=>rn,bootstrap:()=>el,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>xr,configOverrideManager:()=>wr,createPreviewShell:()=>pa,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>Pn,devicePresets:()=>Mn,diffConfigs:()=>Sn,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>wt,getPresetById:()=>He,getPresetsByCategory:()=>Os,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>wn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Cn,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setBootstrapDependencies:()=>Zs,setOverrideMode:()=>yn,setupHotReload:()=>kn,setupLiveEditBridge:()=>Bi,toLegacyFormat:()=>En,validateObjectConfig:()=>Ze});module.exports=zo(pl);var we={};function Ut(n,e,t=!1){we[n]||(we[n]=[]),we[n].push({fn:e,once:t})}function en(n,e){if(we[n]){if(!e){delete we[n];return}we[n]=we[n].filter(t=>t.fn!==e)}}function Gt(n,...e){let t=we[n];if(t)for(let i of[...t])i.fn(...e),i.once&&en(n,i.fn)}function X(n,e){Ut(n,e,!0)}var F=null,ee=[],We=null;function Ma(n){F=n,ee=[],We!==null&&(clearTimeout(We),We=null)}function Pa(){var n,e,t;return{endpoint:(F==null?void 0:F.endpoint)||"",transport:(F==null?void 0:F.transport)||"beacon",batchSize:(n=F==null?void 0:F.batchSize)!=null?n:10,flushIntervalMs:(e=F==null?void 0:F.flushIntervalMs)!=null?e:300,maxQueue:(t=F==null?void 0:F.maxQueue)!=null?t:200,debug:!!(F!=null&&F.debug)}}async function ka(n,e,t,i){let a=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(n,new Blob([a],{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(n,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function tn(n,e){let t=Pa();if(e&&t.endpoint){if(ee.push(n),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){_a();return}We===null&&(We=window.setTimeout(()=>{We=null,_a()},t.flushIntervalMs))}}async function _a(){let n=Pa();if(!n.endpoint||ee.length===0)return;let e=ee.splice(0,n.batchSize);await ka(n.endpoint,{events:e},n.transport,n.debug),ee.length>0&&await ka(n.endpoint,{events:ee.splice(0,n.batchSize)},n.transport,n.debug)}function Oa(n){return Math.max(0,Math.min(1,n))}function Ho(n){let e=String(n!=null?n:"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 a=>1+(i+1)*Math.pow(a-1,3)+i*Math.pow(a-1,2)}return t=>1-(1-t)*(1-t)}function ft(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function No(n,e){let t=n==null?void 0:n[e];return typeof t=="number"?t:0}function Ia(n,e,t){try{n[e]=t}catch{}}function Bo(n){let e=n==null?void 0:n.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 ja(n,e){let t=n==null?void 0:n.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 Ra(n,e){let t=Bo(n);if(!t)return{from:null,to:null};let i=null,a=null;return typeof e.scale=="number"?(i=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),i===null&&a===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:a!=null?a:t.y}}}function Da(){let n=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),n.size>0&&i()})},a=p=>{var u;n.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{n.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ft();for(let g of Array.from(n)){if(g.killed||g.paused)continue;let m=p-g.startMs-g.delayMs;if(m<0)continue;let h=g.durationMs>0?m/g.durationMs:1,f=Oa(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 E=h-y;f=Oa(E)}let v=g.ease(f);g.yoyo&&y%2===1&&(v=1-v);for(let E of g.props)Ia(g.target,E.key,E.from+(E.to-E.from)*v);g.scaleFrom&&g.scaleTo&&ja(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 E;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),m=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),h=Ho(d.ease),f=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let w of Object.keys(d)){if(y.has(w))continue;let S=d[w];typeof S=="number"&&v.push({key:w,from:No(p,w),to:S})}let x=Ra(p,d);return{target:p,startMs:ft(),delayMs:m,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:f,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return a(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ft())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ft(),m=ft()-g;u.startMs+=m,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let m=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof m=="number"&&Ia(p,g,m)}let u=Ra(p,d);u.to&&ja(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,g=!1,m=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},f=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return f({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,E){return f({kind:"fromTo",target:y,vars:x,from:v,atMs:h(E)}),b},play(){var y,v;if(g)return b;g=!0,m=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),m.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of m)y.pause();return b},kill(){for(let y of m)y.kill();m=[],g=!1}};return p.paused||b.play(),b}};return c}function $a(){if(typeof window=="undefined")return;let n=window;if(!n.gsap)try{n.gsap=Da()}catch{}}var za={name:"handler-playable-sdk",version:"0.3.76",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var J=0,Uo=J++,Ha=J++,Na=J++,Ba=J++,Fa=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,Wa=J++,Ya=J++,Ka=J++,N=Uo;function Xa(){return N===Ha}function Ja(){return N===Na}function Za(){return N===Ba}function Qa(){return N===Fa}function Ye(){return N===Ua}function Ke(){return N===Ga}function er(){return N===qa}function tr(){return N===Va}function ir(){return N===Wa}function nn(){return N===Ya}function an(){return N===Ka}function nr(){let n=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(n==="mraid")try{mraid.getState(),N=Ha;return}catch{}else if(n==="dapi")try{dapi.isReady(),N=Na;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(N=Ba)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(N=Fa)}catch{}else if(e==="mintegral")window.gameReady&&(N=Ua);else if(e==="tapjoy")window.TJ_API&&(N=Ga);else if(e==="tiktok")window.openAppStore&&(N=qa);else if(e==="smadex")try{window.smxTracking&&(N=Va)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(N=Wa)}catch{}else e==="vungle"?N=Ya:(n==="nucleo"||e==="nucleo")&&(N=Ka)}var qt=Ve(require("lottie-web"),1),rn=qt.default;typeof window!="undefined"&&(window.lottie=qt.default,window.__baseLottie=qt.default);var Go=require("pixi.js");var on=require("pixi.js");var qo=null;function sn(n){qo=n}Vt();ln();var mt=require("pixi.js");Vt();var Jo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",un=Jo;if(typeof window!="undefined")try{let n=new XMLHttpRequest;if(n.open("GET","./build-settings.json",!1),n.send(),n.status===200&&n.responseText){let e=JSON.parse(n.responseText);e!=null&&e.buildMode&&(un=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${un}`))}}catch{}function Zo(n){var t,i,a,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(n);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(n))return{x:(t=n[0])!=null?t:.5,y:(i=n[1])!=null?i:.5};if(n&&typeof n=="object"&&"x"in n&&"y"in n)return{x:(a=n.x)!=null?a:.5,y:(r=n.y)!=null?r:.5};if(typeof n=="string"){let s=n.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Ae=class{static async create(e,t,i){var l,c,p,d,u,g,m;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${un}`);let a=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new mt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${a.type}, path: ${a.path}`);let o=await je.load(e,a,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(a.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new mt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(a.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof mt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],f=!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:",(m=s==null?void 0:s.constructor)==null?void 0:m.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var a,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(a=t.position.x)!=null?a:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Zo(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var bt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};var ts=Ve(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ts);Xe();var Wt=require("pixi.js");Xe();var fn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new bt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));if(t.length===0)return;let i=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Ae.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let a=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await i(a)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Ae.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new fn,ns=new Proxy(is,{get(n,e){if(e in n&&typeof n[e]=="function")return n[e].bind(n);if(n.get(e))return n.get(e)}});Xe();var cr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Kt={scale:1,position:1},bn=[];function rs(n,e,t,i,a,r,o){bn.push({element:n,originalScale:r,positionHelper:e,heightPercent:a}),e(n,t,i,a,r,o,!1)}function os(){bn.forEach(({element:n,originalScale:e,positionHelper:t,heightPercent:i})=>{let a=e*he.scaleFactor;t(n,he.width,he.height,i,a,!0,!1)})}function mn(n,e){console.log(`[SCREEN] updateScreenState called: ${n}x${e}`),he.width=n,he.height=e,he.scaleFactor=Math.min(n/he.designWidth,1.15),Kt.scale=he.scaleFactor,Kt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Kt.scale.toFixed(3)}`),os()}var vt={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function ss(n,e,t){let i=vt[n];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${n}.${e} = ${t}`))}function ls(){return vt}var cs={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Yt(n,e){return typeof n=="number"&&Number.isFinite(n)?n:e}function Xt(n,e={x:.5,y:.5}){var t;if(Array.isArray(n))return{x:Yt(n[0],e.x),y:Yt(n[1],e.y)};if(n&&typeof n=="object"){let i=n;return{x:Yt(i.x,e.x),y:Yt(i.y,e.y)}}if(typeof n=="string"){let i=n.trim().toLowerCase();return(t=cs[i])!=null?t:e}return e}function dr(n,e,t,i={}){var g,m,h,f,b,y;let a=Xt(t),r=(g=i.inset)!=null?g:{},o=(m=i.padding)!=null?m:{x:0,y:0},s=((h=r.left)!=null?h:0)+o.x,l=((f=r.right)!=null?f:0)+o.x,c=((b=r.top)!=null?b:0)+o.y,p=((y=r.bottom)!=null?y:0)+o.y,d=Math.max(0,n-s-l),u=Math.max(0,e-c-p);return{x:s+d*a.x,y:c+u*a.y}}function pr(n,e,t,i={}){var h,f,b,y,v,x;let a=(h=i.inset)!=null?h:{},r=(f=i.padding)!=null?f:{x:0,y:0},o=((b=a.left)!=null?b:0)+r.x,s=((y=a.right)!=null?y:0)+r.x,l=((v=a.top)!=null?v:0)+r.y,c=((x=a.bottom)!=null?x:0)+r.y,p=Math.max(0,n-o-s),d=Math.max(0,e-l-c),u=Xt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),m=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*m}}if(typeof window!="undefined"){let n=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,a=window.innerHeight;(i!==n||a!==e)&&(n=i,e=a,mn(i,a))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),mn(window.innerWidth,window.innerHeight),window.updateDebugConfig=ss,window.getDebugConfig=ls,window.copyConfig=xs,window.applyConfig=yt,window.applyConfigForRatio=ws,window.positionAtBottom=ur,window.positionAtTop=us,window.positionAtCenter=gs,window.positionAtLeft=hs,window.positionAtRight=fs,window.positionAtBottomLeft=ms,window.positionAtBottomRight=bs,window.positionAtTopLeft=ys,window.positionAtTopRight=vs,window.applyPositionContract=ps,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Jt(n,e,t=0){return n*e+t}function Zt(n,e,t=0){return n*(1-e)+t}function Qt(n,e,t=0){return n*e+t}function ei(n,e,t=0){return n*(1-e)+t}function Z(n,e=0){return n/2+e}function ds(n,e){return n*e}function ps(n,e,t,i){var o,s,l,c,p,d,u,g,m,h,f,b,y,v,x,E,w,S,C,O;let a=0,r=0;switch(i.type){case"top":a=Z(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Jt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":a=Z(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Zt(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":a=Qt(e,i.percent,(h=(m=i.offset)==null?void 0:m.x)!=null?h:0),r=Z(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":a=ei(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=Z(t,(E=(x=i.offset)==null?void 0:x.y)!=null?E:0);break;case"center":a=Z(e,(S=(w=i.offset)==null?void 0:w.x)!=null?S:0),r=Z(t,(O=(C=i.offset)==null?void 0:C.y)!=null?O:0);break}n.position?n.position.set(a,r):(n.x=a,n.y=r),i.scale!==void 0&&i.scale!==1&&n.scale&&(typeof n.scale.set=="function"?n.scale.set(i.scale,i.scale):(n.scale.x=i.scale,n.scale.y=i.scale))}function ur(n,e,t,i=.2,a=1,r=!0,o=!1){let s=ds(t,i),l=Zt(t,i/2);fe(n,Z(e),l);let c=r?a*he.scaleFactor:a;me(n,c),o&&!bn.find(p=>p.element===n)&&rs(n,ur,e,t,i,a,r)}function us(n,e,t,i=.1,a=1){fe(n,Z(e),Jt(t,i)),me(n,a)}function gs(n,e,t,i=0,a=0,r=1){fe(n,Z(e,i),Z(t,a)),me(n,r)}function hs(n,e,t,i=.1,a=1){fe(n,Qt(e,i),Z(t)),me(n,a)}function fs(n,e,t,i=.1,a=1){fe(n,ei(e,i),Z(t)),me(n,a)}function ms(n,e,t,i=.05,a=.05,r=1){fe(n,Qt(e,a),Zt(t,i)),me(n,r)}function bs(n,e,t,i=.05,a=.05,r=1){fe(n,ei(e,a),Zt(t,i)),me(n,r)}function ys(n,e,t,i=.05,a=.05,r=1){fe(n,Qt(e,a),Jt(t,i)),me(n,r)}function vs(n,e,t,i=.05,a=.05,r=1){fe(n,ei(e,a),Jt(t,i)),me(n,r)}function fe(n,e,t){n&&n.position?typeof n.position.set=="function"?n.position.set(e,t):(n.position.x=e,n.position.y=t):n&&(n.x=e,n.y=t)}function me(n,e){e!==1&&n&&n.scale&&(typeof n.scale.set=="function"?n.scale.set(e,e):n.scale.x!==void 0&&n.scale.y!==void 0&&(n.scale.x=e,n.scale.y=e))}var Re={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function xs(n){return n&&Re[n]?JSON.parse(JSON.stringify(Re[n])):JSON.parse(JSON.stringify(vt))}function yt(n){Object.keys(n).forEach(e=>{let t=e;vt[t]&&n[t]&&Object.assign(vt[t],n[t])}),console.log("Config applied:",n)}function ws(n,e){let t=n/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 n=window;n.configPresets=Re,n.resolveAnchorVec2=n.resolveAnchorVec2||Xt,n.resolveScreenAnchorPoint=n.resolveScreenAnchorPoint||dr,n.resolveScreenRatioPoint=n.resolveScreenRatioPoint||pr}pi();function U(n,e){let t=(a,r)=>r===0?a:t(r,a%r),i=t(n,e);return`${n/i}:${e/i}`}var Hc=[{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)}],Nc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:U(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:U(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:U(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:U(412,915)}],Bc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:U(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:U(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:U(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:U(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:U(800,1280)}],_n=[{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 Mn=[..._n],Pn=[{category:"playable",label:"Playable Ad",devices:_n}],ui=_n[0];function He(n){return Mn.find(e=>e.id===n)||ui}function Os(n){return Mn.filter(e=>e.category===n)}var gi=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
46
|
+
`,this.modal=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 a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let 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:a=>{this.onApplyCallback&&this.onApplyCallback(a),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var pl={};ht(pl,{COLORS:()=>ce,ConfigWatcher:()=>ze,DebugPanel:()=>Ot,DefaultReloadStrategy:()=>St,Handler:()=>ie,PlayableLoadingScreen:()=>Ui,PreviewShell:()=>Ni,STROKE_WIDTH:()=>mo,THEME:()=>bo,applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>$e,baseLottie:()=>rn,bootstrap:()=>el,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>xr,configOverrideManager:()=>wr,createPreviewShell:()=>pa,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>Mn,devicePresets:()=>Pn,diffConfigs:()=>Sn,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>wt,getPresetById:()=>He,getPresetsByCategory:()=>Os,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>wn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Cn,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setBootstrapDependencies:()=>Zs,setOverrideMode:()=>yn,setupHotReload:()=>kn,setupLiveEditBridge:()=>Bi,toLegacyFormat:()=>En,validateObjectConfig:()=>Ze});module.exports=zo(pl);var we={};function Ut(n,e,t=!1){we[n]||(we[n]=[]),we[n].push({fn:e,once:t})}function en(n,e){if(we[n]){if(!e){delete we[n];return}we[n]=we[n].filter(t=>t.fn!==e)}}function Gt(n,...e){let t=we[n];if(t)for(let i of[...t])i.fn(...e),i.once&&en(n,i.fn)}function X(n,e){Ut(n,e,!0)}var F=null,ee=[],We=null;function Pa(n){F=n,ee=[],We!==null&&(clearTimeout(We),We=null)}function Ma(){var n,e,t;return{endpoint:(F==null?void 0:F.endpoint)||"",transport:(F==null?void 0:F.transport)||"beacon",batchSize:(n=F==null?void 0:F.batchSize)!=null?n:10,flushIntervalMs:(e=F==null?void 0:F.flushIntervalMs)!=null?e:300,maxQueue:(t=F==null?void 0:F.maxQueue)!=null?t:200,debug:!!(F!=null&&F.debug)}}async function ka(n,e,t,i){let a=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(n,new Blob([a],{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(n,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function tn(n,e){let t=Ma();if(e&&t.endpoint){if(ee.push(n),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){_a();return}We===null&&(We=window.setTimeout(()=>{We=null,_a()},t.flushIntervalMs))}}async function _a(){let n=Ma();if(!n.endpoint||ee.length===0)return;let e=ee.splice(0,n.batchSize);await ka(n.endpoint,{events:e},n.transport,n.debug),ee.length>0&&await ka(n.endpoint,{events:ee.splice(0,n.batchSize)},n.transport,n.debug)}function Oa(n){return Math.max(0,Math.min(1,n))}function Ho(n){let e=String(n!=null?n:"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 a=>1+(i+1)*Math.pow(a-1,3)+i*Math.pow(a-1,2)}return t=>1-(1-t)*(1-t)}function ft(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function No(n,e){let t=n==null?void 0:n[e];return typeof t=="number"?t:0}function Ia(n,e,t){try{n[e]=t}catch{}}function Bo(n){let e=n==null?void 0:n.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 ja(n,e){let t=n==null?void 0:n.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 Ra(n,e){let t=Bo(n);if(!t)return{from:null,to:null};let i=null,a=null;return typeof e.scale=="number"?(i=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),i===null&&a===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:a!=null?a:t.y}}}function Da(){let n=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),n.size>0&&i()})},a=p=>{var u;n.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{n.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ft();for(let g of Array.from(n)){if(g.killed||g.paused)continue;let m=p-g.startMs-g.delayMs;if(m<0)continue;let h=g.durationMs>0?m/g.durationMs:1,f=Oa(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 w=h-y;f=Oa(w)}let v=g.ease(f);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)Ia(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&ja(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 w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),m=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=Ho(d.ease),f=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let E of Object.keys(d)){if(y.has(E))continue;let C=d[E];typeof C=="number"&&v.push({key:E,from:No(p,E),to:C})}let x=Ra(p,d);return{target:p,startMs:ft(),delayMs:m,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:f,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return a(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ft())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ft(),m=ft()-g;u.startMs+=m,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let m=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof m=="number"&&Ia(p,g,m)}let u=Ra(p,d);u.to&&ja(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,g=!1,m=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},f=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return f({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,w){return f({kind:"fromTo",target:y,vars:x,from:v,atMs:h(w)}),b},play(){var y,v;if(g)return b;g=!0,m=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),m.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of m)y.pause();return b},kill(){for(let y of m)y.kill();m=[],g=!1}};return p.paused||b.play(),b}};return c}function $a(){if(typeof window=="undefined")return;let n=window;if(!n.gsap)try{n.gsap=Da()}catch{}}var za={name:"handler-playable-sdk",version:"0.3.80",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var J=0,Uo=J++,Ha=J++,Na=J++,Ba=J++,Fa=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,Wa=J++,Ya=J++,Ka=J++,N=Uo;function Xa(){return N===Ha}function Ja(){return N===Na}function Za(){return N===Ba}function Qa(){return N===Fa}function Ye(){return N===Ua}function Ke(){return N===Ga}function er(){return N===qa}function tr(){return N===Va}function ir(){return N===Wa}function nn(){return N===Ya}function an(){return N===Ka}function nr(){let n=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(n==="mraid")try{mraid.getState(),N=Ha;return}catch{}else if(n==="dapi")try{dapi.isReady(),N=Na;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(N=Ba)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(N=Fa)}catch{}else if(e==="mintegral")window.gameReady&&(N=Ua);else if(e==="tapjoy")window.TJ_API&&(N=Ga);else if(e==="tiktok")window.openAppStore&&(N=qa);else if(e==="smadex")try{window.smxTracking&&(N=Va)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(N=Wa)}catch{}else e==="vungle"?N=Ya:(n==="nucleo"||e==="nucleo")&&(N=Ka)}var qt=Ve(require("lottie-web"),1),rn=qt.default;typeof window!="undefined"&&(window.lottie=qt.default,window.__baseLottie=qt.default);var Go=require("pixi.js");var on=require("pixi.js");var qo=null;function sn(n){qo=n}Vt();ln();var mt=require("pixi.js");Vt();var Jo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",un=Jo;if(typeof window!="undefined")try{let n=new XMLHttpRequest;if(n.open("GET","./build-settings.json",!1),n.send(),n.status===200&&n.responseText){let e=JSON.parse(n.responseText);e!=null&&e.buildMode&&(un=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${un}`))}}catch{}function Zo(n){var t,i,a,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(n);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(n))return{x:(t=n[0])!=null?t:.5,y:(i=n[1])!=null?i:.5};if(n&&typeof n=="object"&&"x"in n&&"y"in n)return{x:(a=n.x)!=null?a:.5,y:(r=n.y)!=null?r:.5};if(typeof n=="string"){let s=n.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Ae=class{static async create(e,t,i){var l,c,p,d,u,g,m;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${un}`);let a=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new mt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${a.type}, path: ${a.path}`);let o=await je.load(e,a,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(a.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new mt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(a.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof mt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],f=!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:",(m=s==null?void 0:s.constructor)==null?void 0:m.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var a,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(a=t.position.x)!=null?a:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Zo(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var bt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};var ts=Ve(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ts);Xe();var Wt=require("pixi.js");Xe();var fn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new bt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));if(t.length===0)return;let i=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Ae.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let a=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await i(a)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Ae.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new fn,ns=new Proxy(is,{get(n,e){if(e in n&&typeof n[e]=="function")return n[e].bind(n);if(n.get(e))return n.get(e)}});Xe();var cr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Kt={scale:1,position:1},bn=[];function rs(n,e,t,i,a,r,o){bn.push({element:n,originalScale:r,positionHelper:e,heightPercent:a}),e(n,t,i,a,r,o,!1)}function os(){bn.forEach(({element:n,originalScale:e,positionHelper:t,heightPercent:i})=>{let a=e*he.scaleFactor;t(n,he.width,he.height,i,a,!0,!1)})}function mn(n,e){console.log(`[SCREEN] updateScreenState called: ${n}x${e}`),he.width=n,he.height=e,he.scaleFactor=Math.min(n/he.designWidth,1.15),Kt.scale=he.scaleFactor,Kt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Kt.scale.toFixed(3)}`),os()}var vt={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function ss(n,e,t){let i=vt[n];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${n}.${e} = ${t}`))}function ls(){return vt}var cs={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Yt(n,e){return typeof n=="number"&&Number.isFinite(n)?n:e}function Xt(n,e={x:.5,y:.5}){var t;if(Array.isArray(n))return{x:Yt(n[0],e.x),y:Yt(n[1],e.y)};if(n&&typeof n=="object"){let i=n;return{x:Yt(i.x,e.x),y:Yt(i.y,e.y)}}if(typeof n=="string"){let i=n.trim().toLowerCase();return(t=cs[i])!=null?t:e}return e}function dr(n,e,t,i={}){var g,m,h,f,b,y;let a=Xt(t),r=(g=i.inset)!=null?g:{},o=(m=i.padding)!=null?m:{x:0,y:0},s=((h=r.left)!=null?h:0)+o.x,l=((f=r.right)!=null?f:0)+o.x,c=((b=r.top)!=null?b:0)+o.y,p=((y=r.bottom)!=null?y:0)+o.y,d=Math.max(0,n-s-l),u=Math.max(0,e-c-p);return{x:s+d*a.x,y:c+u*a.y}}function pr(n,e,t,i={}){var h,f,b,y,v,x;let a=(h=i.inset)!=null?h:{},r=(f=i.padding)!=null?f:{x:0,y:0},o=((b=a.left)!=null?b:0)+r.x,s=((y=a.right)!=null?y:0)+r.x,l=((v=a.top)!=null?v:0)+r.y,c=((x=a.bottom)!=null?x:0)+r.y,p=Math.max(0,n-o-s),d=Math.max(0,e-l-c),u=Xt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),m=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*m}}if(typeof window!="undefined"){let n=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,a=window.innerHeight;(i!==n||a!==e)&&(n=i,e=a,mn(i,a))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),mn(window.innerWidth,window.innerHeight),window.updateDebugConfig=ss,window.getDebugConfig=ls,window.copyConfig=xs,window.applyConfig=yt,window.applyConfigForRatio=ws,window.positionAtBottom=ur,window.positionAtTop=us,window.positionAtCenter=gs,window.positionAtLeft=hs,window.positionAtRight=fs,window.positionAtBottomLeft=ms,window.positionAtBottomRight=bs,window.positionAtTopLeft=ys,window.positionAtTopRight=vs,window.applyPositionContract=ps,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Jt(n,e,t=0){return n*e+t}function Zt(n,e,t=0){return n*(1-e)+t}function Qt(n,e,t=0){return n*e+t}function ei(n,e,t=0){return n*(1-e)+t}function Z(n,e=0){return n/2+e}function ds(n,e){return n*e}function ps(n,e,t,i){var o,s,l,c,p,d,u,g,m,h,f,b,y,v,x,w,E,C,A,M;let a=0,r=0;switch(i.type){case"top":a=Z(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Jt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":a=Z(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Zt(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":a=Qt(e,i.percent,(h=(m=i.offset)==null?void 0:m.x)!=null?h:0),r=Z(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":a=ei(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=Z(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":a=Z(e,(C=(E=i.offset)==null?void 0:E.x)!=null?C:0),r=Z(t,(M=(A=i.offset)==null?void 0:A.y)!=null?M:0);break}n.position?n.position.set(a,r):(n.x=a,n.y=r),i.scale!==void 0&&i.scale!==1&&n.scale&&(typeof n.scale.set=="function"?n.scale.set(i.scale,i.scale):(n.scale.x=i.scale,n.scale.y=i.scale))}function ur(n,e,t,i=.2,a=1,r=!0,o=!1){let s=ds(t,i),l=Zt(t,i/2);fe(n,Z(e),l);let c=r?a*he.scaleFactor:a;me(n,c),o&&!bn.find(p=>p.element===n)&&rs(n,ur,e,t,i,a,r)}function us(n,e,t,i=.1,a=1){fe(n,Z(e),Jt(t,i)),me(n,a)}function gs(n,e,t,i=0,a=0,r=1){fe(n,Z(e,i),Z(t,a)),me(n,r)}function hs(n,e,t,i=.1,a=1){fe(n,Qt(e,i),Z(t)),me(n,a)}function fs(n,e,t,i=.1,a=1){fe(n,ei(e,i),Z(t)),me(n,a)}function ms(n,e,t,i=.05,a=.05,r=1){fe(n,Qt(e,a),Zt(t,i)),me(n,r)}function bs(n,e,t,i=.05,a=.05,r=1){fe(n,ei(e,a),Zt(t,i)),me(n,r)}function ys(n,e,t,i=.05,a=.05,r=1){fe(n,Qt(e,a),Jt(t,i)),me(n,r)}function vs(n,e,t,i=.05,a=.05,r=1){fe(n,ei(e,a),Jt(t,i)),me(n,r)}function fe(n,e,t){n&&n.position?typeof n.position.set=="function"?n.position.set(e,t):(n.position.x=e,n.position.y=t):n&&(n.x=e,n.y=t)}function me(n,e){e!==1&&n&&n.scale&&(typeof n.scale.set=="function"?n.scale.set(e,e):n.scale.x!==void 0&&n.scale.y!==void 0&&(n.scale.x=e,n.scale.y=e))}var Re={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function xs(n){return n&&Re[n]?JSON.parse(JSON.stringify(Re[n])):JSON.parse(JSON.stringify(vt))}function yt(n){Object.keys(n).forEach(e=>{let t=e;vt[t]&&n[t]&&Object.assign(vt[t],n[t])}),console.log("Config applied:",n)}function ws(n,e){let t=n/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 n=window;n.configPresets=Re,n.resolveAnchorVec2=n.resolveAnchorVec2||Xt,n.resolveScreenAnchorPoint=n.resolveScreenAnchorPoint||dr,n.resolveScreenRatioPoint=n.resolveScreenRatioPoint||pr}pi();function U(n,e){let t=(a,r)=>r===0?a:t(r,a%r),i=t(n,e);return`${n/i}:${e/i}`}var Hc=[{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)}],Nc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:U(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:U(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:U(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:U(412,915)}],Bc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:U(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:U(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:U(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:U(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:U(800,1280)}],_n=[{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 Pn=[..._n],Mn=[{category:"playable",label:"Playable Ad",devices:_n}],ui=_n[0];function He(n){return Pn.find(e=>e.id===n)||ui}function Os(n){return Pn.filter(e=>e.category===n)}var gi=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
47
47
|
<div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
|
|
48
48
|
<div class="scene-panel-header" data-panel-handle>
|
|
49
49
|
<div class="panel-title">
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
</div>
|
|
78
78
|
<div class="panel-resize-handle-v" data-panel-resize-v></div>
|
|
79
79
|
</div>
|
|
80
|
-
`}initialize(e,t){var a,r,o,s,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(s=this.root)==null?void 0:s.querySelector("#scene-screen-filter");if(i){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}catch{}i.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}i.addEventListener("change",()=>{let c=i.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),a=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&a&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),m={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),f=this.formatDisplayName(h);a.textContent=m[g]||g,r.textContent=f,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let a=e();if(!Array.isArray(a)||a.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(a=Array.from(d.keys()))}if(!Array.isArray(a)||a.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));a.forEach(d=>{var
|
|
80
|
+
`}initialize(e,t){var a,r,o,s,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(s=this.root)==null?void 0:s.querySelector("#scene-screen-filter");if(i){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}catch{}i.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}i.addEventListener("change",()=>{let c=i.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),a=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&a&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),m={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),f=this.formatDisplayName(h);a.textContent=m[g]||g,r.textContent=f,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let a=e();if(!Array.isArray(a)||a.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(a=Array.from(d.keys()))}if(!Array.isArray(a)||a.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));a.forEach(d=>{var M,B,P,T;let u=typeof t=="function"?t(d):null;if(!u){let I=window.__editableObjectConfigs;I&&typeof I.get=="function"&&(u=(M=I.get(d))!=null?M:null)}let g=(((B=u==null?void 0:u.identity)==null?void 0:B.category)||"scene").toString(),m=(((P=u==null?void 0:u.identity)==null?void 0:P.id)||d).toString(),h=g.toLowerCase(),f=m.toLowerCase(),b=h.includes("ui")||f.startsWith("ui")||f.includes("label"),y=this.formatDisplayName(m||d),v=((T=u==null?void 0:u.render)==null?void 0:T.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:x},E=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&E!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:s)[E].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
|
|
81
81
|
${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
|
|
82
82
|
`,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,a=(s=i==null?void 0:i.instanceToScreen)==null?void 0:s[e];if(a==="loading"||a==="start"||a==="gameplay"||a==="tutorial"||a==="endgame")return a;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${r}`.toLowerCase();return o.includes("loading")?"loading":o.includes("start")?"start":o.includes("tutorial")?"tutorial":o.includes("endgame")||o.includes("end_card")||o.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,a,r,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(a=(i=e.render)==null?void 0:i.asset)==null?void 0:a.path)!=null&&r.endsWith(".json")?"animation":((s=(o=e.render)==null?void 0:o.asset)==null?void 0:s.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,a=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`
|
|
83
83
|
<button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
</select>
|
|
323
323
|
</div>
|
|
324
324
|
</div>
|
|
325
|
-
`);for(let p in i){if(p==="id")continue;let d=i[p],u=`${a}.${p}`;if(p==="props"&&d&&typeof d=="object"){let m=[];for(let h in d){let f=d[h],b=`${u}.${h}`,y=s[h];if((h==="targetId"||h==="inputId")&&typeof f=="string"){let v=(()=>{try{let
|
|
325
|
+
`);for(let p in i){if(p==="id")continue;let d=i[p],u=`${a}.${p}`;if(p==="props"&&d&&typeof d=="object"){let m=[];for(let h in d){let f=d[h],b=`${u}.${h}`,y=s[h];if((h==="targetId"||h==="inputId")&&typeof f=="string"){let v=(()=>{try{let E=window,C=E==null?void 0:E.__editableConfig;if(!(C!=null&&C.objects))return[];let A=[];if(C.objects instanceof Map)for(let M of C.objects.keys())A.push(M);else typeof C.objects=="object"&&A.push(...Object.keys(C.objects));return A.sort()}catch{return[]}})(),x=f||"",w=x&&!v.includes(x)?[x,...v]:v;m.push(`
|
|
326
326
|
<div class="inspector-property inspector-property-text">
|
|
327
327
|
<label class="inspector-property-label">${this.formatLabel(h)}</label>
|
|
328
328
|
<div class="inspector-input-group">
|
|
@@ -330,7 +330,7 @@
|
|
|
330
330
|
data-property-path="${b}"
|
|
331
331
|
data-object-id="${e}">
|
|
332
332
|
<option value="" ${x?"":"selected"}>None</option>
|
|
333
|
-
${
|
|
333
|
+
${w.map(E=>`<option value="${E}" ${E===x?"selected":""}>${E}</option>`).join("")}
|
|
334
334
|
</select>
|
|
335
335
|
</div>
|
|
336
336
|
</div>
|
|
@@ -370,7 +370,7 @@
|
|
|
370
370
|
</select>
|
|
371
371
|
</div>
|
|
372
372
|
</div>
|
|
373
|
-
`}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(){this.typeDetector=new mi,this.imageRenderer=new bi,this.colorRenderer=new yi,this.numberRenderer=new vi,this.textRenderer=new xi,this.booleanRenderer=new wi,this.arrayRenderer=new Ei,this.objectRenderer=new Ai(this),this.selectRenderer=new Si}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 a of t.objects.keys())i.push(a);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,a=i==null?void 0:i.__editableConfig,r=a==null?void 0:a.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],a=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(a)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,a){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&a.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,a,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&a.includes("logic.props"))return this.selectRenderer.render(e,t,i,a,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,a,["",...u])}let p=this.getEnumOptionsFromSchemas(a);if(p)return this.selectRenderer.render(e,t,i,a,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,a);case"color":return this.colorRenderer.render(e,t,i,a);case"number":return this.numberRenderer.render(e,t,i,a);case"boolean":return this.booleanRenderer.render(e,t,i,a);case"array":return this.arrayRenderer.render(e,t,i,a);case"object":return this.objectRenderer.render(e,t,i,a);case"select":return this.selectRenderer.render(e,t,i,a,[]);default:return this.textRenderer.render(e,t,i,a)}}getTypeDetector(){return this.typeDetector}};K();var Qe=class{async updateProperty(e,t,i,a={}){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}Se({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),a.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),a=e;for(let r of i)if(a&&typeof a=="object"&&r in a)a=a[r];else return;return a}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Ti=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=a(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,a;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((a=(i=t.transform)==null?void 0:i.scale)!=null?a:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let a=i();if(!a||!a.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!a.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),a.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),a.categories&&!a.categories.includes(p)&&a.categories.push(p),a.libraryAssets&&!a.libraryAssets[p]&&(a.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let a=window.__debugContext;if(a){if(a.activeTab!=="library"){a.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(a.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),a.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let a=window.__openAiEditor;if(typeof a=="function"){let r=t.split(".").pop()||t;a(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async a=>{var s;let r=(s=a.target.files)==null?void 0:s[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let o=new FileReader;o.onload=async()=>{var c,p,d;let l=o.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),m=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),f=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",f,"to category:",m);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:m,filename:`${f}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(m,`${f}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(S){console.warn("[QuickActionsBar] Setup-library not available:",S)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let E=window.__debugContext;(d=(p=E==null?void 0:E.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let w=window.__highlightLibrarySlot;typeof w=="function"&&setTimeout(()=>{w(e,m)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},o.readAsDataURL(r)},i.click()}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 a=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(a):typeof o.schemas=="object"&&(s=o.schemas[a]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let a=window.__openAiEditor;if(typeof a=="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),a(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Is(n,e){let t;return function(...a){let r=()=>{clearTimeout(t),n(...a)};clearTimeout(t),t=setTimeout(r,e)}}var Li=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Ci,this.updateManager=new Qe,this.quickActions=new Ti,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
373
|
+
`}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(){this.typeDetector=new mi,this.imageRenderer=new bi,this.colorRenderer=new yi,this.numberRenderer=new vi,this.textRenderer=new xi,this.booleanRenderer=new wi,this.arrayRenderer=new Ei,this.objectRenderer=new Ai(this),this.selectRenderer=new Si}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 a of t.objects.keys())i.push(a);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,a=i==null?void 0:i.__editableConfig,r=a==null?void 0:a.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],a=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(a)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,a){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&a.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,a,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&a.includes("logic.props"))return this.selectRenderer.render(e,t,i,a,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,a,["",...u])}let p=this.getEnumOptionsFromSchemas(a);if(p)return this.selectRenderer.render(e,t,i,a,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,a);case"color":return this.colorRenderer.render(e,t,i,a);case"number":return this.numberRenderer.render(e,t,i,a);case"boolean":return this.booleanRenderer.render(e,t,i,a);case"array":return this.arrayRenderer.render(e,t,i,a);case"object":return this.objectRenderer.render(e,t,i,a);case"select":return this.selectRenderer.render(e,t,i,a,[]);default:return this.textRenderer.render(e,t,i,a)}}getTypeDetector(){return this.typeDetector}};K();var Qe=class{async updateProperty(e,t,i,a={}){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}Se({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),a.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),a=e;for(let r of i)if(a&&typeof a=="object"&&r in a)a=a[r];else return;return a}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Ti=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=a(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,a;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((a=(i=t.transform)==null?void 0:i.scale)!=null?a:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let a=i();if(!a||!a.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!a.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),a.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),a.categories&&!a.categories.includes(p)&&a.categories.push(p),a.libraryAssets&&!a.libraryAssets[p]&&(a.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let a=window.__debugContext;if(a){if(a.activeTab!=="library"){a.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(a.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),a.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let a=window.__openAiEditor;if(typeof a=="function"){let r=t.split(".").pop()||t;a(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async a=>{var s;let r=(s=a.target.files)==null?void 0:s[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let o=new FileReader;o.onload=async()=>{var c,p,d;let l=o.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),m=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),f=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",f,"to category:",m);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:m,filename:`${f}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(m,`${f}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(C){console.warn("[QuickActionsBar] Setup-library not available:",C)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let w=window.__debugContext;(d=(p=w==null?void 0:w.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let E=window.__highlightLibrarySlot;typeof E=="function"&&setTimeout(()=>{E(e,m)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},o.readAsDataURL(r)},i.click()}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 a=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(a):typeof o.schemas=="object"&&(s=o.schemas[a]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let a=window.__openAiEditor;if(typeof a=="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),a(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Is(n,e){let t;return function(...a){let r=()=>{clearTimeout(t),n(...a)};clearTimeout(t),t=setTimeout(r,e)}}var Li=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Ci,this.updateManager=new Qe,this.quickActions=new Ti,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
374
374
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
|
|
375
375
|
<div class="scene-panel-header" data-panel-handle>
|
|
376
376
|
<div class="panel-title">
|
|
@@ -431,7 +431,7 @@
|
|
|
431
431
|
${r.join("")}
|
|
432
432
|
</div>
|
|
433
433
|
</div>
|
|
434
|
-
`}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Is((g,m,h)=>{var f,b;this.updateManager.updateProperty(g,m,h),(b=(f=this.options)==null?void 0:f.onPropertyChange)==null||b.call(f,g,m,h)},300);e.forEach(g=>{let m=f=>{var x,
|
|
434
|
+
`}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Is((g,m,h)=>{var f,b;this.updateManager.updateProperty(g,m,h),(b=(f=this.options)==null?void 0:f.onPropertyChange)==null||b.call(f,g,m,h)},300);e.forEach(g=>{let m=f=>{var x,w;let b=f.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let E=b.value;if(b.type==="checkbox")E=b.checked;else if(b.type==="number"&&(E=parseFloat(b.value),isNaN(E)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,E):(this.updateManager.updateProperty(v,y,E),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,E))}},h=g.dataset.propertyPath;h==="logic.id"||h!=null&&h.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",h),g.addEventListener("change",async f=>{var M;let b=f.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,E=(M=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:M[x],C=this.getDefaultPropsForLogic(x,E);console.log("[Inspector v1.0.0] New logic default props:",C);let A=y.replace(".id",".props");await this.updateManager.updateProperty(v,A,C),console.log("[Inspector v1.0.0] Logic props updated to:",C),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",m),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",m))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",m=>{let h=m.target,f=h.dataset.action,b=h.dataset.path,y=h.dataset.object;f&&b&&y&&this.quickActions.handleAction(f,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",m=>{var b,y;let h=m.target,f=h.dataset.sectionToggle||((b=h.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(f){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${f}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let o=(p=this.root)==null?void 0:p.querySelector("[data-convert-toggle]");o==null||o.addEventListener("click",()=>{var m;let g=(m=this.root)==null?void 0:m.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let s=(d=this.contentContainer)==null?void 0:d.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");s==null||s.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,a=i==null?void 0:i(e);if(!a){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};a[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}let r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};a[t]={...l},await this.updateManager.updateProperty(e,t,a[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,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 a=Object.keys(t);return a.length===0||a.length===1&&a[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
435
435
|
<div class="inspector-empty">
|
|
436
436
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
437
437
|
<span class="inspector-empty-text">${e}</span>
|
|
@@ -441,7 +441,7 @@
|
|
|
441
441
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
442
442
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
443
443
|
</div>
|
|
444
|
-
`)}};var Hr=Ve(require("jszip"),1);function On(n){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(n)})}function Tr(n){var a;let[e,t]=n.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}async function Lr(n){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=n})}async function ki(n){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",n);let i=await fetch(n);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,n),null;let a=await i.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let r=await On(a),o=await Lr(r),s=Tr(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(n){var e,t;try{let i=await On(n),a=await Lr(i),r=Tr(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=a==null?void 0:a.width)!=null?e:0,height:(t=a==null?void 0:a.height)!=null?t:0}}catch{return null}}function In(n){return On(n).then(e=>e).catch(()=>null)}function jn(n,e){var t;try{let[i,a]=n.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(a),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function et(n,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=n}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let a=i.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),n;a.drawImage(t,0,0);let r=a.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],g=o[d+1],m=o[d+2],h=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(m-f.b,2))<e){h=!0;break}h&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),n}}function kr(n,e){if(!n||!e)return"1:1";let t=n/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function W(n){return typeof n=="string"?n:void 0}function _r(n){return n.toLowerCase().endsWith(".png")?n.slice(0,-4):n}function js(n){var i,a,r;let e=(i=W(n.id))!=null?i:W(n.name);if(e)return e;let t=(a=W(n.file))!=null?a:W(n.asset);return t?_r((r=t.split("/").pop())!=null?r:t):void 0}function Rs(n,e,t){var i,a,r;if(typeof e=="string")return{id:n,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(a=W(e.id))!=null?a:n,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Rn(n,e){var t,i,a;if(!n)return[];if(Array.isArray(n)){let r=[];for(let o of n){if(typeof o=="string"){let s=_r((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=js(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(a=W(o.role))!=null?a:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(n)){let r=[];for(let[o,s]of Object.entries(n)){let l=Rs(o,s,e);l&&r.push(l)}return r}return[]}function Ds(n){var e,t;return(t=(e=W(n.brand_name))!=null?e:W(n.brandName))!=null?t:W(n.name)}function $s(n){if(ye(n.brand_dna)&&ye(n.brand_dna.colors))return n.brand_dna;if(ye(n.colors)){let e={colors:n.colors};return typeof n.style=="string"&&(e.style=n.style),ye(n.fonts)&&(e.fonts=n.fonts),e}}function zs(n){var t;let e=new Map;for(let i of n){let a=e.get(i.id);if(!a){e.set(i.id,i);continue}e.set(i.id,{...a,...i,file:i.file||a.file,role:i.role||a.role,dataUrl:i.dataUrl||a.dataUrl,layout:(t=i.layout)!=null?t:a.layout})}return Array.from(e.values())}function Dn(n,e={}){var o,s,l;let t=n.filter(ye),i=(s=(o=t.map(Ds).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",a=(l=t.map($s).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Rn(c.layers,"visual element")),"assets"in c&&r.push(...Rn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...Rn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:a,assets:zs(r)}}var
|
|
444
|
+
`)}};var Hr=Ve(require("jszip"),1);function On(n){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(n)})}function Tr(n){var a;let[e,t]=n.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}async function Lr(n){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=n})}async function ki(n){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",n);let i=await fetch(n);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,n),null;let a=await i.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let r=await On(a),o=await Lr(r),s=Tr(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(n){var e,t;try{let i=await On(n),a=await Lr(i),r=Tr(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=a==null?void 0:a.width)!=null?e:0,height:(t=a==null?void 0:a.height)!=null?t:0}}catch{return null}}function In(n){return On(n).then(e=>e).catch(()=>null)}function jn(n,e){var t;try{let[i,a]=n.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(a),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function et(n,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=n}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let a=i.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),n;a.drawImage(t,0,0);let r=a.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],g=o[d+1],m=o[d+2],h=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(m-f.b,2))<e){h=!0;break}h&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),n}}function kr(n,e){if(!n||!e)return"1:1";let t=n/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function W(n){return typeof n=="string"?n:void 0}function _r(n){return n.toLowerCase().endsWith(".png")?n.slice(0,-4):n}function js(n){var i,a,r;let e=(i=W(n.id))!=null?i:W(n.name);if(e)return e;let t=(a=W(n.file))!=null?a:W(n.asset);return t?_r((r=t.split("/").pop())!=null?r:t):void 0}function Rs(n,e,t){var i,a,r;if(typeof e=="string")return{id:n,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(a=W(e.id))!=null?a:n,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Rn(n,e){var t,i,a;if(!n)return[];if(Array.isArray(n)){let r=[];for(let o of n){if(typeof o=="string"){let s=_r((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=js(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(a=W(o.role))!=null?a:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(n)){let r=[];for(let[o,s]of Object.entries(n)){let l=Rs(o,s,e);l&&r.push(l)}return r}return[]}function Ds(n){var e,t;return(t=(e=W(n.brand_name))!=null?e:W(n.brandName))!=null?t:W(n.name)}function $s(n){if(ye(n.brand_dna)&&ye(n.brand_dna.colors))return n.brand_dna;if(ye(n.colors)){let e={colors:n.colors};return typeof n.style=="string"&&(e.style=n.style),ye(n.fonts)&&(e.fonts=n.fonts),e}}function zs(n){var t;let e=new Map;for(let i of n){let a=e.get(i.id);if(!a){e.set(i.id,i);continue}e.set(i.id,{...a,...i,file:i.file||a.file,role:i.role||a.role,dataUrl:i.dataUrl||a.dataUrl,layout:(t=i.layout)!=null?t:a.layout})}return Array.from(e.values())}function Dn(n,e={}){var o,s,l;let t=n.filter(ye),i=(s=(o=t.map(Ds).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",a=(l=t.map($s).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Rn(c.layers,"visual element")),"assets"in c&&r.push(...Rn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...Rn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:a,assets:zs(r)}}var Pr=require("@google/genai");async function _i(n,e,t=[],i={}){var a,r,o,s,l,c,p;try{if(!(n!=null&&n.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 Pr.GoogleGenAI({apiKey:n}),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 m=await d.models.generateContent({model:u,contents:g}),h="",f=(o=(r=(a=m.candidates)==null?void 0:a[0])==null?void 0:r.content)==null?void 0:o.parts;if(f)for(let b of f)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 Mr=require("@google/genai");async function tt(n,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new Mr.GoogleGenAI({apiKey:n}),r=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await a.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(a){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(a,Object.getOwnPropertyNames(a),2)),a}}function Or(n){let e=n.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(`
|
|
445
445
|
`)||"None",t=n.brandDna?`Colors: ${JSON.stringify(n.brandDna.colors)}, Style: ${n.brandDna.style||"not specified"}`:"Not provided",i=n.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
|
|
446
446
|
`),a="";if(n.brandConfig){let r=n.brandConfig,o=[];r.splash&&o.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&o.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&o.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),o.length>0&&(a=`
|
|
447
447
|
BRAND CONTENT:
|
|
@@ -526,7 +526,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
526
526
|
|
|
527
527
|
OUTPUT:
|
|
528
528
|
Generate the requested asset matching the brand style.${n.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
529
|
-
`.trim()}function jr(n){return n.map(e=>{if(typeof e=="string"){let t=e,i,a;return t.includes("background")?(i="background",a="background"):t.includes("button")||t.includes("cta")?(i="ui",a="button"):t.includes("logo")?(i="ui",a="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",a="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",a="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",a="image"):(i="environment",a="interactive"),{id:t,category:i,type:a}}return e})}function Rr(n,e){return!(n.includes("background")&&(n.includes("_1")||n.includes("splash")||n.includes("endgame")||n.includes("main"))||e==="text"||e==="effects"&&n.includes("particle"))}async function Dr(n){var o,s;let e=jr(n.gameObjects),t={gamePrompt:n.gamePrompt,gameObjects:e,brandAssets:n.manifest.assets,brandDna:n.manifest.brand_dna,brandName:n.manifest.brand_name},i=Or(t),a=[];if(n.flatDesignDataUrl)try{let l=$r(n.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(a.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",a.length,"images...");let r;try{r=await _i(n.apiKey,i,a,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(o=l.message)!=null&&o.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(s=l.message)!=null&&s.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Hs(r,n.gameObjects)}function Hs(n,e){try{let t=n,i=n.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=n.match(/\{[\s\S]*\}/);r&&(t=r[0])}let a=JSON.parse(t);return a.mappings&&Array.isArray(a.mappings)?{mappingResult:a,rawResponse:n,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:n,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:n,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function $n(n,e,t={}){var a;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];(a=t.onProgress)==null||a.call(t,r+1,i.length,o.game_object);try{let s=await Ns(n,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 Ns(n,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&n.manifest){let s=n.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=n.assetFiles.get(s.file);if(l){let c=await Le(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(n.flatDesignDataUrl){let s=$r(n.flatDesignDataUrl);s&&t.push(s)}let i=Rr(e.game_object),a={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:n.manifest.brand_dna,needsTransparency:i},r=Ir(a);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await tt(n.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await et(o)||o}function $r(n){let[e,t]=n.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function zr(n,e){let t=n.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([a,r])=>({id:a,file:String(r),role:"visual element"})):i=[],n.assets=i;for(let a of i){let r=e.get(a.file);if(r){let o=await Le(r);o&&(a.dataUrl=o.dataUrl)}}}var
|
|
529
|
+
`.trim()}function jr(n){return n.map(e=>{if(typeof e=="string"){let t=e,i,a;return t.includes("background")?(i="background",a="background"):t.includes("button")||t.includes("cta")?(i="ui",a="button"):t.includes("logo")?(i="ui",a="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",a="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",a="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",a="image"):(i="environment",a="interactive"),{id:t,category:i,type:a}}return e})}function Rr(n,e){return!(n.includes("background")&&(n.includes("_1")||n.includes("splash")||n.includes("endgame")||n.includes("main"))||e==="text"||e==="effects"&&n.includes("particle"))}async function Dr(n){var o,s;let e=jr(n.gameObjects),t={gamePrompt:n.gamePrompt,gameObjects:e,brandAssets:n.manifest.assets,brandDna:n.manifest.brand_dna,brandName:n.manifest.brand_name},i=Or(t),a=[];if(n.flatDesignDataUrl)try{let l=$r(n.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(a.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",a.length,"images...");let r;try{r=await _i(n.apiKey,i,a,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(o=l.message)!=null&&o.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(s=l.message)!=null&&s.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Hs(r,n.gameObjects)}function Hs(n,e){try{let t=n,i=n.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=n.match(/\{[\s\S]*\}/);r&&(t=r[0])}let a=JSON.parse(t);return a.mappings&&Array.isArray(a.mappings)?{mappingResult:a,rawResponse:n,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:n,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:n,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function $n(n,e,t={}){var a;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];(a=t.onProgress)==null||a.call(t,r+1,i.length,o.game_object);try{let s=await Ns(n,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 Ns(n,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&n.manifest){let s=n.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=n.assetFiles.get(s.file);if(l){let c=await Le(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(n.flatDesignDataUrl){let s=$r(n.flatDesignDataUrl);s&&t.push(s)}let i=Rr(e.game_object),a={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:n.manifest.brand_dna,needsTransparency:i},r=Ir(a);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await tt(n.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await et(o)||o}function $r(n){let[e,t]=n.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function zr(n,e){let t=n.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([a,r])=>({id:a,file:String(r),role:"visual element"})):i=[],n.assets=i;for(let a of i){let r=e.get(a.file);if(r){let o=await Le(r);o&&(a.dataUrl=o.dataUrl)}}}var Pi=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`
|
|
530
530
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
531
531
|
<div class="scene-panel-header" data-panel-handle>
|
|
532
532
|
<div class="panel-title">
|
|
@@ -713,7 +713,7 @@ Generate the requested asset matching the brand style.${n.needsTransparency?" Ba
|
|
|
713
713
|
</div>
|
|
714
714
|
`}).join("")}
|
|
715
715
|
`}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(a=>a.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 a=i.game_object,r=this.getPreviewValueForMapping(a);if(!r.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(a,r.value):r.value;o&&(await this.stageEngineAssetOverride(a,o),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(a=this.mappingResult)==null?void 0:a.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 a=(r=this.mappingResult)==null?void 0:r.mappings.find(o=>o.game_object===e);a&&(a.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),a=window.__openAiEditor;if(typeof a!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;a(e,r,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var a,r,o;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(o=(r=(a=this.root)==null?void 0:a.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:o.trim();if(!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 $n(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(()=>(K(),Je));i({path:`assets.${e}`,value:t},{silent:!0});let a=window.applyEditableEngineConfig;typeof a=="function"&&a({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),a=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let o=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:a,data:t,overwrite:!0})})).json();if(!(o!=null&&o.success)||!(o!=null&&o.path))return console.error("[BrandVision] Save to library failed:",(o==null?void 0:o.error)||o),null;let s=window.addAssetToRegistry;typeof s=="function"&&s(i,a);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(o.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)){let o=a.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let r=a==null?void 0:a.categories;if(Array.isArray(r)&&r.length>0){let o=e.toLowerCase(),s=l=>r.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||r[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||r[0]}}let 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]"},a=(r=this.root)==null?void 0:r.querySelector(i[e]);a&&(a.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,a=this.root.getBoundingClientRect().width,r=s=>{let l=Math.max(300,a+(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 Nr(n,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:a=5}=e;return[`TASK: ${n}`,`CHANGE_STRENGTH: ${a}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
716
|
-
`)}var Bs=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],Fs=["cta_hint","cta_label_end"],Br=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Us=["brand.primary","brand.heading","brand.body","brand.warning"],
|
|
716
|
+
`)}var Bs=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],Fs=["cta_hint","cta_label_end"],Br=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Us=["brand.primary","brand.heading","brand.body","brand.warning"],Mi=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`
|
|
717
717
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
718
718
|
<div class="scene-panel-header" data-panel-handle>
|
|
719
719
|
<div class="panel-title">
|
|
@@ -852,7 +852,7 @@ Generate the requested asset matching the brand style.${n.needsTransparency?" Ba
|
|
|
852
852
|
</div>
|
|
853
853
|
</div>
|
|
854
854
|
</div>
|
|
855
|
-
`;let r=a.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),a.addEventListener("click",b=>{b.target===a&&this.closeAiModal()}),this.aiModal=a,this.aiKeyInput=a.querySelector("[data-ai-key]"),this.aiModelSelect=a.querySelector("[data-ai-model]"),this.aiPromptInput=a.querySelector("[data-ai-prompt]"),this.aiStrengthInput=a.querySelector("[data-ai-strength]"),this.aiStrengthValue=a.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=a.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=a.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=a.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=a.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=a.querySelector("[data-ai-ref-input]"),this.aiReferenceName=a.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=a.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=a.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=a.querySelector("[data-ai-generate]"),this.aiApplyBtn=a.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=a.querySelector("[data-ai-save-library]"),this.aiCropBtn=a.querySelector("[data-ai-crop]"),this.aiDownloadBtn=a.querySelector("[data-ai-download]"),this.aiPreviewImg=a.querySelector("[data-ai-preview]"),this.aiStatusEl=a.querySelector("[data-ai-status]"),this.aiLoadingEl=a.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=a.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=a.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=a.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(m=this.aiSaveLibraryBtn)==null||m.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(a),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,m,h,f,b,y,v,x,E,w,S,C,O,B,M,T,I;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(m=(g=this.aiModelSelect)==null?void 0:g.value)!=null?m:"gemini-2.5-flash-image",i=(b=(f=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:f.trim())!=null?b:"",a=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=a,o=a,s=Number((E=(x=this.aiStrengthInput)==null?void 0:x.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=((w=l==null?void 0:l.value)==null?void 0:w.trim())||((S=this.aiBaseValue)==null?void 0:S.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let P=null,D=(C=this.getSelectedAssetKey())!=null?C:"unknown",j=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((B=this.aiUseOutputToggle)!=null&&B.checked&&this.aiOutputDataUrl){let ne=jn(this.aiOutputDataUrl,"ai-output.png");if(ne){let ae=await Le(ne);ae&&(P={input:{base64:ae.base64,mimeType:ae.mimeType},dataUrl:ae.dataUrl,width:ae.width,height:ae.height})}}if(P||(P=await this.getImageDataFromAsset(c)),!P){this.setAiStatus("Unable to load the base image.");return}let $=[P.input],A=!1;if(this.aiReferenceFile){let ne=await Le(this.aiReferenceFile);ne?($.push({base64:ne.base64,mimeType:ne.mimeType}),A=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let k=Nr(i,{includeReference:A,includeMagenta:r,changeLevel:s}),_=(T=(M=this.aiReferenceFile)==null?void 0:M.name)!=null?T:"none";console.info("[AI] Final prompt:",k),console.info("[AI] Image sources:",{assetKey:D,base:j,reference:_});let q=kr(P.width,P.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await tt(e,k,$,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",V==null?void 0:V.length),this.aiRawOutputDataUrl=V,await this.refreshAiOutputFromRaw()}catch(P){console.error("[CustomizePanel] AI Generate Error:",P),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((I=this.aiStatusEl)==null?void 0:I.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var a,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(a=this.aiRemoveBgToggle)==null?void 0:a.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),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,a;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,(a=this.activePreviewKey)!=null?a:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,a;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((a=this.aiContext)==null?void 0:a.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,a=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:a,filename:`${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:",a),p(a,`${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(f){console.warn("[CustomizePanel] Setup-library endpoint not available:",f)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((s=m.dataset.assetKey)!=null?s:"",m)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let f=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof f=="function"&&b){let y=this.getFilenameFromPath(c.path);await f(u,y,a)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,a),setTimeout(()=>{h(u,a)},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||"",a=window.getEditableAssets;if(typeof a=="function"){let s=a();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===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 a=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(a==null?void 0:a.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let a=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!a)return null;let r=a.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let a=jn(this.aiOutputDataUrl,"ai-output.png");if(!a)return;let r=await this.showManualCropModal(a,i,t);if(!r)return;let o=await In(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 a=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(a);if(p){let d=await this.showManualCropModal(e,p,a);if(!d)return;r=d}}let o=await In(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 m=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(m&&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(m,v,c)}else this.applyObjectPropertyValue(m,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&m&&setTimeout(()=>{f(m,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,a){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=a!=null?a:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),a=[];return i.startsWith("raw/")?a=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?a=[`/${i}`]:a=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",a),a}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,a){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
855
|
+
`;let r=a.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),a.addEventListener("click",b=>{b.target===a&&this.closeAiModal()}),this.aiModal=a,this.aiKeyInput=a.querySelector("[data-ai-key]"),this.aiModelSelect=a.querySelector("[data-ai-model]"),this.aiPromptInput=a.querySelector("[data-ai-prompt]"),this.aiStrengthInput=a.querySelector("[data-ai-strength]"),this.aiStrengthValue=a.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=a.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=a.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=a.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=a.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=a.querySelector("[data-ai-ref-input]"),this.aiReferenceName=a.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=a.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=a.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=a.querySelector("[data-ai-generate]"),this.aiApplyBtn=a.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=a.querySelector("[data-ai-save-library]"),this.aiCropBtn=a.querySelector("[data-ai-crop]"),this.aiDownloadBtn=a.querySelector("[data-ai-download]"),this.aiPreviewImg=a.querySelector("[data-ai-preview]"),this.aiStatusEl=a.querySelector("[data-ai-status]"),this.aiLoadingEl=a.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=a.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=a.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=a.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(m=this.aiSaveLibraryBtn)==null||m.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(a),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,m,h,f,b,y,v,x,w,E,C,A,M,B,P,T,I;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(m=(g=this.aiModelSelect)==null?void 0:g.value)!=null?m:"gemini-2.5-flash-image",i=(b=(f=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:f.trim())!=null?b:"",a=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=a,o=a,s=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((E=l==null?void 0:l.value)==null?void 0:E.trim())||((C=this.aiBaseValue)==null?void 0:C.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let O=null,D=(A=this.getSelectedAssetKey())!=null?A:"unknown",j=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((B=this.aiUseOutputToggle)!=null&&B.checked&&this.aiOutputDataUrl){let ne=jn(this.aiOutputDataUrl,"ai-output.png");if(ne){let ae=await Le(ne);ae&&(O={input:{base64:ae.base64,mimeType:ae.mimeType},dataUrl:ae.dataUrl,width:ae.width,height:ae.height})}}if(O||(O=await this.getImageDataFromAsset(c)),!O){this.setAiStatus("Unable to load the base image.");return}let $=[O.input],S=!1;if(this.aiReferenceFile){let ne=await Le(this.aiReferenceFile);ne?($.push({base64:ne.base64,mimeType:ne.mimeType}),S=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let k=Nr(i,{includeReference:S,includeMagenta:r,changeLevel:s}),_=(T=(P=this.aiReferenceFile)==null?void 0:P.name)!=null?T:"none";console.info("[AI] Final prompt:",k),console.info("[AI] Image sources:",{assetKey:D,base:j,reference:_});let q=kr(O.width,O.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await tt(e,k,$,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",V==null?void 0:V.length),this.aiRawOutputDataUrl=V,await this.refreshAiOutputFromRaw()}catch(O){console.error("[CustomizePanel] AI Generate Error:",O),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((I=this.aiStatusEl)==null?void 0:I.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var a,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(a=this.aiRemoveBgToggle)==null?void 0:a.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),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,a;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,(a=this.activePreviewKey)!=null?a:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,a;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((a=this.aiContext)==null?void 0:a.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,a=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:a,filename:`${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:",a),p(a,`${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(f){console.warn("[CustomizePanel] Setup-library endpoint not available:",f)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((s=m.dataset.assetKey)!=null?s:"",m)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let f=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof f=="function"&&b){let y=this.getFilenameFromPath(c.path);await f(u,y,a)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,a),setTimeout(()=>{h(u,a)},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||"",a=window.getEditableAssets;if(typeof a=="function"){let s=a();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===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 a=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(a==null?void 0:a.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let a=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!a)return null;let r=a.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let a=jn(this.aiOutputDataUrl,"ai-output.png");if(!a)return;let r=await this.showManualCropModal(a,i,t);if(!r)return;let o=await In(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 a=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(a);if(p){let d=await this.showManualCropModal(e,p,a);if(!d)return;r=d}}let o=await In(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 m=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(m&&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(m,v,c)}else this.applyObjectPropertyValue(m,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&m&&setTimeout(()=>{f(m,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,a){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=a!=null?a:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),a=[];return i.startsWith("raw/")?a=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?a=[`/${i}`]:a=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",a),a}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,a){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
856
856
|
<div class="asset-preview-card">
|
|
857
857
|
<div class="asset-preview-header">
|
|
858
858
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -898,7 +898,7 @@ Generate the requested asset matching the brand style.${n.needsTransparency?" Ba
|
|
|
898
898
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
899
899
|
</div>
|
|
900
900
|
</div>
|
|
901
|
-
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),
|
|
901
|
+
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),E=c.querySelector(".asset-crop-close"),C=c.querySelector(".asset-crop-cancel"),A=c.querySelector(".asset-crop-apply"),M=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let B=y.getContext("2d"),P=v.getContext("2d");if(!B||!P){l(null);return}let T=o.naturalWidth,I=o.naturalHeight,O=Math.max(y.width/T,y.height/I),D=1,j=0,$=0,S=!1,k=0,_=0,q=0,V=0,ne=()=>{let R=O*D,Me=Math.max(0,(T*R-y.width)/2),Ue=Math.max(0,(I*R-y.height)/2);j=Math.min(Me,Math.max(-Me,j)),$=Math.min(Ue,Math.max(-Ue,$))},ae=()=>{let R=O*D;B.clearRect(0,0,y.width,y.height);let Me=y.width/2-T*R/2+j,Ue=y.height/2-I*R/2+$;if(B.drawImage(o,Me,Ue,T*R,I*R),P.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let qe=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),Qi=v.width/2-s.naturalWidth*qe/2,gt=v.height/2-s.naturalHeight*qe/2;P.drawImage(s,Qi,gt,s.naturalWidth*qe,s.naturalHeight*qe)}else P.fillStyle="rgba(255, 255, 255, 0.04)",P.fillRect(0,0,v.width,v.height),P.strokeStyle="rgba(255, 255, 255, 0.08)",P.strokeRect(4,4,v.width-8,v.height-8);let ut=v.width/y.width*(O*D),Ge=j*(v.width/y.width),Bt=$*(v.height/y.height),Ji=v.width/2-T*ut/2+Ge,Zi=v.height/2-I*ut/2+Bt;P.save(),P.globalAlpha=.7,P.drawImage(o,Ji,Zi,T*ut,I*ut),P.restore()},Ta=()=>{j=0,$=0,ne(),ae()};x.addEventListener("input",()=>{D=Number(x.value),w.textContent=`${D.toFixed(2)}\xD7`,ne(),ae()}),y.addEventListener("pointerdown",R=>{S=!0,k=R.clientX,_=R.clientY,q=j,V=$,y.setPointerCapture(R.pointerId)}),y.addEventListener("pointermove",R=>{S&&(j=q+(R.clientX-k),$=V+(R.clientY-_),ne(),ae())}),y.addEventListener("pointerup",R=>{S=!1,y.releasePointerCapture(R.pointerId)}),y.addEventListener("pointerleave",()=>{S=!1});let Ki=()=>{c.remove()},Xi=()=>{Ki(),l(null)},Po=async()=>{let R=document.createElement("canvas");R.width=t.width,R.height=t.height;let Me=R.getContext("2d");if(!Me){Ki(),l(null);return}let Ue=D,Ge=Math.max(R.width/T,R.height/I)*Ue,Bt=R.width/y.width,Ji=j*Bt,Zi=$*Bt,qe=R.width/2-T*Ge/2+Ji,Qi=R.height/2-I*Ge/2+Zi;Me.drawImage(o,qe,Qi,T*Ge,I*Ge);let gt=await new Promise(Mo=>{R.toBlob(Oo=>Mo(Oo),e.type||"image/png")});if(Ki(),!gt){l(null);return}l(new File([gt],e.name,{type:gt.type}))};E==null||E.addEventListener("click",Xi),C==null||C.addEventListener("click",Xi),M==null||M.addEventListener("click",Ta),A==null||A.addEventListener("click",()=>{Po()}),c.addEventListener("click",R=>{R.target===c&&Xi()}),document.body.appendChild(c),Ta()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let a=await this.loadImage(i);if(a)return a}return null}};var Oi=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
902
902
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
903
903
|
<div class="scene-panel-header" data-panel-handle>
|
|
904
904
|
<div class="panel-title">
|
|
@@ -964,10 +964,10 @@ Generate the requested asset matching the brand style.${n.needsTransparency?" Ba
|
|
|
964
964
|
</div>
|
|
965
965
|
</div>
|
|
966
966
|
</div>
|
|
967
|
-
`}initialize(e,t){var y,v,x,E,w,S,C,O,B,M,T,I,P,D,j,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let a=(()=>{var k;let A=window.getEditableEngineConfig;if(typeof A=="function"){let _=A();return(k=_==null?void 0:_.loading)!=null?k:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=a.type==="image"?"image":"color",r.addEventListener("change",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=a.background_color||"#160a17",o.addEventListener("input",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{background_color:o.value})}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((w=a.overlay_alpha)!=null?w:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var k,_;let A=Number(s.value);l&&(l.textContent=A.toFixed(2)),(_=(k=this.options)==null?void 0:k.onUpdateLoading)==null||_.call(k,{overlay_alpha:A})}));let c=(S=this.root)==null?void 0:S.querySelector("#loading-text");c&&(c.value=a.text||"",c.addEventListener("input",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{text:c.value})}));let p=(C=this.root)==null?void 0:C.querySelector("#loading-text-scale"),d=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");p&&(p.value=String((B=a.text_scale)!=null?B:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var k,_;let A=Number(p.value);d&&(d.textContent=A.toFixed(2)),(_=(k=this.options)==null?void 0:k.onUpdateLoading)==null||_.call(k,{text_scale:A})}));let u=(M=this.root)==null?void 0:M.querySelector("#loading-enabled");u&&(u.checked=a.enabled!==!1,u.addEventListener("change",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{enabled:u.checked})}));let g=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");g&&(g.checked=a.blur_enabled!==!1,g.addEventListener("change",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{blur_enabled:g.checked})}));let m=(I=this.root)==null?void 0:I.querySelector("#loading-blur-strength"),h=(P=this.root)==null?void 0:P.querySelector("#loading-blur-strength-value");m&&(m.value=String((D=a.blur_strength)!=null?D:8),h&&(h.textContent=m.value),m.addEventListener("input",()=>{var A,k;h&&(h.textContent=m.value),(k=(A=this.options)==null?void 0:A.onUpdateLoading)==null||k.call(A,{blur_strength:Number(m.value)})}));let f=(j=this.root)==null?void 0:j.querySelector("#loading-show-btn"),b=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onShowLoadingScreen)==null||k.call(A)}),b==null||b.addEventListener("click",()=>{var A,k;(k=(A=this.options)==null?void 0:A.onHideLoadingScreen)==null||k.call(A)}),this.updateFieldVisibility(a.type==="image"?"image":"color")}updateFieldVisibility(e){var a,r;let t=(a=this.root)==null?void 0:a.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Tt=require("pixi.js");Xe();K();async function Fr(n,e,t){var i,a;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)oe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let m=((a=g.getDisplayObject)==null?void 0:a.call(g))||g.pixiObject||g;m!=null&&m.texture&&(m.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Ur(n,e){var t,i,a;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(f=>f.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Tt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),m=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of m)oe[f]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let h=window.gameObjectManager;if(h)for(let f of m){let b=h.get(f);if(b){let y=((a=b.getDisplayObject)==null?void 0:a.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Gr(n,e,t,i){var a,r,o,s,l,c,p,d,u,g,m,h,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),E=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",E);let w=await Tt.Assets.load(E);if(!w){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),oe[v]=w,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let S=window.CustomAssets;S!=null&&S[v]&&(S[v].texture=w,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let C=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!C),C){let B=Array.from(((a=C.keys)==null?void 0:a.call(C))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",B);let M=C.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!M),M){let T=((r=M.getDisplayObject)==null?void 0:r.call(M))||M.pixiObject||M.pixi||M,I=(o=T==null?void 0:T.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",T),console.log("[LIBRARY] displayObject type:",I),console.log("[LIBRARY] has texture?",!!(T!=null&&T.texture)),T!=null&&T.texture)T.texture=w,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(I==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:P}=await import("pixi.js"),D=T.parent,j=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,T))!=null?l:0,$={x:T.x,y:T.y},A={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},k={x:(m=(g=T.scale)==null?void 0:g.x)!=null?m:1,y:(f=(h=T.scale)==null?void 0:h.y)!=null?f:1},_=(b=T.alpha)!=null?b:1,q=(y=T.visible)!=null?y:!0,V=new P(w);V.anchor.set(A.x,A.y),V.position.set($.x,$.y),V.scale.set(k.x,k.y),V.alpha=_,V.visible=q,D&&(D.removeChild(T),D.addChildAt(V,j),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),M.pixiObject&&(M.pixiObject=V),M.pixi&&(M.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(T!=null&&T.children){let P=T.children.find(D=>D.texture);P?(P.texture=w,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${i}/${t}`;Se({objectId:v,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",O)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function qr(n,e,t,i){var a;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}oe[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((a=d.getDisplayObject)==null?void 0:a.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Se({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var _t=require("pixi.js");var zn=require("pixi.js"),ke=()=>window.debugConfig||{},Vr=()=>window.resolveAnchorVec2||(n=>({x:.5,y:.5})),Wr=()=>window.resolveScreenAnchorPoint||(()=>new zn.Point),Yr=()=>window.resolveScreenRatioPoint||(()=>new zn.Point);function Kr(n){Ii(n)&&(n.objectDebugRaf||(n.objectDebugRaf=window.requestAnimationFrame(()=>ji(n))))}function Xr(n){n.objectDebugRaf&&(window.cancelAnimationFrame(n.objectDebugRaf),n.objectDebugRaf=null),kt(n)}function Ii(n){return n.isDebugOpen}function ji(n){var r,o,s;if(!Ii(n)){n.objectDebugRaf=null;return}n.objectDebugRaf=window.requestAnimationFrame(()=>ji(n));let e=Hn(n);if(!e){Lt(n,null),kt(n);return}let t=Nn(n,e);if(!t){Lt(n,null),kt(n);return}let i=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let a=Bn(n,t);Lt(n,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=a==null?void 0:a.x)!=null?o:null,configY:(s=a==null?void 0:a.y)!=null?s:null}),n.highlightObject?qn(n,t):Wn(n),n.highlightAnchor&&a?Vn(n,a):Yn(n)}function Hn(n){var a;let e=n.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Nn(n,e){var a,r;let t=window.gameObjectManager,i=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function Mt(n){let e=n.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Bn(n,e){var o,s;let t=Mt(n);if(!t)return null;let i=(o=t.transform)!=null?o:{},a=Fn(n);if(!a)return null;if(i.position_ratio!=null)return Yr()(a.width,a.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Wr()(a.width,a.height,r)}function Fn(n){var r;let e=(r=n.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 a=window.gameApp;return a!=null&&a.renderer?{width:a.renderer.width,height:a.renderer.height}:null}function Un(n){let e=window.gameApp;return e!=null&&e.stage?(n.objectBoundsGfx&&n.objectBoundsGfx.parent!==e.stage&&(n.objectBoundsGfx.destroy(),n.objectBoundsGfx=null),n.objectBoundsGfx||(n.objectBoundsGfx=new _t.Graphics,n.objectBoundsGfx.zIndex=999999,e.stage.addChild(n.objectBoundsGfx)),n.objectBoundsGfx):null}function Gn(n){let e=window.gameApp;return e!=null&&e.stage?(n.objectAnchorGfx&&n.objectAnchorGfx.parent!==e.stage&&(n.objectAnchorGfx.destroy(),n.objectAnchorGfx=null),n.objectAnchorGfx||(n.objectAnchorGfx=new _t.Graphics,n.objectAnchorGfx.zIndex=1e6,e.stage.addChild(n.objectAnchorGfx)),n.objectAnchorGfx):null}function qn(n,e){var a;let t=Un(n);if(!t)return;let i=(a=e.getBounds)==null?void 0:a.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Vn(n,e){let t=Gn(n);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 Wn(n){n.objectBoundsGfx&&n.objectBoundsGfx.clear()}function Yn(n){n.objectAnchorGfx&&n.objectAnchorGfx.clear()}function kt(n){n.objectBoundsGfx&&(n.objectBoundsGfx.destroy(),n.objectBoundsGfx=null),n.objectAnchorGfx&&(n.objectAnchorGfx.destroy(),n.objectAnchorGfx=null)}function Lt(n,e){n.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Jr(n,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,n)}function Zr(n,e,t){var o;let i=e.split("."),a=i.pop(),r=n;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[a]=t}function Kn(n){var i,a,r,o,s;if(!n)return!1;if((i=n.transform)!=null&&i.offset)return!0;let e=((r=(a=n.identity)==null?void 0:a.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=n.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Di(n){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 Qr(n){window.location.reload()}function $i(n){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 eo(n,e){var t,i,a;if(!(!n.configViewer||!n.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(),Cr)),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),Ri(n,u),(i=n.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Ri(n,o),(a=n.configViewer)==null||a.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Ri(n,e){var d,u,g,m,h,f,b,y,v,x;if(!n.container)return;let t=n.container.querySelector("#config-pos-x"),i=n.container.querySelector("#config-pos-y"),a=n.container.querySelector("#config-scale"),r=n.container.querySelector("#config-anchor-x"),o=n.container.querySelector("#config-anchor-y"),l=Kn(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((m=l==null?void 0:l.y)!=null?m:0)),a&&(a.value=String((f=(h=e.transform)==null?void 0:h.scale)!=null?f:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=Vr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function to(n){var l,c,p,d,u,g,m,h,f,b;let e=n.selectedObjectId;if(!e||!n.container)return;let t=(c=(l=n.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=n.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",a=(g=(u=n.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(m=n.container.querySelector("#config-anchor-x"))==null?void 0:m.value)!=null?h:"0.5",o=(b=(f=n.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",s=`${e}:
|
|
967
|
+
`}initialize(e,t){var y,v,x,w,E,C,A,M,B,P,T,I,O,D,j,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let a=(()=>{var k;let S=window.getEditableEngineConfig;if(typeof S=="function"){let _=S();return(k=_==null?void 0:_.loading)!=null?k:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=a.type==="image"?"image":"color",r.addEventListener("change",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=a.background_color||"#160a17",o.addEventListener("input",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{background_color:o.value})}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((E=a.overlay_alpha)!=null?E:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var k,_;let S=Number(s.value);l&&(l.textContent=S.toFixed(2)),(_=(k=this.options)==null?void 0:k.onUpdateLoading)==null||_.call(k,{overlay_alpha:S})}));let c=(C=this.root)==null?void 0:C.querySelector("#loading-text");c&&(c.value=a.text||"",c.addEventListener("input",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{text:c.value})}));let p=(A=this.root)==null?void 0:A.querySelector("#loading-text-scale"),d=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");p&&(p.value=String((B=a.text_scale)!=null?B:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var k,_;let S=Number(p.value);d&&(d.textContent=S.toFixed(2)),(_=(k=this.options)==null?void 0:k.onUpdateLoading)==null||_.call(k,{text_scale:S})}));let u=(P=this.root)==null?void 0:P.querySelector("#loading-enabled");u&&(u.checked=a.enabled!==!1,u.addEventListener("change",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{enabled:u.checked})}));let g=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");g&&(g.checked=a.blur_enabled!==!1,g.addEventListener("change",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{blur_enabled:g.checked})}));let m=(I=this.root)==null?void 0:I.querySelector("#loading-blur-strength"),h=(O=this.root)==null?void 0:O.querySelector("#loading-blur-strength-value");m&&(m.value=String((D=a.blur_strength)!=null?D:8),h&&(h.textContent=m.value),m.addEventListener("input",()=>{var S,k;h&&(h.textContent=m.value),(k=(S=this.options)==null?void 0:S.onUpdateLoading)==null||k.call(S,{blur_strength:Number(m.value)})}));let f=(j=this.root)==null?void 0:j.querySelector("#loading-show-btn"),b=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onShowLoadingScreen)==null||k.call(S)}),b==null||b.addEventListener("click",()=>{var S,k;(k=(S=this.options)==null?void 0:S.onHideLoadingScreen)==null||k.call(S)}),this.updateFieldVisibility(a.type==="image"?"image":"color")}updateFieldVisibility(e){var a,r;let t=(a=this.root)==null?void 0:a.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Tt=require("pixi.js");Xe();K();async function Fr(n,e,t){var i,a;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)oe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let m=((a=g.getDisplayObject)==null?void 0:a.call(g))||g.pixiObject||g;m!=null&&m.texture&&(m.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Ur(n,e){var t,i,a;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(f=>f.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Tt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),m=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of m)oe[f]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let h=window.gameObjectManager;if(h)for(let f of m){let b=h.get(f);if(b){let y=((a=b.getDisplayObject)==null?void 0:a.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Gr(n,e,t,i){var a,r,o,s,l,c,p,d,u,g,m,h,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let E=await Tt.Assets.load(w);if(!E){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),oe[v]=E,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let C=window.CustomAssets;C!=null&&C[v]&&(C[v].texture=E,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let A=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!A),A){let B=Array.from(((a=A.keys)==null?void 0:a.call(A))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",B);let P=A.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!P),P){let T=((r=P.getDisplayObject)==null?void 0:r.call(P))||P.pixiObject||P.pixi||P,I=(o=T==null?void 0:T.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",T),console.log("[LIBRARY] displayObject type:",I),console.log("[LIBRARY] has texture?",!!(T!=null&&T.texture)),T!=null&&T.texture)T.texture=E,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(I==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:O}=await import("pixi.js"),D=T.parent,j=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,T))!=null?l:0,$={x:T.x,y:T.y},S={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},k={x:(m=(g=T.scale)==null?void 0:g.x)!=null?m:1,y:(f=(h=T.scale)==null?void 0:h.y)!=null?f:1},_=(b=T.alpha)!=null?b:1,q=(y=T.visible)!=null?y:!0,V=new O(E);V.anchor.set(S.x,S.y),V.position.set($.x,$.y),V.scale.set(k.x,k.y),V.alpha=_,V.visible=q,D&&(D.removeChild(T),D.addChildAt(V,j),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),P.pixiObject&&(P.pixiObject=V),P.pixi&&(P.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(T!=null&&T.children){let O=T.children.find(D=>D.texture);O?(O.texture=E,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${i}/${t}`;Se({objectId:v,path:"render.asset.path",value:M}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",M)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function qr(n,e,t,i){var a;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}oe[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((a=d.getDisplayObject)==null?void 0:a.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Se({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var _t=require("pixi.js");var zn=require("pixi.js"),ke=()=>window.debugConfig||{},Vr=()=>window.resolveAnchorVec2||(n=>({x:.5,y:.5})),Wr=()=>window.resolveScreenAnchorPoint||(()=>new zn.Point),Yr=()=>window.resolveScreenRatioPoint||(()=>new zn.Point);function Kr(n){Ii(n)&&(n.objectDebugRaf||(n.objectDebugRaf=window.requestAnimationFrame(()=>ji(n))))}function Xr(n){n.objectDebugRaf&&(window.cancelAnimationFrame(n.objectDebugRaf),n.objectDebugRaf=null),kt(n)}function Ii(n){return n.isDebugOpen}function ji(n){var r,o,s;if(!Ii(n)){n.objectDebugRaf=null;return}n.objectDebugRaf=window.requestAnimationFrame(()=>ji(n));let e=Hn(n);if(!e){Lt(n,null),kt(n);return}let t=Nn(n,e);if(!t){Lt(n,null),kt(n);return}let i=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let a=Bn(n,t);Lt(n,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=a==null?void 0:a.x)!=null?o:null,configY:(s=a==null?void 0:a.y)!=null?s:null}),n.highlightObject?qn(n,t):Wn(n),n.highlightAnchor&&a?Vn(n,a):Yn(n)}function Hn(n){var a;let e=n.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Nn(n,e){var a,r;let t=window.gameObjectManager,i=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function Pt(n){let e=n.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Bn(n,e){var o,s;let t=Pt(n);if(!t)return null;let i=(o=t.transform)!=null?o:{},a=Fn(n);if(!a)return null;if(i.position_ratio!=null)return Yr()(a.width,a.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Wr()(a.width,a.height,r)}function Fn(n){var r;let e=(r=n.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 a=window.gameApp;return a!=null&&a.renderer?{width:a.renderer.width,height:a.renderer.height}:null}function Un(n){let e=window.gameApp;return e!=null&&e.stage?(n.objectBoundsGfx&&n.objectBoundsGfx.parent!==e.stage&&(n.objectBoundsGfx.destroy(),n.objectBoundsGfx=null),n.objectBoundsGfx||(n.objectBoundsGfx=new _t.Graphics,n.objectBoundsGfx.zIndex=999999,e.stage.addChild(n.objectBoundsGfx)),n.objectBoundsGfx):null}function Gn(n){let e=window.gameApp;return e!=null&&e.stage?(n.objectAnchorGfx&&n.objectAnchorGfx.parent!==e.stage&&(n.objectAnchorGfx.destroy(),n.objectAnchorGfx=null),n.objectAnchorGfx||(n.objectAnchorGfx=new _t.Graphics,n.objectAnchorGfx.zIndex=1e6,e.stage.addChild(n.objectAnchorGfx)),n.objectAnchorGfx):null}function qn(n,e){var a;let t=Un(n);if(!t)return;let i=(a=e.getBounds)==null?void 0:a.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Vn(n,e){let t=Gn(n);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 Wn(n){n.objectBoundsGfx&&n.objectBoundsGfx.clear()}function Yn(n){n.objectAnchorGfx&&n.objectAnchorGfx.clear()}function kt(n){n.objectBoundsGfx&&(n.objectBoundsGfx.destroy(),n.objectBoundsGfx=null),n.objectAnchorGfx&&(n.objectAnchorGfx.destroy(),n.objectAnchorGfx=null)}function Lt(n,e){n.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Jr(n,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,n)}function Zr(n,e,t){var o;let i=e.split("."),a=i.pop(),r=n;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[a]=t}function Kn(n){var i,a,r,o,s;if(!n)return!1;if((i=n.transform)!=null&&i.offset)return!0;let e=((r=(a=n.identity)==null?void 0:a.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=n.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Di(n){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 Qr(n){window.location.reload()}function $i(n){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 eo(n,e){var t,i,a;if(!(!n.configViewer||!n.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(),Cr)),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),Ri(n,u),(i=n.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Ri(n,o),(a=n.configViewer)==null||a.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Ri(n,e){var d,u,g,m,h,f,b,y,v,x;if(!n.container)return;let t=n.container.querySelector("#config-pos-x"),i=n.container.querySelector("#config-pos-y"),a=n.container.querySelector("#config-scale"),r=n.container.querySelector("#config-anchor-x"),o=n.container.querySelector("#config-anchor-y"),l=Kn(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((m=l==null?void 0:l.y)!=null?m:0)),a&&(a.value=String((f=(h=e.transform)==null?void 0:h.scale)!=null?f:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=Vr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function to(n){var l,c,p,d,u,g,m,h,f,b;let e=n.selectedObjectId;if(!e||!n.container)return;let t=(c=(l=n.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=n.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",a=(g=(u=n.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(m=n.container.querySelector("#config-anchor-x"))==null?void 0:m.value)!=null?h:"0.5",o=(b=(f=n.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",s=`${e}:
|
|
968
968
|
position: (${t}, ${i})
|
|
969
969
|
scale: ${a}
|
|
970
|
-
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 Xn(n,e){var d,u,g,m,h,f,b,y,v,x,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!n.container)return;let t=n.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=n.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),a=Number((m=(g=n.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?m:0),r=Number((f=(h=n.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?f:1),o=Number((y=(b=n.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((x=(v=n.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:a,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Je));l({objectId:t,path:"transform.position",value:{x:i,y:a}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=Mt(n);Kn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:a}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let w=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);w?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,w)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function io(n,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let a=window.applyEditableEngineConfig;if(typeof a=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),m=c;for(let h=0;h<g.length-1;h++){let f=g[h];m[f]=(u=m[f])!=null?u:{},m=m[f]}m[g[g.length-1]]=d}else c[p]=d}),l.ui=c,a({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function no(n){n.selectedObjectId&&(n.objectAutoApplyTimer&&window.clearTimeout(n.objectAutoApplyTimer),n.objectAutoApplyTimer=window.setTimeout(()=>{n.objectAutoApplyTimer=null,Xn(n,{silent:!0})},150))}var Gs=3e3;function Pt(n,e,t){let i=t!=null?t:n.offsetParent;if(!i)return;e.style.cursor="move";let a=0,r=0,o=0,s=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-a,g=d.clientY-r;n.style.left=`${o+u}px`,n.style.top=`${s+g}px`},p=()=>{l&&(l=!1,n.classList.remove("dragging"),window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=n.getBoundingClientRect(),m=i.getBoundingClientRect();o=Math.max(0,g.left-m.left),s=Math.max(0,g.top-m.top);let h=g.width,f=g.height,b=m.width,y=m.height;o=Math.min(o,b-h),s=Math.min(s,y-f),a=d.clientX,r=d.clientY,n.style.left=`${o}px`,n.style.top=`${s}px`,n.style.right="auto",n.style.bottom="auto",n.style.zIndex=String(++Gs);let v=n.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(n.style.left="16px",n.style.top="72px",n.style.right="auto",n.style.bottom="auto"),l=!0,n.classList.add("dragging"),window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function Jn(n,e,t,i=280,a=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-s,m=u.clientY-l,h=Math.max(i,r+g),f=Math.max(a,o+m);n.style.width=`${h}px`,n.style.height=`${f}px`,t==null||t(h,f)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=n.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function Zn(n,e){var h,f,b,y;let t=(b=(f=(h=n.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?f:n.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=n.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),a=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));a.width>o&&(e.style.width=`${o}px`),a.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),m=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(m)}px`,e.style.right="auto",e.style.bottom="auto"}function Ne(n){var i;if(!n.container)return;let e=n.container.querySelector("#debug-workbench");if(!e)return;if(Zn(n,e),(i=n.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:n.activeTab};if(a)try{r={...JSON.parse(a),activeTab:n.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:n.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function zi(n){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(n.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var a;let i=(a=n.container)==null?void 0:a.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),Zn(n,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Qn(n,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",Zn(n,e),Ne(n))}function ao(n){var a,r,o;if(!n.container)return;let e=n.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=n.toggleDebug)==null||s.call(n)}),(a=e.querySelector("#debug-close"))==null||a.addEventListener("click",()=>{var s;return(s=n.toggleDebug)==null?void 0:s.call(n,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Di(n)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>$i(n)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;n.activeTab=l,ea(n),Ne(n)})}),ia(n,e),ta(n,e)}function ea(n){if(!n.container)return;let e=n.container;e.querySelectorAll(".workbench-tab").forEach(a=>{let r=a.dataset.tab;a.classList.toggle("active",r===n.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(a=>{let r=a.dataset.tabPanel;a.classList.toggle("active",r===n.activeTab)})}function ta(n,e){te(n,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),te(n,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),te(n,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),te(n,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),te(n,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),te(n,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),te(n,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),te(n,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),te(n,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let a=ke();a.layout&&(a.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let a=i.value.replace("#",""),r=parseInt(a,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function ro(n){if(!n.container||!n.debugOverlay)return;let e=n.container.querySelector("#debug-workbench"),t=n.container.querySelector("#workbench-handle"),i=n.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Pt(e,t,n.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ne(n),Qn(n,e)},10)}));let a=n.container.querySelector('[data-panel="scene-objects"]'),r=a==null?void 0:a.querySelector("[data-panel-handle]"),o=a==null?void 0:a.querySelector("[data-panel-resize-v]");a&&r&&(!a.style.left&&!a.style.right&&!a.style.top&&!a.style.bottom&&(a.style.left="16px",a.style.top="72px"),Pt(a,r,n.debugOverlay),r.addEventListener("pointerup",()=>{setTimeout(()=>{Qn(n,a)},10)})),a&&o&&Jn(a,o);let s=n.container.querySelector('[data-panel="scene-tools-corner"]'),l=s==null?void 0:s.querySelector("[data-panel-handle]");s&&l&&Pt(s,l,n.debugOverlay);let c=n.container.querySelector('[data-panel="nudge-panel"]'),p=c==null?void 0:c.querySelector("[data-panel-handle]");c&&p&&Pt(c,p,n.debugOverlay),e&&i&&Jn(e,i,()=>Ne(n)),zi(n)}function ia(n,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let a=i.closest(".scene-panel");a&&a.classList.toggle("collapsed")})})}function te(n,e,t,i,a){let r=e.querySelector(`#${t}`),o=e.querySelector(a);if(!r||!o)return;let s=Jr(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),Zr(ke(),i,l)})}K();var Hi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ai(),{hasChanges:t,overrideCount:i,overrides:a}=e,r={};for(let l of a){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never";return`
|
|
970
|
+
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 Xn(n,e){var d,u,g,m,h,f,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!n.container)return;let t=n.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=n.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),a=Number((m=(g=n.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?m:0),r=Number((f=(h=n.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?f:1),o=Number((y=(b=n.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((x=(v=n.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:a,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Je));l({objectId:t,path:"transform.position",value:{x:i,y:a}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=Pt(n);Kn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:a}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let E=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);E?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,E)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function io(n,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let a=window.applyEditableEngineConfig;if(typeof a=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),m=c;for(let h=0;h<g.length-1;h++){let f=g[h];m[f]=(u=m[f])!=null?u:{},m=m[f]}m[g[g.length-1]]=d}else c[p]=d}),l.ui=c,a({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function no(n){n.selectedObjectId&&(n.objectAutoApplyTimer&&window.clearTimeout(n.objectAutoApplyTimer),n.objectAutoApplyTimer=window.setTimeout(()=>{n.objectAutoApplyTimer=null,Xn(n,{silent:!0})},150))}var Gs=3e3;function Mt(n,e,t){let i=t!=null?t:n.offsetParent;if(!i)return;e.style.cursor="move";let a=0,r=0,o=0,s=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-a,g=d.clientY-r;n.style.left=`${o+u}px`,n.style.top=`${s+g}px`},p=()=>{l&&(l=!1,n.classList.remove("dragging"),window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=window.getComputedStyle(n),m=parseFloat(n.style.left)||0,h=parseFloat(n.style.top)||0;if(!n.style.left||n.style.left==="auto"){let f=n.getBoundingClientRect(),b=i.getBoundingClientRect();m=f.left-b.left,h=f.top-b.top,n.style.left=`${m}px`,n.style.top=`${h}px`,n.style.right="auto",n.style.bottom="auto"}o=m,s=h,a=d.clientX,r=d.clientY,n.style.zIndex=String(++Gs),l=!0,n.classList.add("dragging"),window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function Jn(n,e,t,i=280,a=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-s,m=u.clientY-l,h=Math.max(i,r+g),f=Math.max(a,o+m);n.style.width=`${h}px`,n.style.height=`${f}px`,t==null||t(h,f)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=n.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function Zn(n,e){var h,f,b,y;let t=(b=(f=(h=n.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?f:n.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=n.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),a=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));a.width>o&&(e.style.width=`${o}px`),a.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),m=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(m)}px`,e.style.right="auto",e.style.bottom="auto"}function Ne(n){var i;if(!n.container)return;let e=n.container.querySelector("#debug-workbench");if(!e)return;if(Zn(n,e),(i=n.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:n.activeTab};if(a)try{r={...JSON.parse(a),activeTab:n.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:n.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function zi(n){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(n.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var a;let i=(a=n.container)==null?void 0:a.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),Zn(n,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Qn(n,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",Zn(n,e),Ne(n))}function ao(n){var a,r,o;if(!n.container)return;let e=n.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=n.toggleDebug)==null||s.call(n)}),(a=e.querySelector("#debug-close"))==null||a.addEventListener("click",()=>{var s;return(s=n.toggleDebug)==null?void 0:s.call(n,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Di(n)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>$i(n)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;n.activeTab=l,ea(n),Ne(n)})}),ia(n,e),ta(n,e)}function ea(n){if(!n.container)return;let e=n.container;e.querySelectorAll(".workbench-tab").forEach(a=>{let r=a.dataset.tab;a.classList.toggle("active",r===n.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(a=>{let r=a.dataset.tabPanel;a.classList.toggle("active",r===n.activeTab)})}function ta(n,e){te(n,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),te(n,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),te(n,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),te(n,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),te(n,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),te(n,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),te(n,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),te(n,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),te(n,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let a=ke();a.layout&&(a.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let a=i.value.replace("#",""),r=parseInt(a,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function ro(n){if(!n.container||!n.debugOverlay)return;let e=n.container.querySelector("#debug-workbench"),t=n.container.querySelector("#workbench-handle"),i=n.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Mt(e,t,n.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ne(n),Qn(n,e)},10)}));let a=n.container.querySelector('[data-panel="scene-objects"]'),r=a==null?void 0:a.querySelector("[data-panel-handle]"),o=a==null?void 0:a.querySelector("[data-panel-resize-v]");a&&r&&(!a.style.left&&!a.style.right&&!a.style.top&&!a.style.bottom&&(a.style.left="16px",a.style.top="72px"),Mt(a,r,n.debugOverlay),r.addEventListener("pointerup",()=>{setTimeout(()=>{Qn(n,a)},10)})),a&&o&&Jn(a,o);let s=n.container.querySelector('[data-panel="scene-tools-corner"]'),l=s==null?void 0:s.querySelector("[data-panel-handle]");s&&l&&Mt(s,l,n.debugOverlay);let c=n.container.querySelector('[data-panel="nudge-panel"]'),p=c==null?void 0:c.querySelector("[data-panel-handle]");c&&p&&Mt(c,p,n.debugOverlay),e&&i&&Jn(e,i,()=>Ne(n)),zi(n)}function ia(n,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let a=i.closest(".scene-panel");a&&a.classList.toggle("collapsed")})})}function te(n,e,t,i,a){let r=e.querySelector(`#${t}`),o=e.querySelector(a);if(!r||!o)return;let s=Jr(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),Zr(ke(),i,l)})}K();var Hi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ai(),{hasChanges:t,overrideCount:i,overrides:a}=e,r={};for(let l of a){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never";return`
|
|
971
971
|
<div class="config-persistence-panel">
|
|
972
972
|
<div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
|
|
973
973
|
${t?`
|
|
@@ -1120,7 +1120,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
|
|
|
1120
1120
|
|
|
1121
1121
|
This cannot be undone unless you have git commits or backups.
|
|
1122
1122
|
|
|
1123
|
-
Are you absolutely sure?`))try{let t=De(),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 a=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!a.ok){let r=await a.json();throw new Error(r.error||"Direct apply failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ot=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new gi;this.sceneToolsPanel=new hi;this.nudgePanel=new fi;this.inspectorPanel=new Li;this.libraryPanel=new Ct;this.libraryPanelDocked=new Ct;this.brandVisionPanel=new
|
|
1123
|
+
Are you absolutely sure?`))try{let t=De(),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 a=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!a.ok){let r=await a.json();throw new Error(r.error||"Direct apply failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ot=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new gi;this.sceneToolsPanel=new hi;this.nudgePanel=new fi;this.inspectorPanel=new Li;this.libraryPanel=new Ct;this.libraryPanelDocked=new Ct;this.brandVisionPanel=new Pi;this.customizeSettingsPanel=new Mi;this.configPersistencePanel=new Hi;this.loadingScreenPanel=new Oi}applyAssetChange(e,t){return Fr(this,e,t)}resetAsset(e){return Ur(this,e)}applySlotAsset(e,t,i){return Gr(this,e,t,i)}resetSlotAsset(e,t,i){return qr(this,e,t,i)}startObjectVisuals(){return Kr(this)}stopObjectVisuals(){return Xr(this)}shouldRunObjectVisuals(){return Ii(this)}updateObjectVisuals(){return ji(this)}getSelectedInstanceId(){return Hn(this)}getDisplayObjectById(e){return Nn(this,e)}getSelectedObjectConfig(){return Pt(this)}getConfigAnchorWorldPoint(e){return Bn(this,e)}getScreenSize(){return Fn(this)}ensureBoundsGfx(){return Un(this)}ensureAnchorGfx(){return Gn(this)}drawBounds(e){return qn(this,e)}drawAnchor(e){return Vn(this,e)}clearBounds(){return Wn(this)}clearAnchor(){return Yn(this)}clearObjectVisuals(){return kt(this)}updateObjectInfo(e){return Lt(this,e)}resetDebugConfig(){return Di(this)}applyDebugConfig(){return Qr(this)}exportDebugConfig(){return $i(this)}loadObjectConfig(e){return eo(this,e)}fillConfigViewer(e){return Ri(this,e)}copyConfigValues(){return to(this)}applyObjectConfig(e){return Xn(this,e)}applyCustomizeSettings(e,t){return io(this,e,t)}scheduleObjectAutoApply(){return no(this)}setupDebugEventListeners(){return ao(this)}setupDebugInputListeners(e){return ta(this,e)}setupPanelLayout(){return ro(this)}setupCollapsiblePanels(e){return ia(this,e)}setupRangeInput(e,t,i,a){return te(this,e,t,i,a)}updateWorkbenchTabs(){return ea(this)}saveWorkbenchState(){return Ne(this)}loadWorkbenchState(){return zi(this)}initialize(e){var o;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let s=localStorage.getItem("preview_workbench_state");if(s){let l=JSON.parse(s);l.activeTab&&(this.activeTab=l.activeTab)}}catch(s){console.warn("[PREVIEW] Failed to load workbench tab state",s)}this.sceneObjectsPanel.initialize(e,{onSelect:s=>this.handleObjectSelect(s)}),this.libraryPanel.initialize(e,{onApply:(s,l,c)=>this.applySlotAsset(s,l,c),onReset:(s,l,c)=>this.resetSlotAsset(s,l,c)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(e,{onApply:(s,l,c)=>this.applySlotAsset(s,l,c),onReset:(s,l,c)=>this.resetSlotAsset(s,l,c)})),this.inspectorPanel.initialize(e,{onPropertyChange:(s,l,c)=>{console.log("[Inspector] Property changed:",s,l,c)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let s="/dashboard";window.location.pathname!==s&&(window.location.href=s)}),this.customizeSettingsPanel.initialize(e,{onApply:(s,l)=>this.applyCustomizeSettings(s,l)});let i=e.querySelector("#scene-tools-container");i&&(i.innerHTML=this.sceneToolsPanel.render());let a=e.querySelector("#nudge-panel-container");a&&(a.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(i||e,{onHighlightObject:s=>{this.highlightObject=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:s=>{this.highlightAnchor=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(s,l)=>this.nudgeSelectedObject(s,l),onShowSplash:()=>{let s=window;typeof s.__previewShowSplash=="function"&&s.__previewShowSplash()},onUpdateSplash:s=>{let l=window;typeof l.applyEditableEngineConfig=="function"&&l.applyEditableEngineConfig({splash:s})}}),this.nudgePanel.initialize(a||e,{onNudge:async(s,l)=>{var h,f,b,y,v,x;if(!this.selectedObjectId)return;let c=this.getSelectedObjectConfig();if(!c)return;let p=(h=c.transform)==null?void 0:h.position,d=((f=p==null?void 0:p.x)!=null?f:0)+s,u=((b=p==null?void 0:p.y)!=null?b:0)+l,{applyConfigOverride:g}=await Promise.resolve().then(()=>(K(),Je));g({objectId:this.selectedObjectId,path:"transform.position",value:{x:d,y:u}},{silent:!0,emitEvent:!0});let m=window.applyEditableObjectConfig;if(typeof m=="function"){let w=window.__editableConfig,E=(x=(v=(y=w==null?void 0:w.objects)==null?void 0:y.get)==null?void 0:v.call(y,this.selectedObjectId))!=null?x:c;await m(this.selectedObjectId,E)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async s=>{var g,m,h,f,b;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(m=(g=l.transform)==null?void 0:g.scale)!=null?m:1,p=Math.max(.1,c+s),{applyConfigOverride:d}=await Promise.resolve().then(()=>(K(),Je));d({objectId:this.selectedObjectId,path:"transform.scale",value:p},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let y=window.__editableConfig,v=(b=(f=(h=y==null?void 0:y.objects)==null?void 0:h.get)==null?void 0:f.call(h,this.selectedObjectId))!=null?b:l;await u(this.selectedObjectId,v)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let r=i==null?void 0:i.querySelector("#debug-nudge-enabled");r==null||r.addEventListener("change",()=>{r.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let s=window;typeof s.__previewShowLoading=="function"?s.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let s=window;typeof s.__previewHideLoading=="function"?s.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:s=>{let l=window;typeof l.applyEditableEngineConfig=="function"&&l.applyEditableEngineConfig({loading:s}),typeof l.__previewUpdateLoading=="function"?l.__previewUpdateLoading(s):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(s,l,c,p)=>{this.customizeSettingsPanel.openAiEditor(s,l,c,p)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(o=this.debugOverlay)==null||o.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=s=>this.selectObject(s),window.addEventListener("config:changed",s=>{var l,c;((l=s.detail)==null?void 0:l.action)!=="remove"&&((c=s.detail)==null?void 0:c.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(s,l,c)=>this.applySlotAsset(s,l,c),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var l;let s=window.getActiveConfig;if(typeof s=="function"){let c=s();return((l=c==null?void 0:c.engine)==null?void 0:l.splash)||null}return null},window.addAssetToRegistry=(s,l)=>{let c=window.getEditableAssets;if(typeof c=="function"){let p=c();if(p!=null&&p.libraryAssets&&(p.libraryAssets[s]||(p.libraryAssets[s]=[]),!p.libraryAssets[s].some(u=>u.filename===l))){let u=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");p.libraryAssets[s].unshift({filename:l,displayName:u}),console.log(`[DEBUG] Added ${l} to registry category ${s}`)}}},window.__highlightLibrarySlot=(s,l)=>{this.libraryPanel.highlightSlot(s,l)}}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`
|
|
1124
1124
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
1125
1125
|
<div class="debug-workbench" id="debug-workbench">
|
|
1126
1126
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -1351,7 +1351,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
1351
1351
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
1352
1352
|
</div>
|
|
1353
1353
|
</div>
|
|
1354
|
-
`,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,a=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,a=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,a),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+a-r],[e+i-r,t+a-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let a=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(a,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 a=parseFloat(i.target.value);this.setZoom(a)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let a=i.target.value;this.setAspectRatio(a)}),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 a;if(!this.image||!((a=this.options)!=null&&a.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let 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(n){new da().open(n)};var Ni=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.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new Ot,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var a,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=(a=this.options).onDeviceChange)==null||r.call(a,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){var a;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(r=>r.classList.toggle("active",r.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(r=>{r.style.left="",r.style.top="",r.style.width="",r.style.height="",r.style.zIndex=""}),e==="fixed"&&((a=this.debugPanel)==null?void 0:a.activeTab)==="library"&&this.debugPanel.setActiveTab("inspector"),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock"),t=this.container.querySelector(".console-panel"),i=this.container.querySelector("#dock-console-content"),a=this.container.querySelector("#console-messages");e==null||e.classList.remove("hidden"),this.layoutMode==="fixed"?(t==null||t.classList.add("docked-hidden"),a&&i&&a.parentElement!==i&&i.appendChild(a)):(t==null||t.classList.remove("docked-hidden"),a&&t&&a.parentElement!==t&&t.appendChild(a))}makeBottomDockResizable(e,t){let i,a,r=s=>{let l=i-s.clientY,c=Math.max(100,Math.min(800,a+l));e.style.height=`${c}px`,this.scheduleFit()},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,a=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let a,r,o=l=>{let c=i==="left"?l.clientX-a:a-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 u=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",g=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${u} 1fr ${g}`}this.scheduleFit()},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),a=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=`
|
|
1354
|
+
`,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,a=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,a=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,a),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+a-r],[e+i-r,t+a-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let a=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(a,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 a=parseFloat(i.target.value);this.setZoom(a)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let a=i.target.value;this.setAspectRatio(a)}),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 a;if(!this.image||!((a=this.options)!=null&&a.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let 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(n){new da().open(n)};var Ni=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.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new Ot,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var a,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=(a=this.options).onDeviceChange)==null||r.call(a,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(a=>a.classList.toggle("active",a.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(a=>{a.style.left="",a.style.top="",a.style.width="",a.style.height="",a.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")}makeBottomDockResizable(e,t){let i,a,r=s=>{let l=i-s.clientY,c=Math.max(100,Math.min(800,a+l));e.style.height=`${c}px`,this.scheduleFit()},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,a=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let a,r,o=l=>{let c=i==="left"?l.clientX-a:a-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 u=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",g=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${u} 1fr ${g}`}this.scheduleFit()},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),a=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=`
|
|
1355
1355
|
<div class="preview-toolbar">
|
|
1356
1356
|
<div class="preview-toolbar-left">
|
|
1357
1357
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -1360,7 +1360,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
1360
1360
|
<div class="preview-toolbar-center">
|
|
1361
1361
|
<div class="device-selector-wrapper">
|
|
1362
1362
|
<select class="device-dropdown" id="device-select">
|
|
1363
|
-
${
|
|
1363
|
+
${Mn.map(i=>`
|
|
1364
1364
|
<optgroup label="${i.label}">
|
|
1365
1365
|
${i.devices.map(a=>`
|
|
1366
1366
|
<option value="${a.id}" ${a.id===this.currentPreset.id?"selected":""}>
|
|
@@ -1492,25 +1492,27 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
1492
1492
|
|
|
1493
1493
|
${((t=this.debugPanel)==null?void 0:t.getDebugOverlayHTML())||""}
|
|
1494
1494
|
|
|
1495
|
-
<div class="
|
|
1496
|
-
<div class="
|
|
1497
|
-
|
|
1498
|
-
<div class="
|
|
1495
|
+
<div class="bottom-dock" id="bottom-dock">
|
|
1496
|
+
<div class="bottom-dock-resize-handle" id="bottom-dock-resize"></div>
|
|
1497
|
+
<div class="bottom-dock-header">
|
|
1498
|
+
<div class="bottom-dock-tabs">
|
|
1499
|
+
<button class="bottom-dock-tab active" data-dock-tab="console">Console</button>
|
|
1500
|
+
<button class="bottom-dock-tab" data-dock-tab="library">Library</button>
|
|
1501
|
+
</div>
|
|
1502
|
+
<div class="bottom-dock-actions">
|
|
1499
1503
|
<button class="console-action-btn" id="console-clear">Clear</button>
|
|
1500
|
-
<button class="console-action-btn" id="console-close">Close</button>
|
|
1501
1504
|
</div>
|
|
1502
1505
|
</div>
|
|
1503
|
-
<div class="console-messages" id="console-messages"></div>
|
|
1504
|
-
<div class="bottom-dock ${this.layoutMode==="fixed"?"":"hidden"}" id="bottom-dock">
|
|
1505
1506
|
<div class="bottom-dock-content">
|
|
1506
|
-
<div class="bottom-dock-panel active" data-dock-panel="
|
|
1507
|
-
|
|
1507
|
+
<div class="bottom-dock-panel active" data-dock-panel="console" id="dock-console-content">
|
|
1508
|
+
<div class="console-messages" id="console-messages"></div>
|
|
1509
|
+
</div>
|
|
1510
|
+
<div class="bottom-dock-panel" data-dock-panel="library" id="dock-library-content"></div>
|
|
1508
1511
|
</div>
|
|
1509
|
-
<div class="bottom-dock-resize-handle" id="bottom-dock-resize"></div>
|
|
1510
1512
|
</div>
|
|
1511
1513
|
|
|
1512
1514
|
</div>
|
|
1513
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var u,g,m,h,f,b,y,v,x,E;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",w=>{if(this.viewMode==="compare")return;let S=w.target.value;this.setDevice(S)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",w=>{let S=w.target.value;this.setTheme(S)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let S=w.dataset.viewToggle;S&&this.setViewMode(S)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let S=w.dataset.layoutToggle;S&&this.setLayoutMode(S)})}),(u=e.querySelector("#rotate-btn"))==null||u.addEventListener("click",()=>this.toggleRotation()),(g=e.querySelector("#zoom-in-btn"))==null||g.addEventListener("click",()=>this.adjustUserZoom(.1)),(m=e.querySelector("#zoom-out-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(-.1)),(h=e.querySelector("#refresh-btn"))==null||h.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s),(f=e.querySelector("#console-toggle"))==null||f.addEventListener("click",()=>this.toggleConsole()),(b=e.querySelector("#console-close"))==null||b.addEventListener("click",()=>this.toggleConsole(!1)),(y=e.querySelector("#console-clear"))==null||y.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(E=e.querySelector("#corner-grab-btn"))==null||E.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let l=e.querySelector(".scene-panel.scene-objects"),c=e.querySelector("[data-panel-resize-v]");l&&c&&this.makeSidebarResizable(l,c,"left");let p=e.querySelector(".debug-workbench"),d=e.querySelector("#workbench-resize-v");p&&d&&this.makeSidebarResizable(p,d,"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(),a=Math.max(0,i.width),r=Math.max(0,i.height);if(a<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=a/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");if(this.layoutMode==="fixed"){let a=this.container.querySelector(".preview-container");a&&(e&&(a.appendChild(e),e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&(a.appendChild(t),t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100"));return}let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t)),e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,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,(a,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=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),a=console.info.bind(console),r=(o,...s)=>{let l=s.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:o,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...o)=>{e(...o),r("log",...o)},console.warn=(...o)=>{t(...o),r("warn",...o)},console.error=(...o)=>{i(...o),r("error",...o)},console.info=(...o)=>{a(...o),r("info",...o)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let a=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(a)}</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 a=this.container.querySelector("#bottom-dock");a==null||a.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 a=this.comparePresets.find(d=>d.id===i);if(!a)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:a,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let 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,a=this.activeCompareId;a&&a!==e&&this.captureCompareSnapshot(a),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale: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`,a=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=a,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),a=Math.max(0,t.clientHeight-24);if(i<=0||a<=0)return;let r=i/e.preset.width,o=a/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let a=t.canvas.getContext("2d");if(!a)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;a.clearRect(0,0,r,o),a.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 pa(n={}){let e=new Ni(n);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ua(n){try{if(n&&typeof n.keys=="function")return Array.from(n.keys())}catch{}return[]}function lo(n){var e;return n?((e=n.getDisplayObject)==null?void 0:e.call(n))||n.pixiObject||n:null}function Ks(n,e){if(!n||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);n.eventMode=i?"static":"none",n.interactive=i,i&&(n.cursor=t.draggable?"move":"pointer")}function co(n,e){var l,c,p;if(!n||!e)return;let t=e.transform||{};Ks(n,e);let i=t.position||{},a=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof a.x=="number"?a.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof a.y=="number"?a.y:0);(l=n.position)!=null&&l.set?n.position.set(r,o):(typeof n.x=="number"&&(n.x=r),typeof n.y=="number"&&(n.y=o)),typeof t.scale=="number"&&((c=n.scale)!=null&&c.set?n.scale.set(t.scale):n.scale&&(n.scale.x=t.scale,n.scale.y=t.scale));let s=t.anchor;if(s&&((p=n.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"&&n.anchor.set(d.x,d.y)}}function po(n){if(typeof window=="undefined")return;let e=n==null?void 0:n.objects,t=ua(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 a=new Map;t.forEach(r=>a.set(r,[r])),window.__editableObjectInstances=a,window.refreshEditableConfigIndex=()=>po(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ua((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ua((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,m;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.instanceToScreen)==null?void 0:m[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function Xs(){if(typeof window=="undefined")return;let n=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 a=n(i);if(a)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Xe(),lr))]),p=Date.now(),d=/^(data:|blob:)/.test(a)?a:a+(a.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let m=window.gameObjectManager,h=(o=m==null?void 0:m.get)==null?void 0:o.call(m,t);if(h){let f=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=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 a=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))a.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))a.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))a.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))a.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))a.push({path:`start.${r}`,value:o});a.length&&Ce(a,{silent:!0,persist:!0,emitEvent:!0})}}function Bi(n){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=n;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Ae.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Xs(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=lo(d);co(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let a={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=lo(l);co(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,po(r))}};return a.rebuildIndexes(),a}K();var ho=Ve(require("lottie-web"),1);sn(rn);typeof window!="undefined"&&!window.lottie&&(window.lottie=ho.default);var nt=null,Js=async()=>{if(!nt){let n=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(n==null?void 0:n["handler.config"])||(n==null?void 0:n["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},ma,jt,fo,at,ha,fa;function Zs(n){ma=n.initGame,jt=n.CustomAssets,fo=n.updateScreenState,at=n.globalResponsiveMultipliers,ha=n.layout,fa=n.clearResponsiveElements}var Fi="web_embed",It="https://example.com",uo={profile_id:Fi},_e=null,le=null,ga={width:0,height:0},Qs=!0,el=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let n=await Js();uo={...n.ids||{},profile_id:Fi},It=n.destination_url||((p=(c=n.export_profiles)==null?void 0:c[Fi])==null?void 0:p.destination_url)||It,Oe.init({ids:uo,profile:Fi,destinationUrl:It});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=pa({onDeviceChange:m=>{console.log(`[PREVIEW] Device switched to ${m.width}x${m.height}, restarting game...`),go()},onRefresh:go});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",m=>{var v,x,E,w,S,C,O,B,M,T,I;let h=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=m.detail;if(ga.width=b,ga.height=y,fo(b,y),!(!h||!h.renderer)){f&&s(h,f);try{h.renderer.resize(b,y);let P=h.view;P&&(P.style.width="100%",P.style.height="100%",P.style.display="block")}catch(P){console.warn("[SCREEN] Error resizing renderer:",P);return}if(t&&f&&ha)try{let P=(v=window.__mainContainer)!=null?v:h.stage,D=(O=(C=(w=window.__tutorialLabel)!=null?w:(E=(x=f.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:E.call(x))!=null?C:(S=f.get("label_1"))==null?void 0:S.pixiObject)!=null?O:f.get("label_1"),j=f.get("background_1"),$=(I=(T=(M=window.__background)!=null?M:(B=j==null?void 0:j.getDisplayObject)==null?void 0:B.call(j))!=null?T:j==null?void 0:j.pixiObject)!=null?I:j;if(P){let A=P===h.stage;ha({mainContainer:P,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:h},t,0,ga,f,{skipMainContainerTransform:A})}}catch(P){console.warn("[SCREEN] Error in layout:",P)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=G(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await be("scene.main"));let i=await ma(e,t,It,le);_e=i.app;let a=i.gameObjectManager;window.gameApp=_e,window.gameObjectManager=a;try{window.__liveEditBridge=Bi({getConfig:()=>window.__editableConfig,gameObjectManager:a,assets:jt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(at.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(_e,a);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let E=await x.text();try{return JSON.parse(E)}catch{return null}},m=await g("configs/flow/app.flow.json");if(!m||typeof m!="object")return;let h=m.screens;if(!h||typeof h!="object")return;let f={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let E=await g(x),w=E==null?void 0:E.elements;if(!Array.isArray(w))continue;let S=w.map(C=>C==null?void 0:C.instance_id).filter(C=>typeof C=="string");f[y]=S;for(let C of S)b[C]||(b[C]=y)}window.__HANDLER_APP_FLOW=m,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,m){if(Qs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,E)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let w=x.scale.x||1,S=x.scale.y||1;x.__originalScale||(x.__originalScale={x:w,y:S},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${w.toFixed(3)}, ${S.toFixed(3)}`));let C=x.__originalScale.x*at.scale,O=x.__originalScale.y*at.scale;typeof x.scale.set=="function"?x.scale.set(C,O):(x.scale.x=C,x.scale.y=O),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${w.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),f(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${x.constructor.name})`)})};var h=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){at.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let m=window.gameApp,h=window.gameObjectManager;m&&h?(s(m,h),m.renderer&&(m.renderer.render(m.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!m}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},go=async()=>{var e,t,i,a;console.log("[PREVIEW] Restarting game in 1 seconds...");let n=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(n){let r=((t=n.getDisplayObject)==null?void 0:t.call(n))||n;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((a=r.scale.y)!=null?a:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{fa&&fa()}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()),_e){try{_e.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}_e=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof jt.resetScene=="function"&&jt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),ma(r,s,It).then(l=>{_e=l.app,window.gameApp=_e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Bi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:jt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},mo=1.25,bo={fontFamily:"Inter, system-ui, sans-serif"};var Ui=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=`
|
|
1515
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var g,m,h,f,b,y,v,x;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",w=>{if(this.viewMode==="compare")return;let E=w.target.value;this.setDevice(E)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",w=>{let E=w.target.value;this.setTheme(E)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.viewToggle;E&&this.setViewMode(E)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.layoutToggle;E&&this.setLayoutMode(E)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(m=e.querySelector("#zoom-in-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(f=e.querySelector("#refresh-btn"))==null||f.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.dockTab;if(!E)return;l.forEach(A=>A.classList.remove("active")),w.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(A=>{let M=A.dataset.dockPanel;A.classList.toggle("active",M===E)})})}),(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)),(x=e.querySelector("#corner-grab-btn"))==null||x.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=e.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=e.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(),a=Math.max(0,i.width),r=Math.max(0,i.height);if(a<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=a/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");if(this.layoutMode==="fixed"){let a=this.container.querySelector(".preview-container");a&&(e&&(a.appendChild(e),e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&(a.appendChild(t),t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100"));return}let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t)),e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,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,(a,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=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),a=console.info.bind(console),r=(o,...s)=>{let l=s.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:o,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...o)=>{e(...o),r("log",...o)},console.warn=(...o)=>{t(...o),r("warn",...o)},console.error=(...o)=>{i(...o),r("error",...o)},console.info=(...o)=>{a(...o),r("info",...o)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let a=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(a)}</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 a=this.container.querySelector("#bottom-dock");a==null||a.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 a=this.comparePresets.find(d=>d.id===i);if(!a)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:a,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let 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,a=this.activeCompareId;a&&a!==e&&this.captureCompareSnapshot(a),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale: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`,a=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=a,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),a=Math.max(0,t.clientHeight-24);if(i<=0||a<=0)return;let r=i/e.preset.width,o=a/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let a=t.canvas.getContext("2d");if(!a)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;a.clearRect(0,0,r,o),a.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 pa(n={}){let e=new Ni(n);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ua(n){try{if(n&&typeof n.keys=="function")return Array.from(n.keys())}catch{}return[]}function lo(n){var e;return n?((e=n.getDisplayObject)==null?void 0:e.call(n))||n.pixiObject||n:null}function Ks(n,e){if(!n||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);n.eventMode=i?"static":"none",n.interactive=i,i&&(n.cursor=t.draggable?"move":"pointer")}function co(n,e){var l,c,p;if(!n||!e)return;let t=e.transform||{};Ks(n,e);let i=t.position||{},a=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof a.x=="number"?a.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof a.y=="number"?a.y:0);(l=n.position)!=null&&l.set?n.position.set(r,o):(typeof n.x=="number"&&(n.x=r),typeof n.y=="number"&&(n.y=o)),typeof t.scale=="number"&&((c=n.scale)!=null&&c.set?n.scale.set(t.scale):n.scale&&(n.scale.x=t.scale,n.scale.y=t.scale));let s=t.anchor;if(s&&((p=n.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"&&n.anchor.set(d.x,d.y)}}function po(n){if(typeof window=="undefined")return;let e=n==null?void 0:n.objects,t=ua(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 a=new Map;t.forEach(r=>a.set(r,[r])),window.__editableObjectInstances=a,window.refreshEditableConfigIndex=()=>po(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ua((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ua((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,m;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.instanceToScreen)==null?void 0:m[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function Xs(){if(typeof window=="undefined")return;let n=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 a=n(i);if(a)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Xe(),lr))]),p=Date.now(),d=/^(data:|blob:)/.test(a)?a:a+(a.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let m=window.gameObjectManager,h=(o=m==null?void 0:m.get)==null?void 0:o.call(m,t);if(h){let f=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=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 a=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))a.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))a.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))a.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))a.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))a.push({path:`start.${r}`,value:o});a.length&&Ce(a,{silent:!0,persist:!0,emitEvent:!0})}}function Bi(n){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=n;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Ae.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Xs(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=lo(d);co(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let a={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=lo(l);co(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,po(r))}};return a.rebuildIndexes(),a}K();var ho=Ve(require("lottie-web"),1);sn(rn);typeof window!="undefined"&&!window.lottie&&(window.lottie=ho.default);var nt=null,Js=async()=>{if(!nt){let n=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(n==null?void 0:n["handler.config"])||(n==null?void 0:n["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},ma,jt,fo,at,ha,fa;function Zs(n){ma=n.initGame,jt=n.CustomAssets,fo=n.updateScreenState,at=n.globalResponsiveMultipliers,ha=n.layout,fa=n.clearResponsiveElements}var Fi="web_embed",It="https://example.com",uo={profile_id:Fi},_e=null,le=null,ga={width:0,height:0},Qs=!0,el=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let n=await Js();uo={...n.ids||{},profile_id:Fi},It=n.destination_url||((p=(c=n.export_profiles)==null?void 0:c[Fi])==null?void 0:p.destination_url)||It,Oe.init({ids:uo,profile:Fi,destinationUrl:It});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=pa({onDeviceChange:m=>{console.log(`[PREVIEW] Device switched to ${m.width}x${m.height}, restarting game...`),go()},onRefresh:go});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",m=>{var v,x,w,E,C,A,M,B,P,T,I;let h=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=m.detail;if(ga.width=b,ga.height=y,fo(b,y),!(!h||!h.renderer)){f&&s(h,f);try{h.renderer.resize(b,y);let O=h.view;O&&(O.style.width="100%",O.style.height="100%",O.style.display="block")}catch(O){console.warn("[SCREEN] Error resizing renderer:",O);return}if(t&&f&&ha)try{let O=(v=window.__mainContainer)!=null?v:h.stage,D=(M=(A=(E=window.__tutorialLabel)!=null?E:(w=(x=f.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?A:(C=f.get("label_1"))==null?void 0:C.pixiObject)!=null?M:f.get("label_1"),j=f.get("background_1"),$=(I=(T=(P=window.__background)!=null?P:(B=j==null?void 0:j.getDisplayObject)==null?void 0:B.call(j))!=null?T:j==null?void 0:j.pixiObject)!=null?I:j;if(O){let S=O===h.stage;ha({mainContainer:O,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:h},t,0,ga,f,{skipMainContainerTransform:S})}}catch(O){console.warn("[SCREEN] Error in layout:",O)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=G(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await be("scene.main"));let i=await ma(e,t,It,le);_e=i.app;let a=i.gameObjectManager;window.gameApp=_e,window.gameObjectManager=a;try{window.__liveEditBridge=Bi({getConfig:()=>window.__editableConfig,gameObjectManager:a,assets:jt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(at.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(_e,a);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},m=await g("configs/flow/app.flow.json");if(!m||typeof m!="object")return;let h=m.screens;if(!h||typeof h!="object")return;let f={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),E=w==null?void 0:w.elements;if(!Array.isArray(E))continue;let C=E.map(A=>A==null?void 0:A.instance_id).filter(A=>typeof A=="string");f[y]=C;for(let A of C)b[A]||(b[A]=y)}window.__HANDLER_APP_FLOW=m,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,m){if(Qs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let E=x.scale.x||1,C=x.scale.y||1;x.__originalScale||(x.__originalScale={x:E,y:C},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${E.toFixed(3)}, ${C.toFixed(3)}`));let A=x.__originalScale.x*at.scale,M=x.__originalScale.y*at.scale;typeof x.scale.set=="function"?x.scale.set(A,M):(x.scale.x=A,x.scale.y=M),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${E.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),f(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var h=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){at.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let m=window.gameApp,h=window.gameObjectManager;m&&h?(s(m,h),m.renderer&&(m.renderer.render(m.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!m}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},go=async()=>{var e,t,i,a;console.log("[PREVIEW] Restarting game in 1 seconds...");let n=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(n){let r=((t=n.getDisplayObject)==null?void 0:t.call(n))||n;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((a=r.scale.y)!=null?a:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{fa&&fa()}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()),_e){try{_e.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}_e=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof jt.resetScene=="function"&&jt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),ma(r,s,It).then(l=>{_e=l.app,window.gameApp=_e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Bi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:jt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},mo=1.25,bo={fontFamily:"Inter, system-ui, sans-serif"};var Ui=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=`
|
|
1514
1516
|
position: fixed;
|
|
1515
1517
|
inset: 0;
|
|
1516
1518
|
display: flex;
|
|
@@ -1709,7 +1711,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
1709
1711
|
0%, 100% { opacity: 1; }
|
|
1710
1712
|
50% { opacity: 0.3; }
|
|
1711
1713
|
}
|
|
1712
|
-
`,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 ba=za.version,tl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);$a();var So={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Co=Math.random().toString(36).slice(2),st=null,rt={...So},To="web_embed",wa={},Dt,ya=!1,Rt=!1,zt=!1,Lo=!1,Ca=1,qi=0,Yi=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),Ea=lt>ct,xe=!1,$t=!1,yo=!1,vo=!1,va=!1,Vi=null,Fe=null,Aa=!1,Sa=!1,Gi=new Map;function ko(){if(!Fe)return null;let n=Date.now()-Fe;return!Number.isFinite(n)||n<0?null:n}function xa(n){if(Aa)return;let e=ko();e!==null&&(Aa=!0,L("session_time",{duration_ms:e,reason:n}))}function xo(){if(st)return st;let n=document.createElement("div");return n.id="handler-root",n.setAttribute("data-handler-root","true"),document.body.appendChild(n),st=n,n}function Wi(n){switch(n){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return n}}function _o(n,e){return{event_name:n,ts:Date.now(),session_id:Co,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:To==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function L(n,e){let t=Wi(n),i=_o(t,e);tn(i,!!wa.analytics),Gt(t,i),t!==n&&Gt(n,i)}function Ht(){Vi&&(Vi(lt,ct),Vi=null)}function dt(n){Ca=n,L("volume",n)}function pt(n){n&&(Lo=!0),!zt&&(zt=!0,L("pause"),dt(0))}function Nt(n){!n&&Lo||zt&&(zt=!1,L("resume"),dt(Ca))}function Me(n,e){lt=Math.floor(n||window.innerWidth),ct=Math.floor(e||window.innerHeight),Ea=lt>ct,L("resize",{width:lt,height:ct})}function il(){if(Xa())try{let n=mraid.getMaxSize();Me(n.width,n.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Nt():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(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)}),Yi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht();else{let t=()=>{xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht()};mraid.addEventListener("ready",t)}}catch(n){console.warn("MRAID hook skipped",n)}}function nl(){if(Ja())try{let n=dapi.getScreenSize();Me(n.width,n.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Nt():pt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(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)),Yi=!0,dapi.isViewable())xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht();else{let t=()=>{xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht()};dapi.addEventListener("ready",t)}}catch(n){console.warn("DAPI hook skipped",n)}}function wo(){let n=()=>{xe||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht(),$t&&($t=!1,ie.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Nt(),n()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?n():window.addEventListener("load",n),Yi=!0}function al(){let n=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(yo=!0),!(yo&&e instanceof MouseEvent)&&(qi+=1,Sa||(Sa=!0,L("first_interaction",{count:qi})),L("interaction",qi))};document.addEventListener("mousedown",n),document.addEventListener("touchstart",n)}function Eo(n){var i,a,r,o,s,l,c,p,d,u,g,m;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(n||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ke())(r=(a=window.TJ_API)==null?void 0:a.click)==null||r.call(a);else if(Za())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(ir())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(tr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Qa()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(n||ot||""):n&&window.open(n)}else Ye()?(u=window.install)==null||u.call(window):er()?(g=window.openAppStore)==null||g.call(window):nn()?(m=parent==null?void 0:parent.postMessage)==null||m.call(parent,"download","*"):n&&window.open(n)}function rl(){let n=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(n==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;X("view",()=>e(t.mraid_viewable)),X("start",()=>e(t.game_viewable)),X("engagement",()=>e(t.engagement));let i=()=>e(t.complete);X("complete",i),Ut("engagement",a=>{var r;((r=a==null?void 0:a.payload)==null?void 0:r.count)>3&&i()}),X("cta_click",()=>e(t.click))}else if(n==="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 ol(){if(!Ke())return;let n=window.TJ_API;n&&n.setPlayableAPI&&n.setPlayableAPI({skipAd:()=>{try{ie.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Ao(){var e,t,i;let n=window.TJ_API;(e=n==null?void 0:n.objectiveComplete)==null||e.call(n),(t=n==null?void 0:n.playableFinished)==null||t.call(n),(i=n==null?void 0:n.gameplayFinished)==null||i.call(n)}function sl(){Ye()&&(window.mintGameStart=()=>{Nt(!0),Me()},window.mintGameClose=()=>{pt(!0)})}function ll(){if(!an())return;let n=window.NUC;!n||!n.trigger||(ie.on("cta_click",()=>{var e,t;return(t=(e=n.trigger).convert)==null?void 0:t.call(e,ot)}),ie.on("complete",()=>{var e,t;return(t=(e=n.trigger).tryAgain)==null?void 0:t.call(e)}))}var ie={init(n={},e){var t;if(To=n.profile||"web_embed",wa=n.consent||{},rt={...So,...n.ids||{}},st=n.rootEl||st,Dt=void 0,Ma((t=n.telemetry)!=null&&t.endpoint?n.telemetry:null),Fe=null,Aa=!1,Sa=!1,Gi.clear(),ot=n.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Vi=e),L("init"),document.body.oncontextmenu=()=>!1,xo(),dl(st),nr(),il(),nl(),!Yi){if(document.readyState==="complete")wo();else if(!vo){vo=!0;let i=()=>{wo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}al(),rl(),ol(),sl(),ll(),console.log(`%c @handler/playable-sdk %c v${ba} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),xe&&!ve&&(L("boot"),L("view"),L("ready"),$t&&($t=!1,ie.start()),ve=!0),ve=xe},getRoot(){return xo()},get version(){return ba},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return Ea},get isReady(){return ve},get isStarted(){return ya},get isPaused(){return zt},get isFinished(){return Rt},get volume(){return Ca},get interactions(){return qi},on(n,e){Ut(Wi(n),e)},off(n,e){en(Wi(n),e)},start(){var n,e;if(!ya){if(!xe){$t=!0;return}if(ya=!0,Fe||(Fe=Date.now()),L("start"),Me(),Ye())pt(),(n=window.gameReady)==null||n.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ea?"landscape":"portrait",buildID:ba})}}},finish(){var n,e;Rt||(Rt=!0,L("complete"),xa("complete"),Ye()?(n=window.gameEnd)==null||n.call(window):nn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&Ao())},install(n){if(!Rt){Rt=!0,Ke()?(Ao(),setTimeout(()=>ie.install(n),300)):(L("complete"),setTimeout(()=>ie.install(n),0));return}va||(va=!0,setTimeout(()=>va=!1,500),L("cta_click"),L("conversion"),xa("cta"),Eo(n||ot))},emit(n,e){let t=Wi(n);if(!tl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${n} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=_o(t,e);tn(i,!!wa.analytics),Gt(t,i)},gameStart(){ie.start()},gameEnd(){ie.finish()},ctaClick(n,e){L("cta_click",{url:n||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&Eo(n||ot)},ctaShow(n){L("cta_show",n)},ctaDismiss(n){L("cta_dismiss",n)},getGameTimeMs(){return ko()},endSession(n="manual"){xa(n)},setAttribution(n){Dt=n},abTest(n,e){if(!n)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(cl(`${Co}:${n}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:n},rt.variant_id=i,L("ab_assign",{experiment_id:n,variant_id:i}),i},levelStart(n,e){Fe||(Fe=Date.now()),L("level_start",{level_id:n,...e})},levelComplete(n,e){L("level_complete",{level_id:n,...e})},levelFail(n,e){L("level_fail",{level_id:n,...e})},checkpoint(n,e){L("checkpoint",{checkpoint_id:n,...e})},reward(n,e){L("reward",{reward_id:n,...e})},tutorialStart(n,e){L("tutorial_start",{step_id:n,...e})},tutorialComplete(n,e){L("tutorial_complete",{step_id:n,...e})},tutorialSkip(n,e){L("tutorial_skip",{step_id:n,...e})},timerStart(n){n&&Gi.set(n,Date.now())},timerEnd(n,e="custom",t){if(!n)return;let i=Gi.get(n);if(!i)return;Gi.delete(n);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){L("engagement",{action:"timer",key:n,duration_ms:a,...t});return}L(e,{key:n,duration_ms:a,...t})}},fps(n,e){L("fps",{value:n,...e})},memory(n,e){L("memory",{bytes:n,...e})},assetLoadStart(n,e){L("asset_load_start",{asset_id:n,...e})},assetLoadComplete(n,e){L("asset_load_complete",{asset_id:n,...e})},reportError(n,e,t){L("error",{code:n,message:e,...t})},retry(){var n,e,t;if(Ye())(n=window.gameRetry)==null||n.call(window);else if(an()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}L("engagement",{action:"retry"})},pause(){pt(!0)},resume(){Nt(!0)},resize(n,e){Me(n,e)}},Oe=ie;function cl(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function dl(n){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
1714
|
+
`,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 ba=za.version,tl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);$a();var So={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Co=Math.random().toString(36).slice(2),st=null,rt={...So},To="web_embed",wa={},Dt,ya=!1,Rt=!1,zt=!1,Lo=!1,Ca=1,qi=0,Yi=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),Ea=lt>ct,xe=!1,$t=!1,yo=!1,vo=!1,va=!1,Vi=null,Fe=null,Aa=!1,Sa=!1,Gi=new Map;function ko(){if(!Fe)return null;let n=Date.now()-Fe;return!Number.isFinite(n)||n<0?null:n}function xa(n){if(Aa)return;let e=ko();e!==null&&(Aa=!0,L("session_time",{duration_ms:e,reason:n}))}function xo(){if(st)return st;let n=document.createElement("div");return n.id="handler-root",n.setAttribute("data-handler-root","true"),document.body.appendChild(n),st=n,n}function Wi(n){switch(n){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return n}}function _o(n,e){return{event_name:n,ts:Date.now(),session_id:Co,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:To==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function L(n,e){let t=Wi(n),i=_o(t,e);tn(i,!!wa.analytics),Gt(t,i),t!==n&&Gt(n,i)}function Ht(){Vi&&(Vi(lt,ct),Vi=null)}function dt(n){Ca=n,L("volume",n)}function pt(n){n&&(Lo=!0),!zt&&(zt=!0,L("pause"),dt(0))}function Nt(n){!n&&Lo||zt&&(zt=!1,L("resume"),dt(Ca))}function Pe(n,e){lt=Math.floor(n||window.innerWidth),ct=Math.floor(e||window.innerHeight),Ea=lt>ct,L("resize",{width:lt,height:ct})}function il(){if(Xa())try{let n=mraid.getMaxSize();Pe(n.width,n.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Nt():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Pe(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();dt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&dt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Yi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht();else{let t=()=>{xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht()};mraid.addEventListener("ready",t)}}catch(n){console.warn("MRAID hook skipped",n)}}function nl(){if(Ja())try{let n=dapi.getScreenSize();Pe(n.width,n.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Nt():pt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Pe(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)),Yi=!0,dapi.isViewable())xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht();else{let t=()=>{xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht()};dapi.addEventListener("ready",t)}}catch(n){console.warn("DAPI hook skipped",n)}}function wo(){let n=()=>{xe||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(xe=!0,L("boot"),L("view"),L("ready"),ve=!0,Ht(),$t&&($t=!1,ie.start()))};window.addEventListener("resize",()=>Pe()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Nt(),n()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?n():window.addEventListener("load",n),Yi=!0}function al(){let n=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(yo=!0),!(yo&&e instanceof MouseEvent)&&(qi+=1,Sa||(Sa=!0,L("first_interaction",{count:qi})),L("interaction",qi))};document.addEventListener("mousedown",n),document.addEventListener("touchstart",n)}function Eo(n){var i,a,r,o,s,l,c,p,d,u,g,m;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(n||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ke())(r=(a=window.TJ_API)==null?void 0:a.click)==null||r.call(a);else if(Za())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(ir())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(tr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Qa()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(n||ot||""):n&&window.open(n)}else Ye()?(u=window.install)==null||u.call(window):er()?(g=window.openAppStore)==null||g.call(window):nn()?(m=parent==null?void 0:parent.postMessage)==null||m.call(parent,"download","*"):n&&window.open(n)}function rl(){let n=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(n==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;X("view",()=>e(t.mraid_viewable)),X("start",()=>e(t.game_viewable)),X("engagement",()=>e(t.engagement));let i=()=>e(t.complete);X("complete",i),Ut("engagement",a=>{var r;((r=a==null?void 0:a.payload)==null?void 0:r.count)>3&&i()}),X("cta_click",()=>e(t.click))}else if(n==="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 ol(){if(!Ke())return;let n=window.TJ_API;n&&n.setPlayableAPI&&n.setPlayableAPI({skipAd:()=>{try{ie.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Ao(){var e,t,i;let n=window.TJ_API;(e=n==null?void 0:n.objectiveComplete)==null||e.call(n),(t=n==null?void 0:n.playableFinished)==null||t.call(n),(i=n==null?void 0:n.gameplayFinished)==null||i.call(n)}function sl(){Ye()&&(window.mintGameStart=()=>{Nt(!0),Pe()},window.mintGameClose=()=>{pt(!0)})}function ll(){if(!an())return;let n=window.NUC;!n||!n.trigger||(ie.on("cta_click",()=>{var e,t;return(t=(e=n.trigger).convert)==null?void 0:t.call(e,ot)}),ie.on("complete",()=>{var e,t;return(t=(e=n.trigger).tryAgain)==null?void 0:t.call(e)}))}var ie={init(n={},e){var t;if(To=n.profile||"web_embed",wa=n.consent||{},rt={...So,...n.ids||{}},st=n.rootEl||st,Dt=void 0,Pa((t=n.telemetry)!=null&&t.endpoint?n.telemetry:null),Fe=null,Aa=!1,Sa=!1,Gi.clear(),ot=n.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Vi=e),L("init"),document.body.oncontextmenu=()=>!1,xo(),dl(st),nr(),il(),nl(),!Yi){if(document.readyState==="complete")wo();else if(!vo){vo=!0;let i=()=>{wo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}al(),rl(),ol(),sl(),ll(),console.log(`%c @handler/playable-sdk %c v${ba} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),xe&&!ve&&(L("boot"),L("view"),L("ready"),$t&&($t=!1,ie.start()),ve=!0),ve=xe},getRoot(){return xo()},get version(){return ba},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return Ea},get isReady(){return ve},get isStarted(){return ya},get isPaused(){return zt},get isFinished(){return Rt},get volume(){return Ca},get interactions(){return qi},on(n,e){Ut(Wi(n),e)},off(n,e){en(Wi(n),e)},start(){var n,e;if(!ya){if(!xe){$t=!0;return}if(ya=!0,Fe||(Fe=Date.now()),L("start"),Pe(),Ye())pt(),(n=window.gameReady)==null||n.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ea?"landscape":"portrait",buildID:ba})}}},finish(){var n,e;Rt||(Rt=!0,L("complete"),xa("complete"),Ye()?(n=window.gameEnd)==null||n.call(window):nn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&Ao())},install(n){if(!Rt){Rt=!0,Ke()?(Ao(),setTimeout(()=>ie.install(n),300)):(L("complete"),setTimeout(()=>ie.install(n),0));return}va||(va=!0,setTimeout(()=>va=!1,500),L("cta_click"),L("conversion"),xa("cta"),Eo(n||ot))},emit(n,e){let t=Wi(n);if(!tl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${n} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=_o(t,e);tn(i,!!wa.analytics),Gt(t,i)},gameStart(){ie.start()},gameEnd(){ie.finish()},ctaClick(n,e){L("cta_click",{url:n||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&Eo(n||ot)},ctaShow(n){L("cta_show",n)},ctaDismiss(n){L("cta_dismiss",n)},getGameTimeMs(){return ko()},endSession(n="manual"){xa(n)},setAttribution(n){Dt=n},abTest(n,e){if(!n)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(cl(`${Co}:${n}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:n},rt.variant_id=i,L("ab_assign",{experiment_id:n,variant_id:i}),i},levelStart(n,e){Fe||(Fe=Date.now()),L("level_start",{level_id:n,...e})},levelComplete(n,e){L("level_complete",{level_id:n,...e})},levelFail(n,e){L("level_fail",{level_id:n,...e})},checkpoint(n,e){L("checkpoint",{checkpoint_id:n,...e})},reward(n,e){L("reward",{reward_id:n,...e})},tutorialStart(n,e){L("tutorial_start",{step_id:n,...e})},tutorialComplete(n,e){L("tutorial_complete",{step_id:n,...e})},tutorialSkip(n,e){L("tutorial_skip",{step_id:n,...e})},timerStart(n){n&&Gi.set(n,Date.now())},timerEnd(n,e="custom",t){if(!n)return;let i=Gi.get(n);if(!i)return;Gi.delete(n);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){L("engagement",{action:"timer",key:n,duration_ms:a,...t});return}L(e,{key:n,duration_ms:a,...t})}},fps(n,e){L("fps",{value:n,...e})},memory(n,e){L("memory",{bytes:n,...e})},assetLoadStart(n,e){L("asset_load_start",{asset_id:n,...e})},assetLoadComplete(n,e){L("asset_load_complete",{asset_id:n,...e})},reportError(n,e,t){L("error",{code:n,message:e,...t})},retry(){var n,e,t;if(Ye())(n=window.gameRetry)==null||n.call(window);else if(an()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}L("engagement",{action:"retry"})},pause(){pt(!0)},resume(){Nt(!0)},resize(n,e){Pe(n,e)}},Oe=ie;function cl(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function dl(n){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
1713
1715
|
(function(){
|
|
1714
1716
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
1715
1717
|
function unlock(){
|