handler-playable-sdk 0.5.556 → 0.5.558
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-DABHJLJI.js → chunk-ANXMNGMU.js} +90 -56
- 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 +85 -51
- package/dist/index.css +21 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +8 -8
- package/dist/pixi/index.css +21 -0
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +21 -21
- package/dist/three/index.css +21 -0
- 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 Qr=Object.create;var Qt=Object.defineProperty;var eo=Object.getOwnPropertyDescriptor;var to=Object.getOwnPropertyNames;var io=Object.getPrototypeOf,no=Object.prototype.hasOwnProperty;var be=(s,e)=>()=>(s&&(e=s(s=0)),e);var Et=(s,e)=>{for(var t in e)Qt(s,t,{get:e[t],enumerable:!0})},Ya=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of to(e))!no.call(s,n)&&n!==t&&Qt(s,n,{get:()=>e[n],enumerable:!(i=eo(e,n))||i.enumerable});return s};var tt=(s,e,t)=>(t=s!=null?Qr(io(s)):{},Ya(e||!s||!s.__esModule?Qt(t,"default",{value:s,enumerable:!0}):t,s)),ao=s=>Ya(Qt({},"__esModule",{value:!0}),s);var ye,Ln=be(()=>{"use strict";ye=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()}};ye.store=new Map});function go(){var s,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(s=document.querySelector("script"))==null?void 0:s.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function ho(){try{if(typeof window!="undefined"){let s=await fetch("./build-settings.json");if(s.ok){let e=await s.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function fo(){try{if(typeof window!="undefined"){let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function mo(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${U}`),Object.keys(ve).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ve)),ve;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ve={...window.INLINE_ASSETS},ve;if(!(U==="publish"&&ce!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ve;if(!kn){let e=typeof window!="undefined"?new URL("inline-assets.js",window.location.href).href:"./inline-assets.js";console.log("[AssetLoader] Loading inline assets from:",e),kn=(async()=>{try{try{let a=await import(e+"?t="+Date.now());if(a.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(a.INLINE_ASSETS)),a.INLINE_ASSETS}catch(a){console.warn("[AssetLoader] ES module import failed, trying text parse:",a)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let a=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let r=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(r)),r}catch(a){return console.warn("[AssetLoader] Failed to parse inline assets:",a),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ve=await kn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ve)),ve}function Pn(s){return s===null||typeof s!="object"||(Object.freeze(s),Object.values(s).forEach(e=>Pn(e))),s}function bo(s=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=s,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,s,e),n.strokeStyle="#000",n.strokeRect(0,0,s,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",s/2,e/2),we.Texture.from(i)}function In(s,e){Ls.set(s,e)}var we,As,Ts,Ne,U,ce,Pe,ve,kn,Ls,Fe,ni=be(()=>{"use strict";we=require("pixi.js");Ln();As=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ts=go(),Ne=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,U=Ts?"publish":As,ce=Ne==null?void 0:Ne.assetsInlined;Ne!=null&&Ne.buildMode&&(U=Ne.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${U}`));Pe=fo();Pe!=null&&Pe.buildMode&&(U=Pe.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${U}`));(Pe==null?void 0:Pe.assetsInlined)!==void 0&&(ce=Pe.assetsInlined);ho().then(s=>{s!=null&&s.buildMode&&s.buildMode!==U&&(U=s.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${U}`)),(s==null?void 0:s.assetsInlined)!==void 0&&(ce=s.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${As}, Runtime: ${Ts?"publish":"dev"}, Effective: ${U}`);ve={},kn=null;Ls=new Map;Fe=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,r=ye.get(a);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${U}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let o=await mo(),l=o[e];if(!l&&n&&(l=o[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let p=t.path.split("/");if(p.length>=2){let u=p[p.length-1].split(".")[0];o[u]&&(l=o[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),U==="publish"&&ce!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let d=Ls.get(t.type);if(d)try{let p=await d(t.path,l,e,i);return ye.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}try{let p;switch(t.type){case"image":p=await this.loadImage(t.path,l);break;case"json":p=await this.loadJSON(t.path,l),p=Pn(p);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return ye.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}}static async loadImage(e,t){let i=U==="publish",n=i&&ce!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${U}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await we.Assets.load(t)}catch(a){throw console.error("[AssetLoader] Failed to load texture from data URI:",a),a}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await we.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await we.Assets.load(e)}return await we.Assets.load(e)}static async loadJSON(e,t){let i=U==="publish",n=i&&ce!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${U}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}let a=await fetch(e);if(!a.ok)throw new Error(`JSON fetch failed: ${e}`);return a.json()}static handleFailure(e,t,i){if(U==="dev"){let a=t==="image"?bo():Pn({__placeholder:!0,type:t});return ye.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};In("image",async(s,e)=>{let t=U==="publish",i=t&&ce!==!1,n=U==="brand",a=t&&ce===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${U}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${s}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return we.Assets.load(e)}let r=s;return(n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),we.Assets.load(e||r)});In("json",async(s,e)=>{let t=U==="publish",i=t&&ce!==!1,n=U==="brand",a=t&&ce===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${U}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${s}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let r=s;if((n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let o=await fetch(r);if(!o.ok)throw new Error(`JSON fetch failed: ${s}`);return o.json()})});var Ps={};Et(Ps,{AssetTextures:()=>pe,initAssetTextures:()=>_n});function _n(s,e){ks.init(s,e),typeof window!="undefined"&&(window.__AssetTextures=pe)}var Mn,ks,pe,st=be(()=>{"use strict";ni();Mn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var r;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],a=[];for(let[o,l]of e.objects.entries()){let c=(r=l.render)==null?void 0:r.asset;if(!c)continue;let d=async()=>{var p;try{let u=(p=l.identity)==null?void 0:p.id;console.log(`[AssetTextures] Loading ${c.type}: ${o} (${u})`);let g=await Fe.load(o,c,t,u);this.textures.set(o,g),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,u)}finally{this.attempted.add(o);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(o)?n.push(d()):a.push(d())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(a),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(o=>typeof o=="string"&&o))).filter(o=>{var l,c,d,p;try{let u=(d=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:d.call(c,o);return!!((p=u==null?void 0:u.render)!=null&&p.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let a=()=>n.every(o=>this.textures.has(o)||this.attempted.has(o));if(a())return;let r=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(o=>{let l=!1,c=()=>{l||a()&&(l=!0,this.waiters.delete(c),o())};this.waiters.add(c),c(),r>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),o())},r)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},ks=new Mn,pe=new Proxy(ks,{get(s,e){return e in s&&typeof s[e]=="function"?s[e].bind(s):s.get(e)},set(s,e,t){return s.set(e,t),!0}})});var Ge={};Et(Ge,{applyConfigOverride:()=>ne,applyConfigOverrides:()=>Ie,applyConfigsToDisk:()=>mi,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,deepClone:()=>Y,exportConfigsAsJSON:()=>Ue,getConfigOverrides:()=>Z,getConfigStateSummary:()=>je,getOverrideMode:()=>jt,redoLastConfigChange:()=>fi,removeConfigOverride:()=>Mt,resetToApplied:()=>_t,resetToOriginal:()=>bi,setOverrideMode:()=>Fn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Hs,undoLastConfigChange:()=>hi});function pi(){return typeof window=="undefined"?null:window.__editableConfig||null}function Dn(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function $n(s,e){var t,i;if(!s)return null;try{if(s instanceof Map)return(t=s.get(e))!=null?t:null;if(typeof s=="object")return(i=s[e])!=null?i:null}catch{}return null}function Uo(s,e,t){if(s){if(s instanceof Map){s.set(e,t);return}typeof s=="object"&&(s[e]=t)}}function _s(s,e){for(let t of e)It(s,t.path,t.value)}function ui(s){var o;if(typeof window=="undefined")return;let e=pi();if(!e)return;let t=Dn(),i=(o=t?$n(t.objects,s):null)!=null?o:$n(e.objects,s);if(!i)return;let n=Y(i),a=Z().filter(l=>l.objectId===s);try{_s(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",s,l);return}Uo(e.objects,s,n);let r=window.applyEditableObjectConfig;if(typeof r=="function")try{r(s,n)}catch{}}function Hn(){var n;if(typeof window=="undefined")return;let s=pi();if(!(s!=null&&s.engine))return;let e=Dn(),t=Y(((n=e==null?void 0:e.engine)!=null?n:s.engine)||{}),i=Z().filter(a=>!a.objectId&&!a.sceneId);try{_s(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=s.engine;for(let r of Object.keys(a))r in t||delete a[r];for(let[r,o]of Object.entries(t))a[r]=o}catch{s.engine=t}}function Go(){if(typeof window=="undefined")return"unknown";let s=window;return typeof s.__HANDLER_PROJECT_ID=="string"?s.__HANDLER_PROJECT_ID:"handler-default"}function Os(){return`handler_preview_config_overrides::${Go()}`}function qo(){if(typeof window=="undefined")return[];try{let s=window.localStorage.getItem(Os());if(!s)return[];let e=JSON.parse(s);return Array.isArray(e)?e:[]}catch{return[]}}function gi(s){if(typeof window!="undefined")try{window.localStorage.setItem(Os(),JSON.stringify(s))}catch{}}function jt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Fn(s){if(typeof window!="undefined"){window.__enableConfigOverrides=s;try{window.localStorage.setItem(Rs,s?"true":"false")}catch{}}}function ne(s,e={}){var u,g;let{objectId:t,path:i,value:n}=s,{silent:a=!1,persist:r=!0,emitEvent:o=!0}=e,l=pi();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}a||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let d;try{d=Ns(c,i),It(c,i,n)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},h);return}if(e.trackHistory!==!1){window.__configChanges=window.__configChanges||[];let h=window.__configChanges;h.push({objectId:t,path:i,oldValue:d,newValue:n,ts:Date.now()}),h.length>Nn&&h.shift(),window.__configChangeRedo=[]}if(r){let h=Z(),f=h.findIndex(m=>m.objectId===t&&m.sceneId===s.sceneId&&m.path===i);f>=0?h[f].value=n:h.push(s),window.__configOverrides=h,gi(h),jt()||Fn(!0)}a||console.log("[CONFIG] Applied override:",s),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:s}))}function Ie(s,e={}){let t=e.emitEvent!==!1,i=[];for(let n of s)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),ne(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:s.length}}))}}function ae(){window.__configOverrides=[],window.__configChanges=[],window.__configChangeRedo=[],gi([]),console.log("[CONFIG] Cleared all overrides")}function zs(s){let e=Z().filter(i=>i.objectId!==s);window.__configOverrides=e,gi(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==s),ui(s),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:s}}))}function Mt(s,e){let t=Z().filter(n=>n.objectId!==s||n.path!==e);window.__configOverrides=t,gi(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==s||n.path!==e),s?ui(s):Hn(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:s,path:e}}))}function Z(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=qo()),window.__configOverrides||[])}function hi(){var a;if(typeof window=="undefined")return!1;let s=window.__configChanges||[];if(s.length===0)return!1;let e=s.pop();window.__configChangeRedo=window.__configChangeRedo||[];let t=window.__configChangeRedo;if(e.changeType==="object_create"){let{screenId:r}=e.metadata||{};return e.objectId&&r&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:r})}).catch(o=>console.error("[CONFIG] Failed to delete object on undo:",o)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Deleted object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:r,objectConfigId:o}=e.metadata||{},l=e.oldValue;return e.objectId&&r&&l&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:r,instanceId:e.objectId,objectConfigId:o||((a=l==null?void 0:l.identity)==null?void 0:a.id),config:l})}).catch(c=>console.error("[CONFIG] Failed to recreate object on undo:",c)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Recreated object",e.objectId),!0}t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType});let i=Dn(),n=!1;if(i){let r=e.objectId?$n(i.objects,e.objectId):i.engine;if(r){let o=Ns(r,e.path);JSON.stringify(o)===JSON.stringify(e.oldValue)&&(n=!0)}}return n?Mt(e.objectId,e.path):(ne({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ui(e.objectId):Hn()),console.log("[CONFIG] Undo:",e.path),!0}function fi(){var i;if(typeof window=="undefined")return!1;let s=window.__configChangeRedo||[];if(s.length===0)return!1;let e=s.pop();if(e.changeType==="object_create"){let{screenId:n,objectConfigId:a}=e.metadata||{},r=e.newValue;return e.objectId&&n&&r&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:n,instanceId:e.objectId,objectConfigId:a||((i=r==null?void 0:r.identity)==null?void 0:i.id),config:r})}).catch(l=>console.error("[CONFIG] Failed to recreate object on redo:",l)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Recreated object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:n}=e.metadata||{};return e.objectId&&n&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:n})}).catch(r=>console.error("[CONFIG] Failed to delete object on redo:",r)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Deleted object",e.objectId),!0}return window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType}),ne({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ui(e.objectId):Hn(),console.log("[CONFIG] Redo:",e.path),!0}function Ds(s,e,t){var n;if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_create__",oldValue:null,newValue:t,ts:Date.now(),changeType:"object_create",metadata:{screenId:e,objectConfigId:(n=t==null?void 0:t.identity)==null?void 0:n.id}}),window.__configChangeRedo=[],i.length>Nn&&i.shift(),console.log("[CONFIG] Tracked object creation:",s)}function Hs(s,e,t){if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_delete__",oldValue:t,newValue:null,ts:Date.now(),changeType:"object_delete",metadata:{screenId:e}}),window.__configChangeRedo=[],i.length>Nn&&i.shift(),console.log("[CONFIG] Tracked object deletion:",s)}function It(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i){if(a[o]!==void 0&&typeof a[o]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${o})`);a[o]=(r=a[o])!=null?r:{},a=a[o]}a[n]=t}function Ns(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Y(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(s instanceof Set)return new Set([...s].map(t=>Y(t)));if(ArrayBuffer.isView(s))return s.slice();if(s instanceof Array)return s.map(t=>Y(t));if(s instanceof Map){let t=new Map;return s.forEach((i,n)=>t.set(n,Y(i))),t}let e={};for(let t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=Y(s[t]));return e}function Ue(){let s=window.__editableConfigBaseline;if(!s){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return Ms(e)}return Ms(s)}function Ms(s){let e={objects:{},scenes:{},engine:Y(s.engine||{})},t=s.objects;if(t instanceof Map)t.forEach((a,r)=>{e.objects[r]=Y(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=Y(t[a]);let i=s.scenes;if(i instanceof Map)i.forEach((a,r)=>{e.scenes[r]=Y(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=Y(i[a]);let n=Z();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),It(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),It(e.scenes[a.sceneId],a.path,a.value)):It(e.engine,a.path,a.value);return e}function je(){let s=Z(),e=new Set;for(let t of s)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:s.length,hasChanges:s.length>0,overrides:s}}async function mi(s){let e=Ue(),t={};for(let[n,a]of Object.entries(e.objects)){let r=a,o=n;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${n}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=o),t[`objects/${o}.json`]=r}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,a]of Object.entries(e.scenes)){let r=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${r}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Z().length>0,versionName:s})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ae();try{let n=pi();n&&(window.__editableConfigBaseline=Y(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function _t(){ae(),window.location.reload()}async function bi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}ae(),window.location.reload()}var Rs,Nn,$s,K=be(()=>{"use strict";Rs="handler_preview_override_mode";if(typeof window!="undefined"){let s=window.localStorage.getItem(Rs);window.__enableConfigOverrides=s===null?!0:s==="true"}Nn=500;$s={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[],window.__configChangeRedo=[]}}});function Vo(s,e){try{if(typeof s=="object"&&s!==null)return s;if(typeof s!="string")return null;if(s.startsWith("data:")){let i=s.indexOf(",");if(i===-1)return null;let n=s.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=s.slice(i+1),r=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(r)}let t=s.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(s):null}catch{return null}}function Wo(s){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=s.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let r=e[a];if(r){let o=Vo(r,a);if(o!==null)return o}}return null}async function Ot(s){if(Bn.has(s)&&!Un)return console.log(`[CONFIG] Using cached config for: "${s}"`),Bn.get(s);if(console.log(`[CONFIG] loadConfigFile called with: "${s}", MODE: ${B.toUpperCase()}, CACHE: ${Un?"DISABLED":"ENABLED"}`),B==="publish"){let i=Wo(s);return i?(console.log(`[CONFIG] \u2713 Loaded ${s} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${s} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}B==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${s}"`);let e;B==="brand"?e=[`./${s.split("/").pop()||s}`,`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=Un?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let r=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${s} via ${n}`,r),r}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${B}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${s}; using defaults`),{}})();return Bn.set(s,t),t}async function yi(){console.log("[CONFIG] Loading component schemas...");let s=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of s)try{let i=B==="publish"||B==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await Ot(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${B==="publish"||B==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Me(s){console.log(`[CONFIG] Loading object config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/objects/${s}.json`;return await Ot(e)}async function vi(s){let e=new Map;if(s.objects&&Array.isArray(s.objects)){for(let t of s.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Me(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Me(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Me(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function wi(){console.log("[CONFIG] Loading engine configs...");let s=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(s.map(i=>{let n=`engine.${i}.json`,a=B==="publish"||B==="brand"?n:`configs/engine/${n}`;return Ot(a)})),t=Object.fromEntries(s.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(s.map(i=>{var r;let n=(r=t[i])!=null?r:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function Gn(){return await Ot(B==="publish"||B==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function xi(s="scene.main"){console.log(`[CONFIG] Loading scene config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/scenes/${s}.json`;return await Ot(e)}function ot(s,e){let t=[];if(!s.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])s.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(s)){if(n==="identity")continue;let r=e.get(n);if(r&&a&&typeof a=="object"){let o=a;for(let l of r.required||[])o[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(r.constraints&&typeof r.constraints=="object")for(let[l,c]of Object.entries(r.constraints)){let d=o[l];if(d!==void 0&&c&&typeof c=="object"){let p=c;typeof d=="number"&&(p.min!==void 0&&d<p.min&&t.push(`${n}.${l} value ${d} is below minimum ${p.min}`),p.max!==void 0&&d>p.max&&t.push(`${n}.${l} value ${d} is above maximum ${p.max}`))}}}}return{valid:t.length===0,errors:t}}function qe(s,e){let t={...s},i=["identity","transform","render"];for(let[n,a]of e.entries())a.defaults&&Object.keys(a.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...a.defaults,...t[n]});return t}function se(s,e,t,i){return typeof s!="number"||!Number.isFinite(s)?e:Math.min(Math.max(s,t),i)}function Bs(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,-2e3,2e3),y:se(s[1],e.y,-2e3,2e3)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,-2e3,2e3),y:se(i,e.y,-2e3,2e3)}}function Yo(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,0,1),y:se(s[1],e.y,0,1)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,0,1),y:se(i,e.y,0,1)}}function Ko(s){if(Array.isArray(s))return{x:se(s[0],.5,-10,10),y:se(s[1],.5,-10,10)};if(s&&typeof s=="object"){let{x:e,y:t}=s;return{x:se(e,.5,-10,10),y:se(t,.5,-10,10)}}return typeof s=="string"?s:null}async function Ce(s="scene.main",e){var l,c,d,p,u,g,h,f,m,b,y,v,w,E;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await yi(),i=Z();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await xi(s);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await wi();console.log("[CONFIG] Loading object configs...");let r=await vi(n);console.log(`[CONFIG] Loaded ${r.size} object configs:`,Array.from(r.keys()));for(let[k,j]of r.entries()){let x=qe(j,t),M=ot(x,t);M.valid||console.warn(`Object ${k} validation errors:`,M.errors),(c=x.transform)!=null&&c.position&&(x.transform.position=Bs(x.transform.position,{x:0,y:0})),(d=x.transform)!=null&&d.offset&&(x.transform.offset=Bs(x.transform.offset,{x:0,y:0})),((p=x.transform)==null?void 0:p.anchor)!==void 0&&(x.transform.anchor=Ko(x.transform.anchor)),((u=x.transform)==null?void 0:u.position_ratio)!==void 0&&x.transform.position_ratio!==null&&(x.transform.position_ratio=Yo(x.transform.position_ratio,{x:.5,y:.5})),r.set(k,x)}if(e){if(e.objects)for(let[k,j]of e.objects.entries())r.set(k,j);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let o={objects:r,engine:a,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=qe(o,t))),i.length>0&&jt()&&Ie(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(r.keys()),engine:{runtime:Object.keys((f=a.runtime)!=null?f:{}),assets:Object.keys((m=a.assets)!=null?m:{}),splash:Object.keys((b=a.splash)!=null?b:{}),loading:Object.keys((y=a.loading)!=null?y:{}),start:Object.keys((v=a.start)!=null?v:{}),tutorial:Object.keys((w=a.tutorial)!=null?w:{}),endgame:Object.keys((E=a.endgame)!=null?E:{})},scene:n.scene_id||"unknown"}),o}function qn(s){var t,i,n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,j,x,M,O,T,A,_,P,C,S,I,L;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[R,z]of s.objects.entries()){let N=((t=z.identity)==null?void 0:t.id)||R;N.includes("character")&&(e.gameplay.character_pos=((i=z.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=z.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((r=(a=z.gameplay)==null?void 0:a.tuning)==null?void 0:r.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=z.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((d=(c=z.gameplay)==null?void 0:c.tuning)==null?void 0:d.relief_speed)||.22),(N.includes("gun")||N.includes("flame"))&&(e.gameplay.gun=z.gun||{},e.gameplay.gunmuzzle=((p=z.effects)==null?void 0:p.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=z.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=z.effects)==null?void 0:g.flame)||{}),N.includes("diamond")&&(e.gameplay.diamond=z),N.includes("ice")&&(e.gameplay.melt=z.melt||{},e.gameplay.melt_anchor=((h=z.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((f=z.transform)==null?void 0:f.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=z.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=z.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=z.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=z.hard_ice||{}),N.includes("water")&&(e.gameplay.water_drops=z),N.includes("crack")&&(e.gameplay.crack=z),N.includes("hand")&&(e.gameplay.hand=((v=z.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=z.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=z.transform)==null?void 0:E.scale)||1.5),N.includes("hazard")&&(e.gameplay.hazard=((k=z.gameplay)==null?void 0:k.tuning)||{},e.gameplay.danger_pos=((j=z.transform)==null?void 0:j.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((M=(x=z.gameplay)==null?void 0:x.tuning)==null?void 0:M.danger_pulse)||{},e.gameplay.hazard_height=((T=(O=z.gameplay)==null?void 0:O.tuning)==null?void 0:T.hazard_height)||140)}return e.gameplay.timeline=((A=s.engine.runtime)==null?void 0:A.timeline)||{},e.gameplay.drag_surface=((_=s.engine.runtime)==null?void 0:_.drag_surface)||{},e.gameplay.background=((P=s.engine.runtime)==null?void 0:P.background)||{},e.gameplay.ui_styles=((C=s.engine.runtime)==null?void 0:C.ui_styles)||{},e.gameplay.label_pulse=((S=s.engine.runtime)==null?void 0:S.label_pulse)||{},e.ui=((I=s.engine.runtime)==null?void 0:I.ui)||{},e.theme=((L=s.engine.runtime)==null?void 0:L.theme)||{},e.assets=s.engine.assets||{},e}var Fs,B,Bn,Un,Vn=be(()=>{"use strict";K();Fs=null,B="dev";if(typeof window!="undefined"){let s=window.__BUILD_SETTINGS__;if(s!=null&&s.buildMode)Fs=s,B=s.buildMode,console.log("[CONFIG] Loaded inline build settings:",s,"buildMode:",B);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Fs=t,B=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",B)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",B)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",B);Bn=new Map,Un=B==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Wn(s,e){let t=[];function i(n,a,r=""){if(n!==a){if(typeof n!=typeof a){t.push(`${r}: type changed`);return}if(typeof n=="object"&&n!==null&&a!==null){let o=new Set([...Object.keys(n),...Object.keys(a)]);for(let l of o){let c=r?`${r}.${l}`:l;l in n?l in a?i(n[l],a[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${r}: changed`)}}return i(s,e),t}function Yn(s,e,t,i){let n={...t};for(let[a,r]of i.entries())n[a]&&r.defaults&&(n[a]={...r.defaults,...n[a]});return n}var Rt,Ve,Kn=be(()=>{"use strict";Rt=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},Ve=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let a=await n.text(),r=this.hashString(a),o=this.fileHashes.get(e);if(o&&o!==r&&console.log(`[HOT-RELOAD] File changed: ${e}`),o&&o!==r){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,r)}else o||this.fileHashes.set(e,r)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function Jn(s){if(typeof window=="undefined")return;let e=typeof Xn!="undefined"&&!!Xn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,r=null;if(t){r=new Ve;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=r}let o=new Set,l=h=>{var b,y;if(!r)return;let f=new Set;f.add("configs/engine/engine.runtime.json"),f.add("configs/engine/engine.assets.json"),f.add("configs/engine/engine.splash.json"),f.add("configs/scenes/scene.main.json");let m=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&f.add(`configs/objects/${v.object_config}.json`);for(let v of o)f.has(v)||r.unwatch(v);for(let v of f)o.has(v)||r.watch(v,w=>g(w));o=f},c=new Set,d=!1,p=async h=>{let f=await Me(h),m=qe(f,s.activeConfig.schemas),b=ot(m,s.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await s.liveEditBridge.applyObjectConfig(h,m)};async function u(h){if(!a){a=!0;try{if(d||c.size===0){s.audioSystem.destroy();let f=await Ce("scene.main");s.setActiveConfig(f),s.gameObjectManager.updateConfig(f),s.CustomAssets.updateConfig(f),await s.CustomAssets.ready();let m=s.createAudioSystem(f);s.setAudioSystem(m),window.__audioSystem=m,await m.start(),s.liveEditBridge.rebuildIndexes(),l(f),console.log(`[GAME] Hot-reload complete (${h})`)}else{let f=Array.from(c);c.clear();for(let m of f)await p(m);console.log(`[GAME] Hot-reload updated objects: ${f.join(", ")}`)}}catch(f){console.warn("[GAME] Hot-reload failed:",f)}finally{a=!1,d=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):d=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(h.type)},120)}e&&Xn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(s.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Xn,Us=be(()=>{"use strict";Kn();Vn();Xn={}});var Gs={};Et(Gs,{ConfigWatcher:()=>Ve,DefaultReloadStrategy:()=>Rt,applyDefaults:()=>qe,diffConfigs:()=>Wn,loadAllObjectConfigs:()=>vi,loadComponentSchemas:()=>yi,loadEngineConfig:()=>wi,loadGamePromptConfig:()=>Gn,loadObjectCentricConfig:()=>Ce,loadObjectConfig:()=>Me,loadSceneConfig:()=>xi,rehydrateObject:()=>Yn,setupHotReload:()=>Jn,toLegacyFormat:()=>qn,validateObjectConfig:()=>ot});var Si=be(()=>{"use strict";Vn();Kn();Us()});var Pr={};Et(Pr,{AssetEditorModal:()=>Pa});var Pa,Ia=be(()=>{"use strict";Pa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
1
|
+
"use strict";var eo=Object.create;var Qt=Object.defineProperty;var to=Object.getOwnPropertyDescriptor;var io=Object.getOwnPropertyNames;var no=Object.getPrototypeOf,ao=Object.prototype.hasOwnProperty;var be=(s,e)=>()=>(s&&(e=s(s=0)),e);var Et=(s,e)=>{for(var t in e)Qt(s,t,{get:e[t],enumerable:!0})},Ka=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of io(e))!ao.call(s,n)&&n!==t&&Qt(s,n,{get:()=>e[n],enumerable:!(i=to(e,n))||i.enumerable});return s};var tt=(s,e,t)=>(t=s!=null?eo(no(s)):{},Ka(e||!s||!s.__esModule?Qt(t,"default",{value:s,enumerable:!0}):t,s)),so=s=>Ka(Qt({},"__esModule",{value:!0}),s);var ye,kn=be(()=>{"use strict";ye=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()}};ye.store=new Map});function ho(){var s,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(s=document.querySelector("script"))==null?void 0:s.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function fo(){try{if(typeof window!="undefined"){let s=await fetch("./build-settings.json");if(s.ok){let e=await s.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function mo(){try{if(typeof window!="undefined"){let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function bo(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${U}`),Object.keys(ve).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ve)),ve;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ve={...window.INLINE_ASSETS},ve;if(!(U==="publish"&&ce!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ve;if(!Pn){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),Pn=(async()=>{try{try{let a=await import(e+"?t="+Date.now());if(a.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(a.INLINE_ASSETS)),a.INLINE_ASSETS}catch(a){console.warn("[AssetLoader] ES module import failed, trying text parse:",a)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let a=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let r=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(r)),r}catch(a){return console.warn("[AssetLoader] Failed to parse inline assets:",a),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ve=await Pn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ve)),ve}function In(s){return s===null||typeof s!="object"||(Object.freeze(s),Object.values(s).forEach(e=>In(e))),s}function yo(s=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=s,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,s,e),n.strokeStyle="#000",n.strokeRect(0,0,s,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",s/2,e/2),we.Texture.from(i)}function Mn(s,e){ks.set(s,e)}var we,Ts,Ls,Fe,U,ce,Pe,ve,Pn,ks,Be,ni=be(()=>{"use strict";we=require("pixi.js");kn();Ts=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ls=ho(),Fe=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,U=Ls?"publish":Ts,ce=Fe==null?void 0:Fe.assetsInlined;Fe!=null&&Fe.buildMode&&(U=Fe.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${U}`));Pe=mo();Pe!=null&&Pe.buildMode&&(U=Pe.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${U}`));(Pe==null?void 0:Pe.assetsInlined)!==void 0&&(ce=Pe.assetsInlined);fo().then(s=>{s!=null&&s.buildMode&&s.buildMode!==U&&(U=s.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${U}`)),(s==null?void 0:s.assetsInlined)!==void 0&&(ce=s.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${Ts}, Runtime: ${Ls?"publish":"dev"}, Effective: ${U}`);ve={},Pn=null;ks=new Map;Be=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,r=ye.get(a);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${U}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let o=await bo(),l=o[e];if(!l&&n&&(l=o[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let p=t.path.split("/");if(p.length>=2){let u=p[p.length-1].split(".")[0];o[u]&&(l=o[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),U==="publish"&&ce!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let d=ks.get(t.type);if(d)try{let p=await d(t.path,l,e,i);return ye.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}try{let p;switch(t.type){case"image":p=await this.loadImage(t.path,l);break;case"json":p=await this.loadJSON(t.path,l),p=In(p);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return ye.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}}static async loadImage(e,t){let i=U==="publish",n=i&&ce!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${U}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await we.Assets.load(t)}catch(a){throw console.error("[AssetLoader] Failed to load texture from data URI:",a),a}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await we.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await we.Assets.load(e)}return await we.Assets.load(e)}static async loadJSON(e,t){let i=U==="publish",n=i&&ce!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${U}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}let a=await fetch(e);if(!a.ok)throw new Error(`JSON fetch failed: ${e}`);return a.json()}static handleFailure(e,t,i){if(U==="dev"){let a=t==="image"?yo():In({__placeholder:!0,type:t});return ye.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};Mn("image",async(s,e)=>{let t=U==="publish",i=t&&ce!==!1,n=U==="brand",a=t&&ce===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${U}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${s}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return we.Assets.load(e)}let r=s;return(n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),we.Assets.load(e||r)});Mn("json",async(s,e)=>{let t=U==="publish",i=t&&ce!==!1,n=U==="brand",a=t&&ce===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${U}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${s}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let r=s;if((n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let o=await fetch(r);if(!o.ok)throw new Error(`JSON fetch failed: ${s}`);return o.json()})});var Is={};Et(Is,{AssetTextures:()=>pe,initAssetTextures:()=>On});function On(s,e){Ps.init(s,e),typeof window!="undefined"&&(window.__AssetTextures=pe)}var _n,Ps,pe,st=be(()=>{"use strict";ni();_n=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var r;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],a=[];for(let[o,l]of e.objects.entries()){let c=(r=l.render)==null?void 0:r.asset;if(!c)continue;let d=async()=>{var p;try{let u=(p=l.identity)==null?void 0:p.id;console.log(`[AssetTextures] Loading ${c.type}: ${o} (${u})`);let g=await Be.load(o,c,t,u);this.textures.set(o,g),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,u)}finally{this.attempted.add(o);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(o)?n.push(d()):a.push(d())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(a),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(o=>typeof o=="string"&&o))).filter(o=>{var l,c,d,p;try{let u=(d=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:d.call(c,o);return!!((p=u==null?void 0:u.render)!=null&&p.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let a=()=>n.every(o=>this.textures.has(o)||this.attempted.has(o));if(a())return;let r=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(o=>{let l=!1,c=()=>{l||a()&&(l=!0,this.waiters.delete(c),o())};this.waiters.add(c),c(),r>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),o())},r)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},Ps=new _n,pe=new Proxy(Ps,{get(s,e){return e in s&&typeof s[e]=="function"?s[e].bind(s):s.get(e)},set(s,e,t){return s.set(e,t),!0}})});var je={};Et(je,{applyConfigOverride:()=>Q,applyConfigOverrides:()=>Ie,applyConfigsToDisk:()=>mi,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>$s,configOverrideManager:()=>Ds,deepClone:()=>Y,exportConfigsAsJSON:()=>Ge,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Me,getOverrideMode:()=>Mt,redoLastConfigChange:()=>fi,removeConfigOverride:()=>jt,resetToApplied:()=>_t,resetToOriginal:()=>bi,setOverrideMode:()=>Bn,trackObjectCreation:()=>Hs,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>hi});function pi(){return typeof window=="undefined"?null:window.__editableConfig||null}function Hn(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function Dn(s,e){var t,i;if(!s)return null;try{if(s instanceof Map)return(t=s.get(e))!=null?t:null;if(typeof s=="object")return(i=s[e])!=null?i:null}catch{}return null}function Go(s,e,t){if(s){if(s instanceof Map){s.set(e,t);return}typeof s=="object"&&(s[e]=t)}}function Os(s,e){for(let t of e)It(s,t.path,t.value)}function ui(s){var o;if(typeof window=="undefined")return;let e=pi();if(!e)return;let t=Hn(),i=(o=t?Dn(t.objects,s):null)!=null?o:Dn(e.objects,s);if(!i)return;let n=Y(i),a=Z().filter(l=>l.objectId===s);try{Os(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",s,l);return}Go(e.objects,s,n);let r=window.applyEditableObjectConfig;if(typeof r=="function")try{r(s,n)}catch{}}function Nn(){var n;if(typeof window=="undefined")return;let s=pi();if(!(s!=null&&s.engine))return;let e=Hn(),t=Y(((n=e==null?void 0:e.engine)!=null?n:s.engine)||{}),i=Z().filter(a=>!a.objectId&&!a.sceneId);try{Os(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=s.engine;for(let r of Object.keys(a))r in t||delete a[r];for(let[r,o]of Object.entries(t))a[r]=o}catch{s.engine=t}}function qo(){if(typeof window=="undefined")return"unknown";let s=window;return typeof s.__HANDLER_PROJECT_ID=="string"?s.__HANDLER_PROJECT_ID:"handler-default"}function Rs(){return`handler_preview_config_overrides::${qo()}`}function Vo(){if(typeof window=="undefined")return[];try{let s=window.localStorage.getItem(Rs());if(!s)return[];let e=JSON.parse(s);return Array.isArray(e)?e:[]}catch{return[]}}function gi(s){if(typeof window!="undefined")try{window.localStorage.setItem(Rs(),JSON.stringify(s))}catch{}}function Mt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Bn(s){if(typeof window!="undefined"){window.__enableConfigOverrides=s;try{window.localStorage.setItem(zs,s?"true":"false")}catch{}}}function Q(s,e={}){var u,g;let{objectId:t,path:i,value:n}=s,{silent:a=!1,persist:r=!0,emitEvent:o=!0}=e,l=pi();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}a||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let d;try{d=Fs(c,i),It(c,i,n)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},h);return}if(e.trackHistory!==!1){window.__configChanges=window.__configChanges||[];let h=window.__configChanges;h.push({objectId:t,path:i,oldValue:d,newValue:n,ts:Date.now()}),h.length>Fn&&h.shift(),window.__configChangeRedo=[]}if(r){let h=Z(),f=h.findIndex(m=>m.objectId===t&&m.sceneId===s.sceneId&&m.path===i);f>=0?h[f].value=n:h.push(s),window.__configOverrides=h,gi(h),Mt()||Bn(!0)}a||console.log("[CONFIG] Applied override:",s),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:s}))}function Ie(s,e={}){let t=e.emitEvent!==!1,i=[];for(let n of s)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Q(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:s.length}}))}}function ae(){window.__configOverrides=[],window.__configChanges=[],window.__configChangeRedo=[],gi([]),console.log("[CONFIG] Cleared all overrides")}function $s(s){let e=Z().filter(i=>i.objectId!==s);window.__configOverrides=e,gi(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==s),ui(s),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:s}}))}function jt(s,e){let t=Z().filter(n=>n.objectId!==s||n.path!==e);window.__configOverrides=t,gi(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==s||n.path!==e),s?ui(s):Nn(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:s,path:e}}))}function Z(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Vo()),window.__configOverrides||[])}function hi(){var a;if(typeof window=="undefined")return!1;let s=window.__configChanges||[];if(s.length===0)return!1;let e=s.pop();window.__configChangeRedo=window.__configChangeRedo||[];let t=window.__configChangeRedo;if(e.changeType==="object_create"){let{screenId:r}=e.metadata||{};return e.objectId&&r&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:r})}).catch(o=>console.error("[CONFIG] Failed to delete object on undo:",o)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Deleted object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:r,objectConfigId:o}=e.metadata||{},l=e.oldValue;return e.objectId&&r&&l&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:r,instanceId:e.objectId,objectConfigId:o||((a=l==null?void 0:l.identity)==null?void 0:a.id),config:l})}).catch(c=>console.error("[CONFIG] Failed to recreate object on undo:",c)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Recreated object",e.objectId),!0}t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType});let i=Hn(),n=!1;if(i){let r=e.objectId?Dn(i.objects,e.objectId):i.engine;if(r){let o=Fs(r,e.path);JSON.stringify(o)===JSON.stringify(e.oldValue)&&(n=!0)}}return n?jt(e.objectId,e.path):(Q({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ui(e.objectId):Nn()),console.log("[CONFIG] Undo:",e.path),!0}function fi(){var i;if(typeof window=="undefined")return!1;let s=window.__configChangeRedo||[];if(s.length===0)return!1;let e=s.pop();if(e.changeType==="object_create"){let{screenId:n,objectConfigId:a}=e.metadata||{},r=e.newValue;return e.objectId&&n&&r&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:n,instanceId:e.objectId,objectConfigId:a||((i=r==null?void 0:r.identity)==null?void 0:i.id),config:r})}).catch(l=>console.error("[CONFIG] Failed to recreate object on redo:",l)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Recreated object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:n}=e.metadata||{};return e.objectId&&n&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:n})}).catch(r=>console.error("[CONFIG] Failed to delete object on redo:",r)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Deleted object",e.objectId),!0}return window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType}),Q({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ui(e.objectId):Nn(),console.log("[CONFIG] Redo:",e.path),!0}function Hs(s,e,t){var n;if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_create__",oldValue:null,newValue:t,ts:Date.now(),changeType:"object_create",metadata:{screenId:e,objectConfigId:(n=t==null?void 0:t.identity)==null?void 0:n.id}}),window.__configChangeRedo=[],i.length>Fn&&i.shift(),console.log("[CONFIG] Tracked object creation:",s)}function Ns(s,e,t){if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_delete__",oldValue:t,newValue:null,ts:Date.now(),changeType:"object_delete",metadata:{screenId:e}}),window.__configChangeRedo=[],i.length>Fn&&i.shift(),console.log("[CONFIG] Tracked object deletion:",s)}function It(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i){if(a[o]!==void 0&&typeof a[o]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${o})`);a[o]=(r=a[o])!=null?r:{},a=a[o]}a[n]=t}function Fs(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Y(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(s instanceof Set)return new Set([...s].map(t=>Y(t)));if(ArrayBuffer.isView(s))return s.slice();if(s instanceof Array)return s.map(t=>Y(t));if(s instanceof Map){let t=new Map;return s.forEach((i,n)=>t.set(n,Y(i))),t}let e={};for(let t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=Y(s[t]));return e}function Ge(){let s=window.__editableConfigBaseline;if(!s){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return _s(e)}return _s(s)}function _s(s){let e={objects:{},scenes:{},engine:Y(s.engine||{})},t=s.objects;if(t instanceof Map)t.forEach((a,r)=>{e.objects[r]=Y(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=Y(t[a]);let i=s.scenes;if(i instanceof Map)i.forEach((a,r)=>{e.scenes[r]=Y(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=Y(i[a]);let n=Z();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),It(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),It(e.scenes[a.sceneId],a.path,a.value)):It(e.engine,a.path,a.value);return e}function Me(){let s=Z(),e=new Set;for(let t of s)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:s.length,hasChanges:s.length>0,overrides:s}}async function mi(s){let e=Ge(),t={};for(let[n,a]of Object.entries(e.objects)){let r=a,o=n;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${n}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=o),t[`objects/${o}.json`]=r}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,a]of Object.entries(e.scenes)){let r=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${r}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Z().length>0,versionName:s})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ae();try{let n=pi();n&&(window.__editableConfigBaseline=Y(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function _t(){ae(),window.location.reload()}async function bi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}ae(),window.location.reload()}var zs,Fn,Ds,K=be(()=>{"use strict";zs="handler_preview_override_mode";if(typeof window!="undefined"){let s=window.localStorage.getItem(zs);window.__enableConfigOverrides=s===null?!0:s==="true"}Fn=500;Ds={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[],window.__configChangeRedo=[]}}});function Wo(s,e){try{if(typeof s=="object"&&s!==null)return s;if(typeof s!="string")return null;if(s.startsWith("data:")){let i=s.indexOf(",");if(i===-1)return null;let n=s.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=s.slice(i+1),r=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(r)}let t=s.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(s):null}catch{return null}}function Yo(s){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=s.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let r=e[a];if(r){let o=Wo(r,a);if(o!==null)return o}}return null}async function Ot(s){if(Un.has(s)&&!Gn)return console.log(`[CONFIG] Using cached config for: "${s}"`),Un.get(s);if(console.log(`[CONFIG] loadConfigFile called with: "${s}", MODE: ${B.toUpperCase()}, CACHE: ${Gn?"DISABLED":"ENABLED"}`),B==="publish"){let i=Yo(s);return i?(console.log(`[CONFIG] \u2713 Loaded ${s} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${s} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}B==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${s}"`);let e;B==="brand"?e=[`./${s.split("/").pop()||s}`,`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=Gn?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let r=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${s} via ${n}`,r),r}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${B}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${s}; using defaults`),{}})();return Un.set(s,t),t}async function yi(){console.log("[CONFIG] Loading component schemas...");let s=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of s)try{let i=B==="publish"||B==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await Ot(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${B==="publish"||B==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function _e(s){console.log(`[CONFIG] Loading object config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/objects/${s}.json`;return await Ot(e)}async function vi(s){let e=new Map;if(s.objects&&Array.isArray(s.objects)){for(let t of s.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await _e(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await _e(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await _e(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function wi(){console.log("[CONFIG] Loading engine configs...");let s=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(s.map(i=>{let n=`engine.${i}.json`,a=B==="publish"||B==="brand"?n:`configs/engine/${n}`;return Ot(a)})),t=Object.fromEntries(s.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(s.map(i=>{var r;let n=(r=t[i])!=null?r:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function qn(){return await Ot(B==="publish"||B==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function xi(s="scene.main"){console.log(`[CONFIG] Loading scene config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/scenes/${s}.json`;return await Ot(e)}function ot(s,e){let t=[];if(!s.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])s.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(s)){if(n==="identity")continue;let r=e.get(n);if(r&&a&&typeof a=="object"){let o=a;for(let l of r.required||[])o[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(r.constraints&&typeof r.constraints=="object")for(let[l,c]of Object.entries(r.constraints)){let d=o[l];if(d!==void 0&&c&&typeof c=="object"){let p=c;typeof d=="number"&&(p.min!==void 0&&d<p.min&&t.push(`${n}.${l} value ${d} is below minimum ${p.min}`),p.max!==void 0&&d>p.max&&t.push(`${n}.${l} value ${d} is above maximum ${p.max}`))}}}}return{valid:t.length===0,errors:t}}function qe(s,e){let t={...s},i=["identity","transform","render"];for(let[n,a]of e.entries())a.defaults&&Object.keys(a.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...a.defaults,...t[n]});return t}function se(s,e,t,i){return typeof s!="number"||!Number.isFinite(s)?e:Math.min(Math.max(s,t),i)}function Us(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,-2e3,2e3),y:se(s[1],e.y,-2e3,2e3)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,-2e3,2e3),y:se(i,e.y,-2e3,2e3)}}function Ko(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,0,1),y:se(s[1],e.y,0,1)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,0,1),y:se(i,e.y,0,1)}}function Xo(s){if(Array.isArray(s))return{x:se(s[0],.5,-10,10),y:se(s[1],.5,-10,10)};if(s&&typeof s=="object"){let{x:e,y:t}=s;return{x:se(e,.5,-10,10),y:se(t,.5,-10,10)}}return typeof s=="string"?s:null}async function Ce(s="scene.main",e){var l,c,d,p,u,g,h,f,m,b,y,v,w,E;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await yi(),i=Z();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await xi(s);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await wi();console.log("[CONFIG] Loading object configs...");let r=await vi(n);console.log(`[CONFIG] Loaded ${r.size} object configs:`,Array.from(r.keys()));for(let[k,M]of r.entries()){let x=qe(M,t),j=ot(x,t);j.valid||console.warn(`Object ${k} validation errors:`,j.errors),(c=x.transform)!=null&&c.position&&(x.transform.position=Us(x.transform.position,{x:0,y:0})),(d=x.transform)!=null&&d.offset&&(x.transform.offset=Us(x.transform.offset,{x:0,y:0})),((p=x.transform)==null?void 0:p.anchor)!==void 0&&(x.transform.anchor=Xo(x.transform.anchor)),((u=x.transform)==null?void 0:u.position_ratio)!==void 0&&x.transform.position_ratio!==null&&(x.transform.position_ratio=Ko(x.transform.position_ratio,{x:.5,y:.5})),r.set(k,x)}if(e){if(e.objects)for(let[k,M]of e.objects.entries())r.set(k,M);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let o={objects:r,engine:a,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=qe(o,t))),i.length>0&&Mt()&&Ie(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(r.keys()),engine:{runtime:Object.keys((f=a.runtime)!=null?f:{}),assets:Object.keys((m=a.assets)!=null?m:{}),splash:Object.keys((b=a.splash)!=null?b:{}),loading:Object.keys((y=a.loading)!=null?y:{}),start:Object.keys((v=a.start)!=null?v:{}),tutorial:Object.keys((w=a.tutorial)!=null?w:{}),endgame:Object.keys((E=a.endgame)!=null?E:{})},scene:n.scene_id||"unknown"}),o}function Vn(s){var t,i,n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,M,x,j,O,T,A,_,P,C,S,I,L;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[R,z]of s.objects.entries()){let N=((t=z.identity)==null?void 0:t.id)||R;N.includes("character")&&(e.gameplay.character_pos=((i=z.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=z.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((r=(a=z.gameplay)==null?void 0:a.tuning)==null?void 0:r.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=z.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((d=(c=z.gameplay)==null?void 0:c.tuning)==null?void 0:d.relief_speed)||.22),(N.includes("gun")||N.includes("flame"))&&(e.gameplay.gun=z.gun||{},e.gameplay.gunmuzzle=((p=z.effects)==null?void 0:p.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=z.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=z.effects)==null?void 0:g.flame)||{}),N.includes("diamond")&&(e.gameplay.diamond=z),N.includes("ice")&&(e.gameplay.melt=z.melt||{},e.gameplay.melt_anchor=((h=z.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((f=z.transform)==null?void 0:f.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=z.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=z.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=z.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=z.hard_ice||{}),N.includes("water")&&(e.gameplay.water_drops=z),N.includes("crack")&&(e.gameplay.crack=z),N.includes("hand")&&(e.gameplay.hand=((v=z.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=z.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=z.transform)==null?void 0:E.scale)||1.5),N.includes("hazard")&&(e.gameplay.hazard=((k=z.gameplay)==null?void 0:k.tuning)||{},e.gameplay.danger_pos=((M=z.transform)==null?void 0:M.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((j=(x=z.gameplay)==null?void 0:x.tuning)==null?void 0:j.danger_pulse)||{},e.gameplay.hazard_height=((T=(O=z.gameplay)==null?void 0:O.tuning)==null?void 0:T.hazard_height)||140)}return e.gameplay.timeline=((A=s.engine.runtime)==null?void 0:A.timeline)||{},e.gameplay.drag_surface=((_=s.engine.runtime)==null?void 0:_.drag_surface)||{},e.gameplay.background=((P=s.engine.runtime)==null?void 0:P.background)||{},e.gameplay.ui_styles=((C=s.engine.runtime)==null?void 0:C.ui_styles)||{},e.gameplay.label_pulse=((S=s.engine.runtime)==null?void 0:S.label_pulse)||{},e.ui=((I=s.engine.runtime)==null?void 0:I.ui)||{},e.theme=((L=s.engine.runtime)==null?void 0:L.theme)||{},e.assets=s.engine.assets||{},e}var Bs,B,Un,Gn,Wn=be(()=>{"use strict";K();Bs=null,B="dev";if(typeof window!="undefined"){let s=window.__BUILD_SETTINGS__;if(s!=null&&s.buildMode)Bs=s,B=s.buildMode,console.log("[CONFIG] Loaded inline build settings:",s,"buildMode:",B);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Bs=t,B=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",B)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",B)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",B);Un=new Map,Gn=B==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Yn(s,e){let t=[];function i(n,a,r=""){if(n!==a){if(typeof n!=typeof a){t.push(`${r}: type changed`);return}if(typeof n=="object"&&n!==null&&a!==null){let o=new Set([...Object.keys(n),...Object.keys(a)]);for(let l of o){let c=r?`${r}.${l}`:l;l in n?l in a?i(n[l],a[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${r}: changed`)}}return i(s,e),t}function Kn(s,e,t,i){let n={...t};for(let[a,r]of i.entries())n[a]&&r.defaults&&(n[a]={...r.defaults,...n[a]});return n}var Rt,Ve,Xn=be(()=>{"use strict";Rt=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},Ve=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let a=await n.text(),r=this.hashString(a),o=this.fileHashes.get(e);if(o&&o!==r&&console.log(`[HOT-RELOAD] File changed: ${e}`),o&&o!==r){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,r)}else o||this.fileHashes.set(e,r)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function Zn(s){if(typeof window=="undefined")return;let e=typeof Jn!="undefined"&&!!Jn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,r=null;if(t){r=new Ve;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=r}let o=new Set,l=h=>{var b,y;if(!r)return;let f=new Set;f.add("configs/engine/engine.runtime.json"),f.add("configs/engine/engine.assets.json"),f.add("configs/engine/engine.splash.json"),f.add("configs/scenes/scene.main.json");let m=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&f.add(`configs/objects/${v.object_config}.json`);for(let v of o)f.has(v)||r.unwatch(v);for(let v of f)o.has(v)||r.watch(v,w=>g(w));o=f},c=new Set,d=!1,p=async h=>{let f=await _e(h),m=qe(f,s.activeConfig.schemas),b=ot(m,s.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await s.liveEditBridge.applyObjectConfig(h,m)};async function u(h){if(!a){a=!0;try{if(d||c.size===0){s.audioSystem.destroy();let f=await Ce("scene.main");s.setActiveConfig(f),s.gameObjectManager.updateConfig(f),s.CustomAssets.updateConfig(f),await s.CustomAssets.ready();let m=s.createAudioSystem(f);s.setAudioSystem(m),window.__audioSystem=m,await m.start(),s.liveEditBridge.rebuildIndexes(),l(f),console.log(`[GAME] Hot-reload complete (${h})`)}else{let f=Array.from(c);c.clear();for(let m of f)await p(m);console.log(`[GAME] Hot-reload updated objects: ${f.join(", ")}`)}}catch(f){console.warn("[GAME] Hot-reload failed:",f)}finally{a=!1,d=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):d=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(h.type)},120)}e&&Jn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(s.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Jn,Gs=be(()=>{"use strict";Xn();Wn();Jn={}});var qs={};Et(qs,{ConfigWatcher:()=>Ve,DefaultReloadStrategy:()=>Rt,applyDefaults:()=>qe,diffConfigs:()=>Yn,loadAllObjectConfigs:()=>vi,loadComponentSchemas:()=>yi,loadEngineConfig:()=>wi,loadGamePromptConfig:()=>qn,loadObjectCentricConfig:()=>Ce,loadObjectConfig:()=>_e,loadSceneConfig:()=>xi,rehydrateObject:()=>Kn,setupHotReload:()=>Zn,toLegacyFormat:()=>Vn,validateObjectConfig:()=>ot});var Si=be(()=>{"use strict";Wn();Xn();Gs()});var Ir={};Et(Ir,{AssetEditorModal:()=>Ia});var Ia,Ma=be(()=>{"use strict";Ia=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
2
2
|
<div class="asset-editor-card">
|
|
3
3
|
<div class="asset-editor-header">
|
|
4
4
|
<div>
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
<button class="debug-btn primary" data-modal-apply>Apply</button>
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
46
|
-
`,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(r=>{r.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(r=>{r.addEventListener("click",o=>{let c=o.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let a=this.modal.querySelector("[data-modal-apply]");a==null||a.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",r=>{r.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var _l={};Et(_l,{COLORS:()=>he,ConfigWatcher:()=>Ve,DebugPanel:()=>Ut,DefaultReloadStrategy:()=>Rt,Handler:()=>le,PlayableLoadingScreen:()=>pn,PreviewShell:()=>ln,STROKE_WIDTH:()=>$r,THEME:()=>Dr,applyConfigOverride:()=>ne,applyConfigOverrides:()=>Ie,applyConfigsToDisk:()=>mi,applyDefaults:()=>qe,baseLottie:()=>Cn,bootstrap:()=>Sl,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,createPreviewShell:()=>_a,deepClone:()=>Y,default:()=>He,defaultPreset:()=>Ei,deviceGroups:()=>ea,devicePresets:()=>Qn,diffConfigs:()=>Wn,exportConfigsAsJSON:()=>Ue,getConfigOverrides:()=>Z,getConfigStateSummary:()=>je,getOverrideMode:()=>jt,getPresetById:()=>We,getPresetsByCategory:()=>Xo,loadAllObjectConfigs:()=>vi,loadComponentSchemas:()=>yi,loadEngineConfig:()=>wi,loadGamePromptConfig:()=>Gn,loadObjectCentricConfig:()=>Ce,loadObjectConfig:()=>Me,loadSceneConfig:()=>xi,redoLastConfigChange:()=>fi,rehydrateObject:()=>Yn,removeConfigOverride:()=>Mt,resetToApplied:()=>_t,resetToOriginal:()=>bi,setBootstrapDependencies:()=>wl,setOverrideMode:()=>Fn,setupHotReload:()=>Jn,setupLiveEditBridge:()=>cn,toLegacyFormat:()=>qn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Hs,undoLastConfigChange:()=>hi,validateObjectConfig:()=>ot});module.exports=ao(_l);var ke={};function ei(s,e,t=!1){ke[s]||(ke[s]=[]),ke[s].push({fn:e,once:t})}function wn(s,e){if(ke[s]){if(!e){delete ke[s];return}ke[s]=ke[s].filter(t=>t.fn!==e)}}function ti(s,...e){let t=ke[s];if(t)for(let i of[...t])i.fn(...e),i.once&&wn(s,i.fn)}function ee(s,e){ei(s,e,!0)}var V=null,re=[],it=null;function Ja(s){V=s,re=[],it!==null&&(clearTimeout(it),it=null)}function Za(){var s,e,t;return{endpoint:(V==null?void 0:V.endpoint)||"",transport:(V==null?void 0:V.transport)||"beacon",batchSize:(s=V==null?void 0:V.batchSize)!=null?s:10,flushIntervalMs:(e=V==null?void 0:V.flushIntervalMs)!=null?e:300,maxQueue:(t=V==null?void 0:V.maxQueue)!=null?t:200,debug:!!(V!=null&&V.debug)}}async function Ka(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function xn(s,e){let t=Za();if(e&&t.endpoint){if(re.push(s),re.length>t.maxQueue&&(re=re.slice(re.length-t.maxQueue)),re.length>=t.batchSize){Xa();return}it===null&&(it=window.setTimeout(()=>{it=null,Xa()},t.flushIntervalMs))}}async function Xa(){let s=Za();if(!s.endpoint||re.length===0)return;let e=re.splice(0,s.batchSize);await Ka(s.endpoint,{events:e},s.transport,s.debug),re.length>0&&await Ka(s.endpoint,{events:re.splice(0,s.batchSize)},s.transport,s.debug)}function Qa(s){return Math.max(0,Math.min(1,s))}function so(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function Ct(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function ro(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function es(s,e,t){try{s[e]=t}catch{}}function oo(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function ts(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function is(s,e){let t=oo(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function ns(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=Ct();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let f=g.durationMs>0?h/g.durationMs:1,m=Qa(f),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(f),b-1):0;if(g.repeat>0&&f>=1){let E=f-y;m=Qa(E)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let E of g.props)es(g.target,E.key,E.from+(E.to-E.from)*v);g.scaleFrom&&g.scaleTo&&ts(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(f>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var E;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),f=so(p.ease),m=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let k of Object.keys(p)){if(y.has(k))continue;let j=p[k];typeof j=="number"&&v.push({key:k,from:ro(d,k),to:j})}let w=is(d,p);return{target:d,startMs:Ct(),delayMs:h,durationMs:g,ease:f,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Ct())},resume:()=>{var f;if(!u.paused)return;let g=(f=u.pauseAtMs)!=null?f:Ct(),h=Ct()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&es(d,g,h)}let u=is(d,p);u.to&&ts(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],f=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{p.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,w){return m({kind:"to",target:y,vars:v,atMs:f(w)}),b},fromTo(y,v,w,E){return m({kind:"fromTo",target:y,vars:w,from:v,atMs:f(E)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let w of p)w.kind==="fromTo"&&c.set(w.target,(y=w.from)!=null?y:{}),h.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function as(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=ns()}catch{}}var ss={name:"handler-playable-sdk",version:"0.5.556",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 te=0,co=te++,rs=te++,os=te++,ls=te++,cs=te++,ds=te++,ps=te++,us=te++,gs=te++,hs=te++,fs=te++,ms=te++,G=co;function bs(){return G===rs}function ys(){return G===os}function vs(){return G===ls}function ws(){return G===cs}function nt(){return G===ds}function at(){return G===ps}function xs(){return G===us}function Ss(){return G===gs}function Es(){return G===hs}function Sn(){return G===fs}function En(){return G===ms}function Cs(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),G=rs;return}catch{}else if(s==="dapi")try{dapi.isReady(),G=os;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(G=ls)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(G=cs)}catch{}else if(e==="mintegral")window.gameReady&&(G=ds);else if(e==="tapjoy")window.TJ_API&&(G=ps);else if(e==="tiktok")window.openAppStore&&(G=us);else if(e==="smadex")try{window.smxTracking&&(G=gs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(G=hs)}catch{}else e==="vungle"?G=fs:(s==="nucleo"||e==="nucleo")&&(G=ms)}var ii=tt(require("lottie-web"),1),Cn=ii.default;typeof window!="undefined"&&(window.lottie=ii.default,window.__baseLottie=ii.default);var po=require("pixi.js");var An=require("pixi.js");var uo=null;function Tn(s){uo=s}ni();Ln();var At=require("pixi.js");ni();var yo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",jn=yo;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(jn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${jn}`))}}catch{}function vo(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var de=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${jn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let f=new At.Container;return this.applyTransform(f,t==null?void 0:t.transform,t),f}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await Fe.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new At.Sprite(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof At.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let f=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of f)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=vo(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 Tt=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 So=tt(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=So);st();var ai=require("pixi.js");st();var On=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Tt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await de.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await de.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Eo=new On,Co=new Proxy(Eo,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});st();var Is=require("pixi.js"),xe={width:400,height:600,designWidth:400,scaleFactor:1},ri={scale:1,position:1},zn=[];function To(s,e,t,i,n,a,r){zn.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Lo(){zn.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(s,xe.width,xe.height,i,n,!0,!1)})}function Rn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),xe.width=s,xe.height=e,xe.scaleFactor=Math.min(s/xe.designWidth,1.15),ri.scale=xe.scaleFactor,ri.position=1,console.log(`[SCREEN] Global multipliers - scale: ${ri.scale.toFixed(3)}`),Lo()}var ue={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 ko(s,e,t){let i=ue[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Po(){return ue}var Io={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function si(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function rt(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:si(s[0],e.x),y:si(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:si(i.x,e.x),y:si(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=Io[i])!=null?t:e}return e}function kt(s,e,t,i={}){var g,h,f,m,b,y;let n=rt(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((f=a.left)!=null?f:0)+r.x,l=((m=a.right)!=null?m:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((y=a.bottom)!=null?y:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Pt(s,e,t,i={}){var f,m,b,y,v,w;let n=(f=i.inset)!=null?f:{},a=(m=i.padding)!=null?m:{x:0,y:0},r=((b=n.left)!=null?b:0)+a.x,o=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((w=n.bottom)!=null?w:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=rt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,Rn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Rn(window.innerWidth,window.innerHeight),window.updateDebugConfig=ko,window.getDebugConfig=Po,window.copyConfig=Fo,window.applyConfig=Lt,window.applyConfigForRatio=Bo,window.positionAtBottom=js,window.positionAtTop=_o,window.positionAtCenter=Oo,window.positionAtLeft=Ro,window.positionAtRight=zo,window.positionAtBottomLeft=$o,window.positionAtBottomRight=Do,window.positionAtTopLeft=Ho,window.positionAtTopRight=No,window.applyPositionContract=Mo,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 oi(s,e,t=0){return s*e+t}function li(s,e,t=0){return s*(1-e)+t}function ci(s,e,t=0){return s*e+t}function di(s,e,t=0){return s*(1-e)+t}function ie(s,e=0){return s/2+e}function jo(s,e){return s*e}function Mo(s,e,t,i){var r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,j,x,M;let n=0,a=0;switch(i.type){case"top":n=ie(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=oi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ie(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=li(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ci(e,i.percent,(f=(h=i.offset)==null?void 0:h.x)!=null?f:0),a=ie(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=di(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=ie(t,(E=(w=i.offset)==null?void 0:w.y)!=null?E:0);break;case"center":n=ie(e,(j=(k=i.offset)==null?void 0:k.x)!=null?j:0),a=ie(t,(M=(x=i.offset)==null?void 0:x.y)!=null?M:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function js(s,e,t,i=.2,n=1,a=!0,r=!1){let o=jo(t,i),l=li(t,i/2);Se(s,ie(e),l);let c=a?n*xe.scaleFactor:n;Ee(s,c),r&&!zn.find(d=>d.element===s)&&To(s,js,e,t,i,n,a)}function _o(s,e,t,i=.1,n=1){Se(s,ie(e),oi(t,i)),Ee(s,n)}function Oo(s,e,t,i=0,n=0,a=1){Se(s,ie(e,i),ie(t,n)),Ee(s,a)}function Ro(s,e,t,i=.1,n=1){Se(s,ci(e,i),ie(t)),Ee(s,n)}function zo(s,e,t,i=.1,n=1){Se(s,di(e,i),ie(t)),Ee(s,n)}function $o(s,e,t,i=.05,n=.05,a=1){Se(s,ci(e,n),li(t,i)),Ee(s,a)}function Do(s,e,t,i=.05,n=.05,a=1){Se(s,di(e,n),li(t,i)),Ee(s,a)}function Ho(s,e,t,i=.05,n=.05,a=1){Se(s,ci(e,n),oi(t,i)),Ee(s,a)}function No(s,e,t,i=.05,n=.05,a=1){Se(s,di(e,n),oi(t,i)),Ee(s,a)}function Se(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function Ee(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Be={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 Fo(s){return s&&Be[s]?JSON.parse(JSON.stringify(Be[s])):JSON.parse(JSON.stringify(ue))}function Lt(s){Object.keys(s).forEach(e=>{let t=e;ue[t]&&s[t]&&Object.assign(ue[t],s[t])}),console.log("Config applied:",s)}function Bo(s,e){let t=s/e;t>1.6?(Lt(Be.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Lt(Be.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Lt(Be.square),console.log("Applied SQUARE config for ratio:",t)):(Lt(Be.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Be,s.resolveAnchorVec2=s.resolveAnchorVec2||rt,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||kt,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||Pt}Si();function W(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var od=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:W(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:W(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:W(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:W(360,780)}],ld=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:W(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:W(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:W(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:W(412,915)}],cd=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:W(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:W(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:W(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:W(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:W(800,1280)}],Zn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:W(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:W(768,1024),mraidScale:.7}];var Qn=[...Zn],ea=[{category:"playable",label:"Playable Ad",devices:Zn}],Ei=Zn[0];function We(s){return Qn.find(e=>e.id===s)||Ei}function Xo(s){return Qn.filter(e=>e.category===s)}K();var _e=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}ne({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ta(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ci=class{constructor(){this.updateManager=new _e}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ta({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Jo=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Zo=["environment","ui","character","system","backgrounds"],Qo=["bg","world","ui"],qs={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Ai=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
46
|
+
`,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(r=>{r.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(r=>{r.addEventListener("click",o=>{let c=o.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let a=this.modal.querySelector("[data-modal-apply]");a==null||a.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",r=>{r.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var Ol={};Et(Ol,{COLORS:()=>he,ConfigWatcher:()=>Ve,DebugPanel:()=>Ut,DefaultReloadStrategy:()=>Rt,Handler:()=>le,PlayableLoadingScreen:()=>un,PreviewShell:()=>cn,STROKE_WIDTH:()=>Dr,THEME:()=>Hr,applyConfigOverride:()=>Q,applyConfigOverrides:()=>Ie,applyConfigsToDisk:()=>mi,applyDefaults:()=>qe,baseLottie:()=>An,bootstrap:()=>El,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>$s,configOverrideManager:()=>Ds,createPreviewShell:()=>Oa,deepClone:()=>Y,default:()=>Ne,defaultPreset:()=>Ei,deviceGroups:()=>ta,devicePresets:()=>ea,diffConfigs:()=>Yn,exportConfigsAsJSON:()=>Ge,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Me,getOverrideMode:()=>Mt,getPresetById:()=>We,getPresetsByCategory:()=>Jo,loadAllObjectConfigs:()=>vi,loadComponentSchemas:()=>yi,loadEngineConfig:()=>wi,loadGamePromptConfig:()=>qn,loadObjectCentricConfig:()=>Ce,loadObjectConfig:()=>_e,loadSceneConfig:()=>xi,redoLastConfigChange:()=>fi,rehydrateObject:()=>Kn,removeConfigOverride:()=>jt,resetToApplied:()=>_t,resetToOriginal:()=>bi,setBootstrapDependencies:()=>xl,setOverrideMode:()=>Bn,setupHotReload:()=>Zn,setupLiveEditBridge:()=>dn,toLegacyFormat:()=>Vn,trackObjectCreation:()=>Hs,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>hi,validateObjectConfig:()=>ot});module.exports=so(Ol);var ke={};function ei(s,e,t=!1){ke[s]||(ke[s]=[]),ke[s].push({fn:e,once:t})}function xn(s,e){if(ke[s]){if(!e){delete ke[s];return}ke[s]=ke[s].filter(t=>t.fn!==e)}}function ti(s,...e){let t=ke[s];if(t)for(let i of[...t])i.fn(...e),i.once&&xn(s,i.fn)}function te(s,e){ei(s,e,!0)}var V=null,re=[],it=null;function Za(s){V=s,re=[],it!==null&&(clearTimeout(it),it=null)}function Qa(){var s,e,t;return{endpoint:(V==null?void 0:V.endpoint)||"",transport:(V==null?void 0:V.transport)||"beacon",batchSize:(s=V==null?void 0:V.batchSize)!=null?s:10,flushIntervalMs:(e=V==null?void 0:V.flushIntervalMs)!=null?e:300,maxQueue:(t=V==null?void 0:V.maxQueue)!=null?t:200,debug:!!(V!=null&&V.debug)}}async function Xa(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Sn(s,e){let t=Qa();if(e&&t.endpoint){if(re.push(s),re.length>t.maxQueue&&(re=re.slice(re.length-t.maxQueue)),re.length>=t.batchSize){Ja();return}it===null&&(it=window.setTimeout(()=>{it=null,Ja()},t.flushIntervalMs))}}async function Ja(){let s=Qa();if(!s.endpoint||re.length===0)return;let e=re.splice(0,s.batchSize);await Xa(s.endpoint,{events:e},s.transport,s.debug),re.length>0&&await Xa(s.endpoint,{events:re.splice(0,s.batchSize)},s.transport,s.debug)}function es(s){return Math.max(0,Math.min(1,s))}function ro(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function Ct(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function oo(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function ts(s,e,t){try{s[e]=t}catch{}}function lo(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function is(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function ns(s,e){let t=lo(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function as(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=Ct();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let f=g.durationMs>0?h/g.durationMs:1,m=es(f),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(f),b-1):0;if(g.repeat>0&&f>=1){let E=f-y;m=es(E)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let E of g.props)ts(g.target,E.key,E.from+(E.to-E.from)*v);g.scaleFrom&&g.scaleTo&&is(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(f>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var E;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),f=ro(p.ease),m=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let k of Object.keys(p)){if(y.has(k))continue;let M=p[k];typeof M=="number"&&v.push({key:k,from:oo(d,k),to:M})}let w=ns(d,p);return{target:d,startMs:Ct(),delayMs:h,durationMs:g,ease:f,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Ct())},resume:()=>{var f;if(!u.paused)return;let g=(f=u.pauseAtMs)!=null?f:Ct(),h=Ct()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&ts(d,g,h)}let u=ns(d,p);u.to&&is(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],f=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{p.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,w){return m({kind:"to",target:y,vars:v,atMs:f(w)}),b},fromTo(y,v,w,E){return m({kind:"fromTo",target:y,vars:w,from:v,atMs:f(E)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let w of p)w.kind==="fromTo"&&c.set(w.target,(y=w.from)!=null?y:{}),h.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function ss(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=as()}catch{}}var rs={name:"handler-playable-sdk",version:"0.5.558",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 ie=0,po=ie++,os=ie++,ls=ie++,cs=ie++,ds=ie++,ps=ie++,us=ie++,gs=ie++,hs=ie++,fs=ie++,ms=ie++,bs=ie++,G=po;function ys(){return G===os}function vs(){return G===ls}function ws(){return G===cs}function xs(){return G===ds}function nt(){return G===ps}function at(){return G===us}function Ss(){return G===gs}function Es(){return G===hs}function Cs(){return G===fs}function En(){return G===ms}function Cn(){return G===bs}function As(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),G=os;return}catch{}else if(s==="dapi")try{dapi.isReady(),G=ls;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(G=cs)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(G=ds)}catch{}else if(e==="mintegral")window.gameReady&&(G=ps);else if(e==="tapjoy")window.TJ_API&&(G=us);else if(e==="tiktok")window.openAppStore&&(G=gs);else if(e==="smadex")try{window.smxTracking&&(G=hs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(G=fs)}catch{}else e==="vungle"?G=ms:(s==="nucleo"||e==="nucleo")&&(G=bs)}var ii=tt(require("lottie-web"),1),An=ii.default;typeof window!="undefined"&&(window.lottie=ii.default,window.__baseLottie=ii.default);var uo=require("pixi.js");var Tn=require("pixi.js");var go=null;function Ln(s){go=s}ni();kn();var At=require("pixi.js");ni();var vo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",jn=vo;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(jn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${jn}`))}}catch{}function wo(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var de=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${jn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let f=new At.Container;return this.applyTransform(f,t==null?void 0:t.transform,t),f}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await Be.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new At.Sprite(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof At.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let f=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of f)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=wo(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 Tt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};var Eo=tt(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=Eo);st();var ai=require("pixi.js");st();var Rn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Tt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await de.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await de.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Co=new Rn,Ao=new Proxy(Co,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});st();var Ms=require("pixi.js"),xe={width:400,height:600,designWidth:400,scaleFactor:1},ri={scale:1,position:1},$n=[];function Lo(s,e,t,i,n,a,r){$n.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function ko(){$n.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(s,xe.width,xe.height,i,n,!0,!1)})}function zn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),xe.width=s,xe.height=e,xe.scaleFactor=Math.min(s/xe.designWidth,1.15),ri.scale=xe.scaleFactor,ri.position=1,console.log(`[SCREEN] Global multipliers - scale: ${ri.scale.toFixed(3)}`),ko()}var ue={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 Po(s,e,t){let i=ue[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Io(){return ue}var Mo={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function si(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function rt(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:si(s[0],e.x),y:si(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:si(i.x,e.x),y:si(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=Mo[i])!=null?t:e}return e}function kt(s,e,t,i={}){var g,h,f,m,b,y;let n=rt(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((f=a.left)!=null?f:0)+r.x,l=((m=a.right)!=null?m:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((y=a.bottom)!=null?y:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Pt(s,e,t,i={}){var f,m,b,y,v,w;let n=(f=i.inset)!=null?f:{},a=(m=i.padding)!=null?m:{x:0,y:0},r=((b=n.left)!=null?b:0)+a.x,o=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((w=n.bottom)!=null?w:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=rt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,zn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),zn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Po,window.getDebugConfig=Io,window.copyConfig=Bo,window.applyConfig=Lt,window.applyConfigForRatio=Uo,window.positionAtBottom=js,window.positionAtTop=Oo,window.positionAtCenter=Ro,window.positionAtLeft=zo,window.positionAtRight=$o,window.positionAtBottomLeft=Do,window.positionAtBottomRight=Ho,window.positionAtTopLeft=No,window.positionAtTopRight=Fo,window.applyPositionContract=_o,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 oi(s,e,t=0){return s*e+t}function li(s,e,t=0){return s*(1-e)+t}function ci(s,e,t=0){return s*e+t}function di(s,e,t=0){return s*(1-e)+t}function ne(s,e=0){return s/2+e}function jo(s,e){return s*e}function _o(s,e,t,i){var r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,M,x,j;let n=0,a=0;switch(i.type){case"top":n=ne(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=oi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ne(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=li(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ci(e,i.percent,(f=(h=i.offset)==null?void 0:h.x)!=null?f:0),a=ne(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=di(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=ne(t,(E=(w=i.offset)==null?void 0:w.y)!=null?E:0);break;case"center":n=ne(e,(M=(k=i.offset)==null?void 0:k.x)!=null?M:0),a=ne(t,(j=(x=i.offset)==null?void 0:x.y)!=null?j:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function js(s,e,t,i=.2,n=1,a=!0,r=!1){let o=jo(t,i),l=li(t,i/2);Se(s,ne(e),l);let c=a?n*xe.scaleFactor:n;Ee(s,c),r&&!$n.find(d=>d.element===s)&&Lo(s,js,e,t,i,n,a)}function Oo(s,e,t,i=.1,n=1){Se(s,ne(e),oi(t,i)),Ee(s,n)}function Ro(s,e,t,i=0,n=0,a=1){Se(s,ne(e,i),ne(t,n)),Ee(s,a)}function zo(s,e,t,i=.1,n=1){Se(s,ci(e,i),ne(t)),Ee(s,n)}function $o(s,e,t,i=.1,n=1){Se(s,di(e,i),ne(t)),Ee(s,n)}function Do(s,e,t,i=.05,n=.05,a=1){Se(s,ci(e,n),li(t,i)),Ee(s,a)}function Ho(s,e,t,i=.05,n=.05,a=1){Se(s,di(e,n),li(t,i)),Ee(s,a)}function No(s,e,t,i=.05,n=.05,a=1){Se(s,ci(e,n),oi(t,i)),Ee(s,a)}function Fo(s,e,t,i=.05,n=.05,a=1){Se(s,di(e,n),oi(t,i)),Ee(s,a)}function Se(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function Ee(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Ue={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 Bo(s){return s&&Ue[s]?JSON.parse(JSON.stringify(Ue[s])):JSON.parse(JSON.stringify(ue))}function Lt(s){Object.keys(s).forEach(e=>{let t=e;ue[t]&&s[t]&&Object.assign(ue[t],s[t])}),console.log("Config applied:",s)}function Uo(s,e){let t=s/e;t>1.6?(Lt(Ue.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Lt(Ue.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Lt(Ue.square),console.log("Applied SQUARE config for ratio:",t)):(Lt(Ue.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Ue,s.resolveAnchorVec2=s.resolveAnchorVec2||rt,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||kt,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||Pt}Si();function W(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var ld=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:W(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:W(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:W(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:W(360,780)}],cd=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:W(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:W(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:W(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:W(412,915)}],dd=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:W(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:W(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:W(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:W(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:W(800,1280)}],Qn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:W(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:W(768,1024),mraidScale:.7}];var ea=[...Qn],ta=[{category:"playable",label:"Playable Ad",devices:Qn}],Ei=Qn[0];function We(s){return ea.find(e=>e.id===s)||Ei}function Jo(s){return ea.filter(e=>e.category===s)}K();var Oe=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}Q({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ia(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ci=class{constructor(){this.updateManager=new Oe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ia({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Zo=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Qo=["environment","ui","character","system","backgrounds"],el=["bg","world","ui"],Vs={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Ai=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
47
47
|
<div class="wizard-card">
|
|
48
48
|
<div class="wizard-header">
|
|
49
49
|
<div class="wizard-title">
|
|
@@ -95,19 +95,19 @@
|
|
|
95
95
|
<div class="wizard-field-group">
|
|
96
96
|
<label class="wizard-label required">Category</label>
|
|
97
97
|
<select class="wizard-select" data-field="category">
|
|
98
|
-
${
|
|
98
|
+
${Qo.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
99
99
|
</select>
|
|
100
100
|
</div>
|
|
101
101
|
<div class="wizard-field-group">
|
|
102
102
|
<label class="wizard-label required">Screen</label>
|
|
103
103
|
<select class="wizard-select" data-field="screenId" required>
|
|
104
|
-
${
|
|
104
|
+
${Zo.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
|
|
105
105
|
</select>
|
|
106
106
|
</div>
|
|
107
107
|
<div class="wizard-field-group">
|
|
108
108
|
<label class="wizard-label required">Layer</label>
|
|
109
109
|
<select class="wizard-select" data-field="layer">
|
|
110
|
-
${
|
|
110
|
+
${el.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
111
111
|
</select>
|
|
112
112
|
</div>
|
|
113
113
|
</div>
|
|
@@ -266,7 +266,7 @@
|
|
|
266
266
|
<label class="wizard-label">Logic Component</label>
|
|
267
267
|
<select class="wizard-select" data-field="logicId">
|
|
268
268
|
<option value="">None</option>
|
|
269
|
-
${Object.keys(
|
|
269
|
+
${Object.keys(Vs).map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
270
270
|
</select>
|
|
271
271
|
</div>
|
|
272
272
|
<div class="wizard-field-group">
|
|
@@ -293,7 +293,7 @@
|
|
|
293
293
|
<div class="wizard-type-icon">${t}</div>
|
|
294
294
|
<div class="wizard-type-name">${i}</div>
|
|
295
295
|
</button>
|
|
296
|
-
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";
|
|
296
|
+
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";ia({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=Vs[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
|
|
297
297
|
<div class="wizard-step-indicator">
|
|
298
298
|
<span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
|
|
299
299
|
<span class="wizard-step-label">Step ${a}</span>
|
|
@@ -494,16 +494,16 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
494
494
|
<button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create</button>
|
|
495
495
|
</div>
|
|
496
496
|
</div>
|
|
497
|
-
`;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=b=>{let y=b.trim();if(!y)return null;try{return JSON.parse(y)}catch{return null}},p=()=>{var q;let b=t.querySelector("#spawner-instance-id").value.trim(),y=t.querySelector("#spawner-template-id").value.trim(),v=t.querySelector("#spawner-spawn-templates").value,w=t.querySelector("#spawner-position-source").value.trim(),E=t.querySelector("#spawner-point-mode").value.trim(),k=t.querySelector("#spawner-spawn-points").value,
|
|
498
|
-
`))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await Promise.resolve().then(()=>(K(),
|
|
499
|
-
`))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,
|
|
497
|
+
`;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=b=>{let y=b.trim();if(!y)return null;try{return JSON.parse(y)}catch{return null}},p=()=>{var q;let b=t.querySelector("#spawner-instance-id").value.trim(),y=t.querySelector("#spawner-template-id").value.trim(),v=t.querySelector("#spawner-spawn-templates").value,w=t.querySelector("#spawner-position-source").value.trim(),E=t.querySelector("#spawner-point-mode").value.trim(),k=t.querySelector("#spawner-spawn-points").value,M=t.querySelector("#spawner-random-bounds").value,x=t.querySelector("#spawner-pattern").value.trim(),j=Number(t.querySelector("#spawner-rate").value.trim()),O=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,_=t.querySelector("#spawner-movement").value.trim(),P=t.querySelector("#spawner-velocity").value.trim(),C=t.querySelector("#spawner-velocity-range").value,S=d(v),I=Array.isArray(S)&&S.length?S:null,L=typeof((q=I==null?void 0:I[0])==null?void 0:q.templateId)=="string"?String(I[0].templateId):y;if(!b){alert("Instance ID is required.");return}if(!L){alert("Template ID is required (or provide Spawn Templates JSON).");return}let R={templateId:L,spawnPattern:x,spawnRate:Number.isFinite(j)?j:650,poolSize:Number.isFinite(O)?O:18,returnOnInvisible:A,positionSource:w,spawnPointMode:E,movementMode:_,lifetime:Number.isFinite(T)?T:5e3};I&&(R.spawnTemplates=I);let z=d(k);Array.isArray(z)&&(R.spawnPoints=z);let N=d(M);if(N&&typeof N=="object"&&(R.randomBounds=N),P.includes(",")){let[J,He]=P.split(",").map(Je=>Je.trim()),fe=Number(J),me=Number(He);Number.isFinite(fe)&&Number.isFinite(me)&&(R.velocity={x:fe,y:me})}let F=d(C);F&&typeof F=="object"&&(R.velocityRange=F),c(),e({templateId:L,instanceId:b,spawnerProps:R})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(h=t.querySelector('[data-action="confirm"]'))==null||h.addEventListener("click",p),(f=t.querySelector('[data-action="cancel"]'))==null||f.addEventListener("click",u),(m=t.querySelector(".add-menu-modal-close"))==null||m.addEventListener("click",u),t.addEventListener("click",b=>{b.target===t&&u()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
|
|
498
|
+
`))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await Promise.resolve().then(()=>(K(),je));g(r,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var r,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
|
|
499
|
+
`))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,w,E,k,M,x,j,O,T,A,_,P;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let C=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((n=S==null?void 0:S.errors)==null?void 0:n.join(`
|
|
500
500
|
`))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(C){alert(`Failed to create collectable system: ${C instanceof Error?C.message:String(C)}`)}if(e==="drag-snap-couples")try{let C=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((o=S==null?void 0:S.errors)==null?void 0:o.join(`
|
|
501
501
|
`))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(C){alert(`Failed to create drag-snap system: ${C instanceof Error?C.message:String(C)}`)}if(e==="swerve-collect")try{let C=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((d=S==null?void 0:S.errors)==null?void 0:d.join(`
|
|
502
502
|
`))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(C){alert(`Failed to create swerve collect system: ${C instanceof Error?C.message:String(C)}`)}if(e==="tap-destroy")try{let C=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((g=S==null?void 0:S.errors)==null?void 0:g.join(`
|
|
503
503
|
`))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(h=this.options).onRefresh)==null||f.call(h)}catch(C){alert(`Failed to create tap destroy system: ${C instanceof Error?C.message:String(C)}`)}if(e==="scratch-card")try{let C=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((m=S==null?void 0:S.errors)==null?void 0:m.join(`
|
|
504
504
|
`))||(S==null?void 0:S.error)||"Failed to create scratch card system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(y=(b=this.options).onRefresh)==null||y.call(b)}catch(C){alert(`Failed to create scratch card system: ${C instanceof Error?C.message:String(C)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let S=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),I=await S.json().catch(()=>({}));if(!S.ok||(I==null?void 0:I.success)===!1){let L=((v=I==null?void 0:I.errors)==null?void 0:v.join(`
|
|
505
505
|
`))||(I==null?void 0:I.error)||"Failed to create start screen template.";alert(L);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(E=(w=this.options).onRefresh)==null||E.call(w)}catch(C){alert(`Failed to create start screen template: ${C instanceof Error?C.message:String(C)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let S=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),I=await S.json().catch(()=>({}));if(!S.ok||(I==null?void 0:I.success)===!1){let L=((k=I==null?void 0:I.errors)==null?void 0:k.join(`
|
|
506
|
-
`))||(I==null?void 0:I.error)||"Failed to create endgame screen template.";alert(L);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(x=(
|
|
506
|
+
`))||(I==null?void 0:I.error)||"Failed to create endgame screen template.";alert(L);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(x=(M=this.options).onRefresh)==null||x.call(M)}catch(C){alert(`Failed to create endgame screen template: ${C instanceof Error?C.message:String(C)}`)}if(e==="bullet-system")try{let C=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await C.json().catch(()=>({}));if(!C.ok||(S==null?void 0:S.success)===!1){let I=((j=S==null?void 0:S.errors)==null?void 0:j.join(`
|
|
507
507
|
`))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(O=this.options).onRefresh)==null||T.call(O)}catch(C){alert(`Failed to create bullet system: ${C instanceof Error?C.message:String(C)}`)}if(e==="spawner"){let C=await this.promptSpawnerConfig();if(!C)return;let{templateId:S,instanceId:I,spawnerProps:L}=C;try{let R=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:S,instanceId:I,spawnerProps:L})}),z=await R.json().catch(()=>({}));if(!R.ok||(z==null?void 0:z.success)===!1){let N=((A=z==null?void 0:z.errors)==null?void 0:A.join(`
|
|
508
508
|
`))||(z==null?void 0:z.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(P=(_=this.options).onRefresh)==null||P.call(_)}catch(R){alert(`Failed to create spawner: ${R instanceof Error?R.message:String(R)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var ki=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.showTemplates=!1;this.isContextMenuOpen=!1;this.systemBundles=new Map}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getShowTemplatesStorageKey(){return`handler_preview_show_templates::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
509
509
|
<div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
|
|
@@ -544,7 +544,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
544
544
|
</div>
|
|
545
545
|
<div class="panel-resize-handle-v" data-panel-resize-v></div>
|
|
546
546
|
</div>
|
|
547
|
-
`}initialize(e,t){var r,o,l,c,d,p,u,g,h;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",f=>{let m=f.target,b=m==null?void 0:m.closest("[data-object-visibility-toggle][data-object-id]");if(b){let E=b.dataset.objectId;if(!E)return;f.preventDefault(),f.stopPropagation(),this.toggleObjectVisibility(E);return}let y=m==null?void 0:m.closest("[data-system-bundle-action][data-system-bundle-id]");if(!y)return;f.preventDefault(),f.stopPropagation();let v=y.dataset.systemBundleAction,w=y.dataset.systemBundleId;if(!(!v||!w)){if(v==="toggle-visibility"){this.toggleSystemBundleVisibility(w);return}v==="delete"&&this.deleteSystemBundle(w)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",f=>{f.stopPropagation();let m=i.getBoundingClientRect();this.openAddObjectMenu({x:m.left,y:m.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let f=window.localStorage.getItem(this.getScreenFilterStorageKey());f&&(this.screenFilter=f)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let f=n.value||"all";this.screenFilter=f;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()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let f=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=f==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",f=>{let m=f.target;if(!m||m.closest("[data-context-menu]"))return;if(m.tagName==="INPUT"&&m.classList.contains("scene-object-checkbox")){let k=m.dataset.objectId;if(!k)return;f.stopPropagation(),this.toggleBatchSelect(k);return}let b=m.closest(".scene-object-item[data-object-id]");if(!b)return;let y=b.dataset.objectId;if(!y)return;let v=f.ctrlKey||f.metaKey;f.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,y):v?this.toggleBatchSelect(y):this.select(y)}),(h=this.listContainer)==null||h.addEventListener("contextmenu",f=>{var k;let m=f.target,b=m==null?void 0:m.closest("[data-object-id]");if(!b)return;let y=b.dataset.objectId;if(!y)return;f.preventDefault();let v=window.getEditableObjectConfig,w=typeof v=="function"?v(y):null;if(!w){let
|
|
547
|
+
`}initialize(e,t){var r,o,l,c,d,p,u,g,h;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",f=>{let m=f.target,b=m==null?void 0:m.closest("[data-object-visibility-toggle][data-object-id]");if(b){let E=b.dataset.objectId;if(!E)return;f.preventDefault(),f.stopPropagation(),this.toggleObjectVisibility(E);return}let y=m==null?void 0:m.closest("[data-system-bundle-action][data-system-bundle-id]");if(!y)return;f.preventDefault(),f.stopPropagation();let v=y.dataset.systemBundleAction,w=y.dataset.systemBundleId;if(!(!v||!w)){if(v==="toggle-visibility"){this.toggleSystemBundleVisibility(w);return}v==="delete"&&this.deleteSystemBundle(w)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",f=>{f.stopPropagation();let m=i.getBoundingClientRect();this.openAddObjectMenu({x:m.left,y:m.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let f=window.localStorage.getItem(this.getScreenFilterStorageKey());f&&(this.screenFilter=f)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let f=n.value||"all";this.screenFilter=f;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()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let f=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=f==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",f=>{let m=f.target;if(!m||m.closest("[data-context-menu]"))return;if(m.tagName==="INPUT"&&m.classList.contains("scene-object-checkbox")){let k=m.dataset.objectId;if(!k)return;f.stopPropagation(),this.toggleBatchSelect(k);return}let b=m.closest(".scene-object-item[data-object-id]");if(!b)return;let y=b.dataset.objectId;if(!y)return;let v=f.ctrlKey||f.metaKey;f.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,y):v?this.toggleBatchSelect(y):this.select(y)}),(h=this.listContainer)==null||h.addEventListener("contextmenu",f=>{var k;let m=f.target,b=m==null?void 0:m.closest("[data-object-id]");if(!b)return;let y=b.dataset.objectId;if(!y)return;f.preventDefault();let v=window.getEditableObjectConfig,w=typeof v=="function"?v(y):null;if(!w){let M=window.__editableObjectConfigs;M&&typeof M.get=="function"&&(w=(k=M.get(y))!=null?k:null)}let E=this.inferScreen(y,w);this.showContextMenu(y,E,f.clientX,f.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),f=h==null?void 0:h.querySelector(".scene-object-checkbox");f&&(f.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},f=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),m=this.formatDisplayName(f);i.textContent=h[g]||g,n.textContent=m,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var v;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let w=window.__editableObjectConfigs;w&&typeof w.keys=="function"&&(i=Array.from(w.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((v=this.searchInput)==null?void 0:v.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],r=Object.fromEntries(a.map(w=>[w,[]])),o=Object.fromEntries(a.map(w=>[w,[]])),l=[],c=[],d=new Map;this.systemBundles=new Map;let p=w=>{var M,x,j,O,T;let E=(O=(j=(x=(M=window.__editableConfig)==null?void 0:M.objects)==null?void 0:x.get)==null?void 0:j.call(x,w))!=null?O:null;if(E)return E;let k=window.__editableObjectConfigs;return k&&typeof k.get=="function"&&(T=k.get(w))!=null?T:null};i.forEach(w=>{var N,F,q,J,He,fe,me,Je;let E=p(w),k=(((N=E==null?void 0:E.identity)==null?void 0:N.category)||"scene").toString(),M=(((F=E==null?void 0:E.identity)==null?void 0:F.id)||w).toString(),x=k.toLowerCase(),j=M.toLowerCase(),O=x.includes("ui")||j.startsWith("ui")||j.includes("label"),T=x==="system",A=((q=E==null?void 0:E.identity)==null?void 0:q.is_template)===!0||j.includes(".template")||w.toLowerCase().includes(".template"),_=typeof((J=E==null?void 0:E.identity)==null?void 0:J.system_group)=="string"?E.identity.system_group:null,P=typeof((He=E==null?void 0:E.identity)==null?void 0:He.system_label)=="string"?E.identity.system_label:_?this.formatDisplayName(_):null,C=this.formatDisplayName(M||w),S=((fe=E==null?void 0:E.render)==null?void 0:fe.visible)===!1||(E==null?void 0:E.enabled)===!1,I=this.getObjectType(E),L={id:w,label:C,category:k,isUi:O,isTemplate:A,isUnused:S,objectType:I,systemGroupId:_,systemLabel:P},R=this.inferScreen(L.id,E);if(!(this.screenFilter!=="all"&&R!==this.screenFilter||!(!n||L.id.toLowerCase().includes(n)||L.label.toLowerCase().includes(n)))){if(_){if(A&&!this.showTemplates)return;let H=(me=d.get(_))!=null?me:[];H.push(L),d.set(_,H);let ee=(Je=this.systemBundles.get(_))!=null?Je:{label:P!=null?P:_,objectIds:[]};ee.label=P!=null?P:ee.label,ee.objectIds.push(w),this.systemBundles.set(_,ee);return}if(A){if(!this.showTemplates)return;c.push(L);return}T?l.push(L):(L.isUnused?o:r)[R].push(L)}});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=[...Array.from(d.entries()).map(([w,E])=>{var k,M,x,j;return{groupId:w,label:(M=(k=this.systemBundles.get(w))==null?void 0:k.label)!=null?M:w,objectIds:(j=(x=this.systemBundles.get(w))==null?void 0:x.objectIds)!=null?j:[],entries:E}})].sort((w,E)=>w.label.localeCompare(E.label)),f=h.length>0?this.renderSystemBundlesGroup(h):"",m=l.length>0?this.renderSystemGroup(l):"",b=a.map(w=>this.renderGroup(u[w],[...r[w],...o[w]])).join(""),y=c.length>0?this.renderGroup("Templates",c):"";if(this.listContainer.innerHTML=f+m+b+y,this.objectEntries=[...h.flatMap(w=>w.entries),...l,...a.flatMap(w=>[...r[w],...o[w]]),...c],l.length>0){let w=this.listContainer.querySelector("[data-delete-system-group]");w==null||w.addEventListener("click",E=>{E.stopPropagation(),this.deleteSystemGroup(l)})}this.updateSelectionUI()}renderSystemBundlesGroup(e){if(!e.length)return"";let t=e.map(i=>this.renderSystemBundle(i.groupId,i.label,i.objectIds,i.entries)).join("");return`
|
|
548
548
|
<div class="scene-object-group scene-object-group-system">
|
|
549
549
|
<div class="scene-object-group-title">
|
|
550
550
|
<span>\u{1F9E9} Systems <span class="scene-object-count">${e.length}</span></span>
|
|
@@ -628,7 +628,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var
|
|
|
628
628
|
`))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}}async moveMultipleObjects(e,t){var r;let i=0,n=0,a=[];for(let o of e){let l=this.inferScreen(o,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:o,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
|
|
629
629
|
`))||(d==null?void 0:d.error)||"Move failed.";a.push(`${o}: ${p}`)}}catch(c){n++,a.push(`${o}: ${c instanceof Error?c.message:String(c)}`)}}if(n>0){let o=a.length>0?a.join(`
|
|
630
630
|
`):`${n} object(s) failed to move.`;alert(`Moved ${i} object(s). Errors:
|
|
631
|
-
${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Pi=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
|
|
631
|
+
${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Pi=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}render(){return`
|
|
632
632
|
<div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
|
|
633
633
|
<div class="scene-tools-header" data-tools-header data-panel-handle>
|
|
634
634
|
<span class="scene-tools-title">Scene Tools</span>
|
|
@@ -671,9 +671,21 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
|
|
|
671
671
|
<input type="checkbox" id="debug-nudge-enabled">
|
|
672
672
|
<label for="debug-nudge-enabled" title="Enable nudge panel with position and scale controls">Enable nudging</label>
|
|
673
673
|
</div>
|
|
674
|
+
<div class="debug-field checkbox-field">
|
|
675
|
+
<input type="checkbox" id="scene-grid-enabled">
|
|
676
|
+
<label for="scene-grid-enabled" title="Toggle the scene grid overlay">Show grid</label>
|
|
677
|
+
</div>
|
|
678
|
+
<div class="debug-field">
|
|
679
|
+
<label for="scene-grid-gap">Grid gap</label>
|
|
680
|
+
<input type="number" id="scene-grid-gap" min="4" max="200" step="2">
|
|
681
|
+
</div>
|
|
682
|
+
<div class="debug-field checkbox-field">
|
|
683
|
+
<input type="checkbox" id="scene-play-mode">
|
|
684
|
+
<label for="scene-play-mode" title="Sync Scene view with live gameplay (read-only)">Sync with gameplay</label>
|
|
685
|
+
</div>
|
|
674
686
|
</div>
|
|
675
687
|
</div>
|
|
676
|
-
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var
|
|
688
|
+
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var m;this.isCollapsed=!this.isCollapsed,(m=this.root)==null||m.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(m,b)=>{var v;let y=(v=this.root)==null?void 0:v.querySelector(`[data-status="${m}"]`);y&&y.classList.toggle("active",b)},r=this.root.querySelector("#debug-highlight-object");r==null||r.addEventListener("change",()=>{var m;(m=this.options)==null||m.onHighlightObject(!!r.checked),a("bounds",r.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var m;(m=this.options)==null||m.onHighlightAnchor(!!o.checked),a("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),p=this.root.querySelector("#scene-play-mode"),u=(m,b)=>{var y,v;(v=(y=this.options)==null?void 0:y.onGridToggle)==null||v.call(y,m,b),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:m,gap:b}}))},g=m=>{var b,y;(y=(b=this.options)==null?void 0:b.onGridGapChange)==null||y.call(b,m),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:m}}))},h=m=>{var b,y;(y=(b=this.options)==null?void 0:b.onPlayModeChange)==null||y.call(b,m),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:m}}))},f=()=>{if(!d)return 50;let m=Number(d.value),b=Number.isFinite(m)?Math.min(200,Math.max(4,m)):50;return d.value=String(b),b};try{let m=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),b=localStorage.getItem(this.getSceneStorageKey("grid_gap")),y=localStorage.getItem(this.getSceneStorageKey("play_mode"));c&&(c.checked=m?m==="true":!1),d&&(d.value=b||"50",d.disabled=!(c!=null&&c.checked)),p&&(p.checked=y==="true")}catch{}c==null||c.addEventListener("change",()=>{let m=f();d&&(d.disabled=!c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(m))}catch{}u(c.checked,m)}),d==null||d.addEventListener("input",()=>{let m=f();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(m))}catch{}g(m)}),p==null||p.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),p.checked?"true":"false")}catch{}h(p.checked)})}updateInfo(e){}};var Ii=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
677
689
|
<div class="nudge-panel hidden" data-panel="nudge-panel">
|
|
678
690
|
<div class="nudge-panel-header" data-panel-handle>
|
|
679
691
|
<span class="nudge-panel-title">Nudge Controls</span>
|
|
@@ -749,7 +761,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
|
|
|
749
761
|
</div>
|
|
750
762
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
751
763
|
</div>
|
|
752
|
-
`}initialize(e,t){var a,r,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(r=this.root)==null?void 0:r.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let r=document.createElement("div");r.className="library-category-header",r.textContent=this.formatCategoryName(i),a.appendChild(r);let o=document.createElement("div");o.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);o.appendChild(c)}a.appendChild(o),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let r=document.createElement("div");r.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},r.appendChild(o),a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let h=document.createElement("button");h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),p.appendChild(h);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=i?"\u25BC":"\u25B6",p.appendChild(f),a.appendChild(p),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(r=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of r)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let d=document.createElement("div");d.className="library-item";let p=document.createElement("img");p.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,p.alt=c.displayName,p.className="library-thumbnail",p.onerror=()=>{p.style.opacity="0.3"},d.appendChild(p);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,d.appendChild(u),d.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(d)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",d.error),alert(`Upload failed: ${d.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var r;let a=(r=this.slotsContainer)==null?void 0:r.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var ji=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var Mi=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
|
|
764
|
+
`}initialize(e,t){var a,r,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(r=this.root)==null?void 0:r.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let r=document.createElement("div");r.className="library-category-header",r.textContent=this.formatCategoryName(i),a.appendChild(r);let o=document.createElement("div");o.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);o.appendChild(c)}a.appendChild(o),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let r=document.createElement("div");r.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},r.appendChild(o),a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let h=document.createElement("button");h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),p.appendChild(h);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=i?"\u25BC":"\u25B6",p.appendChild(f),a.appendChild(p),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(r=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of r)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let d=document.createElement("div");d.className="library-item";let p=document.createElement("img");p.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,p.alt=c.displayName,p.className="library-thumbnail",p.onerror=()=>{p.style.opacity="0.3"},d.appendChild(p);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,d.appendChild(u),d.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(d)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",d.error),alert(`Upload failed: ${d.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var r;let a=(r=this.slotsContainer)==null?void 0:r.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Mi=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var ji=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
|
|
753
765
|
<div class="inspector-property" data-property-type="image">
|
|
754
766
|
<div class="inspector-property-header">
|
|
755
767
|
<label class="inspector-label">${a}</label>
|
|
@@ -910,7 +922,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
|
|
|
910
922
|
</select>
|
|
911
923
|
</div>
|
|
912
924
|
</div>
|
|
913
|
-
`);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${h}.${b}`,w=o[b];if(b==="targetId"||b==="inputId"){let E=this.registry.getObjectIds(),k=typeof y=="string"?y:"",
|
|
925
|
+
`);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${h}.${b}`,w=o[b];if(b==="targetId"||b==="inputId"){let E=this.registry.getObjectIds(),k=typeof y=="string"?y:"",M=k&&!E.includes(k)?[k,...E]:E;m.push(`
|
|
914
926
|
<div class="inspector-property inspector-property-text">
|
|
915
927
|
<label class="inspector-property-label">${this.formatLabel(b)}</label>
|
|
916
928
|
<div class="inspector-input-group">
|
|
@@ -918,7 +930,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
|
|
|
918
930
|
data-property-path="${v}"
|
|
919
931
|
data-object-id="${e}">
|
|
920
932
|
<option value="" ${k?"":"selected"}>None</option>
|
|
921
|
-
${
|
|
933
|
+
${M.map(x=>`<option value="${x}" ${x===k?"selected":""}>${x}</option>`).join("")}
|
|
922
934
|
</select>
|
|
923
935
|
</div>
|
|
924
936
|
</div>
|
|
@@ -1048,7 +1060,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
|
|
|
1048
1060
|
</div>
|
|
1049
1061
|
</div>
|
|
1050
1062
|
</div>
|
|
1051
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ui=class{constructor(){this.typeDetector=new
|
|
1063
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ui=class{constructor(){this.typeDetector=new Mi,this.imageRenderer=new ji,this.colorRenderer=new _i,this.numberRenderer=new Oi,this.textRenderer=new Ri,this.booleanRenderer=new zi,this.arrayRenderer=new $i(this),this.objectRenderer=new Di(this),this.selectRenderer=new Hi,this.jsonRenderer=new Ni,this.spawnPointsRenderer=new Fi,this.spawnTemplatesRenderer=new Bi(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let r=String(e||"").split(".").filter(Boolean);if(r.length<2)return null;let o=r[0],l=r.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,r)=>a.localeCompare(r))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),r=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((r||o)&&typeof i=="string"){let h=this.getLogicOptions(),f=this.selectRenderer.render(e,t,i,n,h);return r?`
|
|
1052
1064
|
${f}
|
|
1053
1065
|
<div class="inspector-array-actions">
|
|
1054
1066
|
<button class="inspector-button"
|
|
@@ -1058,7 +1070,7 @@ ${f}
|
|
|
1058
1070
|
Add Logic
|
|
1059
1071
|
</button>
|
|
1060
1072
|
</div>
|
|
1061
|
-
`:f}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),f=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?f+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':f}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let f=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,f)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let f=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,f,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function
|
|
1073
|
+
`:f}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),f=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?f+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':f}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let f=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,f)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let f=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,f,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function tl(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Gi=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new Ui,this.updateManager=new Oe,this.quickActions=new Ci;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
1062
1074
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
|
|
1063
1075
|
<div class="scene-panel-header" data-panel-handle>
|
|
1064
1076
|
<div class="panel-title">
|
|
@@ -1156,11 +1168,11 @@ ${f}
|
|
|
1156
1168
|
${m.join("")}
|
|
1157
1169
|
</div>
|
|
1158
1170
|
</div>
|
|
1159
|
-
`);let E=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),k=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),
|
|
1171
|
+
`);let E=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),k=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),M=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),x=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),j=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(E.length||k.length||M.length||x.length||j.length){let T=(_,P)=>P.length?`
|
|
1160
1172
|
<div class="inspector-motion-continuous-group">
|
|
1161
1173
|
<div class="inspector-subsection-title">${_}</div>
|
|
1162
1174
|
<div class="inspector-subsection-content">${P.join("")}</div>
|
|
1163
|
-
</div>`:"",A=[T("Pulse",E),T("Swing",k),T("Move forever",
|
|
1175
|
+
</div>`:"",A=[T("Pulse",E),T("Swing",k),T("Move forever",M),T("Rotate (pivoting itself)",x),T("Rotate around",j)].filter(Boolean).join("");n.push(`
|
|
1164
1176
|
<div class="inspector-subsection inspector-subsection-continuous">
|
|
1165
1177
|
<div class="inspector-subsection-title">Continuous</div>
|
|
1166
1178
|
<div class="inspector-subsection-content inspector-motion-continuous-groups">
|
|
@@ -1180,7 +1192,7 @@ ${f}
|
|
|
1180
1192
|
${n.join("")}
|
|
1181
1193
|
</div>
|
|
1182
1194
|
</div>
|
|
1183
|
-
`}attachEventListeners(){var w,E,k,j;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=el((x,M,O)=>{var T,A;this.updateManager.updateProperty(x,M,O),(A=(T=this.options)==null?void 0:T.onPropertyChange)==null||A.call(T,x,M,O)},300),i=x=>x?/(^|\.)logic(\.\d+)?\.id$/.test(x):!1;e.forEach(x=>{let M=T=>{var C,S;let A=T.target,_=A.dataset.propertyPath,P=A.dataset.objectId;if(_&&P){let I=A.value;if(A.type==="checkbox")I=A.checked;else if(A.type==="number"){if(I=parseFloat(A.value),isNaN(I))return}else if(A.dataset.json==="true")try{I=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(P,_,I):(this.updateManager.updateProperty(P,_,I),(S=(C=this.options)==null?void 0:C.onPropertyChange)==null||S.call(C,P,_,I))}},O=x.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),x.addEventListener("change",async T=>{var z;let A=T.target,_=A.dataset.propertyPath,P=A.dataset.objectId,C=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",C),!_||!P)return;await this.updateManager.updateProperty(P,_,C),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,I=(z=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:z[C],L=this.getDefaultPropsForLogic(C,I);console.log("[Inspector v1.0.0] New logic default props:",L);let R=_.replace(/\.id$/,".props");await this.updateManager.updateProperty(P,R,L),console.log("[Inspector v1.0.0] Logic props updated to:",L),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(P)})):(x.addEventListener("change",M),(x.tagName==="INPUT"||x.tagName==="TEXTAREA")&&x.addEventListener("input",M))}),this.contentContainer.querySelectorAll("[data-action]").forEach(x=>{x.addEventListener("click",M=>{let O=M.target,T=O.dataset.action,A=O.dataset.path,_=O.dataset.object;T&&A&&_&&this.quickActions.handleAction(T,_,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(x=>{x.addEventListener("click",M=>{var A,_;let O=M.target,T=O.dataset.sectionToggle||((A=O.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(T){let P=(_=this.contentContainer)==null?void 0:_.querySelector(`[data-section="${T}"]`);P==null||P.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(x=>{x.addEventListener("click",async M=>{let T=M.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(x=>{x.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(x=>{x.addEventListener("click",async M=>{let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S=Array.isArray(C)?[...C]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(x=>{x.addEventListener("click",async M=>{let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number(O.dataset.index||"-1");if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((L,R)=>R!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(x=>{x.addEventListener("click",async M=>{let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S=Array.isArray(C)?[...C]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(x=>{x.addEventListener("click",async M=>{var L;let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((L=O.dataset.index)!=null?L:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((R,z)=>z!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(x=>{x.addEventListener("click",async M=>{var N;let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S;Array.isArray(C)?S=[...C]:C!=null?typeof C=="string"?S=[{id:C,props:{}}]:typeof C=="object"?S=[C]:S=[]:S=[];let I=this.getDefaultLogicId(),L=window,R=(N=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:N[I],z=this.getDefaultPropsForLogic(I,R);S.push({id:I,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:T,path:A,current:C,next:S}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(x=>{x.addEventListener("click",async M=>{var L;let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((L=O.dataset.index)!=null?L:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((R,z)=>z!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(x=>{x.addEventListener("click",async M=>{var F,q;let O=M.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((F=O.dataset.index)!=null?F:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S[_];if(typeof I!="string")return;let L=window,R=(q=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:q[I],z=this.getDefaultPropsForLogic(I,R),N=[...S];N[_]={id:I,props:z},await this.updateManager.updateProperty(T,A,N),this.loadObject(T)})});let m=(w=this.root)==null?void 0:w.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(E=this.root)==null?void 0:E.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var M;let x=(M=this.root)==null?void 0:M.querySelector("[data-convert-menu]");x==null||x.classList.toggle("hidden")});let y=(k=this.contentContainer)==null?void 0:k.querySelector("[data-inspector-add-component-btn]"),v=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let x=v.value;x&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,x)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
1195
|
+
`}attachEventListeners(){var w,E,k,M;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=tl((x,j,O)=>{var T,A;this.updateManager.updateProperty(x,j,O),(A=(T=this.options)==null?void 0:T.onPropertyChange)==null||A.call(T,x,j,O)},300),i=x=>x?/(^|\.)logic(\.\d+)?\.id$/.test(x):!1;e.forEach(x=>{let j=T=>{var C,S;let A=T.target,_=A.dataset.propertyPath,P=A.dataset.objectId;if(_&&P){let I=A.value;if(A.type==="checkbox")I=A.checked;else if(A.type==="number"){if(I=parseFloat(A.value),isNaN(I))return}else if(A.dataset.json==="true")try{I=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(P,_,I):(this.updateManager.updateProperty(P,_,I),(S=(C=this.options)==null?void 0:C.onPropertyChange)==null||S.call(C,P,_,I))}},O=x.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),x.addEventListener("change",async T=>{var z;let A=T.target,_=A.dataset.propertyPath,P=A.dataset.objectId,C=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",C),!_||!P)return;await this.updateManager.updateProperty(P,_,C),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,I=(z=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:z[C],L=this.getDefaultPropsForLogic(C,I);console.log("[Inspector v1.0.0] New logic default props:",L);let R=_.replace(/\.id$/,".props");await this.updateManager.updateProperty(P,R,L),console.log("[Inspector v1.0.0] Logic props updated to:",L),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(P)})):(x.addEventListener("change",j),(x.tagName==="INPUT"||x.tagName==="TEXTAREA")&&x.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(x=>{x.addEventListener("click",j=>{let O=j.target,T=O.dataset.action,A=O.dataset.path,_=O.dataset.object;T&&A&&_&&this.quickActions.handleAction(T,_,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(x=>{x.addEventListener("click",j=>{var A,_;let O=j.target,T=O.dataset.sectionToggle||((A=O.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(T){let P=(_=this.contentContainer)==null?void 0:_.querySelector(`[data-section="${T}"]`);P==null||P.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(x=>{x.addEventListener("click",async j=>{let T=j.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(x=>{x.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(x=>{x.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S=Array.isArray(C)?[...C]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(x=>{x.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number(O.dataset.index||"-1");if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((L,R)=>R!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(x=>{x.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S=Array.isArray(C)?[...C]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(x=>{x.addEventListener("click",async j=>{var L;let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((L=O.dataset.index)!=null?L:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((R,z)=>z!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(x=>{x.addEventListener("click",async j=>{var N;let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let _=window.getEditableObjectConfig,P=_==null?void 0:_(T);if(!P)return;let C=this.updateManager.getNestedProperty(P,A),S;Array.isArray(C)?S=[...C]:C!=null?typeof C=="string"?S=[{id:C,props:{}}]:typeof C=="object"?S=[C]:S=[]:S=[];let I=this.getDefaultLogicId(),L=window,R=(N=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:N[I],z=this.getDefaultPropsForLogic(I,R);S.push({id:I,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:T,path:A,current:C,next:S}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(x=>{x.addEventListener("click",async j=>{var L;let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((L=O.dataset.index)!=null?L:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S.filter((R,z)=>z!==_);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(x=>{x.addEventListener("click",async j=>{var F,q;let O=j.target,T=O.dataset.objectId,A=O.dataset.propertyPath,_=Number((F=O.dataset.index)!=null?F:-1);if(!T||!A||_<0)return;let P=window.getEditableObjectConfig,C=P==null?void 0:P(T);if(!C)return;let S=this.updateManager.getNestedProperty(C,A);if(!Array.isArray(S))return;let I=S[_];if(typeof I!="string")return;let L=window,R=(q=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:q[I],z=this.getDefaultPropsForLogic(I,R),N=[...S];N[_]={id:I,props:z},await this.updateManager.updateProperty(T,A,N),this.loadObject(T)})});let m=(w=this.root)==null?void 0:w.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(E=this.root)==null?void 0:E.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let x=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");x==null||x.classList.toggle("hidden")});let y=(k=this.contentContainer)==null?void 0:k.querySelector("[data-inspector-add-component-btn]"),v=(M=this.contentContainer)==null?void 0:M.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let x=v.value;x&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,x)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
1184
1196
|
<div class="inspector-empty">
|
|
1185
1197
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
1186
1198
|
<span class="inspector-empty-text">${e}</span>
|
|
@@ -1190,7 +1202,7 @@ ${f}
|
|
|
1190
1202
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
1191
1203
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
1192
1204
|
</div>
|
|
1193
|
-
`)}};function
|
|
1205
|
+
`)}};var Ki=tt(require("jszip"),1);function na(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function Ws(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ys(s){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=s})}async function qi(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await na(n),r=await Ys(a),o=Ws(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Re(s){var e,t;try{let i=await na(s),n=await Ys(i),a=Ws(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function aa(s){return na(s).then(e=>e).catch(()=>null)}function sa(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function lt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],f=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(h-m.b,2))<e){f=!0;break}f&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function Ks(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ae(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function X(s){return typeof s=="string"?s:void 0}function Xs(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function il(s){var i,n,a;let e=(i=X(s.id))!=null?i:X(s.name);if(e)return e;let t=(n=X(s.file))!=null?n:X(s.asset);return t?Xs((a=t.split("/").pop())!=null?a:t):void 0}function nl(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Ae(e)){let r=(i=X(e.file))!=null?i:X(e.asset);return r?{id:(n=X(e.id))!=null?n:s,file:r,role:(a=X(e.role))!=null?a:t,dataUrl:X(e.dataUrl),layout:e.layout}:null}return null}function ra(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=Xs((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Ae(r)){let o=il(r),l=(i=X(r.file))!=null?i:X(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=X(r.role))!=null?n:e,dataUrl:X(r.dataUrl),layout:r.layout})}}return a}if(Ae(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=nl(r,o,e);l&&a.push(l)}return a}return[]}function al(s){var e,t;return(t=(e=X(s.brand_name))!=null?e:X(s.brandName))!=null?t:X(s.name)}function sl(s){if(Ae(s.brand_dna)&&Ae(s.brand_dna.colors))return s.brand_dna;if(Ae(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Ae(s.fonts)&&(e.fonts=s.fonts),e}}function rl(s){var t;let e=new Map;for(let i of s){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Js(s,e={}){var r,o,l;let t=s.filter(Ae),i=(o=(r=t.map(al).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(sl).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...ra(c.layers,"visual element")),"assets"in c&&a.push(...ra(c.assets,"visual element")),Ae(c.endgame)&&"assets"in c.endgame&&a.push(...ra(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:rl(a)}}var Zs=require("@google/genai");async function Vi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let p=new Zs.GoogleGenAI({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),f="",m=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(m)for(let b of m)b.text&&(f+=b.text);if(!f.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${f.length}`),f}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}var Qs=require("@google/genai");async function ct(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Qs.GoogleGenAI({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function er(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),r}).join(`
|
|
1194
1206
|
`)||"None",t=s.brandDna?`Colors: ${JSON.stringify(s.brandDna.colors)}, Style: ${s.brandDna.style||"not specified"}`:"Not provided",i=s.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
|
|
1195
1207
|
`),n="";if(s.brandConfig){let a=s.brandConfig,r=[];a.splash&&r.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&r.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&r.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),r.length>0&&(n=`
|
|
1196
1208
|
BRAND CONTENT:
|
|
@@ -1254,7 +1266,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
|
|
|
1254
1266
|
}
|
|
1255
1267
|
]
|
|
1256
1268
|
}
|
|
1257
|
-
`.trim()}function
|
|
1269
|
+
`.trim()}function tr(s){var n,a;let e=(n=s.brandDna)!=null&&n.colors?`Primary: ${s.brandDna.colors.primary}, Secondary: ${s.brandDna.colors.secondary||"N/A"}, Accent: ${s.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=s.brandDna)==null?void 0:a.style)||"modern gaming style",i=s.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
|
|
1258
1270
|
TASK: ${s.prompt}
|
|
1259
1271
|
|
|
1260
1272
|
BRAND STYLE:
|
|
@@ -1275,7 +1287,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
1275
1287
|
|
|
1276
1288
|
OUTPUT:
|
|
1277
1289
|
Generate the requested asset matching the brand style.${s.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
1278
|
-
`.trim()}function tr(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function ir(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function nr(s){var r,o;let e=tr(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=Qs(t),n=[];if(s.flatDesignDataUrl)try{let l=ar(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Vi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return rl(a,s.gameObjects)}function rl(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function ra(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await ol(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function ol(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await Oe(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=ar(s.flatDesignDataUrl);o&&t.push(o)}let i=ir(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=er(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await ct(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await lt(r)||r}function ar(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function sr(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await Oe(a);r&&(n.dataUrl=r.dataUrl)}}}function rr(s){let e=new Map;if(!s)return e;if(s!=null&&s.layers&&Array.isArray(s.layers))for(let t of s.layers){let i=t.asset||t.id||t.name;i&&t.layout&&e.set(i,{position:t.layout.position||{x:0,y:0},scale:t.layout.scale||1,rotation:t.layout.rotation||0})}if(typeof s=="object"&&!Array.isArray(s)){for(let[t,i]of Object.entries(s))if(i&&typeof i=="object"&&"layout"in i){let n=i.layout;e.set(t,{position:(n==null?void 0:n.position)||{x:0,y:0},scale:(n==null?void 0:n.scale)||1,rotation:(n==null?void 0:n.rotation)||0})}}return e}function or(s,e){if(!s||e.size===0)return null;if(e.has(s))return e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return e.get(t);for(let[i,n]of e.entries()){let a=i.toLowerCase(),r=t.toLowerCase();if(a===r||a.includes(r)||r.includes(a))return n}return null}function ll(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function lr(){var n,a,r,o,l,c,d;let s=window.getEditableObjectList,e=typeof s=="function"?s():[],t=window.getEditableObjectConfig;if(typeof t!="function")return[];let i=[];for(let p of e)try{let u=t(p);if(!u)continue;(((a=(n=u==null?void 0:u.render)==null?void 0:n.asset)==null?void 0:a.type)==="image"||(o=(r=u==null?void 0:u.render)==null?void 0:r.asset)!=null&&o.path||(l=u==null?void 0:u.render)!=null&&l.asset&&typeof u.render.asset=="string")&&i.push({id:p,name:ll(p),type:((d=(c=u==null?void 0:u.render)==null?void 0:c.asset)==null?void 0:d.type)||"sprite"})}catch(u){console.warn(`[CanvaZip] Failed to check object ${p}:`,u)}return i.sort((p,u)=>p.name.localeCompare(u.name))}var Dt=require("pixi.js");st();K();async function cr(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await Dt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)pe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function dr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await Dt.Assets.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of h)pe[m]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let f=window.gameObjectManager;if(f)for(let m of h){let b=f.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Wi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,f,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),E=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",E);let k=await Dt.Assets.load(E);if(!k){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),pe[v]=k,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let j=window.CustomAssets;j!=null&&j[v]&&(j[v].texture=k,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let x=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!x),x){let O=Array.from(((n=x.keys)==null?void 0:n.call(x))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let T=x.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,_=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",_),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=k,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(_==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:P}=await import("pixi.js"),C=A.parent,S=(l=(o=C==null?void 0:C.getChildIndex)==null?void 0:o.call(C,A))!=null?l:0,I={x:A.x,y:A.y},L={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},R={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(m=(f=A.scale)==null?void 0:f.y)!=null?m:1},z=(b=A.alpha)!=null?b:1,N=(y=A.visible)!=null?y:!0,F=new P(k);F.anchor.set(L.x,L.y),F.position.set(I.x,I.y),F.scale.set(R.x,R.y),F.alpha=z,F.visible=N,C&&(C.removeChild(A),C.addChildAt(F,S),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=F),T.pixi&&(T.pixi=F),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let P=A.children.find(C=>C.texture);P?(P.texture=k,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}`;ne({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 pr(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=Date.now(),o=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await Dt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}pe[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}ne({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var Yi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
|
|
1290
|
+
`.trim()}function ir(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function nr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function ar(s){var r,o;let e=ir(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=er(t),n=[];if(s.flatDesignDataUrl)try{let l=sr(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Vi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return ol(a,s.gameObjects)}function ol(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function oa(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await ll(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function ll(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await Re(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=sr(s.flatDesignDataUrl);o&&t.push(o)}let i=nr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=tr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await ct(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await lt(r)||r}function sr(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function rr(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await Re(a);r&&(n.dataUrl=r.dataUrl)}}}function or(s){var t,i;let e=new Map;if(!s)return e;if(s!=null&&s.layers&&Array.isArray(s.layers))for(let n of s.layers){let a=n.asset;if(!a||!n.layout)continue;let r=n.layout,o={x:typeof r.x=="number"?r.x:0,y:typeof r.y=="number"?r.y:0},l=typeof r.scaleX=="number"?r.scaleX:1,c=typeof r.scaleY=="number"?r.scaleY:1,d=(l+c)/2,p=typeof r.rotation=="number"?r.rotation:0;e.set(a,{position:o,scale:d,rotation:p})}if(e.size===0&&typeof s=="object"&&!Array.isArray(s)){for(let[n,a]of Object.entries(s))if(a&&typeof a=="object"&&"layout"in a){let r=a.layout,o={x:0,y:0},l=1,c=0;if(r.position&&typeof r.position=="object"?o={x:r.position.x||0,y:r.position.y||0}:(typeof r.x=="number"||typeof r.y=="number")&&(o={x:r.x||0,y:r.y||0}),typeof r.scale=="number")l=r.scale;else if(typeof r.scaleX=="number"||typeof r.scaleY=="number"){let d=(t=r.scaleX)!=null?t:1,p=(i=r.scaleY)!=null?i:1;l=(d+p)/2}typeof r.rotation=="number"&&(c=r.rotation),e.set(n,{position:o,scale:l,rotation:c})}}return e}function lr(s,e){if(!s||e.size===0)return null;if(e.has(s))return e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return e.get(t);for(let[i,n]of e.entries()){let a=i.toLowerCase(),r=t.toLowerCase();if(a===r||a.includes(r)||r.includes(a))return n}return null}function cl(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function cr(){var n,a,r,o,l,c,d;let s=window.getEditableObjectList,e=typeof s=="function"?s():[],t=window.getEditableObjectConfig;if(typeof t!="function")return[];let i=[];for(let p of e)try{let u=t(p);if(!u)continue;(((a=(n=u==null?void 0:u.render)==null?void 0:n.asset)==null?void 0:a.type)==="image"||(o=(r=u==null?void 0:u.render)==null?void 0:r.asset)!=null&&o.path||(l=u==null?void 0:u.render)!=null&&l.asset&&typeof u.render.asset=="string")&&i.push({id:p,name:cl(p),type:((d=(c=u==null?void 0:u.render)==null?void 0:c.asset)==null?void 0:d.type)||"sprite"})}catch(u){console.warn(`[CanvaZip] Failed to check object ${p}:`,u)}return i.sort((p,u)=>p.name.localeCompare(u.name))}var Dt=require("pixi.js");st();K();async function dr(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await Dt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)pe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function pr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await Dt.Assets.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of h)pe[m]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let f=window.gameObjectManager;if(f)for(let m of h){let b=f.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Wi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,f,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),E=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",E);let k=await Dt.Assets.load(E);if(!k){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),pe[v]=k,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let M=window.CustomAssets;M!=null&&M[v]&&(M[v].texture=k,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let x=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!x),x){let O=Array.from(((n=x.keys)==null?void 0:n.call(x))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let T=x.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,_=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",_),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=k,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(_==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:P}=await import("pixi.js"),C=A.parent,S=(l=(o=C==null?void 0:C.getChildIndex)==null?void 0:o.call(C,A))!=null?l:0,I={x:A.x,y:A.y},L={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},R={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(m=(f=A.scale)==null?void 0:f.y)!=null?m:1},z=(b=A.alpha)!=null?b:1,N=(y=A.visible)!=null?y:!0,F=new P(k);F.anchor.set(L.x,L.y),F.position.set(I.x,I.y),F.scale.set(R.x,R.y),F.alpha=z,F.visible=N,C&&(C.removeChild(A),C.addChildAt(F,S),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=F),T.pixi&&(T.pixi=F),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let P=A.children.find(C=>C.texture);P?(P.texture=k,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let j=`raw/library/${i}/${t}`;Q({objectId:v,path:"render.asset.path",value:j}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",j)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function ur(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=Date.now(),o=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await Dt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}pe[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Q({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var Yi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
|
|
1279
1291
|
<div class="canva-wizard-overlay" data-canva-wizard>
|
|
1280
1292
|
<div class="canva-wizard-modal">
|
|
1281
1293
|
<div class="canva-wizard-header">
|
|
@@ -1313,7 +1325,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1313
1325
|
</div>
|
|
1314
1326
|
</div>
|
|
1315
1327
|
</div>
|
|
1316
|
-
`}renderAssetCard(e,t){let n=e.position&&e.scale?`x: ${e.position.x.toFixed(0)}, y: ${e.position.y.toFixed(0)}, scale: ${e.scale.toFixed(2)}`:"No position data",a=e.action==="add"||e.action==="replace"?"active":"",r=e.action==="replace"?this.renderReplaceDropdown(e,t):"";return`
|
|
1328
|
+
`}renderAssetCard(e,t){let n=e.position&&e.scale?`x: ${e.position.x.toFixed(0)}, y: ${e.position.y.toFixed(0)}, scale: ${e.scale.toFixed(2)}`:"No position data",a=e.action==="add"||e.action==="replace"?"active":"",r=e.action==="replace"?this.renderReplaceDropdown(e,t):"",o=e.action==="add"?this.renderAddToSceneFields(e,t):"";return`
|
|
1317
1329
|
<div class="canva-asset-card ${a}" data-asset-index="${t}">
|
|
1318
1330
|
<div class="canva-asset-preview">
|
|
1319
1331
|
<img src="${e.dataUrl}" alt="${e.filename}" />
|
|
@@ -1350,8 +1362,29 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1350
1362
|
\u23ED\uFE0F Do Nothing
|
|
1351
1363
|
</button>
|
|
1352
1364
|
</div>
|
|
1365
|
+
${o}
|
|
1353
1366
|
${r}
|
|
1354
1367
|
</div>
|
|
1368
|
+
`}renderAddToSceneFields(e,t){return`
|
|
1369
|
+
<div class="canva-asset-add-scene" data-asset-add-scene="${t}">
|
|
1370
|
+
<div class="canva-asset-field">
|
|
1371
|
+
<label>Screen:</label>
|
|
1372
|
+
<select class="inspector-input inspector-input-sm" data-asset-screen="${t}">
|
|
1373
|
+
<option value="loading" ${e.screen==="loading"?"selected":""}>Loading</option>
|
|
1374
|
+
<option value="start" ${e.screen==="start"?"selected":""}>Start</option>
|
|
1375
|
+
<option value="gameplay" ${e.screen==="gameplay"||!e.screen?"selected":""}>Gameplay</option>
|
|
1376
|
+
<option value="tutorial" ${e.screen==="tutorial"?"selected":""}>Tutorial</option>
|
|
1377
|
+
<option value="endgame" ${e.screen==="endgame"?"selected":""}>Endgame</option>
|
|
1378
|
+
</select>
|
|
1379
|
+
</div>
|
|
1380
|
+
<div class="canva-asset-field">
|
|
1381
|
+
<label>Type:</label>
|
|
1382
|
+
<select class="inspector-input inspector-input-sm" data-asset-type="${t}">
|
|
1383
|
+
<option value="sprite" ${e.objectType==="sprite"||!e.objectType?"selected":""}>Sprite</option>
|
|
1384
|
+
<option value="ui-image" ${e.objectType==="ui-image"?"selected":""}>UI Image</option>
|
|
1385
|
+
</select>
|
|
1386
|
+
</div>
|
|
1387
|
+
</div>
|
|
1355
1388
|
`}renderReplaceDropdown(e,t){return this.replaceableObjects.length===0?'<div class="canva-asset-replace-hint">No replaceable objects found</div>':`
|
|
1356
1389
|
<div class="canva-asset-replace" data-asset-replace="${t}">
|
|
1357
1390
|
<label>Replace object:</label>
|
|
@@ -1360,7 +1393,8 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1360
1393
|
${this.replaceableObjects.map(i=>`<option value="${i.id}" ${e.targetObjectId===i.id?"selected":""}>${i.name}</option>`).join("")}
|
|
1361
1394
|
</select>
|
|
1362
1395
|
</div>
|
|
1363
|
-
`}initialize(e,t,i,n){this.options=n,this.positionMap=
|
|
1396
|
+
`}initialize(e,t,i,n){this.options=n,this.positionMap=or(i),this.replaceableObjects=cr(),this.assets=t.map(a=>{let r=lr(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:r==null?void 0:r.position,scale:r==null?void 0:r.scale,rotation:r==null?void 0:r.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-action")||"0"),l=r.getAttribute("data-action");this.handleAction(o,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-category")||"0"),l=r.value;this.assets[o]&&(this.assets[o].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-target")||"0"),l=r.value;this.assets[o]&&(this.assets[o].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-screen")||"0"),l=r.value;this.assets[o]&&(this.assets[o].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-type")||"0"),l=r.value;this.assets[o]&&(this.assets[o].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,r;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let o=this.assets[e],l=this.renderAssetCard(o,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",p=>{let u=p.target,g=parseInt(u.getAttribute("data-asset-action")||"0"),h=u.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].category=u)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=u)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].screen=u)}),(r=c.querySelector("[data-asset-type]"))==null||r.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].objectType=u)}))}}async applyAll(){if(this.options){for(let e of this.assets)e.action||(e.action="skip");this.processedCount=0,this.updateProgress();for(let e=0;e<this.assets.length;e++){let t=this.assets[e];try{let i=await this.saveAssetToLibrary(t);t.libraryPath=i,t.action==="add"?await this.addToScene(t):t.action==="replace"&&t.targetObjectId&&await this.replaceObject(t,t.targetObjectId),this.processedCount++,this.updateProgress()}catch(i){console.error(`[CanvaZip] Failed to process ${t.filename}:`,i)}}this.options.onComplete&&this.options.onComplete(this.assets),this.close()}}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async addToScene(e){var a;if(!e.screen||!e.objectType||!e.libraryPath)throw new Error(`Missing required fields: screen=${e.screen}, objectType=${e.objectType}, libraryPath=${e.libraryPath}`);console.log(`[CanvaZip] Add to scene: ${e.filename}`,{screen:e.screen,objectType:e.objectType,position:e.position,scale:e.scale,category:e.category,libraryPath:e.libraryPath});let t=e.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),i=`json.${t}`,n={identity:{id:i,category:e.category||"environment"},transform:{position:e.position||{x:0,y:0},offset:{x:0,y:0},scale:e.scale||1,rotation:e.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:e.libraryPath}},instance_id:t,object_config:i};try{let r=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:e.screen,instanceId:t,objectConfigId:i,layer:e.objectType==="ui-image"?"ui":"world",config:n})}),o=await r.json().catch(()=>({}));if(!r.ok||(o==null?void 0:o.success)===!1){let l=((a=o==null?void 0:o.errors)==null?void 0:a.join(`
|
|
1397
|
+
`))||(o==null?void 0:o.error)||"Failed to create object.";throw new Error(l)}try{let{trackObjectCreation:l}=await Promise.resolve().then(()=>(K(),je));l(t,e.screen,n)}catch(l){console.warn("[CanvaZip] Failed to track object creation:",l)}try{await this.syncScreens()}catch(l){console.warn("[CanvaZip] Failed to sync screens:",l)}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),console.log(`[CanvaZip] \u2705 Added ${e.filename} to scene ${e.screen} as ${e.objectType}`)}catch(r){throw console.error("[CanvaZip] Failed to add object to scene:",r),r}}async syncScreens(){try{let e=await fetch("/api/screens/sync",{method:"POST",headers:{"Content-Type":"application/json"}});if(!e.ok){let t=await e.json().catch(()=>({}));throw new Error((t==null?void 0:t.error)||"Failed to sync screens")}}catch(e){console.warn("[CanvaZip] Screen sync failed:",e)}}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await Wi(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var Xi=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.wizardProcessedAssets=new Set;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
|
|
1364
1398
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
1365
1399
|
<div class="scene-panel-header" data-panel-handle>
|
|
1366
1400
|
<div class="panel-title">
|
|
@@ -1475,15 +1509,15 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1475
1509
|
</div>
|
|
1476
1510
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
1477
1511
|
</div>
|
|
1478
|
-
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let f=h.dataset.visionTab;this.switchTab(f)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let f=h.target.value;this.switchUploadMethod(f)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||f.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||f.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||f.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||f.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let f=h.target;if(!f)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;b&&(f.closest("[data-mapping-apply-one]")&&this.applyOne(b),f.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),f.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),f.closest("[data-mapping-generate-one]")&&this.generateOne(b),f.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let f=h.target;if(!f||!this.mappingResult)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(f.matches("[data-mapping-action]")&&(y.action=String(f.value||"KEEP"),y.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(f.value||""),y.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let f=h.target;if(!f||!this.mappingResult||!f.matches("[data-mapping-prompt]"))return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(y.generation_prompt=String(f.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var
|
|
1512
|
+
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let f=h.dataset.visionTab;this.switchTab(f)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let f=h.target.value;this.switchUploadMethod(f)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||f.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||f.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||f.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||f.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let f=h.target;if(!f)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;b&&(f.closest("[data-mapping-apply-one]")&&this.applyOne(b),f.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),f.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),f.closest("[data-mapping-generate-one]")&&this.generateOne(b),f.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let f=h.target;if(!f||!this.mappingResult)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(f.matches("[data-mapping-action]")&&(y.action=String(f.value||"KEEP"),y.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(f.value||""),y.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let f=h.target;if(!f||!this.mappingResult||!f.matches("[data-mapping-prompt]"))return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(y.generation_prompt=String(f.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var o;if(!Ki||typeof Ki.loadAsync!="function")throw new Error("JSZip is not properly imported");let t=await Ki.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let d=l.toLowerCase();d.endsWith(".json")?i.push({name:l,content:null}):d.startsWith("assets/")&&d.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=[];for(let l of n)try{let c=await l.file.async("uint8array"),d=new Blob([c],{type:"image/png"}),p=l.name.split("/").pop()||l.name;console.log(`Processing ${p}, uint8array length: ${c.length}, blob size: ${d.size}`);let u;try{u=await this.blobToDataUrl(d)}catch(g){console.warn(`FileReader failed for ${p}, using fallback:`,g),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,u.substring(0,100));continue}a.push({filename:p,dataUrl:u})}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}let r=null;for(let l of i){let c=l.name.toLowerCase();if(c.includes("positionnormalizedpack")||c.includes("positionnormalized")){r=l.content;break}}if(a.length>0){await this.showCanvaZipWizard(a,r),this.setStatus("zip",`\u2705 Wizard completed - ${a.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new Yi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let l=await o.text(),c=JSON.parse(l);this.uploadedJsons.set(o.name,c),c.layers?n+=`\u2705 Layers: ${o.name}
|
|
1479
1513
|
`:c.brand_dna||c.colors?n+=`\u2705 Brand: ${o.name}
|
|
1480
1514
|
`:n+=`\u2705 Loaded: ${o.name}
|
|
1481
1515
|
`}catch{n+=`\u274C Error in ${o.name}
|
|
1482
|
-
`}try{this.normalizedManifest=
|
|
1516
|
+
`}try{this.normalizedManifest=Js(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
|
|
1483
1517
|
\u{1F4E6} Normalized manifest: ${o} assets`,n+=`
|
|
1484
1518
|
\u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:o,brandName:this.normalizedManifest.brand_name})}catch(o){console.error("[BrandVision] Failed to normalize manifest:",o),this.normalizedManifest=null,n+=`
|
|
1485
1519
|
\u274C Failed to normalize manifest`}t.value="";let a=n.trim();this.uploadedJsons.size>0?this.setStatus("manifest",`${a}
|
|
1486
|
-
\u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let o=0;o<i.length;o++)console.log(`[BrandVision] File ${o}: ${i[o].name}, type: ${i[o].type}, size: ${i[o].size}`);let n=[];for(let o of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${o.name}, type: ${o.type}`),!o.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${o.name}`),this.assetFiles.set(o.name,o);continue}try{let l=await this.fileToDataUrl(o);n.push({filename:o.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${o.name} to data URL (length: ${l.length})`)}catch(l){console.error(`[BrandVision] Failed to process ${o.name}:`,l),this.assetFiles.set(o.name,o)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,r=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${r}`),a&&r){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let o=null;for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c,console.log("[BrandVision] Found position data in:",l);break}}console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,o),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await
|
|
1520
|
+
\u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let o=0;o<i.length;o++)console.log(`[BrandVision] File ${o}: ${i[o].name}, type: ${i[o].type}, size: ${i[o].size}`);let n=[];for(let o of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${o.name}, type: ${o.type}`),!o.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${o.name}`),this.assetFiles.set(o.name,o);continue}try{let l=await this.fileToDataUrl(o);n.push({filename:o.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${o.name} to data URL (length: ${l.length})`)}catch(l){console.error(`[BrandVision] Failed to process ${o.name}:`,l),this.assetFiles.set(o.name,o)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,r=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${r}`),a&&r){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let o=null;for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c,console.log("[BrandVision] Found position data in:",l);break}}console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,o),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Re(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(r=this.root)==null?void 0:r.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,r,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await rr(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await ar(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(r=p.parseError)!=null?r:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await oa(a,this.mappingResult,{onProgress:(r,o,l)=>{this.setStatus("apply",`Generating ${r}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),r=n?`
|
|
1487
1521
|
<div class="vision-raw-block">
|
|
1488
1522
|
<div class="inspector-text-sm" style="white-space: pre-wrap;">
|
|
1489
1523
|
\u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
|
|
@@ -1545,8 +1579,8 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1545
1579
|
</div>
|
|
1546
1580
|
</div>
|
|
1547
1581
|
`}).join("")}
|
|
1548
|
-
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await
|
|
1549
|
-
`)}var
|
|
1582
|
+
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await oa(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),je));i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let r=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(r!=null&&r.success)||!(r!=null&&r.path))return console.error("[BrandVision] Save to library failed:",(r==null?void 0:r.error)||r),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(r.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let r=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(r!=null&&r.category)return String(r.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let r=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return r.includes("bg")||r.includes("background")?o("background")||a[0]:(r.includes("cta")||r.includes("button")||r.includes("ui")||r.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},r=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",r)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",r)})}refresh(){}};function gr(s,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${s}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
1583
|
+
`)}var dl=["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"],pl=["cta_hint","cta_label_end"],hr=[{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"}],ul=["brand.primary","brand.heading","brand.body","brand.warning"],Ji=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`
|
|
1550
1584
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
1551
1585
|
<div class="scene-panel-header" data-panel-handle>
|
|
1552
1586
|
<div class="panel-title">
|
|
@@ -1614,7 +1648,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1614
1648
|
<path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
|
|
1615
1649
|
<path d="M5 14v4h14v-4h2v6H3v-6h2z" />
|
|
1616
1650
|
</svg>
|
|
1617
|
-
`;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",
|
|
1651
|
+
`;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",dl.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",ul.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",pl.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),hr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=hr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await qi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(r=i==null?void 0:i.dataUrl)!=null?r:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,h,f,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
|
|
1618
1652
|
<div class="ai-modal-card">
|
|
1619
1653
|
<div class="ai-modal-header">
|
|
1620
1654
|
<div>
|
|
@@ -1685,7 +1719,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1685
1719
|
</div>
|
|
1686
1720
|
</div>
|
|
1687
1721
|
</div>
|
|
1688
|
-
`;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,v,w;let b=(w=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(f=this.aiCropBtn)==null||f.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,f,m,b,y,v,w,E,k,j,x,M,O,T,A,_;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(m=(f=this.aiPromptInput)==null?void 0:f.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,r=n,o=Number((E=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((k=l==null?void 0:l.value)==null?void 0:k.trim())||((j=this.aiBaseValue)==null?void 0:j.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let P=null,C=(x=this.getSelectedAssetKey())!=null?x:"unknown",S=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let q=aa(this.aiOutputDataUrl,"ai-output.png");if(q){let J=await Oe(q);J&&(P={input:{base64:J.base64,mimeType:J.mimeType},dataUrl:J.dataUrl,width:J.width,height:J.height})}}if(P||(P=await this.getImageDataFromAsset(c)),!P){this.setAiStatus("Unable to load the base image.");return}let I=[P.input],L=!1;if(this.aiReferenceFile){let q=await Oe(this.aiReferenceFile);q?(I.push({base64:q.base64,mimeType:q.mimeType}),L=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let R=ur(i,{includeReference:L,includeMagenta:a,changeLevel:o}),z=(A=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?A:"none";console.info("[AI] Final prompt:",R),console.info("[AI] Image sources:",{assetKey:C,base:S,reference:z});let N=Ys(P.width,P.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let F=await ct(e,R,I,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",F==null?void 0:F.length),this.aiRawOutputDataUrl=F,await this.refreshAiOutputFromRaw()}catch(P){console.error("[CustomizePanel] AI Generate Error:",P),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((_=this.aiStatusEl)==null?void 0:_.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await lt(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=aa(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await na(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await na(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),f=this.inferPathFromAssetKey(i);if(h&&f){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(p.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,f,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&setTimeout(()=>{m(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1722
|
+
`;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,v,w;let b=(w=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(f=this.aiCropBtn)==null||f.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,f,m,b,y,v,w,E,k,M,x,j,O,T,A,_;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(m=(f=this.aiPromptInput)==null?void 0:f.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,r=n,o=Number((E=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((k=l==null?void 0:l.value)==null?void 0:k.trim())||((M=this.aiBaseValue)==null?void 0:M.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let P=null,C=(x=this.getSelectedAssetKey())!=null?x:"unknown",S=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let q=sa(this.aiOutputDataUrl,"ai-output.png");if(q){let J=await Re(q);J&&(P={input:{base64:J.base64,mimeType:J.mimeType},dataUrl:J.dataUrl,width:J.width,height:J.height})}}if(P||(P=await this.getImageDataFromAsset(c)),!P){this.setAiStatus("Unable to load the base image.");return}let I=[P.input],L=!1;if(this.aiReferenceFile){let q=await Re(this.aiReferenceFile);q?(I.push({base64:q.base64,mimeType:q.mimeType}),L=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let R=gr(i,{includeReference:L,includeMagenta:a,changeLevel:o}),z=(A=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?A:"none";console.info("[AI] Final prompt:",R),console.info("[AI] Image sources:",{assetKey:C,base:S,reference:z});let N=Ks(P.width,P.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let F=await ct(e,R,I,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",F==null?void 0:F.length),this.aiRawOutputDataUrl=F,await this.refreshAiOutputFromRaw()}catch(P){console.error("[CustomizePanel] AI Generate Error:",P),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((_=this.aiStatusEl)==null?void 0:_.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await lt(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=sa(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await aa(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await aa(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),f=this.inferPathFromAssetKey(i);if(h&&f){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(p.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,f,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&setTimeout(()=>{m(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1689
1723
|
<div class="asset-preview-card">
|
|
1690
1724
|
<div class="asset-preview-header">
|
|
1691
1725
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -1731,7 +1765,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1731
1765
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
1732
1766
|
</div>
|
|
1733
1767
|
</div>
|
|
1734
|
-
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),E=c.querySelector(".asset-crop-zoom-value"),k=c.querySelector(".asset-crop-close"),
|
|
1768
|
+
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),E=c.querySelector(".asset-crop-zoom-value"),k=c.querySelector(".asset-crop-close"),M=c.querySelector(".asset-crop-cancel"),x=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!y||!v||!w||!E){l(null);return}let O=y.getContext("2d"),T=v.getContext("2d");if(!O||!T){l(null);return}let A=r.naturalWidth,_=r.naturalHeight,P=Math.max(y.width/A,y.height/_),C=1,S=0,I=0,L=!1,R=0,z=0,N=0,F=0,q=()=>{let H=P*C,ee=Math.max(0,(A*H-y.width)/2),Ze=Math.max(0,(_*H-y.height)/2);S=Math.min(ee,Math.max(-ee,S)),I=Math.min(Ze,Math.max(-Ze,I))},J=()=>{let H=P*C;O.clearRect(0,0,y.width,y.height);let ee=y.width/2-A*H/2+S,Ze=y.height/2-_*H/2+I;if(O.drawImage(r,ee,Ze,A*H,_*H),T.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let et=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),wn=v.width/2-o.naturalWidth*et/2,St=v.height/2-o.naturalHeight*et/2;T.drawImage(o,wn,St,o.naturalWidth*et,o.naturalHeight*et)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,v.width,v.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,v.width-8,v.height-8);let xt=v.width/y.width*(P*C),Qe=S*(v.width/y.width),Zt=I*(v.height/y.height),yn=v.width/2-A*xt/2+Qe,vn=v.height/2-_*xt/2+Zt;T.save(),T.globalAlpha=.7,T.drawImage(r,yn,vn,A*xt,_*xt),T.restore()},He=()=>{S=0,I=0,q(),J()};w.addEventListener("input",()=>{C=Number(w.value),E.textContent=`${C.toFixed(2)}\xD7`,q(),J()}),y.addEventListener("pointerdown",H=>{L=!0,R=H.clientX,z=H.clientY,N=S,F=I,y.setPointerCapture(H.pointerId)}),y.addEventListener("pointermove",H=>{L&&(S=N+(H.clientX-R),I=F+(H.clientY-z),q(),J())}),y.addEventListener("pointerup",H=>{L=!1,y.releasePointerCapture(H.pointerId)}),y.addEventListener("pointerleave",()=>{L=!1});let fe=()=>{c.remove()},me=()=>{fe(),l(null)},Je=async()=>{let H=document.createElement("canvas");H.width=t.width,H.height=t.height;let ee=H.getContext("2d");if(!ee){fe(),l(null);return}let Ze=C,Qe=Math.max(H.width/A,H.height/_)*Ze,Zt=H.width/y.width,yn=S*Zt,vn=I*Zt,et=H.width/2-A*Qe/2+yn,wn=H.height/2-_*Qe/2+vn;ee.drawImage(r,et,wn,A*Qe,_*Qe);let St=await new Promise(Zr=>{H.toBlob(Qr=>Zr(Qr),e.type||"image/png")});if(fe(),!St){l(null);return}l(new File([St],e.name,{type:St.type}))};k==null||k.addEventListener("click",me),M==null||M.addEventListener("click",me),j==null||j.addEventListener("click",He),x==null||x.addEventListener("click",()=>{Je()}),c.addEventListener("click",H=>{H.target===c&&me()}),document.body.appendChild(c),He()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var Zi=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
1735
1769
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
1736
1770
|
<div class="scene-panel-header" data-panel-handle>
|
|
1737
1771
|
<div class="panel-title">
|
|
@@ -1797,10 +1831,10 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
|
|
|
1797
1831
|
</div>
|
|
1798
1832
|
</div>
|
|
1799
1833
|
</div>
|
|
1800
|
-
`}initialize(e,t){var y,v,w,E,k,j,x,M,O,T,A,_,P,C,S,I;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let L=window.getEditableEngineConfig;if(typeof L=="function"){let z=L();return(R=z==null?void 0:z.loading)!=null?R:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{background_color:r.value})}));let o=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((k=n.overlay_alpha)!=null?k:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let L=Number(o.value);l&&(l.textContent=L.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:L})}));let c=(j=this.root)==null?void 0:j.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{text:c.value})}));let d=(x=this.root)==null?void 0:x.querySelector("#loading-text-scale"),p=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");d&&(d.value=String((O=n.text_scale)!=null?O:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let L=Number(d.value);p&&(p.textContent=L.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:L})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{blur_enabled:g.checked})}));let h=(_=this.root)==null?void 0:_.querySelector("#loading-blur-strength"),f=(P=this.root)==null?void 0:P.querySelector("#loading-blur-strength-value");h&&(h.value=String((C=n.blur_strength)!=null?C:8),f&&(f.textContent=h.value),h.addEventListener("input",()=>{var L,R;f&&(f.textContent=h.value),(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{blur_strength:Number(h.value)})}));let m=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),b=(I=this.root)==null?void 0:I.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onShowLoadingScreen)==null||R.call(L)}),b==null||b.addEventListener("click",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onHideLoadingScreen)==null||R.call(L)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Ft=require("pixi.js");var oa=require("pixi.js"),Re=()=>window.debugConfig||{},hr=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),fr=()=>window.resolveScreenAnchorPoint||(()=>new oa.Point),mr=()=>window.resolveScreenRatioPoint||(()=>new oa.Point);function br(s){Zi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Qi(s))))}function yr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),Nt(s)}function Zi(s){return s.isDebugOpen}function Qi(s){var a,r,o;if(!Zi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Qi(s));let e=la(s);if(!e){Ht(s,null),Nt(s);return}let t=ca(s,e);if(!t){Ht(s,null),Nt(s);return}let i=new Ft.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=da(s,t);Ht(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?ha(s,t):ma(s),s.highlightAnchor&&n?fa(s,n):ba(s)}function la(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function ca(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Bt(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function da(s,e){var r,o;let t=Bt(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=pa(s);if(!n)return null;if(i.position_ratio!=null)return mr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return fr()(n.width,n.height,a)}function pa(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ua(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Ft.Graphics,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function ga(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Ft.Graphics,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function ha(s,e){var n;let t=ua(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function fa(s,e){let t=ga(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function ma(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function ba(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function Nt(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function Ht(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function vr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function wr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function ya(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function tn(s){let e=Re();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function xr(s){window.location.reload()}function nn(s){let e=JSON.stringify(Re(),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 Sr(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(Si(),Gs)),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),en(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),en(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function en(s,e){var p,u,g,h,f,m,b,y,v,w;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=ya(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((m=(f=e.transform)==null?void 0:f.scale)!=null?m:1));let c=(w=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?w:{x:.5,y:.5},d=hr()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Er(s){var l,c,d,p,u,g,h,f,m,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(f=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?f:"0.5",r=(b=(m=s.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
|
|
1834
|
+
`}initialize(e,t){var y,v,w,E,k,M,x,j,O,T,A,_,P,C,S,I;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let L=window.getEditableEngineConfig;if(typeof L=="function"){let z=L();return(R=z==null?void 0:z.loading)!=null?R:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{background_color:r.value})}));let o=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((k=n.overlay_alpha)!=null?k:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let L=Number(o.value);l&&(l.textContent=L.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:L})}));let c=(M=this.root)==null?void 0:M.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{text:c.value})}));let d=(x=this.root)==null?void 0:x.querySelector("#loading-text-scale"),p=(j=this.root)==null?void 0:j.querySelector("#loading-text-scale-value");d&&(d.value=String((O=n.text_scale)!=null?O:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let L=Number(d.value);p&&(p.textContent=L.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:L})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{blur_enabled:g.checked})}));let h=(_=this.root)==null?void 0:_.querySelector("#loading-blur-strength"),f=(P=this.root)==null?void 0:P.querySelector("#loading-blur-strength-value");h&&(h.value=String((C=n.blur_strength)!=null?C:8),f&&(f.textContent=h.value),h.addEventListener("input",()=>{var L,R;f&&(f.textContent=h.value),(R=(L=this.options)==null?void 0:L.onUpdateLoading)==null||R.call(L,{blur_strength:Number(h.value)})}));let m=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),b=(I=this.root)==null?void 0:I.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onShowLoadingScreen)==null||R.call(L)}),b==null||b.addEventListener("click",()=>{var L,R;(R=(L=this.options)==null?void 0:L.onHideLoadingScreen)==null||R.call(L)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Ft=require("pixi.js");var la=require("pixi.js"),ze=()=>window.debugConfig||{},fr=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),mr=()=>window.resolveScreenAnchorPoint||(()=>new la.Point),br=()=>window.resolveScreenRatioPoint||(()=>new la.Point);function yr(s){Qi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>en(s))))}function vr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),Nt(s)}function Qi(s){return s.isDebugOpen}function en(s){var a,r,o;if(!Qi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>en(s));let e=ca(s);if(!e){Ht(s,null),Nt(s);return}let t=da(s,e);if(!t){Ht(s,null),Nt(s);return}let i=new Ft.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=pa(s,t);Ht(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?fa(s,t):ba(s),s.highlightAnchor&&n?ma(s,n):ya(s)}function ca(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function da(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Bt(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function pa(s,e){var r,o;let t=Bt(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=ua(s);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return mr()(n.width,n.height,a)}function ua(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ga(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Ft.Graphics,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function ha(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Ft.Graphics,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function fa(s,e){var n;let t=ga(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function ma(s,e){let t=ha(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function ba(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function ya(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function Nt(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function Ht(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function wr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function xr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function va(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function nn(s){let e=ze();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 Sr(s){window.location.reload()}function an(s){let e=JSON.stringify(ze(),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 Er(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(Si(),qs)),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),tn(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),tn(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function tn(s,e){var p,u,g,h,f,m,b,y,v,w;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=va(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((m=(f=e.transform)==null?void 0:f.scale)!=null?m:1));let c=(w=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?w:{x:.5,y:.5},d=fr()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Cr(s){var l,c,d,p,u,g,h,f,m,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(f=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?f:"0.5",r=(b=(m=s.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
|
|
1801
1835
|
position: (${t}, ${i})
|
|
1802
1836
|
scale: ${n}
|
|
1803
|
-
anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function va(s,e){var p,u,g,h,f,m,b,y,v,w,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((m=(f=s.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?m:1),r=Number((y=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((w=(v=s.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Ge));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Bt(s);ya(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let k=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);k?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,k)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Cr(s,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Ge));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let f=0;f<g.length-1;f++){let m=g[f];h[m]=(u=h[m])!=null?u:{},h=h[m]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function Ar(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,va(s,{silent:!0})},150))}var ul=3e3;function Ye(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let f=s.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-f.left,d=g.clientY-f.top,console.log("[DRAG] offset:",{x:c,y:d});let b=f.left-m.left,y=f.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),s.style.left=`${b}px`,s.style.top=`${y}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++ul),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function an(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-o,h=u.clientY-l,f=Math.max(i,a+g),m=Math.max(n,r+h);s.style.width=`${f}px`,(y=s.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(s.style.height=`${m}px`),t==null||t(f,m)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function wa(s,e){var f,m,b,y;let t=(b=(m=(f=s.container)==null?void 0:f.querySelector("#debug-overlay"))!=null?m:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=s.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function dt(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(wa(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function sn(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),wa(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function xa(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",wa(s,e),dt(s))}function Tr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>tn(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>nn(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,Sa(s),dt(s)})}),Ca(s,e),Ea(s,e)}function Sa(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Ea(s,e){oe(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),oe(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),oe(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),oe(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),oe(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),oe(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),oe(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),oe(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),oe(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Re();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=Re();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Lr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ye(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{dt(s),xa(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ye(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{xa(s,i)},10)})),i&&a&&an(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ye(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ye(l,c,s.debugOverlay),sn(s)}function Ca(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function oe(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=vr(Re(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),wr(Re(),i,l)})}K();var rn=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=je(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1837
|
+
anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function wa(s,e){var p,u,g,h,f,m,b,y,v,w,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((m=(f=s.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?m:1),r=Number((y=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((w=(v=s.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),je));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Bt(s);va(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let k=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);k?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,k)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Ar(s,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let f=0;f<g.length-1;f++){let m=g[f];h[m]=(u=h[m])!=null?u:{},h=h[m]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function Tr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,wa(s,{silent:!0})},150))}var gl=3e3;function Ye(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let f=s.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-f.left,d=g.clientY-f.top,console.log("[DRAG] offset:",{x:c,y:d});let b=f.left-m.left,y=f.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),s.style.left=`${b}px`,s.style.top=`${y}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++gl),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function sn(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-o,h=u.clientY-l,f=Math.max(i,a+g),m=Math.max(n,r+h);s.style.width=`${f}px`,(y=s.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(s.style.height=`${m}px`),t==null||t(f,m)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function xa(s,e){var f,m,b,y;let t=(b=(m=(f=s.container)==null?void 0:f.querySelector("#debug-overlay"))!=null?m:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=s.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function dt(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(xa(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function rn(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),xa(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Sa(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",xa(s,e),dt(s))}function Lr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>nn(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>an(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,Ea(s),dt(s)})}),Aa(s,e),Ca(s,e)}function Ea(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Ca(s,e){oe(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),oe(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),oe(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),oe(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),oe(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),oe(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),oe(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),oe(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),oe(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ze();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=ze();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function kr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ye(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{dt(s),Sa(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ye(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Sa(s,i)},10)})),i&&a&&sn(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ye(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ye(l,c,s.debugOverlay),rn(s)}function Aa(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function oe(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=wr(ze(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),xr(ze(),i,l)})}K();var on=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Me(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1804
1838
|
<div class="config-persistence-panel">
|
|
1805
1839
|
<!-- Status Footer (Always Visible) -->
|
|
1806
1840
|
<div class="persistence-status-footer">
|
|
@@ -1964,7 +1998,7 @@ This will delete generated config JSON files in configs/objects that are not ref
|
|
|
1964
1998
|
|
|
1965
1999
|
It will NOT touch library/base configs.
|
|
1966
2000
|
|
|
1967
|
-
Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let f=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,m=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${f} configs, ${m} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!
|
|
2001
|
+
Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let f=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,m=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${f} configs, ${m} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!Me().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
|
|
1968
2002
|
|
|
1969
2003
|
This will:
|
|
1970
2004
|
\u2022 Create a new version snapshot
|
|
@@ -1974,7 +2008,7 @@ This will:
|
|
|
1974
2008
|
|
|
1975
2009
|
This will write all staged changes to ${u}.
|
|
1976
2010
|
|
|
1977
|
-
After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=
|
|
2011
|
+
After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Ge(),f={};for(let[y,v]of Object.entries(h.objects)){let w=v,E=y;/^(json\.|ui\.|effects\.|engine\.)/.test(E)||(E=`json.${y}`),w&&typeof w=="object"&&(w.identity||(w.identity={}),w.identity.id=E),f[`objects/${E}.json`]=w}h.engine&&(h.engine.runtime&&(f["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(f["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(f["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(f["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(f["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(f["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(f["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(f["engine/engine.json"]=h.engine));for(let[y,v]of Object.entries(h.scenes)){let w=y.startsWith("scene.")?y:`scene.${y}`;f[`scenes/${w}.json`]=v}let m=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!b.ok){let y=await b.json();throw new Error(y.error||"Apply to current source failed")}ae(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
|
|
1978
2012
|
|
|
1979
2013
|
This will DIRECTLY MODIFY base configuration files.
|
|
1980
2014
|
|
|
@@ -1984,13 +2018,13 @@ This is ONLY for active development.
|
|
|
1984
2018
|
|
|
1985
2019
|
Make sure your project is under Git version control.
|
|
1986
2020
|
|
|
1987
|
-
Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=
|
|
2021
|
+
Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Ge(),h={};for(let[m,b]of Object.entries(g.objects)){let y=b,v=m;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${m}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=v),h[`objects/${v}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[m,b]of Object.entries(g.scenes)){let y=m.startsWith("scene.")?m:`scene.${m}`;h[`scenes/${y}.json`]=b}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!f.ok){let m=await f.json();throw new Error(m.error||"Apply to base failed")}ae(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;jt(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(ae(),_t(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&_t()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await bi()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
|
|
1988
2022
|
<div class="notify-icon">\u2705</div>
|
|
1989
2023
|
<div class="notify-content">
|
|
1990
2024
|
<strong>${i}</strong>
|
|
1991
2025
|
<span>Project files updated.</span>
|
|
1992
2026
|
</div>
|
|
1993
|
-
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,r;let t=
|
|
2027
|
+
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,r;let t=Me();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
|
|
1994
2028
|
|
|
1995
2029
|
You have ${t.overrideCount} staged changes that will be discarded.
|
|
1996
2030
|
|
|
@@ -2002,7 +2036,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
|
|
|
2002
2036
|
|
|
2003
2037
|
This cannot be undone unless you have git commits or backups.
|
|
2004
2038
|
|
|
2005
|
-
Are you absolutely sure?`))try{let t=
|
|
2039
|
+
Are you absolutely sure?`))try{let t=Ge(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}ae(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ut=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 ki;this.sceneToolsPanel=new Pi;this.nudgePanel=new Ii;this.inspectorPanel=new Gi;this.libraryPanel=new $t;this.libraryPanelDocked=new $t;this.brandVisionPanel=new Xi;this.customizeSettingsPanel=new Ji;this.configPersistencePanel=new on;this.loadingScreenPanel=new Zi}applyAssetChange(e,t){return dr(this,e,t)}resetAsset(e){return pr(this,e)}applySlotAsset(e,t,i){return Wi(this,e,t,i)}resetSlotAsset(e,t,i){return ur(this,e,t,i)}startObjectVisuals(){return yr(this)}stopObjectVisuals(){return vr(this)}shouldRunObjectVisuals(){return Qi(this)}updateObjectVisuals(){return en(this)}getSelectedInstanceId(){return ca(this)}getDisplayObjectById(e){return da(this,e)}getSelectedObjectConfig(){return Bt(this)}getConfigAnchorWorldPoint(e){return pa(this,e)}getScreenSize(){return ua(this)}ensureBoundsGfx(){return ga(this)}ensureAnchorGfx(){return ha(this)}drawBounds(e){return fa(this,e)}drawAnchor(e){return ma(this,e)}clearBounds(){return ba(this)}clearAnchor(){return ya(this)}clearObjectVisuals(){return Nt(this)}updateObjectInfo(e){return Ht(this,e)}resetDebugConfig(){return nn(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return an(this)}loadObjectConfig(e){return Er(this,e)}fillConfigViewer(e){return tn(this,e)}copyConfigValues(){return Cr(this)}applyObjectConfig(e){return wa(this,e)}applyCustomizeSettings(e,t){return Ar(this,e,t)}scheduleObjectAutoApply(){return Tr(this)}setupDebugEventListeners(){return Lr(this)}setupDebugInputListeners(e){return Ca(this,e)}setupPanelLayout(){return kr(this)}setupCollapsiblePanels(e){return Aa(this,e)}setupRangeInput(e,t,i,n){return oe(this,e,t,i,n)}updateWorkbenchTabs(){return Ea(this)}saveWorkbenchState(){return dt(this)}loadWorkbenchState(){return rn(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let r=JSON.parse(a);r.activeTab&&(this.activeTab=r.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,f,m,b,y;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((f=l==null?void 0:l.y)!=null?f:0)+r,{applyConfigOverride:p}=await Promise.resolve().then(()=>(K(),je));p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,w=(y=(b=(m=v==null?void 0:v.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?y:o;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,f;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),je));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let m=window.__editableConfig,b=(f=(h=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?f:r;await d(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r)}}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`
|
|
2006
2040
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
2007
2041
|
<div class="debug-workbench" id="debug-workbench">
|
|
2008
2042
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -2049,7 +2083,7 @@ Are you absolutely sure?`))try{let t=Ue(),i={};for(let[a,r]of Object.entries(t.o
|
|
|
2049
2083
|
${this.sceneToolsPanel.render()}
|
|
2050
2084
|
${this.nudgePanel.render()}
|
|
2051
2085
|
</div>
|
|
2052
|
-
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),f=g+e*n,m=h+t*n;p.value=String(f),u.value=String(m),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new
|
|
2086
|
+
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),f=g+e*n,m=h+t*n;p.value=String(f),u.value=String(m),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new Oe;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,f=Array.isArray(g)?g[1]:g.y||0,m=h+e*n,b=f+t*n;await r.updateProperty(p,"transform.position",[m,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function hl(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function fl(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function ml(s){return`
|
|
2053
2087
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
2054
2088
|
|
|
2055
2089
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -2066,9 +2100,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
|
|
|
2066
2100
|
${s?`
|
|
2067
2101
|
ADDITIONAL RULES/NOTES:
|
|
2068
2102
|
${s}`:""}
|
|
2069
|
-
`.trim()}function
|
|
2103
|
+
`.trim()}function Pr(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await hl(a),o=fl(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=ml(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Vi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
|
|
2070
2104
|
`);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
|
|
2071
|
-
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ke="handler_api_key_";var pt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ke}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ke}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ke}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ke}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ke)){let n=i.substring(Ke.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ke)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},
|
|
2105
|
+
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ke="handler_api_key_";var pt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ke}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ke}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ke}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ke}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ke)){let n=i.substring(Ke.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ke)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},Ta=()=>pt.getKey("gemini"),La=(s,e)=>pt.setKey("gemini",s,e),bl=()=>pt.hasKey("gemini");window.ApiKeyStorage=pt;window.getGeminiApiKey=Ta;window.setGeminiApiKey=La;window.hasGeminiApiKey=bl;var Pa=class{constructor(){this.modal=null;this.options=null;this.analyzer=Pr();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
|
|
2072
2106
|
<div class="ai-modal-card">
|
|
2073
2107
|
<div class="ai-modal-header">
|
|
2074
2108
|
<div class="ai-modal-actions">
|
|
@@ -2154,7 +2188,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2154
2188
|
<img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
|
|
2155
2189
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
2156
2190
|
</div>
|
|
2157
|
-
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=
|
|
2191
|
+
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=Ta();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return La(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},ka=null;window.__openAiEditor=function(s,e,t,i){ka||(ka=new Pa),ka.open({objectId:s,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(s,i.path,n);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(s);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};Ma();var ja=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
2158
2192
|
<div class="asset-preview-card">
|
|
2159
2193
|
<div class="asset-preview-header">
|
|
2160
2194
|
<div class="asset-preview-title">${n}</div>
|
|
@@ -2181,7 +2215,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2181
2215
|
<source src="${n}" type="audio/wav">
|
|
2182
2216
|
Your browser does not support the audio element.
|
|
2183
2217
|
</audio>
|
|
2184
|
-
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(
|
|
2218
|
+
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(Ma(),Ir)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(s){new ja().open(s)};var _a=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
|
|
2185
2219
|
<div class="asset-crop-card">
|
|
2186
2220
|
<div class="asset-crop-header">
|
|
2187
2221
|
<div>
|
|
@@ -2232,7 +2266,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2232
2266
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
2233
2267
|
</div>
|
|
2234
2268
|
</div>
|
|
2235
|
-
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new Ma().open(s)};K();var D=require("pixi.js");K();var on=class{constructor(e){this.app=null;this.camera=new D.Container;this.mainContainer=new D.Container;this.uiContainer=new D.Container;this.gizmoLayer=new D.Container;this.screenFrame=new D.Graphics;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.gizmoOutline=new D.Graphics;this.moveHandle=new D.Graphics;this.scaleHandle=new D.Graphics;this.rotateHandle=new D.Graphics;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.updateLayout({width:t,height:i}),this.updateGizmos(),this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onDragMove=e=>{var a;if(!this.dragMode||!this.selectedId||!this.app)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=(a=this.dragContainer)!=null?a:this.mainContainer,n=this.getPointerInContainer(e.clientX,e.clientY,i);if(!(!n||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let r=n.x-this.dragStartPointer.x,o=n.y-this.dragStartPointer.y,l=this.dragStartPos.x+r,c=this.dragStartPos.y+o;t.displayObject.position.set(l,c),this.updateLiveConfigPosition(l,c)}else if(this.dragMode==="scale"){let r=new D.Point(this.dragStartPos.x,this.dragStartPos.y),o=Math.max(1,this.distance(n,r)),l=Math.max(.05,this.dragStartScale*(o/this.dragStartDistance));t.displayObject.scale.set(l),this.updateLiveConfigScale(l)}else if(this.dragMode==="rotate"){let r=new D.Point(this.dragStartPos.x,this.dragStartPos.y),l=Math.atan2(n.y-r.y,n.x-r.x)-this.dragStartAngle,c=this.dragStartRotation+l;t.displayObject.rotation=c,this.updateLiveConfigRotation(c)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i));this.cameraScale=n,this.camera.scale.set(n),this.hasUserCamera=!0,this.updateGizmos()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i)};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new D.Application,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.mainContainer.zIndex=0,this.uiContainer.zIndex=5e4,this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("preview:select",this.handlePreviewSelect),this.app&&(this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("preview:select",this.handlePreviewSelect),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos())}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos()}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t);if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let o=await this.createDisplayObject(e,t);if(!o)return;(a?this.uiContainer:this.mainContainer).addChild(o),this.objectMap.set(e,{id:e,displayObject:o,assetKey:i,isUi:a}),this.attachObjectInteraction(o,e)}let r=this.objectMap.get(e);r&&(this.applyVisualConfig(r.displayObject,t),this.updateObjectTransform(r.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,f,m,b,y,v,w,E;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let j=await de.create(e,t,this.app);if(j instanceof D.Container)return j}}catch(k){console.warn("[SceneEditor] ObjectFactory failed for",e,k)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let k=this.getScreen(),j=(p=k==null?void 0:k.width)!=null?p:0,x=(u=k==null?void 0:k.height)!=null?u:0,M=new D.Graphics,O=this.parseColor(n.background_color,0),T=typeof n.background_alpha=="number"?n.background_alpha:1;j>0&&x>0&&M.rect(0,0,j,x).fill({color:O,alpha:T});let A=new D.Container;return A.addChild(M),A}if(a){let k=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",j=new D.TextStyle({fontFamily:"Arial, sans-serif",fontSize:(f=i==null?void 0:i.fontSize)!=null?f:16,fill:k,align:(m=i==null?void 0:i.align)!=null?m:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new D.Text({text:(y=i==null?void 0:i.text)!=null?y:"",style:j})}if((v=t==null?void 0:t.effects)!=null&&v.width||(w=t==null?void 0:t.effects)!=null&&w.height){let k=new D.Graphics,j=typeof t.effects.width=="number"?t.effects.width:100,x=typeof t.effects.height=="number"?t.effects.height:100,M=(E=t.effects.fill_color)!=null?E:"#ffffff",O=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,T=Number.parseInt(String(M).replace("#",""),16);return k.rect(0,0,j,x).fill({color:Number.isFinite(T)?T:16777215,alpha:O}),k}return new D.Container}attachObjectInteraction(e,t){if(e){if(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function"){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=i)}e.on("pointerdown",i=>{this.getPointerButton(i)===0&&(this.setSelected(t),this.startDrag("move",i))})}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=rt(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var c;if(!e)return;let i=(c=t==null?void 0:t.transform)!=null?c:{},n=e.parent===this.uiContainer?this.uiContainer:this.mainContainer,a=this.getAnchorLocalPoint(i,n),r=this.getPositionOffset(i);a&&e.position.set(a.x+r.x,a.y+r.y);let o=typeof i.scale=="number"?i.scale:void 0;typeof o=="number"&&e.scale&&e.scale.set(o);let l=typeof i.rotation=="number"?i.rotation:0;typeof e.rotation=="number"&&(e.rotation=l)}getAnchorLocalPoint(e,t=this.mainContainer){var r;let i=this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n=(e==null?void 0:e.position_ratio)!=null?Pt(i.width,i.height,e.position_ratio):kt(i.width,i.height,(r=e==null?void 0:e.anchor)!=null?r:"center"),a=new D.Point;return t.toLocal(new D.Point(n.x,n.y),void 0,a),a}getPositionOffset(e){var l,c,d,p,u,g,h,f;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((f=i==null?void 0:i.y)!=null?f:0);return{x:n+r,y:a+o}}updateLayout(e){var f,m,b,y,v,w,E,k;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let n=(((m=(f=this.getEditableConfig())==null?void 0:f.engine)==null?void 0:m.runtime)||{}).layout||{},a=t.width*((b=ue.layout.screen_scale_x)!=null?b:1),r=n.design_width_portrait||400,o=a/r;o=Math.min(o,1.15);let l=o*((y=ue.engine.scale)!=null?y:1);this.mainContainer.scale.set(l),this.uiContainer.scale.set(l);let c=(v=n.main_container_anchor)!=null?v:"center",d=(w=n.main_container_position_ratio)!=null?w:{x:.5,y:.5},p=(E=n.main_container_offset)!=null?E:{x:0,y:0},u=n.main_container_position_ratio?Pt(t.width,t.height,d):kt(t.width,t.height,c),g=u.x+p.x+ue.layout.position_offset.x,h=u.y+p.y+ue.layout.position_offset.y;this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),(k=this.app)!=null&&k.stage&&(this.app.stage.hitArea=new D.Rectangle(0,0,t.width,t.height)),this.hasUserCamera||this.centerCamera()}centerCamera(){if(!this.app)return;let e=this.getScreen(),t=this.app.renderer.width,i=this.app.renderer.height;this.cameraScale=1,this.camera.scale.set(this.cameraScale),this.camera.position.set((t-e.width)/2,(i-e.height)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new D.Point(t.x,t.y)),n=this.camera.toLocal(new D.Point(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g;if(!this.selectedId||!e||!this.app||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;this.dragContainer=(p=(d=n.displayObject)==null?void 0:d.parent)!=null?p:this.mainContainer;let a=this.getEventLocalPoint(t,this.dragContainer);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new D.Point(a.x,a.y),this.dragStartPos=new D.Point(r.position.x,r.position.y),this.dragStartScale=typeof((u=r.scale)==null?void 0:u.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(g=o==null?void 0:o.transform)!=null?g:{};this.dragStartRotation=typeof l.rotation=="number"?l.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(l,this.dragContainer),this.dragStartValue=this.getDragStartValue(e,l);let c=new D.Point(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,f,m;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((f=o[1])!=null?f:0):Number((m=o==null?void 0:o.y)!=null?m:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.scale=e}updateLiveConfigRotation(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.rotation=e}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),ne({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position;return Array.isArray(i)?[t.x,t.y]:{x:t.x,y:t.y}}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new D.Point(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new D.Point;return t.toLocal(new D.Point(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new D.Point;return i.toLocal(new D.Point(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var ln=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[We("playable-portrait"),We("iphone-14"),We("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.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=We(e.defaultDevice||Ei.id),this.debugPanel=new Ut,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let t=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=t===null?!0:t==="true"}catch{}this.sceneEditor=new on({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=We(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",h=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${h}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ye(this.scenePane,e,i!=null?i:this.previewContainer),t&&an(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
2269
|
+
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new _a().open(s)};K();var D=require("pixi.js");K();var ln=class{constructor(e){this.app=null;this.camera=new D.Container;this.mainContainer=new D.Container;this.uiContainer=new D.Container;this.gizmoLayer=new D.Container;this.screenFrame=new D.Graphics;this.gameFrame=new D.Graphics;this.gridLayer=new D.Graphics;this.spawnPointLayer=new D.Container;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.spawnPointDrag=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.gizmoOutline=new D.Graphics;this.moveHandle=new D.Graphics;this.scaleHandle=new D.Graphics;this.rotateHandle=new D.Graphics;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!1;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.updateLayout({width:t,height:i}),this.updateGizmos(),this.updateGrid(),this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{var u,g;if(!this.app||!this.isVisible||this.getPointerButton(e)!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=(g=e==null?void 0:e.global)!=null?g:(u=e==null?void 0:e.data)==null?void 0:u.global;if(!i)return;let n=new D.Point(i.x,i.y),a=this.getPickCandidates(n);if(a.length===0){this.setSelected(null),this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let r=performance.now(),o=this.areSameIds(a,this.lastPickIds),l=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,c=r-this.lastPickTime<1200,d=o&&l&&c?(this.lastPickIndex+1)%a.length:0,p=a[d];this.lastPickIds=a,this.lastPickIndex=d,this.lastPickPoint=n,this.lastPickTime=r,this.setSelected(p),this.playModeEnabled||this.startDrag("move",e)};this.handleGridSettings=e=>{var n,a;let t=(n=e==null?void 0:e.detail)==null?void 0:n.enabled,i=(a=e==null?void 0:e.detail)==null?void 0:a.gap;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),this.updateGrid()};this.handlePlayMode=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&this.setPlayMode(t)};this.syncFromGameObjects=()=>{var t,i,n,a,r,o;if(!this.playModeEnabled||!this.app||!this.isVisible)return;let e=window.gameObjectManager;if(e!=null&&e.get){for(let[l,c]of this.objectMap.entries()){let d=e.get(l),p=((t=d==null?void 0:d.getDisplayObject)==null?void 0:t.call(d))||(d==null?void 0:d.pixiObject)||d;if(!p)continue;let u=c.isUi?this.uiContainer:this.mainContainer,g=new D.Point;if(typeof p.getGlobalPosition=="function"){p.getGlobalPosition(g);let m=u.toLocal(g);c.displayObject.position.set(m.x,m.y)}let h=(n=(i=p.scale)==null?void 0:i.x)!=null?n:1,f=(r=(a=p.scale)==null?void 0:a.y)!=null?r:h;(o=c.displayObject.scale)!=null&&o.set?c.displayObject.scale.set(h,f):c.displayObject.scale&&(c.displayObject.scale.x=h,c.displayObject.scale.y=f),typeof p.rotation=="number"&&(c.displayObject.rotation=p.rotation)}this.updateGizmos()}};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),Q({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var a;if(!this.dragMode||!this.selectedId||!this.app||this.playModeEnabled)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=(a=this.dragContainer)!=null?a:this.mainContainer,n=this.getPointerInContainer(e.clientX,e.clientY,i);if(!(!n||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let r=n.x-this.dragStartPointer.x,o=n.y-this.dragStartPointer.y,l=this.dragStartPos.x+r,c=this.dragStartPos.y+o;t.displayObject.position.set(l,c),this.updateLiveConfigPosition(l,c)}else if(this.dragMode==="scale"){let r=new D.Point(this.dragStartPos.x,this.dragStartPos.y),o=Math.max(1,this.distance(n,r)),l=Math.max(.05,this.dragStartScale*(o/this.dragStartDistance));t.displayObject.scale.set(l),this.updateLiveConfigScale(l)}else if(this.dragMode==="rotate"){let r=new D.Point(this.dragStartPos.x,this.dragStartPos.y),l=Math.atan2(n.y-r.y,n.x-r.x)-this.dragStartAngle,c=this.dragStartRotation+l;t.displayObject.rotation=c,this.updateLiveConfigRotation(c)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i));this.cameraScale=n,this.camera.scale.set(n),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new D.Application,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.gridLayer),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.gridLayer.zIndex=-2,this.gridLayer.eventMode="none",this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.mainContainer.zIndex=0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="none",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.restoreScenePreferences(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:play-mode",this.handlePlayMode),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&(this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:play-mode",this.handlePlayMode),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let r=a.displayObject;if(!r||r.visible===!1)continue;let o=(i=r.getBounds)==null?void 0:i.call(r);if(!o||o.width<=0||o.height<=0||e.x<o.x||e.x>o.x+o.width||e.y<o.y||e.y>o.y+o.height)continue;let l=r.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof r.zIndex=="number"?r.zIndex:0,p=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(r):0,u=c*1e6+d*1e3+p;t.push({id:n,order:u})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("play_mode"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let n=Number(t);Number.isFinite(n)&&n>2&&(this.gridGap=n)}i!==null&&this.setPlayMode(i==="true")}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos(),this.updateSpawnPointHandles()}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t);if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let o=await this.createDisplayObject(e,t);if(!o)return;(a?this.uiContainer:this.mainContainer).addChild(o),this.objectMap.set(e,{id:e,displayObject:o,assetKey:i,isUi:a}),this.attachObjectInteraction(o,e)}let r=this.objectMap.get(e);r&&(this.applyVisualConfig(r.displayObject,t),this.updateObjectTransform(r.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,f,m,b,y,v,w,E;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let M=await de.create(e,t,this.app);if(M instanceof D.Container)return M}}catch(k){console.warn("[SceneEditor] ObjectFactory failed for",e,k)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let k=this.getScreen(),M=(p=k==null?void 0:k.width)!=null?p:0,x=(u=k==null?void 0:k.height)!=null?u:0,j=new D.Graphics,O=this.parseColor(n.background_color,0),T=typeof n.background_alpha=="number"?n.background_alpha:1;M>0&&x>0&&j.rect(0,0,M,x).fill({color:O,alpha:T});let A=new D.Container;return A.addChild(j),A}if(a){let k=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",M=new D.TextStyle({fontFamily:"Arial, sans-serif",fontSize:(f=i==null?void 0:i.fontSize)!=null?f:16,fill:k,align:(m=i==null?void 0:i.align)!=null?m:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new D.Text({text:(y=i==null?void 0:i.text)!=null?y:"",style:M})}if((v=t==null?void 0:t.effects)!=null&&v.width||(w=t==null?void 0:t.effects)!=null&&w.height){let k=new D.Graphics,M=typeof t.effects.width=="number"?t.effects.width:100,x=typeof t.effects.height=="number"?t.effects.height:100,j=(E=t.effects.fill_color)!=null?E:"#ffffff",O=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,T=Number.parseInt(String(j).replace("#",""),16);return k.rect(0,0,M,x).fill({color:Number.isFinite(T)?T:16777215,alpha:O}),k}return new D.Container}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=i)}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=rt(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var c;if(!e||this.playModeEnabled)return;let i=(c=t==null?void 0:t.transform)!=null?c:{},n=e.parent===this.uiContainer?this.uiContainer:this.mainContainer,a=this.getAnchorLocalPoint(i,n),r=this.getPositionOffset(i);a&&e.position.set(a.x+r.x,a.y+r.y);let o=typeof i.scale=="number"?i.scale:void 0;typeof o=="number"&&e.scale&&e.scale.set(o);let l=typeof i.rotation=="number"?i.rotation:0;typeof e.rotation=="number"&&(e.rotation=l)}getAnchorLocalPoint(e,t=this.mainContainer){var r;let i=this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n=(e==null?void 0:e.position_ratio)!=null?Pt(i.width,i.height,e.position_ratio):kt(i.width,i.height,(r=e==null?void 0:e.anchor)!=null?r:"center"),a=new D.Point;return t.toLocal(new D.Point(n.x,n.y),void 0,a),a}getPositionOffset(e){var l,c,d,p,u,g,h,f;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((f=i==null?void 0:i.y)!=null?f:0);return{x:n+r,y:a+o}}updateLayout(e){var f,m,b,y,v,w,E,k;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let n=(((m=(f=this.getEditableConfig())==null?void 0:f.engine)==null?void 0:m.runtime)||{}).layout||{},a=t.width*((b=ue.layout.screen_scale_x)!=null?b:1),r=n.design_width_portrait||400,o=a/r;o=Math.min(o,1.15);let l=o*((y=ue.engine.scale)!=null?y:1);this.mainContainer.scale.set(l),this.uiContainer.scale.set(l);let c=(v=n.main_container_anchor)!=null?v:"center",d=(w=n.main_container_position_ratio)!=null?w:{x:.5,y:.5},p=(E=n.main_container_offset)!=null?E:{x:0,y:0},u=n.main_container_position_ratio?Pt(t.width,t.height,d):kt(t.width,t.height,c),g=u.x+p.x+ue.layout.position_offset.x,h=u.y+p.y+ue.layout.position_offset.y;this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.gameFrame.clear(),this.gameFrame.rect(0,0,t.width,t.height),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}),(k=this.app)!=null&&k.stage&&(this.app.stage.hitArea=new D.Rectangle(0,0,t.width,t.height)),this.hasUserCamera||this.centerCamera(),this.updateSpawnPointHandles()}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear();return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new D.Point(0,0)),n=this.camera.toLocal(new D.Point(t.width,t.height)),a=Math.min(i.x,n.x),r=Math.max(i.x,n.x),o=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((r-a)/e),p=Math.ceil((l-o)/e),u=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(p/c)),h=Math.floor(a/u)*u,f=Math.floor(o/g)*g;this.gridLayer.clear();for(let m=h;m<=r;m+=u)this.gridLayer.moveTo(m,o),this.gridLayer.lineTo(m,l);for(let m=f;m<=l;m+=g)this.gridLayer.moveTo(a,m),this.gridLayer.lineTo(r,m);this.gridLayer.stroke({width:1,color:16777215,alpha:.08})}setPlayMode(e){var t,i,n,a;this.playModeEnabled!==e&&(this.playModeEnabled=e,e?(this.moveHandle.eventMode="none",this.scaleHandle.eventMode="none",this.rotateHandle.eventMode="none",(i=(t=this.app)==null?void 0:t.ticker)==null||i.add(this.syncFromGameObjects)):(this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static",(a=(n=this.app)==null?void 0:n.ticker)==null||a.remove(this.syncFromGameObjects),this.syncFromConfig()),this.updateGizmos(),this.updateSpawnPointHandles())}centerCamera(){if(!this.app)return;let e=this.getScreen(),t=this.app.renderer.width,i=this.app.renderer.height;this.cameraScale=1,this.camera.scale.set(this.cameraScale),this.camera.position.set((t-e.width)/2,(i-e.height)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new D.Point(t.x,t.y)),n=this.camera.toLocal(new D.Point(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;if(this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9}),this.playModeEnabled){this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear();return}let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new D.Graphics;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let r=this.toCameraFromMain(i);a.position.set(r.x,r.y),a.cursor="move",a.eventMode=this.playModeEnabled?"none":"static",a.on("pointerdown",o=>this.startSpawnPointDrag(n,o)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var r,o;return{x:Number((r=a==null?void 0:a.x)!=null?r:0),y:Number((o=a==null?void 0:a.y)!=null?o:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new D.Point(e.x,e.y)),i=new D.Point;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var o,l;if(!this.selectedId||this.playModeEnabled)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let r=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new D.Point(r.x-a.x,r.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let r=this.getSpawnPoints(a);if(!r||!r[t])return;let o=r.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",o),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g;if(!this.selectedId||!e||!this.app||this.playModeEnabled||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;this.dragContainer=(p=(d=n.displayObject)==null?void 0:d.parent)!=null?p:this.mainContainer;let a=this.getEventLocalPoint(t,this.dragContainer);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new D.Point(a.x,a.y),this.dragStartPos=new D.Point(r.position.x,r.position.y),this.dragStartScale=typeof((u=r.scale)==null?void 0:u.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(g=o==null?void 0:o.transform)!=null?g:{};this.dragStartRotation=typeof l.rotation=="number"?l.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(l,this.dragContainer),this.dragStartValue=this.getDragStartValue(e,l);let c=new D.Point(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,f,m;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((f=o[1])!=null?f:0):Number((m=o==null?void 0:o.y)!=null?m:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.scale=e}updateLiveConfigRotation(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.rotation=e}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Q({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position;return Array.isArray(i)?[t.x,t.y]:{x:t.x,y:t.y}}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new D.Point(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new D.Point;return t.toLocal(new D.Point(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new D.Point;return i.toLocal(new D.Point(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var cn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[We("playable-portrait"),We("iphone-14"),We("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.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=We(e.defaultDevice||Ei.id),this.debugPanel=new Ut,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let t=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=t===null?!0:t==="true"}catch{}this.sceneEditor=new ln({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=We(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",h=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${h}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ye(this.scenePane,e,i!=null?i:this.previewContainer),t&&sn(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
2236
2270
|
<div class="preview-toolbar">
|
|
2237
2271
|
<div class="preview-toolbar-left">
|
|
2238
2272
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -2241,7 +2275,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2241
2275
|
<div class="preview-toolbar-center">
|
|
2242
2276
|
<div class="device-selector-wrapper">
|
|
2243
2277
|
<select class="device-dropdown" id="device-select">
|
|
2244
|
-
${
|
|
2278
|
+
${ta.map(i=>`
|
|
2245
2279
|
<optgroup label="${i.label}">
|
|
2246
2280
|
${i.devices.map(n=>`
|
|
2247
2281
|
<option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
|
|
@@ -2422,7 +2456,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2422
2456
|
</div>
|
|
2423
2457
|
|
|
2424
2458
|
</div>
|
|
2425
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var f,m,b,y,v,w,E,k;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",j=>{if(this.viewMode==="compare")return;let x=j.target.value;this.setDevice(x)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",j=>{let x=j.target.value;this.setTheme(x)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let x=j.dataset.viewToggle;x&&this.setViewMode(x)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let x=j.dataset.layoutToggle;x&&this.setLayoutMode(x)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())}),(f=e.querySelector("#rotate-btn"))==null||f.addEventListener("click",()=>this.toggleRotation()),(m=e.querySelector("#zoom-in-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(.1)),(b=e.querySelector("#zoom-out-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(-.1)),(y=e.querySelector("#refresh-btn"))==null||y.addEventListener("click",()=>this.refresh());let l=e.querySelector("#bottom-dock"),c=e.querySelector("#bottom-dock-resize");l&&c&&this.makeBottomDockResizable(l,c);let d=Array.from(e.querySelectorAll(".bottom-dock-tab"));d.forEach(j=>{j.addEventListener("click",()=>{let x=j.dataset.dockTab;if(!x)return;d.forEach(O=>O.classList.remove("active")),j.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let T=O.dataset.dockPanel;O.classList.toggle("active",T===x)})})}),(v=e.querySelector("#console-clear"))==null||v.addEventListener("click",()=>this.clearConsole()),(w=e.querySelector("#corner-zoom-in-btn"))==null||w.addEventListener("click",()=>this.adjustUserZoom(.1)),(E=e.querySelector("#corner-zoom-out-btn"))==null||E.addEventListener("click",()=>this.adjustUserZoom(-.1)),(k=e.querySelector("#corner-grab-btn"))==null||k.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let p=e.querySelector(".scene-panel.scene-objects"),u=p==null?void 0:p.querySelector("[data-panel-resize-v]");p&&u&&this.makeSidebarResizable(p,u,"left");let g=e.querySelector(".debug-workbench"),h=g==null?void 0:g.querySelector("#workbench-resize-v");g&&h&&this.makeSidebarResizable(g,h,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),hi();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),fi();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=je().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function _a(s={}){let e=new ln(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function Oa(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function Ir(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function bl(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function jr(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};bl(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function Mr(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Oa(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Mr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Oa((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Oa((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function yl(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(st(),Ps))]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,f=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(f){let m=((o=f.getDisplayObject)==null?void 0:o.call(f))||f.pixiObject||f.pixi||f;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ie(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ie(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Ie(n,{silent:!0,persist:!0,emitEvent:!0})}}function cn(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await de.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(yl(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Ir(p);jr(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Ir(l);jr(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Mr(a))}};return n.rebuildIndexes(),n}K();var Rr=tt(require("lottie-web"),1);Tn(Cn);typeof window!="undefined"&&!window.lottie&&(window.lottie=Rr.default);var ut=null,vl=async()=>{if(!ut){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ut=JSON.parse(i)}else ut=JSON.parse(e);return ut}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ut=await(await fetch("./handler.config.json")).json()}return ut},Da,qt,zr,gt,za,$a;function wl(s){Da=s.initGame,qt=s.CustomAssets,zr=s.updateScreenState,gt=s.globalResponsiveMultipliers,za=s.layout,$a=s.clearResponsiveElements}var dn="web_embed",Gt="https://example.com",_r={profile_id:dn},ze=null,ge=null,Ra={width:0,height:0},xl=!0,Sl=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await vl();_r={...s.ids||{},profile_id:dn},Gt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[dn])==null?void 0:d.destination_url)||Gt,He.init({ids:_r,profile:dn,destinationUrl:Gt});let e=He.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ge=_a({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),Or()},onRefresh:Or});let g=ge.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,w,E,k,j,x,M,O,T,A,_;let f=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=h.detail;if(Ra.width=b,Ra.height=y,zr(b,y),!(!f||!f.renderer)){m&&o(f,m);try{f.renderer.resize(b,y);let P=f.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&&m&&za)try{let P=(v=window.__mainContainer)!=null?v:f.stage,C=(M=(x=(k=window.__tutorialLabel)!=null?k:(E=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:E.call(w))!=null?x:(j=m.get("label_1"))==null?void 0:j.pixiObject)!=null?M:m.get("label_1"),S=m.get("background_1"),I=(_=(A=(T=window.__background)!=null?T:(O=S==null?void 0:S.getDisplayObject)==null?void 0:O.call(S))!=null?A:S==null?void 0:S.pixiObject)!=null?_:S;if(P){let L=P===f.stage;za({mainContainer:P,label:C,background:I,backgroundTexture:(I==null?void 0:I.texture)||null,app:f},t,0,Ra,m,{skipMainContainerTransform:L})}}catch(P){console.warn("[SCREEN] Error in layout:",P)}}})}let t=await Ce("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ce("scene.main"));let i=await Da(e,t,Gt,ge);ze=i.app;let n=i.gameObjectManager;window.gameApp=ze,window.gameObjectManager=n;try{window.__liveEditBridge=cn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:qt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ge&&ge.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(gt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(ze,n);async function r(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let E=await w.text();try{return JSON.parse(E)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let f=h.screens;if(!f||typeof f!="object")return;let m={},b={};for(let[y,v]of Object.entries(f)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let E=await g(w),k=E==null?void 0:E.elements;if(!Array.isArray(k))continue;let j=k.map(x=>x==null?void 0:x.instance_id).filter(x=>typeof x=="string");m[y]=j;for(let x of j)b[x]||(b[x]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(xl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${gt.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((w,E)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let k=w.scale.x||1,j=w.scale.y||1;w.__originalScale||(w.__originalScale={x:k,y:j},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${k.toFixed(3)}, ${j.toFixed(3)}`));let x=w.__originalScale.x*gt.scale,M=w.__originalScale.y*gt.scale;typeof w.scale.set=="function"?w.scale.set(x,M):(w.scale.x=x,w.scale.y=M),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${k.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,y+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${w.constructor.name})`)})};var f=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){gt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,f=window.gameObjectManager;h&&f?(o(h,f),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!f}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,He.start()},Or=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ge){ge.notifyGameDestroyed();try{$a&&$a()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ge.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),ze){try{ze.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}ze=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof qt.resetScene=="function"&&qt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ce("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(o)),Da(a,o,Gt).then(l=>{ze=l.app,window.gameApp=ze,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=cn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:qt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ge&&ge.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{He.start()}catch{}})})},100)},1e3)}};Si();K();var he={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},$r=1.25,Dr={fontFamily:"Inter, system-ui, sans-serif"};var pn=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=`
|
|
2459
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var f,m,b,y,v,w,E,k;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",M=>{if(this.viewMode==="compare")return;let x=M.target.value;this.setDevice(x)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",M=>{let x=M.target.value;this.setTheme(x)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(M=>{M.addEventListener("click",()=>{let x=M.dataset.viewToggle;x&&this.setViewMode(x)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(M=>{M.addEventListener("click",()=>{let x=M.dataset.layoutToggle;x&&this.setLayoutMode(x)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())}),(f=e.querySelector("#rotate-btn"))==null||f.addEventListener("click",()=>this.toggleRotation()),(m=e.querySelector("#zoom-in-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(.1)),(b=e.querySelector("#zoom-out-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(-.1)),(y=e.querySelector("#refresh-btn"))==null||y.addEventListener("click",()=>this.refresh());let l=e.querySelector("#bottom-dock"),c=e.querySelector("#bottom-dock-resize");l&&c&&this.makeBottomDockResizable(l,c);let d=Array.from(e.querySelectorAll(".bottom-dock-tab"));d.forEach(M=>{M.addEventListener("click",()=>{let x=M.dataset.dockTab;if(!x)return;d.forEach(O=>O.classList.remove("active")),M.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let T=O.dataset.dockPanel;O.classList.toggle("active",T===x)})})}),(v=e.querySelector("#console-clear"))==null||v.addEventListener("click",()=>this.clearConsole()),(w=e.querySelector("#corner-zoom-in-btn"))==null||w.addEventListener("click",()=>this.adjustUserZoom(.1)),(E=e.querySelector("#corner-zoom-out-btn"))==null||E.addEventListener("click",()=>this.adjustUserZoom(-.1)),(k=e.querySelector("#corner-grab-btn"))==null||k.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let p=e.querySelector(".scene-panel.scene-objects"),u=p==null?void 0:p.querySelector("[data-panel-resize-v]");p&&u&&this.makeSidebarResizable(p,u,"left");let g=e.querySelector(".debug-workbench"),h=g==null?void 0:g.querySelector("#workbench-resize-v");g&&h&&this.makeSidebarResizable(g,h,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),hi();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),fi();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Me().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Oa(s={}){let e=new cn(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function Ra(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function Mr(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function yl(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function jr(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};yl(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function _r(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Ra(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>_r(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Ra((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Ra((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function vl(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(st(),Is))]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,f=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(f){let m=((o=f.getDisplayObject)==null?void 0:o.call(f))||f.pixiObject||f.pixi||f;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ie(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ie(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Ie(n,{silent:!0,persist:!0,emitEvent:!0})}}function dn(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await de.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(vl(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Mr(p);jr(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Mr(l);jr(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,_r(a))}};return n.rebuildIndexes(),n}K();var zr=tt(require("lottie-web"),1);Ln(An);typeof window!="undefined"&&!window.lottie&&(window.lottie=zr.default);var ut=null,wl=async()=>{if(!ut){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ut=JSON.parse(i)}else ut=JSON.parse(e);return ut}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ut=await(await fetch("./handler.config.json")).json()}return ut},Ha,qt,$r,gt,$a,Da;function xl(s){Ha=s.initGame,qt=s.CustomAssets,$r=s.updateScreenState,gt=s.globalResponsiveMultipliers,$a=s.layout,Da=s.clearResponsiveElements}var pn="web_embed",Gt="https://example.com",Or={profile_id:pn},$e=null,ge=null,za={width:0,height:0},Sl=!0,El=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await wl();Or={...s.ids||{},profile_id:pn},Gt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[pn])==null?void 0:d.destination_url)||Gt,Ne.init({ids:Or,profile:pn,destinationUrl:Gt});let e=Ne.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ge=Oa({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),Rr()},onRefresh:Rr});let g=ge.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,w,E,k,M,x,j,O,T,A,_;let f=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=h.detail;if(za.width=b,za.height=y,$r(b,y),!(!f||!f.renderer)){m&&o(f,m);try{f.renderer.resize(b,y);let P=f.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&&m&&$a)try{let P=(v=window.__mainContainer)!=null?v:f.stage,C=(j=(x=(k=window.__tutorialLabel)!=null?k:(E=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:E.call(w))!=null?x:(M=m.get("label_1"))==null?void 0:M.pixiObject)!=null?j:m.get("label_1"),S=m.get("background_1"),I=(_=(A=(T=window.__background)!=null?T:(O=S==null?void 0:S.getDisplayObject)==null?void 0:O.call(S))!=null?A:S==null?void 0:S.pixiObject)!=null?_:S;if(P){let L=P===f.stage;$a({mainContainer:P,label:C,background:I,backgroundTexture:(I==null?void 0:I.texture)||null,app:f},t,0,za,m,{skipMainContainerTransform:L})}}catch(P){console.warn("[SCREEN] Error in layout:",P)}}})}let t=await Ce("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ce("scene.main"));let i=await Ha(e,t,Gt,ge);$e=i.app;let n=i.gameObjectManager;window.gameApp=$e,window.gameObjectManager=n;try{window.__liveEditBridge=dn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:qt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ge&&ge.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(gt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o($e,n);async function r(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let E=await w.text();try{return JSON.parse(E)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let f=h.screens;if(!f||typeof f!="object")return;let m={},b={};for(let[y,v]of Object.entries(f)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let E=await g(w),k=E==null?void 0:E.elements;if(!Array.isArray(k))continue;let M=k.map(x=>x==null?void 0:x.instance_id).filter(x=>typeof x=="string");m[y]=M;for(let x of M)b[x]||(b[x]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(Sl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${gt.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((w,E)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let k=w.scale.x||1,M=w.scale.y||1;w.__originalScale||(w.__originalScale={x:k,y:M},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${k.toFixed(3)}, ${M.toFixed(3)}`));let x=w.__originalScale.x*gt.scale,j=w.__originalScale.y*gt.scale;typeof w.scale.set=="function"?w.scale.set(x,j):(w.scale.x=x,w.scale.y=j),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${k.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,y+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${w.constructor.name})`)})};var f=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){gt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,f=window.gameObjectManager;h&&f?(o(h,f),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!f}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Ne.start()},Rr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ge){ge.notifyGameDestroyed();try{Da&&Da()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ge.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),$e){try{$e.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}$e=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof qt.resetScene=="function"&&qt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ce("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(o)),Ha(a,o,Gt).then(l=>{$e=l.app,window.gameApp=$e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=dn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:qt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ge&&ge.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ne.start()}catch{}})})},100)},1e3)}};Si();K();var he={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Dr=1.25,Hr={fontFamily:"Inter, system-ui, sans-serif"};var un=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
|
|
2426
2460
|
position: fixed;
|
|
2427
2461
|
inset: 0;
|
|
2428
2462
|
display: flex;
|
|
@@ -2621,7 +2655,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2621
2655
|
0%, 100% { opacity: 1; }
|
|
2622
2656
|
50% { opacity: 0.3; }
|
|
2623
2657
|
}
|
|
2624
|
-
`,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 Ha=ss.version,El=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);as();var qr={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"},Vr=Math.random().toString(36).slice(2),mt=null,ht={...qr},Wr="web_embed",Ua={},Wt,Na=!1,Vt=!1,Kt=!1,Yr=!1,Wa=1,gn=0,mn=!1,Te=!1,ft="",bt=Math.floor(window.innerWidth),yt=Math.floor(window.innerHeight),Ga=bt>yt,Le=!1,Yt=!1,Hr=!1,Nr=!1,Fa=!1,hn=null,Xe=null,qa=!1,Va=!1,un=new Map;function Kr(){if(!Xe)return null;let s=Date.now()-Xe;return!Number.isFinite(s)||s<0?null:s}function Ba(s){if(qa)return;let e=Kr();e!==null&&(qa=!0,$("session_time",{duration_ms:e,reason:s}))}function Fr(){if(mt)return mt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),mt=s,s}function fn(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function Xr(s,e){return{event_name:s,ts:Date.now(),session_id:Vr,deployment_id:ht.deployment_id,variant_id:ht.variant_id,export_profile_id:ht.profile_id,instance_id:ht.instance_id||"default",env:Wr==="mraid"?"mraid":"web",attribution:Wt,payload:e}}function $(s,e){let t=fn(s),i=Xr(t,e);xn(i,!!Ua.analytics),ti(t,i),t!==s&&ti(s,i)}function Xt(){hn&&(hn(bt,yt),hn=null)}function vt(s){Wa=s,$("volume",s)}function wt(s){s&&(Yr=!0),!Kt&&(Kt=!0,$("pause"),vt(0))}function Jt(s){!s&&Yr||Kt&&(Kt=!1,$("resume"),vt(Wa))}function $e(s,e){bt=Math.floor(s||window.innerWidth),yt=Math.floor(e||window.innerHeight),Ga=bt>yt,$("resize",{width:bt,height:yt})}function Cl(){if(bs())try{let s=mraid.getMaxSize();$e(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Jt():wt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();$e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();vt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&vt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),mn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt();else{let t=()=>{Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Al(){if(ys())try{let s=dapi.getScreenSize();$e(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Jt():wt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();$e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(vt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>vt(t?1:0)),mn=!0,dapi.isViewable())Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt();else{let t=()=>{Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Br(){let s=()=>{Le||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt(),Yt&&(Yt=!1,le.start()))};window.addEventListener("resize",()=>$e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Jt(),s()):wt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),mn=!0}function Tl(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Hr=!0),!(Hr&&e instanceof MouseEvent)&&(gn+=1,Va||(Va=!0,$("first_interaction",{count:gn})),$("interaction",gn))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Ur(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(at())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(vs())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Es())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ss())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(f){console.warn("Smadex redirect failed",f)}else if(ws()){let f=window.ExitApi;f&&typeof f.exit=="function"?f.exit(s||ft||""):s&&window.open(s)}else nt()?(u=window.install)==null||u.call(window):xs()?(g=window.openAppStore)==null||g.call(window):Sn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function Ll(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),ei("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function kl(){if(!at())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{le.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Gr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function Pl(){nt()&&(window.mintGameStart=()=>{Jt(!0),$e()},window.mintGameClose=()=>{wt(!0)})}function Il(){if(!En())return;let s=window.NUC;!s||!s.trigger||(le.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ft)}),le.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var le={init(s={},e){var t;if(Wr=s.profile||"web_embed",Ua=s.consent||{},ht={...qr,...s.ids||{}},mt=s.rootEl||mt,Wt=void 0,Ja((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Xe=null,qa=!1,Va=!1,un.clear(),ft=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(hn=e),$("init"),document.body.oncontextmenu=()=>!1,Fr(),Ml(mt),Cs(),Cl(),Al(),!mn){if(document.readyState==="complete")Br();else if(!Nr){Nr=!0;let i=()=>{Br(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Tl(),Ll(),kl(),Pl(),Il(),console.log(`%c @handler/playable-sdk %c v${Ha} `,"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;"),Le&&!Te&&($("boot"),$("view"),$("ready"),Yt&&(Yt=!1,le.start()),Te=!0),Te=Le},getRoot(){return Fr()},get version(){return Ha},get maxWidth(){return bt},get maxHeight(){return yt},get isLandscape(){return Ga},get isReady(){return Te},get isStarted(){return Na},get isPaused(){return Kt},get isFinished(){return Vt},get volume(){return Wa},get interactions(){return gn},on(s,e){ei(fn(s),e)},off(s,e){wn(fn(s),e)},start(){var s,e;if(!Na){if(!Le){Yt=!0;return}if(Na=!0,Xe||(Xe=Date.now()),$("start"),$e(),nt())wt(),(s=window.gameReady)==null||s.call(window);else if(at()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ga?"landscape":"portrait",buildID:Ha})}}},finish(){var s,e;Vt||(Vt=!0,$("complete"),Ba("complete"),nt()?(s=window.gameEnd)==null||s.call(window):Sn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):at()&&Gr())},install(s){if(!Vt){Vt=!0,at()?(Gr(),setTimeout(()=>le.install(s),300)):($("complete"),setTimeout(()=>le.install(s),0));return}Fa||(Fa=!0,setTimeout(()=>Fa=!1,500),$("cta_click"),$("conversion"),Ba("cta"),Ur(s||ft))},emit(s,e){let t=fn(s);if(!El.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Xr(t,e);xn(i,!!Ua.analytics),ti(t,i)},gameStart(){le.start()},gameEnd(){le.finish()},ctaClick(s,e){$("cta_click",{url:s||ft,manual:!0}),(e==null?void 0:e.open)!==!1&&Ur(s||ft)},ctaShow(s){$("cta_show",s)},ctaDismiss(s){$("cta_dismiss",s)},getGameTimeMs(){return Kr()},endSession(s="manual"){Ba(s)},setAttribution(s){Wt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(jl(`${Vr}:${s}`))%e.length,i=e[t];return Wt={...Wt||{},experiment_id:s},ht.variant_id=i,$("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Xe||(Xe=Date.now()),$("level_start",{level_id:s,...e})},levelComplete(s,e){$("level_complete",{level_id:s,...e})},levelFail(s,e){$("level_fail",{level_id:s,...e})},checkpoint(s,e){$("checkpoint",{checkpoint_id:s,...e})},reward(s,e){$("reward",{reward_id:s,...e})},tutorialStart(s,e){$("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){$("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){$("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&un.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=un.get(s);if(!i)return;un.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){$("engagement",{action:"timer",key:s,duration_ms:n,...t});return}$(e,{key:s,duration_ms:n,...t})}},fps(s,e){$("fps",{value:s,...e})},memory(s,e){$("memory",{bytes:s,...e})},assetLoadStart(s,e){$("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){$("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){$("error",{code:s,message:e,...t})},retry(){var s,e,t;if(nt())(s=window.gameRetry)==null||s.call(window);else if(En()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}$("engagement",{action:"retry"})},pause(){wt(!0)},resume(){Jt(!0)},resize(s,e){$e(s,e)}},He=le;function jl(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Ml(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2658
|
+
`,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var Na=rs.version,Cl=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"]);ss();var Vr={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"},Wr=Math.random().toString(36).slice(2),mt=null,ht={...Vr},Yr="web_embed",Ga={},Wt,Fa=!1,Vt=!1,Kt=!1,Kr=!1,Ya=1,hn=0,bn=!1,Te=!1,ft="",bt=Math.floor(window.innerWidth),yt=Math.floor(window.innerHeight),qa=bt>yt,Le=!1,Yt=!1,Nr=!1,Fr=!1,Ba=!1,fn=null,Xe=null,Va=!1,Wa=!1,gn=new Map;function Xr(){if(!Xe)return null;let s=Date.now()-Xe;return!Number.isFinite(s)||s<0?null:s}function Ua(s){if(Va)return;let e=Xr();e!==null&&(Va=!0,$("session_time",{duration_ms:e,reason:s}))}function Br(){if(mt)return mt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),mt=s,s}function mn(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function Jr(s,e){return{event_name:s,ts:Date.now(),session_id:Wr,deployment_id:ht.deployment_id,variant_id:ht.variant_id,export_profile_id:ht.profile_id,instance_id:ht.instance_id||"default",env:Yr==="mraid"?"mraid":"web",attribution:Wt,payload:e}}function $(s,e){let t=mn(s),i=Jr(t,e);Sn(i,!!Ga.analytics),ti(t,i),t!==s&&ti(s,i)}function Xt(){fn&&(fn(bt,yt),fn=null)}function vt(s){Ya=s,$("volume",s)}function wt(s){s&&(Kr=!0),!Kt&&(Kt=!0,$("pause"),vt(0))}function Jt(s){!s&&Kr||Kt&&(Kt=!1,$("resume"),vt(Ya))}function De(s,e){bt=Math.floor(s||window.innerWidth),yt=Math.floor(e||window.innerHeight),qa=bt>yt,$("resize",{width:bt,height:yt})}function Al(){if(ys())try{let s=mraid.getMaxSize();De(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Jt():wt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();De(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();vt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&vt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),bn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt();else{let t=()=>{Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Tl(){if(vs())try{let s=dapi.getScreenSize();De(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Jt():wt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();De(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(vt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>vt(t?1:0)),bn=!0,dapi.isViewable())Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt();else{let t=()=>{Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Ur(){let s=()=>{Le||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Le=!0,$("boot"),$("view"),$("ready"),Te=!0,Xt(),Yt&&(Yt=!1,le.start()))};window.addEventListener("resize",()=>De()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Jt(),s()):wt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),bn=!0}function Ll(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Nr=!0),!(Nr&&e instanceof MouseEvent)&&(hn+=1,Wa||(Wa=!0,$("first_interaction",{count:hn})),$("interaction",hn))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Gr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(at())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(ws())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Cs())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Es())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(f){console.warn("Smadex redirect failed",f)}else if(xs()){let f=window.ExitApi;f&&typeof f.exit=="function"?f.exit(s||ft||""):s&&window.open(s)}else nt()?(u=window.install)==null||u.call(window):Ss()?(g=window.openAppStore)==null||g.call(window):En()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function kl(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;te("view",()=>e(t.mraid_viewable)),te("start",()=>e(t.game_viewable)),te("engagement",()=>e(t.engagement));let i=()=>e(t.complete);te("complete",i),ei("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),te("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;te("view",()=>e(t.Ad_Load_Start)),te("start",()=>e(t.Ad_Viewable)),te("engagement",()=>e(t.First_Engagement)),te("complete",()=>e(t.Gameplay_Complete)),te("cta_click",()=>e(t.DSP_Click)),te("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Pl(){if(!at())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{le.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function qr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function Il(){nt()&&(window.mintGameStart=()=>{Jt(!0),De()},window.mintGameClose=()=>{wt(!0)})}function Ml(){if(!Cn())return;let s=window.NUC;!s||!s.trigger||(le.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ft)}),le.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var le={init(s={},e){var t;if(Yr=s.profile||"web_embed",Ga=s.consent||{},ht={...Vr,...s.ids||{}},mt=s.rootEl||mt,Wt=void 0,Za((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Xe=null,Va=!1,Wa=!1,gn.clear(),ft=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(fn=e),$("init"),document.body.oncontextmenu=()=>!1,Br(),_l(mt),As(),Al(),Tl(),!bn){if(document.readyState==="complete")Ur();else if(!Fr){Fr=!0;let i=()=>{Ur(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Ll(),kl(),Pl(),Il(),Ml(),console.log(`%c @handler/playable-sdk %c v${Na} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),Le&&!Te&&($("boot"),$("view"),$("ready"),Yt&&(Yt=!1,le.start()),Te=!0),Te=Le},getRoot(){return Br()},get version(){return Na},get maxWidth(){return bt},get maxHeight(){return yt},get isLandscape(){return qa},get isReady(){return Te},get isStarted(){return Fa},get isPaused(){return Kt},get isFinished(){return Vt},get volume(){return Ya},get interactions(){return hn},on(s,e){ei(mn(s),e)},off(s,e){xn(mn(s),e)},start(){var s,e;if(!Fa){if(!Le){Yt=!0;return}if(Fa=!0,Xe||(Xe=Date.now()),$("start"),De(),nt())wt(),(s=window.gameReady)==null||s.call(window);else if(at()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:qa?"landscape":"portrait",buildID:Na})}}},finish(){var s,e;Vt||(Vt=!0,$("complete"),Ua("complete"),nt()?(s=window.gameEnd)==null||s.call(window):En()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):at()&&qr())},install(s){if(!Vt){Vt=!0,at()?(qr(),setTimeout(()=>le.install(s),300)):($("complete"),setTimeout(()=>le.install(s),0));return}Ba||(Ba=!0,setTimeout(()=>Ba=!1,500),$("cta_click"),$("conversion"),Ua("cta"),Gr(s||ft))},emit(s,e){let t=mn(s);if(!Cl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Jr(t,e);Sn(i,!!Ga.analytics),ti(t,i)},gameStart(){le.start()},gameEnd(){le.finish()},ctaClick(s,e){$("cta_click",{url:s||ft,manual:!0}),(e==null?void 0:e.open)!==!1&&Gr(s||ft)},ctaShow(s){$("cta_show",s)},ctaDismiss(s){$("cta_dismiss",s)},getGameTimeMs(){return Xr()},endSession(s="manual"){Ua(s)},setAttribution(s){Wt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(jl(`${Wr}:${s}`))%e.length,i=e[t];return Wt={...Wt||{},experiment_id:s},ht.variant_id=i,$("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Xe||(Xe=Date.now()),$("level_start",{level_id:s,...e})},levelComplete(s,e){$("level_complete",{level_id:s,...e})},levelFail(s,e){$("level_fail",{level_id:s,...e})},checkpoint(s,e){$("checkpoint",{checkpoint_id:s,...e})},reward(s,e){$("reward",{reward_id:s,...e})},tutorialStart(s,e){$("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){$("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){$("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&gn.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=gn.get(s);if(!i)return;gn.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){$("engagement",{action:"timer",key:s,duration_ms:n,...t});return}$(e,{key:s,duration_ms:n,...t})}},fps(s,e){$("fps",{value:s,...e})},memory(s,e){$("memory",{bytes:s,...e})},assetLoadStart(s,e){$("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){$("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){$("error",{code:s,message:e,...t})},retry(){var s,e,t;if(nt())(s=window.gameRetry)==null||s.call(window);else if(Cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}$("engagement",{action:"retry"})},pause(){wt(!0)},resume(){Jt(!0)},resize(s,e){De(s,e)}},Ne=le;function jl(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function _l(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2625
2659
|
(function(){
|
|
2626
2660
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
2627
2661
|
function unlock(){
|