handler-playable-sdk 0.3.61 → 0.3.62
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-2YFOCUIT.js → chunk-MNJSOVZS.js} +69 -69
- 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 +72 -72
- package/dist/index.css +122 -50
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +10 -10
- package/dist/pixi/index.css +122 -50
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +40 -40
- package/dist/three/index.css +122 -50
- package/dist/three/index.js +1 -1
- package/package.json +2 -2
package/dist/three/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var fr=Object.create;var ft=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var yr=Object.getPrototypeOf,vr=Object.prototype.hasOwnProperty;var ie=(t,e)=>()=>(t&&(e=t(t=0)),e);var ra=(t,e)=>{for(var n in e)ft(t,n,{get:e[n],enumerable:!0})},oa=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of br(e))!vr.call(t,a)&&a!==n&&ft(t,a,{get:()=>e[a],enumerable:!(i=mr(e,a))||i.enumerable});return t};var ae=(t,e,n)=>(n=t!=null?fr(yr(t)):{},oa(e||!t||!t.__esModule?ft(n,"default",{value:t,enumerable:!0}):n,t)),xr=t=>oa(ft({},"__esModule",{value:!0}),t);var se,nn=ie(()=>{"use strict";se=class{static get(e){var n;return(n=this.store.get(e))==null?void 0:n.data}static set(e,n){this.store.set(e,{data:n})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};se.store=new Map});function Lr(){var t,e;try{let n=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(t=document.querySelector("script"))==null?void 0:t.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!!(n&&!i)}catch{return!1}}async function Mr(){try{if(typeof window!="undefined"){let t=await fetch("./build-settings.json");if(t.ok){let e=await t.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function Pr(){try{if(typeof window!="undefined"){let t=new XMLHttpRequest;if(t.open("GET","./build-settings.json",!1),t.send(),t.status===200&&t.responseText){let e=JSON.parse(t.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function kr(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${C}`),Object.keys(re).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(re)),re;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),re={...window.INLINE_ASSETS},re;if(!(C==="publish"&&X!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),re;if(!an){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),an=(async()=>{try{try{let s=await import(e+"?t="+Date.now());if(s.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(s.INLINE_ASSETS)),s.INLINE_ASSETS}catch(s){console.warn("[AssetLoader] ES module import failed, trying text parse:",s)}let n=await fetch(e);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let i=await n.text();console.log("[AssetLoader] Received JS code, length:",i.length);let a=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let s=a[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let r=new Function("return "+s)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(r)),r}catch(s){return console.warn("[AssetLoader] Failed to parse inline assets:",s),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(n){return console.warn("[AssetLoader] Failed to load inline assets:",n),{}}})()}return re=await an,console.log("[AssetLoader] Final inline assets cache:",Object.keys(re)),re}function sn(t){return t===null||typeof t!="object"||(Object.freeze(t),Object.values(t).forEach(e=>sn(e))),t}function Rr(t=64,e=64,n=16711680){let i=document.createElement("canvas");i.width=t,i.height=e;let a=i.getContext("2d");return a.fillStyle=`#${n.toString(16).padStart(6,"0")}`,a.fillRect(0,0,t,e),a.strokeStyle="#000",a.strokeRect(0,0,t,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",t/2,e/2),oe.Texture.from(i)}function rn(t,e){Fa.set(t,e)}var oe,za,Na,Ee,C,X,he,re,an,Fa,Se,vt=ie(()=>{"use strict";oe=require("pixi.js");nn();za=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Na=Lr(),Ee=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,C=Na?"publish":za,X=Ee==null?void 0:Ee.assetsInlined;Ee!=null&&Ee.buildMode&&(C=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${C}`));he=Pr();he!=null&&he.buildMode&&(C=he.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${C}`));(he==null?void 0:he.assetsInlined)!==void 0&&(X=he.assetsInlined);Mr().then(t=>{t!=null&&t.buildMode&&t.buildMode!==C&&(C=t.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${C}`)),(t==null?void 0:t.assetsInlined)!==void 0&&(X=t.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${za}, Runtime: ${Na?"publish":"dev"}, Effective: ${C}`);re={},an=null;Fa=new Map;Se=class{static async load(e,n,i,a){let s=`${e}:${n.path}`,r=se.get(s);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${n.type}, Effective mode: ${C}`),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 kr(),l=o[e];if(!l&&a&&(l=o[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!l&&n.path){let c=n.path.split("/");if(c.length>=2){let g=c[c.length-1].split(".")[0];o[g]&&(l=o[g],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${g}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),C==="publish"&&X!==!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: ${n.path}`);let p=Fa.get(n.type);if(p)try{let c=await p(n.path,l,e,i);return se.set(s,c),c}catch(c){return this.handleFailure(e,n.type,c)}try{let c;switch(n.type){case"image":c=await this.loadImage(n.path,l);break;case"json":c=await this.loadJSON(n.path,l),c=sn(c);break;default:throw new Error(`Unknown asset type: ${n.type}`)}return se.set(s,c),c}catch(c){return this.handleFailure(e,n.type,c)}}static async loadImage(e,n){let i=C==="publish",a=i&&X!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${C}, isPublishMode: ${i}, inlineData: ${n?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!n)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof n!="string"||!n.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof n}`);try{return await oe.Assets.load(n)}catch(s){throw console.error("[AssetLoader] Failed to load texture from data URI:",s),s}}if(n&&typeof n=="string"&&n.startsWith("data:"))try{return await oe.Assets.load(n)}catch(s){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",s),await oe.Assets.load(e)}return await oe.Assets.load(e)}static async loadJSON(e,n){let i=C==="publish",a=i&&X!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${C}, isPublishMode: ${i}, inlineData: ${n?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!n)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof n=="object"&&n!==null)return n;if(typeof n=="string"&&n.startsWith("data:")){let r=atob(n.split(",")[1]);return JSON.parse(r)}return JSON.parse(n)}if(n){if(typeof n=="object"&&n!==null)return n;if(typeof n=="string"&&n.startsWith("data:")){let r=atob(n.split(",")[1]);return JSON.parse(r)}return JSON.parse(n)}let s=await fetch(e);if(!s.ok)throw new Error(`JSON fetch failed: ${e}`);return s.json()}static handleFailure(e,n,i){if(C==="dev"){let s=n==="image"?Rr():sn({__placeholder:!0,type:n});return se.set(e+":"+((i==null?void 0:i.path)||"missing"),s),s}throw i}};rn("image",async(t,e)=>{let n=C==="publish",i=n&&X!==!1,a=C==="brand",s=n&&X===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${C}, isPublishMode: ${n}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return oe.Assets.load(e)}let r=t;return(a||s)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(r=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${r}"`))),oe.Assets.load(e||r)});rn("json",async(t,e)=>{let n=C==="publish",i=n&&X!==!1,a=C==="brand",s=n&&X===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${C}, isPublishMode: ${n}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let r=t;if((a||s)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(r=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${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: ${t}`);return o.json()})});var ln,Hr,xt,Xe=ie(()=>{"use strict";vt();ln=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,n){if(this.config===e&&this.app===n&&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=n,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,n=this.app;return this.readyPromise=(async()=>{var r;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),a=[],s=[];for(let[o,l]of e.objects.entries()){let d=(r=l.render)==null?void 0:r.asset;if(!d)continue;let p=async()=>{var c;try{let g=(c=l.identity)==null?void 0:c.id;console.log(`[AssetTextures] Loading ${d.type}: ${o} (${g})`);let u=await Se.load(o,d,n,g);this.textures.set(o,u),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(g){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,g)}finally{this.attempted.add(o);try{for(let g of Array.from(this.waiters))g()}catch{}}};i.has(o)?a.push(p()):s.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(s),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,n={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let a=Array.from(new Set((e||[]).filter(o=>typeof o=="string"&&o))).filter(o=>{var l,d,p,c;try{let g=(p=(d=(l=this.config)==null?void 0:l.objects)==null?void 0:d.get)==null?void 0:p.call(d,o);return!!((c=g==null?void 0:g.render)!=null&&c.asset)}catch{return!1}});if(a.length===0)return;this.ready().catch(()=>{});let s=()=>a.every(o=>this.textures.has(o)||this.attempted.has(o));if(s())return;let r=typeof n.timeoutMs=="number"?n.timeoutMs:15e3;await new Promise(o=>{let l=!1,d=()=>{l||s()&&(l=!0,this.waiters.delete(d),o())};this.waiters.add(d),d(),r>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(d),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:a}),o())},r)})}get(e){return this.textures.get(e)}set(e,n){this.textures.set(e,n),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())}},Hr=new ln,xt=new Proxy(Hr,{get(t,e){return e in t&&typeof t[e]=="function"?t[e].bind(t):t.get(e)},set(t,e,n){return t.set(e,n),!0}})});var ro,fe=ie(()=>{"use strict";ro="handler_preview_override_mode";if(typeof window!="undefined"){let t=window.localStorage.getItem(ro);window.__enableConfigOverrides=t===null?!0:t==="true"}});var Wa,Te,Ec,un=ie(()=>{"use strict";fe();Wa=null,Te="dev";if(typeof window!="undefined"){let t=window.__BUILD_SETTINGS__;if(t!=null&&t.buildMode)Wa=t,Te=t.buildMode,console.log("[CONFIG] Loaded inline build settings:",t,"buildMode:",Te);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let n=JSON.parse(e.responseText);Wa=n,Te=n.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",n,"buildMode:",Te)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",Te)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",Te);Ec=Te==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});var gn=ie(()=>{"use strict"});var Ya=ie(()=>{"use strict";gn();un()});var hn=ie(()=>{"use strict";un();gn();Ya()});var ts={};ra(ts,{AssetEditorModal:()=>wn});var wn,En=ie(()=>{"use strict";wn=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,n,i,a){this.currentObjectId=e,this.currentPath=n,this.currentAsset=i,this.onApplyCallback=a,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,n){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
|
|
1
|
+
"use strict";var fs=Object.create;var ft=Object.defineProperty;var ms=Object.getOwnPropertyDescriptor;var bs=Object.getOwnPropertyNames;var ys=Object.getPrototypeOf,vs=Object.prototype.hasOwnProperty;var ie=(t,e)=>()=>(t&&(e=t(t=0)),e);var sa=(t,e)=>{for(var n in e)ft(t,n,{get:e[n],enumerable:!0})},oa=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of bs(e))!vs.call(t,a)&&a!==n&&ft(t,a,{get:()=>e[a],enumerable:!(i=ms(e,a))||i.enumerable});return t};var ae=(t,e,n)=>(n=t!=null?fs(ys(t)):{},oa(e||!t||!t.__esModule?ft(n,"default",{value:t,enumerable:!0}):n,t)),xs=t=>oa(ft({},"__esModule",{value:!0}),t);var re,nn=ie(()=>{"use strict";re=class{static get(e){var n;return(n=this.store.get(e))==null?void 0:n.data}static set(e,n){this.store.set(e,{data:n})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};re.store=new Map});function Ls(){var t,e;try{let n=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(t=document.querySelector("script"))==null?void 0:t.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!!(n&&!i)}catch{return!1}}async function Ms(){try{if(typeof window!="undefined"){let t=await fetch("./build-settings.json");if(t.ok){let e=await t.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function ks(){try{if(typeof window!="undefined"){let t=new XMLHttpRequest;if(t.open("GET","./build-settings.json",!1),t.send(),t.status===200&&t.responseText){let e=JSON.parse(t.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function Ps(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${C}`),Object.keys(se).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(se)),se;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),se={...window.INLINE_ASSETS},se;if(!(C==="publish"&&X!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),se;if(!an){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),an=(async()=>{try{try{let r=await import(e+"?t="+Date.now());if(r.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(r.INLINE_ASSETS)),r.INLINE_ASSETS}catch(r){console.warn("[AssetLoader] ES module import failed, trying text parse:",r)}let n=await fetch(e);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let i=await n.text();console.log("[AssetLoader] Received JS code, length:",i.length);let a=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let r=a[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let s=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(s)),s}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(n){return console.warn("[AssetLoader] Failed to load inline assets:",n),{}}})()}return se=await an,console.log("[AssetLoader] Final inline assets cache:",Object.keys(se)),se}function rn(t){return t===null||typeof t!="object"||(Object.freeze(t),Object.values(t).forEach(e=>rn(e))),t}function Rs(t=64,e=64,n=16711680){let i=document.createElement("canvas");i.width=t,i.height=e;let a=i.getContext("2d");return a.fillStyle=`#${n.toString(16).padStart(6,"0")}`,a.fillRect(0,0,t,e),a.strokeStyle="#000",a.strokeRect(0,0,t,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",t/2,e/2),oe.Texture.from(i)}function sn(t,e){Na.set(t,e)}var oe,za,Fa,Ee,C,X,he,se,an,Na,Se,vt=ie(()=>{"use strict";oe=require("pixi.js");nn();za=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Fa=Ls(),Ee=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,C=Fa?"publish":za,X=Ee==null?void 0:Ee.assetsInlined;Ee!=null&&Ee.buildMode&&(C=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${C}`));he=ks();he!=null&&he.buildMode&&(C=he.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${C}`));(he==null?void 0:he.assetsInlined)!==void 0&&(X=he.assetsInlined);Ms().then(t=>{t!=null&&t.buildMode&&t.buildMode!==C&&(C=t.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${C}`)),(t==null?void 0:t.assetsInlined)!==void 0&&(X=t.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${za}, Runtime: ${Fa?"publish":"dev"}, Effective: ${C}`);se={},an=null;Na=new Map;Se=class{static async load(e,n,i,a){let r=`${e}:${n.path}`,s=re.get(r);if(s!==void 0)return s;console.log(`[AssetLoader] Loading asset: ${e}, type: ${n.type}, Effective mode: ${C}`),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 Ps(),l=o[e];if(!l&&a&&(l=o[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!l&&n.path){let c=n.path.split("/");if(c.length>=2){let g=c[c.length-1].split(".")[0];o[g]&&(l=o[g],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${g}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),C==="publish"&&X!==!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: ${n.path}`);let p=Na.get(n.type);if(p)try{let c=await p(n.path,l,e,i);return re.set(r,c),c}catch(c){return this.handleFailure(e,n.type,c)}try{let c;switch(n.type){case"image":c=await this.loadImage(n.path,l);break;case"json":c=await this.loadJSON(n.path,l),c=rn(c);break;default:throw new Error(`Unknown asset type: ${n.type}`)}return re.set(r,c),c}catch(c){return this.handleFailure(e,n.type,c)}}static async loadImage(e,n){let i=C==="publish",a=i&&X!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${C}, isPublishMode: ${i}, inlineData: ${n?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!n)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof n!="string"||!n.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof n}`);try{return await oe.Assets.load(n)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(n&&typeof n=="string"&&n.startsWith("data:"))try{return await oe.Assets.load(n)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await oe.Assets.load(e)}return await oe.Assets.load(e)}static async loadJSON(e,n){let i=C==="publish",a=i&&X!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${C}, isPublishMode: ${i}, inlineData: ${n?"EXISTS":"MISSING"}`),a){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!n)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof n=="object"&&n!==null)return n;if(typeof n=="string"&&n.startsWith("data:")){let s=atob(n.split(",")[1]);return JSON.parse(s)}return JSON.parse(n)}if(n){if(typeof n=="object"&&n!==null)return n;if(typeof n=="string"&&n.startsWith("data:")){let s=atob(n.split(",")[1]);return JSON.parse(s)}return JSON.parse(n)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,n,i){if(C==="dev"){let r=n==="image"?Rs():rn({__placeholder:!0,type:n});return re.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};sn("image",async(t,e)=>{let n=C==="publish",i=n&&X!==!1,a=C==="brand",r=n&&X===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${C}, isPublishMode: ${n}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return oe.Assets.load(e)}let s=t;return(a||r)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(s=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${s}"`))),oe.Assets.load(e||s)});sn("json",async(t,e)=>{let n=C==="publish",i=n&&X!==!1,a=C==="brand",r=n&&X===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${C}, isPublishMode: ${n}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let s=t;if((a||r)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(s=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${s}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let o=await fetch(s);if(!o.ok)throw new Error(`JSON fetch failed: ${t}`);return o.json()})});var ln,Hs,xt,Xe=ie(()=>{"use strict";vt();ln=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,n){if(this.config===e&&this.app===n&&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=n,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,n=this.app;return this.readyPromise=(async()=>{var s;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),a=[],r=[];for(let[o,l]of e.objects.entries()){let d=(s=l.render)==null?void 0:s.asset;if(!d)continue;let p=async()=>{var c;try{let g=(c=l.identity)==null?void 0:c.id;console.log(`[AssetTextures] Loading ${d.type}: ${o} (${g})`);let u=await Se.load(o,d,n,g);this.textures.set(o,u),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(g){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,g)}finally{this.attempted.add(o);try{for(let g of Array.from(this.waiters))g()}catch{}}};i.has(o)?a.push(p()):r.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,n={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let a=Array.from(new Set((e||[]).filter(o=>typeof o=="string"&&o))).filter(o=>{var l,d,p,c;try{let g=(p=(d=(l=this.config)==null?void 0:l.objects)==null?void 0:d.get)==null?void 0:p.call(d,o);return!!((c=g==null?void 0:g.render)!=null&&c.asset)}catch{return!1}});if(a.length===0)return;this.ready().catch(()=>{});let r=()=>a.every(o=>this.textures.has(o)||this.attempted.has(o));if(r())return;let s=typeof n.timeoutMs=="number"?n.timeoutMs:15e3;await new Promise(o=>{let l=!1,d=()=>{l||r()&&(l=!0,this.waiters.delete(d),o())};this.waiters.add(d),d(),s>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(d),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:a}),o())},s)})}get(e){return this.textures.get(e)}set(e,n){this.textures.set(e,n),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())}},Hs=new ln,xt=new Proxy(Hs,{get(t,e){return e in t&&typeof t[e]=="function"?t[e].bind(t):t.get(e)},set(t,e,n){return t.set(e,n),!0}})});var so,fe=ie(()=>{"use strict";so="handler_preview_override_mode";if(typeof window!="undefined"){let t=window.localStorage.getItem(so);window.__enableConfigOverrides=t===null?!0:t==="true"}});var Wa,Te,Ec,un=ie(()=>{"use strict";fe();Wa=null,Te="dev";if(typeof window!="undefined"){let t=window.__BUILD_SETTINGS__;if(t!=null&&t.buildMode)Wa=t,Te=t.buildMode,console.log("[CONFIG] Loaded inline build settings:",t,"buildMode:",Te);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let n=JSON.parse(e.responseText);Wa=n,Te=n.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",n,"buildMode:",Te)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",Te)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",Te);Ec=Te==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});var gn=ie(()=>{"use strict"});var Ya=ie(()=>{"use strict";gn();un()});var hn=ie(()=>{"use strict";un();gn();Ya()});var tr={};sa(tr,{AssetEditorModal:()=>wn});var wn,En=ie(()=>{"use strict";wn=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,n,i,a){this.currentObjectId=e,this.currentPath=n,this.currentAsset=i,this.onApplyCallback=a,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,n){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 d=o.target.dataset.tab;d&&this.switchTab(d)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let s=this.modal.querySelector("[data-modal-apply]");s==null||s.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(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let n=window.__openAiEditor;if(typeof n!="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}`,n(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:a=>{this.onApplyCallback&&this.onApplyCallback(a),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var Xo={};ra(Xo,{AspectClass:()=>In,GameObject:()=>ot,GameObjectManager:()=>$t,Renderer:()=>rt,ResponsiveUISystem:()=>Ge,Transform:()=>st,animateHandClick:()=>xs,animatePanelEntrance:()=>vs,createBrushTexture:()=>_s,createEndGamePanel:()=>ys,createHandTutorial:()=>ws,createThreeBase:()=>fs,createTutorialLabel:()=>Es,getAspectClass:()=>Dt,getRegisteredFontIds:()=>bs,loadAsset:()=>$n,loadCharacterFrames:()=>Ts,registerFont:()=>ms,resolveFont:()=>Z,resolveFontWeight:()=>Q,updateHandAnimation:()=>Ss});module.exports=xr(Xo);var V=ae(require("three"),1);var ge={};function mt(t,e,n=!1){ge[t]||(ge[t]=[]),ge[t].push({fn:e,once:n})}function Xt(t,e){if(ge[t]){if(!e){delete ge[t];return}ge[t]=ge[t].filter(n=>n.fn!==e)}}function bt(t,...e){let n=ge[t];if(n)for(let i of[...n])i.fn(...e),i.once&&Xt(t,i.fn)}function B(t,e){mt(t,e,!0)}var P=null,W=[],ke=null;function da(t){P=t,W=[],ke!==null&&(clearTimeout(ke),ke=null)}function pa(){var t,e,n;return{endpoint:(P==null?void 0:P.endpoint)||"",transport:(P==null?void 0:P.transport)||"beacon",batchSize:(t=P==null?void 0:P.batchSize)!=null?t:10,flushIntervalMs:(e=P==null?void 0:P.flushIntervalMs)!=null?e:300,maxQueue:(n=P==null?void 0:P.maxQueue)!=null?n:200,debug:!!(P!=null&&P.debug)}}async function la(t,e,n,i){let a=JSON.stringify(e);if(n==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let s=navigator.sendBeacon(t,new Blob([a],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",s,e);return}catch(s){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",s)}try{await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(s){i&&console.warn("[handler.telemetry] fetch failed",s)}}function Jt(t,e){let n=pa();if(e&&n.endpoint){if(W.push(t),W.length>n.maxQueue&&(W=W.slice(W.length-n.maxQueue)),W.length>=n.batchSize){ca();return}ke===null&&(ke=window.setTimeout(()=>{ke=null,ca()},n.flushIntervalMs))}}async function ca(){let t=pa();if(!t.endpoint||W.length===0)return;let e=W.splice(0,t.batchSize);await la(t.endpoint,{events:e},t.transport,t.debug),W.length>0&&await la(t.endpoint,{events:W.splice(0,t.batchSize)},t.transport,t.debug)}function ua(t){return Math.max(0,Math.min(1,t))}function wr(t){let e=String(t!=null?t:"power2.out");if(e==="linear")return n=>n;if(e==="sine.inOut")return n=>.5-Math.cos(Math.PI*n)/2;if(e==="power2.out"||e==="easeOutQuad")return n=>1-(1-n)*(1-n);if(e.startsWith("back.out")){let n=e.match(/back\.out\(([\d.]+)\)/),i=n?Number(n[1]):1.8;return a=>1+(i+1)*Math.pow(a-1,3)+i*Math.pow(a-1,2)}return n=>1-(1-n)*(1-n)}function Ve(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Er(t,e){let n=t==null?void 0:t[e];return typeof n=="number"?n:0}function ga(t,e,n){try{t[e]=n}catch{}}function Sr(t){let e=t==null?void 0:t.scale;if(!e)return null;let n=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:n,y:i}}function ha(t,e){let n=t==null?void 0:t.scale;if(n)try{typeof n.set=="function"?n.set(e.x,e.y):(typeof n.x=="number"&&(n.x=e.x),typeof n.y=="number"&&(n.y=e.y))}catch{}}function fa(t,e){let n=Sr(t);if(!n)return{from:null,to:null};let i=null,a=null;return typeof e.scale=="number"?(i=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),i===null&&a===null?{from:null,to:null}:{from:{x:n.x,y:n.y},to:{x:i!=null?i:n.x,y:a!=null?a:n.y}}}function ma(){let t=new Set,e=new WeakMap,n=null,i=()=>{if(n!=null)return;n=requestAnimationFrame(()=>{n=null,o(),t.size>0&&i()})},a=p=>{var g;t.add(p);let c=(g=e.get(p.target))!=null?g:new Set;c.add(p),e.set(p.target,c),i()},s=p=>{t.delete(p);let c=e.get(p.target);c&&(c.delete(p),c.size===0&&e.delete(p.target))},r=p=>{p.killed||(p.killed=!0,s(p))},o=()=>{var c,g;let p=Ve();for(let u of Array.from(t)){if(u.killed||u.paused)continue;let b=p-u.startMs-u.delayMs;if(b<0)continue;let h=u.durationMs>0?b/u.durationMs:1,x=ua(h),v=u.repeat>=0?u.repeat+1:1,y=u.repeat>0?Math.min(Math.floor(h),v-1):0;if(u.repeat>0&&h>=1){let E=h-y;x=ua(E)}let f=u.ease(x);u.yoyo&&y%2===1&&(f=1-f);for(let E of u.props)ga(u.target,E.key,E.from+(E.to-E.from)*f);u.scaleFrom&&u.scaleTo&&ha(u.target,{x:u.scaleFrom.x+(u.scaleTo.x-u.scaleFrom.x)*f,y:u.scaleFrom.y+(u.scaleTo.y-u.scaleFrom.y)*f});try{(c=u.onUpdate)==null||c.call(u)}catch{}if(h>=v){r(u);try{(g=u.onComplete)==null||g.call(u)}catch{}}}},l=(p,c,g)=>{var E;let u=Math.max(0,(typeof c.duration=="number"?c.duration:.5)*1e3),b=Math.max(0,(typeof c.delay=="number"?c.delay:0)*1e3+((E=g==null?void 0:g.delayMsOverride)!=null?E:0)),h=wr(c.ease),x=typeof c.repeat=="number"?Math.max(0,c.repeat|0):0,v=c.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),f=[];for(let S of Object.keys(c)){if(y.has(S))continue;let A=c[S];typeof A=="number"&&f.push({key:S,from:Er(p,S),to:A})}let m=fa(p,c);return{target:p,startMs:Ve(),delayMs:b,durationMs:u,ease:h,props:f,scaleFrom:m.from,scaleTo:m.to,repeat:x,yoyo:v,onUpdate:typeof c.onUpdate=="function"?c.onUpdate:void 0,onComplete:typeof c.onComplete=="function"?c.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},d={to(p,c){let g=l(p,c);return a(g),{kill:()=>r(g),pause:()=>{g.paused||(g.paused=!0,g.pauseAtMs=Ve())},resume:()=>{var h;if(!g.paused)return;let u=(h=g.pauseAtMs)!=null?h:Ve(),b=Ve()-u;g.startMs+=b,g.paused=!1,g.pauseAtMs=null},isActive:()=>!g.killed&&!g.paused}},fromTo(p,c,g){return d.set(p,c),d.to(p,g)},set(p,c){if(!p||!c)return;for(let u of Object.keys(c)){let b=c[u];u==="scale"||u==="scaleX"||u==="scaleY"||typeof b=="number"&&ga(p,u,b)}let g=fa(p,c);g.to&&ha(p,g.to)},killTweensOf(p){let c=e.get(p);if(c)for(let g of Array.from(c))r(g)},timeline(p={}){let c=[],g=0,u=!1,b=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let f=typeof y=="string"?y.trim():"";return f.startsWith("+=")?g+Math.max(0,Number(f.slice(2))*1e3||0):f?Math.max(0,Number(f)*1e3||0):g},x=y=>{c.push(y);let f=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);g=Math.max(g,y.atMs+f)},v={to(y,f,m){return x({kind:"to",target:y,vars:f,atMs:h(m)}),v},fromTo(y,f,m,E){return x({kind:"fromTo",target:y,vars:m,from:f,atMs:h(E)}),v},play(){var y,f;if(u)return v;u=!0,b=[];for(let m of c)m.kind==="fromTo"&&d.set(m.target,(y=m.from)!=null?y:{}),b.push(d.to(m.target,{...m.vars,delay:m.atMs/1e3+((f=m.vars.delay)!=null?f:0)}));return v},pause(){for(let y of b)y.pause();return v},kill(){for(let y of b)y.kill();b=[],u=!1}};return p.paused||v.play(),v}};return d}function ba(){if(typeof window=="undefined")return;let t=window;if(!t.gsap)try{t.gsap=ma()}catch{}}var ya={name:"handler-playable-sdk",version:"0.3.61",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 G=0,Cr=G++,va=G++,xa=G++,wa=G++,Ea=G++,Sa=G++,Aa=G++,Ca=G++,Ta=G++,_a=G++,La=G++,Ma=G++,T=Cr;function Pa(){return T===va}function ka(){return T===xa}function Ra(){return T===wa}function Oa(){return T===Ea}function Re(){return T===Sa}function Oe(){return T===Aa}function Ia(){return T===Ca}function ja(){return T===Ta}function Da(){return T===_a}function Zt(){return T===La}function Qt(){return T===Ma}function $a(){let t=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(t==="mraid")try{mraid.getState(),T=va;return}catch{}else if(t==="dapi")try{dapi.isReady(),T=xa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(T=wa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(T=Ea)}catch{}else if(e==="mintegral")window.gameReady&&(T=Sa);else if(e==="tapjoy")window.TJ_API&&(T=Aa);else if(e==="tiktok")window.openAppStore&&(T=Ca);else if(e==="smadex")try{window.smxTracking&&(T=Ta)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(T=_a)}catch{}else e==="vungle"?T=La:(t==="nucleo"||e==="nucleo")&&(T=Ma)}var yt=ae(require("lottie-web"),1),Ha=yt.default;typeof window!="undefined"&&(window.lottie=yt.default,window.__baseLottie=yt.default);var Tr=require("pixi.js");var en=require("pixi.js");var _r=null;function tn(t){_r=t}vt();nn();var Ye=require("pixi.js");vt();var Or=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",on=Or;if(typeof window!="undefined")try{let t=new XMLHttpRequest;if(t.open("GET","./build-settings.json",!1),t.send(),t.status===200&&t.responseText){let e=JSON.parse(t.responseText);e!=null&&e.buildMode&&(on=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${on}`))}}catch{}function Ir(t){var n,i,a,s,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(t);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(t))return{x:(n=t[0])!=null?n:.5,y:(i=t[1])!=null?i:.5};if(t&&typeof t=="object"&&"x"in t&&"y"in t)return{x:(a=t.x)!=null?a:.5,y:(s=t.y)!=null?s:.5};if(typeof t=="string"){let o=t.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var Ae=class{static async create(e,n,i){var l,d,p,c,g,u,b;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${on}`);let a=(l=n==null?void 0:n.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new Ye.Container;return this.applyTransform(h,n==null?void 0:n.transform,n),h}let s=(d=n==null?void 0:n.identity)==null?void 0:d.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${s}, type: ${a.type}, path: ${a.path}`);let r=await Se.load(e,a,i,s);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=r==null?void 0:r.constructor)==null?void 0:p.name}`);let o;if(a.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ye.Sprite(r),console.log("[ObjectFactory] Created object:",o,"type:",(c=o==null?void 0:o.constructor)==null?void 0:c.name),this.applyTransform(o,n==null?void 0:n.transform,n);else if(a.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(g=r==null?void 0:r.constructor)==null?void 0:g.name,r),r&&(((u=r.constructor)==null?void 0:u.name)==="Container"||r instanceof Ye.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],x=!1;for(let v of h)try{let y=await fetch(v);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"type:",(b=o==null?void 0:o.constructor)==null?void 0:b.name),x=!0;break}}catch{continue}x||(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,n==null?void 0:n.transform,n);return o}static applyTransform(e,n,i){var a,s,r,o;if(!(!n||!e)&&(n.position&&("x"in e&&"y"in e?(e.x=(a=n.position.x)!=null?a:0,e.y=(s=n.position.y)!=null?s:0):"position"in e&&e.position&&e.position.set((r=n.position.x)!=null?r:0,(o=n.position.y)!=null?o:0)),n.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(n.scale):e.scale=n.scale),n.rotation!==void 0&&"rotation"in e&&(e.rotation=n.rotation),n.anchor&&"anchor"in e&&e.anchor)){let l=Ir(n.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Ke=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 $r=ae(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=$r);Xe();var wt=require("pixi.js");Xe();var cn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Ke}init(e,n){this.registry.init(e),this.app=n}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));if(n.length===0)return;let i=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.map(async s=>{var o;let r=this.registry.get(s);if(!r){console.warn("[Assets] No config found for object:",s);return}try{let l=await Ae.create(s,r,this.app);this.instanceCache.set(s,l),console.log("[Assets] Loaded object:",s,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",s,l)}})))};return this.readyPromise=(async()=>{await i(n);let a=this.registry.getAllIds().filter(s=>!this.instanceCache.has(s));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await i(a)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let n=this.registry.get(e);if(n){let i=await Ae.create(e,n,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},zr=new cn,Nr=new Proxy(zr,{get(t,e){if(e in t&&typeof t[e]=="function")return t[e].bind(t);if(t.get(e))return t.get(e)}});Xe();var Ba=require("pixi.js"),le={width:400,height:600,designWidth:400,scaleFactor:1},St={scale:1,position:1},pn=[];function Gr(t,e,n,i,a,s,r){pn.push({element:t,originalScale:s,positionHelper:e,heightPercent:a}),e(t,n,i,a,s,r,!1)}function Ur(){pn.forEach(({element:t,originalScale:e,positionHelper:n,heightPercent:i})=>{let a=e*le.scaleFactor;n(t,le.width,le.height,i,a,!0,!1)})}function dn(t,e){console.log(`[SCREEN] updateScreenState called: ${t}x${e}`),le.width=t,le.height=e,le.scaleFactor=Math.min(t/le.designWidth,1.15),St.scale=le.scaleFactor,St.position=1,console.log(`[SCREEN] Global multipliers - scale: ${St.scale.toFixed(3)}`),Ur()}var Ze={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 qr(t,e,n){let i=Ze[t];i&&i[e]!==void 0&&(i[e]=n,console.log(`Updated ${t}.${e} = ${n}`))}function Wr(){return Ze}var Vr={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 Et(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function At(t,e={x:.5,y:.5}){var n;if(Array.isArray(t))return{x:Et(t[0],e.x),y:Et(t[1],e.y)};if(t&&typeof t=="object"){let i=t;return{x:Et(i.x,e.x),y:Et(i.y,e.y)}}if(typeof t=="string"){let i=t.trim().toLowerCase();return(n=Vr[i])!=null?n:e}return e}function Ga(t,e,n,i={}){var u,b,h,x,v,y;let a=At(n),s=(u=i.inset)!=null?u:{},r=(b=i.padding)!=null?b:{x:0,y:0},o=((h=s.left)!=null?h:0)+r.x,l=((x=s.right)!=null?x:0)+r.x,d=((v=s.top)!=null?v:0)+r.y,p=((y=s.bottom)!=null?y:0)+r.y,c=Math.max(0,t-o-l),g=Math.max(0,e-d-p);return{x:o+c*a.x,y:d+g*a.y}}function Ua(t,e,n,i={}){var h,x,v,y,f,m;let a=(h=i.inset)!=null?h:{},s=(x=i.padding)!=null?x:{x:0,y:0},r=((v=a.left)!=null?v:0)+s.x,o=((y=a.right)!=null?y:0)+s.x,l=((f=a.top)!=null?f:0)+s.y,d=((m=a.bottom)!=null?m:0)+s.y,p=Math.max(0,t-r-o),c=Math.max(0,e-l-d),g=At(n,{x:.5,y:.5}),u=Math.min(Math.max(g.x,0),1),b=Math.min(Math.max(g.y,0),1);return{x:r+p*u,y:l+c*b}}if(typeof window!="undefined"){let t=window.innerWidth,e=window.innerHeight,n=()=>{let i=window.innerWidth,a=window.innerHeight;(i!==t||a!==e)&&(t=i,e=a,dn(i,a))};window.addEventListener("resize",n),window.addEventListener("orientationchange",()=>{setTimeout(n,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",n),window.mraid.addEventListener("sizeChange",n)),dn(window.innerWidth,window.innerHeight),window.updateDebugConfig=qr,window.getDebugConfig=Wr,window.copyConfig=ao,window.applyConfig=Je,window.applyConfigForRatio=so,window.positionAtBottom=qa,window.positionAtTop=Xr,window.positionAtCenter=Jr,window.positionAtLeft=Zr,window.positionAtRight=Qr,window.positionAtBottomLeft=eo,window.positionAtBottomRight=to,window.positionAtTopLeft=no,window.positionAtTopRight=io,window.applyPositionContract=Kr,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 Ct(t,e,n=0){return t*e+n}function Tt(t,e,n=0){return t*(1-e)+n}function _t(t,e,n=0){return t*e+n}function Lt(t,e,n=0){return t*(1-e)+n}function U(t,e=0){return t/2+e}function Yr(t,e){return t*e}function Kr(t,e,n,i){var r,o,l,d,p,c,g,u,b,h,x,v,y,f,m,E,S,A,M,R;let a=0,s=0;switch(i.type){case"top":a=U(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),s=Ct(n,i.percent,(d=(l=i.offset)==null?void 0:l.y)!=null?d:0);break;case"bottom":a=U(e,(c=(p=i.offset)==null?void 0:p.x)!=null?c:0),s=Tt(n,i.percent,(u=(g=i.offset)==null?void 0:g.y)!=null?u:0);break;case"left":a=_t(e,i.percent,(h=(b=i.offset)==null?void 0:b.x)!=null?h:0),s=U(n,(v=(x=i.offset)==null?void 0:x.y)!=null?v:0);break;case"right":a=Lt(e,i.percent,(f=(y=i.offset)==null?void 0:y.x)!=null?f:0),s=U(n,(E=(m=i.offset)==null?void 0:m.y)!=null?E:0);break;case"center":a=U(e,(A=(S=i.offset)==null?void 0:S.x)!=null?A:0),s=U(n,(R=(M=i.offset)==null?void 0:M.y)!=null?R:0);break}t.position?t.position.set(a,s):(t.x=a,t.y=s),i.scale!==void 0&&i.scale!==1&&t.scale&&(typeof t.scale.set=="function"?t.scale.set(i.scale,i.scale):(t.scale.x=i.scale,t.scale.y=i.scale))}function qa(t,e,n,i=.2,a=1,s=!0,r=!1){let o=Yr(n,i),l=Tt(n,i/2);ce(t,U(e),l);let d=s?a*le.scaleFactor:a;de(t,d),r&&!pn.find(p=>p.element===t)&&Gr(t,qa,e,n,i,a,s)}function Xr(t,e,n,i=.1,a=1){ce(t,U(e),Ct(n,i)),de(t,a)}function Jr(t,e,n,i=0,a=0,s=1){ce(t,U(e,i),U(n,a)),de(t,s)}function Zr(t,e,n,i=.1,a=1){ce(t,_t(e,i),U(n)),de(t,a)}function Qr(t,e,n,i=.1,a=1){ce(t,Lt(e,i),U(n)),de(t,a)}function eo(t,e,n,i=.05,a=.05,s=1){ce(t,_t(e,a),Tt(n,i)),de(t,s)}function to(t,e,n,i=.05,a=.05,s=1){ce(t,Lt(e,a),Tt(n,i)),de(t,s)}function no(t,e,n,i=.05,a=.05,s=1){ce(t,_t(e,a),Ct(n,i)),de(t,s)}function io(t,e,n,i=.05,a=.05,s=1){ce(t,Lt(e,a),Ct(n,i)),de(t,s)}function ce(t,e,n){t&&t.position?typeof t.position.set=="function"?t.position.set(e,n):(t.position.x=e,t.position.y=n):t&&(t.x=e,t.y=n)}function de(t,e){e!==1&&t&&t.scale&&(typeof t.scale.set=="function"?t.scale.set(e,e):t.scale.x!==void 0&&t.scale.y!==void 0&&(t.scale.x=e,t.scale.y=e))}var Ce={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 ao(t){return t&&Ce[t]?JSON.parse(JSON.stringify(Ce[t])):JSON.parse(JSON.stringify(Ze))}function Je(t){Object.keys(t).forEach(e=>{let n=e;Ze[n]&&t[n]&&Object.assign(Ze[n],t[n])}),console.log("Config applied:",t)}function so(t,e){let n=t/e;n>1.6?(Je(Ce.wide),console.log("Applied WIDE config for ratio:",n)):n<.7?(Je(Ce.tall),console.log("Applied TALL config for ratio:",n)):n>.8&&n<1.2?(Je(Ce.square),console.log("Applied SQUARE config for ratio:",n)):(Je(Ce.default),console.log("Applied DEFAULT config for ratio:",n))}if(typeof window!="undefined"){let t=window;t.configPresets=Ce,t.resolveAnchorVec2=t.resolveAnchorVec2||At,t.resolveScreenAnchorPoint=t.resolveScreenAnchorPoint||Ga,t.resolveScreenRatioPoint=t.resolveScreenRatioPoint||Ua}hn();function k(t,e){let n=(a,s)=>s===0?a:n(s,a%s),i=n(t,e);return`${t/i}:${e/i}`}var Bc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:k(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:k(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:k(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:k(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:k(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:k(360,780)}],Gc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:k(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:k(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:k(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:k(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:k(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:k(412,915)}],Uc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:k(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:k(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:k(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:k(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:k(800,1280)}],Ka=[{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:k(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:k(768,1024),mraidScale:.7}];var qc=[...Ka];var ho=Ka[0];fe();var xo=ae(require("jszip"),1);function bo(t){return new Promise((e,n)=>{let i=new FileReader;i.onerror=()=>n(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(t)})}function yo(t){var a;let[e,n]=t.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:n!=null?n:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}async function vo(t){return await new Promise(e=>{let n=new Image;n.onload=()=>e({width:n.naturalWidth||n.width,height:n.naturalHeight||n.height}),n.onerror=()=>e(null),n.src=t})}async function fn(t){var e,n;try{console.log("[ImageUtils] Fetching image data from URL:",t);let i=await fetch(t);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,t),null;let a=await i.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let s=await bo(a),r=await vo(s),o=yo(s);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:s,width:(e=r==null?void 0:r.width)!=null?e:0,height:(n=r==null?void 0:r.height)!=null?n:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Mt(t,e=30){try{console.log("[ImageUtils] Removing background color...");let n=await new Promise((c,g)=>{let u=new Image;u.onload=()=>c(u),u.onerror=()=>g(new Error("Failed to load image")),u.src=t}),i=document.createElement("canvas");i.width=n.width,i.height=n.height;let a=i.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),t;a.drawImage(n,0,0);let s=a.getImageData(0,0,i.width,i.height),r=s.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(c=>({r:r[c.offset],g:r[c.offset+1],b:r[c.offset+2]})),d=0;for(let c=0;c<r.length;c+=4){let g=r[c],u=r[c+1],b=r[c+2],h=!1;for(let x of l)if(Math.sqrt(Math.pow(g-x.r,2)+Math.pow(u-x.g,2)+Math.pow(b-x.b,2))<e){h=!0;break}h&&(r[c+3]=0,d++)}return console.log(`[ImageUtils] Removed background from ${d} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(s,0,0),i.toDataURL("image/png")}catch(n){return console.error("[ImageUtils] Error removing background:",n),t}}var Xa=require("@google/genai");async function mn(t,e,n=[],i={}){var a,s,r,o,l,d,p;try{if(!(t!=null&&t.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let v=0;v<n.length;v++){let y=n[v];if(!y.base64||!y.mimeType)throw new Error(`Image ${v+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${v+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${v+1} has invalid MIME type: ${y.mimeType}`)}let c=new Xa.GoogleGenAI({apiKey:t}),g="gemini-2.5-flash",u=[e];n.length>0&&n.forEach((v,y)=>{u.push({inlineData:{data:v.base64,mimeType:v.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${v.mimeType}, size: ${Math.round(v.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${n.length} images and prompt length: ${e.length}`);let b=await c.models.generateContent({model:g,contents:u}),h="",x=(r=(s=(a=b.candidates)==null?void 0:a[0])==null?void 0:s.content)==null?void 0:r.parts;if(x)for(let v of x)v.text&&(h+=v.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(c){throw console.error("[Gemini] API error:",c),(o=c.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=c.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(d=c.message)!=null&&d.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=c.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):c}}var Ja=require("@google/genai");async function Pt(t,e,n=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new Ja.GoogleGenAI({apiKey:t}),s=[{text:e}];n.length>0&&n.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),s.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 a.models.generateContent({model:"gemini-2.5-flash-image",contents:s});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,d=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${d};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(a){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(a,Object.getOwnPropertyNames(a),2)),a}}var wo=require("pixi.js");Xe();fe();var Qa=require("pixi.js");var Eo=require("pixi.js");fe();function Mo(t){return new Promise((e,n)=>{let i=new FileReader;i.onerror=()=>n(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(t)})}function Po(t){var a;let[e,n]=t.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:n!=null?n:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}function ko(t){return`
|
|
46
|
+
`,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(s=>{s.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(s=>{s.addEventListener("click",o=>{let d=o.target.dataset.tab;d&&this.switchTab(d)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",s=>{s.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let n=window.__openAiEditor;if(typeof n!="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}`,n(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:a=>{this.onApplyCallback&&this.onApplyCallback(a),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var Xo={};sa(Xo,{AspectClass:()=>In,GameObject:()=>ot,GameObjectManager:()=>$t,Renderer:()=>st,ResponsiveUISystem:()=>Ge,Transform:()=>rt,animateHandClick:()=>xr,animatePanelEntrance:()=>vr,createBrushTexture:()=>_r,createEndGamePanel:()=>yr,createHandTutorial:()=>wr,createThreeBase:()=>fr,createTutorialLabel:()=>Er,getAspectClass:()=>Dt,getRegisteredFontIds:()=>br,loadAsset:()=>$n,loadCharacterFrames:()=>Tr,registerFont:()=>mr,resolveFont:()=>Z,resolveFontWeight:()=>Q,updateHandAnimation:()=>Sr});module.exports=xs(Xo);var V=ae(require("three"),1);var ge={};function mt(t,e,n=!1){ge[t]||(ge[t]=[]),ge[t].push({fn:e,once:n})}function Xt(t,e){if(ge[t]){if(!e){delete ge[t];return}ge[t]=ge[t].filter(n=>n.fn!==e)}}function bt(t,...e){let n=ge[t];if(n)for(let i of[...n])i.fn(...e),i.once&&Xt(t,i.fn)}function B(t,e){mt(t,e,!0)}var k=null,W=[],Pe=null;function da(t){k=t,W=[],Pe!==null&&(clearTimeout(Pe),Pe=null)}function pa(){var t,e,n;return{endpoint:(k==null?void 0:k.endpoint)||"",transport:(k==null?void 0:k.transport)||"beacon",batchSize:(t=k==null?void 0:k.batchSize)!=null?t:10,flushIntervalMs:(e=k==null?void 0:k.flushIntervalMs)!=null?e:300,maxQueue:(n=k==null?void 0:k.maxQueue)!=null?n:200,debug:!!(k!=null&&k.debug)}}async function la(t,e,n,i){let a=JSON.stringify(e);if(n==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(t,new Blob([a],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function Jt(t,e){let n=pa();if(e&&n.endpoint){if(W.push(t),W.length>n.maxQueue&&(W=W.slice(W.length-n.maxQueue)),W.length>=n.batchSize){ca();return}Pe===null&&(Pe=window.setTimeout(()=>{Pe=null,ca()},n.flushIntervalMs))}}async function ca(){let t=pa();if(!t.endpoint||W.length===0)return;let e=W.splice(0,t.batchSize);await la(t.endpoint,{events:e},t.transport,t.debug),W.length>0&&await la(t.endpoint,{events:W.splice(0,t.batchSize)},t.transport,t.debug)}function ua(t){return Math.max(0,Math.min(1,t))}function ws(t){let e=String(t!=null?t:"power2.out");if(e==="linear")return n=>n;if(e==="sine.inOut")return n=>.5-Math.cos(Math.PI*n)/2;if(e==="power2.out"||e==="easeOutQuad")return n=>1-(1-n)*(1-n);if(e.startsWith("back.out")){let n=e.match(/back\.out\(([\d.]+)\)/),i=n?Number(n[1]):1.8;return a=>1+(i+1)*Math.pow(a-1,3)+i*Math.pow(a-1,2)}return n=>1-(1-n)*(1-n)}function Ve(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Es(t,e){let n=t==null?void 0:t[e];return typeof n=="number"?n:0}function ga(t,e,n){try{t[e]=n}catch{}}function Ss(t){let e=t==null?void 0:t.scale;if(!e)return null;let n=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:n,y:i}}function ha(t,e){let n=t==null?void 0:t.scale;if(n)try{typeof n.set=="function"?n.set(e.x,e.y):(typeof n.x=="number"&&(n.x=e.x),typeof n.y=="number"&&(n.y=e.y))}catch{}}function fa(t,e){let n=Ss(t);if(!n)return{from:null,to:null};let i=null,a=null;return typeof e.scale=="number"?(i=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),i===null&&a===null?{from:null,to:null}:{from:{x:n.x,y:n.y},to:{x:i!=null?i:n.x,y:a!=null?a:n.y}}}function ma(){let t=new Set,e=new WeakMap,n=null,i=()=>{if(n!=null)return;n=requestAnimationFrame(()=>{n=null,o(),t.size>0&&i()})},a=p=>{var g;t.add(p);let c=(g=e.get(p.target))!=null?g:new Set;c.add(p),e.set(p.target,c),i()},r=p=>{t.delete(p);let c=e.get(p.target);c&&(c.delete(p),c.size===0&&e.delete(p.target))},s=p=>{p.killed||(p.killed=!0,r(p))},o=()=>{var c,g;let p=Ve();for(let u of Array.from(t)){if(u.killed||u.paused)continue;let b=p-u.startMs-u.delayMs;if(b<0)continue;let h=u.durationMs>0?b/u.durationMs:1,x=ua(h),v=u.repeat>=0?u.repeat+1:1,y=u.repeat>0?Math.min(Math.floor(h),v-1):0;if(u.repeat>0&&h>=1){let E=h-y;x=ua(E)}let f=u.ease(x);u.yoyo&&y%2===1&&(f=1-f);for(let E of u.props)ga(u.target,E.key,E.from+(E.to-E.from)*f);u.scaleFrom&&u.scaleTo&&ha(u.target,{x:u.scaleFrom.x+(u.scaleTo.x-u.scaleFrom.x)*f,y:u.scaleFrom.y+(u.scaleTo.y-u.scaleFrom.y)*f});try{(c=u.onUpdate)==null||c.call(u)}catch{}if(h>=v){s(u);try{(g=u.onComplete)==null||g.call(u)}catch{}}}},l=(p,c,g)=>{var E;let u=Math.max(0,(typeof c.duration=="number"?c.duration:.5)*1e3),b=Math.max(0,(typeof c.delay=="number"?c.delay:0)*1e3+((E=g==null?void 0:g.delayMsOverride)!=null?E:0)),h=ws(c.ease),x=typeof c.repeat=="number"?Math.max(0,c.repeat|0):0,v=c.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),f=[];for(let S of Object.keys(c)){if(y.has(S))continue;let A=c[S];typeof A=="number"&&f.push({key:S,from:Es(p,S),to:A})}let m=fa(p,c);return{target:p,startMs:Ve(),delayMs:b,durationMs:u,ease:h,props:f,scaleFrom:m.from,scaleTo:m.to,repeat:x,yoyo:v,onUpdate:typeof c.onUpdate=="function"?c.onUpdate:void 0,onComplete:typeof c.onComplete=="function"?c.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},d={to(p,c){let g=l(p,c);return a(g),{kill:()=>s(g),pause:()=>{g.paused||(g.paused=!0,g.pauseAtMs=Ve())},resume:()=>{var h;if(!g.paused)return;let u=(h=g.pauseAtMs)!=null?h:Ve(),b=Ve()-u;g.startMs+=b,g.paused=!1,g.pauseAtMs=null},isActive:()=>!g.killed&&!g.paused}},fromTo(p,c,g){return d.set(p,c),d.to(p,g)},set(p,c){if(!p||!c)return;for(let u of Object.keys(c)){let b=c[u];u==="scale"||u==="scaleX"||u==="scaleY"||typeof b=="number"&&ga(p,u,b)}let g=fa(p,c);g.to&&ha(p,g.to)},killTweensOf(p){let c=e.get(p);if(c)for(let g of Array.from(c))s(g)},timeline(p={}){let c=[],g=0,u=!1,b=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let f=typeof y=="string"?y.trim():"";return f.startsWith("+=")?g+Math.max(0,Number(f.slice(2))*1e3||0):f?Math.max(0,Number(f)*1e3||0):g},x=y=>{c.push(y);let f=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);g=Math.max(g,y.atMs+f)},v={to(y,f,m){return x({kind:"to",target:y,vars:f,atMs:h(m)}),v},fromTo(y,f,m,E){return x({kind:"fromTo",target:y,vars:m,from:f,atMs:h(E)}),v},play(){var y,f;if(u)return v;u=!0,b=[];for(let m of c)m.kind==="fromTo"&&d.set(m.target,(y=m.from)!=null?y:{}),b.push(d.to(m.target,{...m.vars,delay:m.atMs/1e3+((f=m.vars.delay)!=null?f:0)}));return v},pause(){for(let y of b)y.pause();return v},kill(){for(let y of b)y.kill();b=[],u=!1}};return p.paused||v.play(),v}};return d}function ba(){if(typeof window=="undefined")return;let t=window;if(!t.gsap)try{t.gsap=ma()}catch{}}var ya={name:"handler-playable-sdk",version:"0.3.62",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 G=0,Cs=G++,va=G++,xa=G++,wa=G++,Ea=G++,Sa=G++,Aa=G++,Ca=G++,Ta=G++,_a=G++,La=G++,Ma=G++,T=Cs;function ka(){return T===va}function Pa(){return T===xa}function Ra(){return T===wa}function Oa(){return T===Ea}function Re(){return T===Sa}function Oe(){return T===Aa}function Ia(){return T===Ca}function ja(){return T===Ta}function Da(){return T===_a}function Zt(){return T===La}function Qt(){return T===Ma}function $a(){let t=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(t==="mraid")try{mraid.getState(),T=va;return}catch{}else if(t==="dapi")try{dapi.isReady(),T=xa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(T=wa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(T=Ea)}catch{}else if(e==="mintegral")window.gameReady&&(T=Sa);else if(e==="tapjoy")window.TJ_API&&(T=Aa);else if(e==="tiktok")window.openAppStore&&(T=Ca);else if(e==="smadex")try{window.smxTracking&&(T=Ta)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(T=_a)}catch{}else e==="vungle"?T=La:(t==="nucleo"||e==="nucleo")&&(T=Ma)}var yt=ae(require("lottie-web"),1),Ha=yt.default;typeof window!="undefined"&&(window.lottie=yt.default,window.__baseLottie=yt.default);var Ts=require("pixi.js");var en=require("pixi.js");var _s=null;function tn(t){_s=t}vt();nn();var Ye=require("pixi.js");vt();var Os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",on=Os;if(typeof window!="undefined")try{let t=new XMLHttpRequest;if(t.open("GET","./build-settings.json",!1),t.send(),t.status===200&&t.responseText){let e=JSON.parse(t.responseText);e!=null&&e.buildMode&&(on=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${on}`))}}catch{}function Is(t){var n,i,a,r,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(t);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(t))return{x:(n=t[0])!=null?n:.5,y:(i=t[1])!=null?i:.5};if(t&&typeof t=="object"&&"x"in t&&"y"in t)return{x:(a=t.x)!=null?a:.5,y:(r=t.y)!=null?r:.5};if(typeof t=="string"){let o=t.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Ae=class{static async create(e,n,i){var l,d,p,c,g,u,b;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${on}`);let a=(l=n==null?void 0:n.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new Ye.Container;return this.applyTransform(h,n==null?void 0:n.transform,n),h}let r=(d=n==null?void 0:n.identity)==null?void 0:d.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${a.type}, path: ${a.path}`);let s=await Se.load(e,a,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=s==null?void 0:s.constructor)==null?void 0:p.name}`);let o;if(a.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new Ye.Sprite(s),console.log("[ObjectFactory] Created object:",o,"type:",(c=o==null?void 0:o.constructor)==null?void 0:c.name),this.applyTransform(o,n==null?void 0:n.transform,n);else if(a.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(g=s==null?void 0:s.constructor)==null?void 0:g.name,s),s&&(((u=s.constructor)==null?void 0:u.name)==="Container"||s instanceof Ye.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],x=!1;for(let v of h)try{let y=await fetch(v);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"type:",(b=o==null?void 0:o.constructor)==null?void 0:b.name),x=!0;break}}catch{continue}x||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,n==null?void 0:n.transform,n);return o}static applyTransform(e,n,i){var a,r,s,o;if(!(!n||!e)&&(n.position&&("x"in e&&"y"in e?(e.x=(a=n.position.x)!=null?a:0,e.y=(r=n.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((s=n.position.x)!=null?s:0,(o=n.position.y)!=null?o:0)),n.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(n.scale):e.scale=n.scale),n.rotation!==void 0&&"rotation"in e&&(e.rotation=n.rotation),n.anchor&&"anchor"in e&&e.anchor)){let l=Is(n.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Ke=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 $s=ae(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=$s);Xe();var wt=require("pixi.js");Xe();var cn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Ke}init(e,n){this.registry.init(e),this.app=n}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));if(n.length===0)return;let i=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.map(async r=>{var o;let s=this.registry.get(r);if(!s){console.warn("[Assets] No config found for object:",r);return}try{let l=await Ae.create(r,s,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(n);let a=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await i(a)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let n=this.registry.get(e);if(n){let i=await Ae.create(e,n,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},zs=new cn,Fs=new Proxy(zs,{get(t,e){if(e in t&&typeof t[e]=="function")return t[e].bind(t);if(t.get(e))return t.get(e)}});Xe();var Ba=require("pixi.js"),le={width:400,height:600,designWidth:400,scaleFactor:1},St={scale:1,position:1},pn=[];function Gs(t,e,n,i,a,r,s){pn.push({element:t,originalScale:r,positionHelper:e,heightPercent:a}),e(t,n,i,a,r,s,!1)}function Us(){pn.forEach(({element:t,originalScale:e,positionHelper:n,heightPercent:i})=>{let a=e*le.scaleFactor;n(t,le.width,le.height,i,a,!0,!1)})}function dn(t,e){console.log(`[SCREEN] updateScreenState called: ${t}x${e}`),le.width=t,le.height=e,le.scaleFactor=Math.min(t/le.designWidth,1.15),St.scale=le.scaleFactor,St.position=1,console.log(`[SCREEN] Global multipliers - scale: ${St.scale.toFixed(3)}`),Us()}var Ze={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 qs(t,e,n){let i=Ze[t];i&&i[e]!==void 0&&(i[e]=n,console.log(`Updated ${t}.${e} = ${n}`))}function Ws(){return Ze}var Vs={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 Et(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function At(t,e={x:.5,y:.5}){var n;if(Array.isArray(t))return{x:Et(t[0],e.x),y:Et(t[1],e.y)};if(t&&typeof t=="object"){let i=t;return{x:Et(i.x,e.x),y:Et(i.y,e.y)}}if(typeof t=="string"){let i=t.trim().toLowerCase();return(n=Vs[i])!=null?n:e}return e}function Ga(t,e,n,i={}){var u,b,h,x,v,y;let a=At(n),r=(u=i.inset)!=null?u:{},s=(b=i.padding)!=null?b:{x:0,y:0},o=((h=r.left)!=null?h:0)+s.x,l=((x=r.right)!=null?x:0)+s.x,d=((v=r.top)!=null?v:0)+s.y,p=((y=r.bottom)!=null?y:0)+s.y,c=Math.max(0,t-o-l),g=Math.max(0,e-d-p);return{x:o+c*a.x,y:d+g*a.y}}function Ua(t,e,n,i={}){var h,x,v,y,f,m;let a=(h=i.inset)!=null?h:{},r=(x=i.padding)!=null?x:{x:0,y:0},s=((v=a.left)!=null?v:0)+r.x,o=((y=a.right)!=null?y:0)+r.x,l=((f=a.top)!=null?f:0)+r.y,d=((m=a.bottom)!=null?m:0)+r.y,p=Math.max(0,t-s-o),c=Math.max(0,e-l-d),g=At(n,{x:.5,y:.5}),u=Math.min(Math.max(g.x,0),1),b=Math.min(Math.max(g.y,0),1);return{x:s+p*u,y:l+c*b}}if(typeof window!="undefined"){let t=window.innerWidth,e=window.innerHeight,n=()=>{let i=window.innerWidth,a=window.innerHeight;(i!==t||a!==e)&&(t=i,e=a,dn(i,a))};window.addEventListener("resize",n),window.addEventListener("orientationchange",()=>{setTimeout(n,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",n),window.mraid.addEventListener("sizeChange",n)),dn(window.innerWidth,window.innerHeight),window.updateDebugConfig=qs,window.getDebugConfig=Ws,window.copyConfig=ao,window.applyConfig=Je,window.applyConfigForRatio=ro,window.positionAtBottom=qa,window.positionAtTop=Xs,window.positionAtCenter=Js,window.positionAtLeft=Zs,window.positionAtRight=Qs,window.positionAtBottomLeft=eo,window.positionAtBottomRight=to,window.positionAtTopLeft=no,window.positionAtTopRight=io,window.applyPositionContract=Ks,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 Ct(t,e,n=0){return t*e+n}function Tt(t,e,n=0){return t*(1-e)+n}function _t(t,e,n=0){return t*e+n}function Lt(t,e,n=0){return t*(1-e)+n}function U(t,e=0){return t/2+e}function Ys(t,e){return t*e}function Ks(t,e,n,i){var s,o,l,d,p,c,g,u,b,h,x,v,y,f,m,E,S,A,M,R;let a=0,r=0;switch(i.type){case"top":a=U(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),r=Ct(n,i.percent,(d=(l=i.offset)==null?void 0:l.y)!=null?d:0);break;case"bottom":a=U(e,(c=(p=i.offset)==null?void 0:p.x)!=null?c:0),r=Tt(n,i.percent,(u=(g=i.offset)==null?void 0:g.y)!=null?u:0);break;case"left":a=_t(e,i.percent,(h=(b=i.offset)==null?void 0:b.x)!=null?h:0),r=U(n,(v=(x=i.offset)==null?void 0:x.y)!=null?v:0);break;case"right":a=Lt(e,i.percent,(f=(y=i.offset)==null?void 0:y.x)!=null?f:0),r=U(n,(E=(m=i.offset)==null?void 0:m.y)!=null?E:0);break;case"center":a=U(e,(A=(S=i.offset)==null?void 0:S.x)!=null?A:0),r=U(n,(R=(M=i.offset)==null?void 0:M.y)!=null?R:0);break}t.position?t.position.set(a,r):(t.x=a,t.y=r),i.scale!==void 0&&i.scale!==1&&t.scale&&(typeof t.scale.set=="function"?t.scale.set(i.scale,i.scale):(t.scale.x=i.scale,t.scale.y=i.scale))}function qa(t,e,n,i=.2,a=1,r=!0,s=!1){let o=Ys(n,i),l=Tt(n,i/2);ce(t,U(e),l);let d=r?a*le.scaleFactor:a;de(t,d),s&&!pn.find(p=>p.element===t)&&Gs(t,qa,e,n,i,a,r)}function Xs(t,e,n,i=.1,a=1){ce(t,U(e),Ct(n,i)),de(t,a)}function Js(t,e,n,i=0,a=0,r=1){ce(t,U(e,i),U(n,a)),de(t,r)}function Zs(t,e,n,i=.1,a=1){ce(t,_t(e,i),U(n)),de(t,a)}function Qs(t,e,n,i=.1,a=1){ce(t,Lt(e,i),U(n)),de(t,a)}function eo(t,e,n,i=.05,a=.05,r=1){ce(t,_t(e,a),Tt(n,i)),de(t,r)}function to(t,e,n,i=.05,a=.05,r=1){ce(t,Lt(e,a),Tt(n,i)),de(t,r)}function no(t,e,n,i=.05,a=.05,r=1){ce(t,_t(e,a),Ct(n,i)),de(t,r)}function io(t,e,n,i=.05,a=.05,r=1){ce(t,Lt(e,a),Ct(n,i)),de(t,r)}function ce(t,e,n){t&&t.position?typeof t.position.set=="function"?t.position.set(e,n):(t.position.x=e,t.position.y=n):t&&(t.x=e,t.y=n)}function de(t,e){e!==1&&t&&t.scale&&(typeof t.scale.set=="function"?t.scale.set(e,e):t.scale.x!==void 0&&t.scale.y!==void 0&&(t.scale.x=e,t.scale.y=e))}var Ce={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 ao(t){return t&&Ce[t]?JSON.parse(JSON.stringify(Ce[t])):JSON.parse(JSON.stringify(Ze))}function Je(t){Object.keys(t).forEach(e=>{let n=e;Ze[n]&&t[n]&&Object.assign(Ze[n],t[n])}),console.log("Config applied:",t)}function ro(t,e){let n=t/e;n>1.6?(Je(Ce.wide),console.log("Applied WIDE config for ratio:",n)):n<.7?(Je(Ce.tall),console.log("Applied TALL config for ratio:",n)):n>.8&&n<1.2?(Je(Ce.square),console.log("Applied SQUARE config for ratio:",n)):(Je(Ce.default),console.log("Applied DEFAULT config for ratio:",n))}if(typeof window!="undefined"){let t=window;t.configPresets=Ce,t.resolveAnchorVec2=t.resolveAnchorVec2||At,t.resolveScreenAnchorPoint=t.resolveScreenAnchorPoint||Ga,t.resolveScreenRatioPoint=t.resolveScreenRatioPoint||Ua}hn();function P(t,e){let n=(a,r)=>r===0?a:n(r,a%r),i=n(t,e);return`${t/i}:${e/i}`}var Bc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:P(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:P(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:P(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:P(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:P(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:P(360,780)}],Gc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:P(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:P(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:P(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:P(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:P(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:P(412,915)}],Uc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:P(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:P(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:P(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:P(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:P(800,1280)}],Ka=[{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:P(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:P(768,1024),mraidScale:.7}];var qc=[...Ka];var ho=Ka[0];fe();var xo=ae(require("jszip"),1);function bo(t){return new Promise((e,n)=>{let i=new FileReader;i.onerror=()=>n(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(t)})}function yo(t){var a;let[e,n]=t.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:n!=null?n:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}async function vo(t){return await new Promise(e=>{let n=new Image;n.onload=()=>e({width:n.naturalWidth||n.width,height:n.naturalHeight||n.height}),n.onerror=()=>e(null),n.src=t})}async function fn(t){var e,n;try{console.log("[ImageUtils] Fetching image data from URL:",t);let i=await fetch(t);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,t),null;let a=await i.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let r=await bo(a),s=await vo(r),o=yo(r);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:r,width:(e=s==null?void 0:s.width)!=null?e:0,height:(n=s==null?void 0:s.height)!=null?n:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Mt(t,e=30){try{console.log("[ImageUtils] Removing background color...");let n=await new Promise((c,g)=>{let u=new Image;u.onload=()=>c(u),u.onerror=()=>g(new Error("Failed to load image")),u.src=t}),i=document.createElement("canvas");i.width=n.width,i.height=n.height;let a=i.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),t;a.drawImage(n,0,0);let r=a.getImageData(0,0,i.width,i.height),s=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(c=>({r:s[c.offset],g:s[c.offset+1],b:s[c.offset+2]})),d=0;for(let c=0;c<s.length;c+=4){let g=s[c],u=s[c+1],b=s[c+2],h=!1;for(let x of l)if(Math.sqrt(Math.pow(g-x.r,2)+Math.pow(u-x.g,2)+Math.pow(b-x.b,2))<e){h=!0;break}h&&(s[c+3]=0,d++)}return console.log(`[ImageUtils] Removed background from ${d} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(r,0,0),i.toDataURL("image/png")}catch(n){return console.error("[ImageUtils] Error removing background:",n),t}}var Xa=require("@google/genai");async function mn(t,e,n=[],i={}){var a,r,s,o,l,d,p;try{if(!(t!=null&&t.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let v=0;v<n.length;v++){let y=n[v];if(!y.base64||!y.mimeType)throw new Error(`Image ${v+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${v+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${v+1} has invalid MIME type: ${y.mimeType}`)}let c=new Xa.GoogleGenAI({apiKey:t}),g="gemini-2.5-flash",u=[e];n.length>0&&n.forEach((v,y)=>{u.push({inlineData:{data:v.base64,mimeType:v.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${v.mimeType}, size: ${Math.round(v.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${n.length} images and prompt length: ${e.length}`);let b=await c.models.generateContent({model:g,contents:u}),h="",x=(s=(r=(a=b.candidates)==null?void 0:a[0])==null?void 0:r.content)==null?void 0:s.parts;if(x)for(let v of x)v.text&&(h+=v.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(c){throw console.error("[Gemini] API error:",c),(o=c.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=c.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(d=c.message)!=null&&d.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=c.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):c}}var Ja=require("@google/genai");async function kt(t,e,n=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new Ja.GoogleGenAI({apiKey:t}),r=[{text:e}];n.length>0&&n.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await a.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of s.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,d=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${d};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(a){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(a,Object.getOwnPropertyNames(a),2)),a}}var wo=require("pixi.js");Xe();fe();var Qa=require("pixi.js");var Eo=require("pixi.js");fe();function Mo(t){return new Promise((e,n)=>{let i=new FileReader;i.onerror=()=>n(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(t)})}function ko(t){var a;let[e,n]=t.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:n!=null?n:"",mimeType:(a=i==null?void 0:i[1])!=null?a:"image/png"}}function Po(t){return`
|
|
47
47
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
48
48
|
|
|
49
49
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -60,9 +60,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
|
|
|
60
60
|
${t?`
|
|
61
61
|
ADDITIONAL RULES/NOTES:
|
|
62
62
|
${t}`:""}
|
|
63
|
-
`.trim()}function
|
|
63
|
+
`.trim()}function er(){let t=[],e="",n=null;return{async addSources(i){let a=[];for(let r of i){let s=await Mo(r),o=ko(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};t.push(l),a.push(l)}return a},getSources(){return t.slice()},async analyze(i,a,r){if(t.length===0)throw new Error("No screenshots to analyze.");let s=Po(a),o=t.map(g=>({base64:g.base64,mimeType:g.mimeType})),l=await mn(i,s,o,{model:r}),d=e,p=[],c=l.split(`
|
|
64
64
|
`);for(let g of c)if(g.toLowerCase().startsWith("summary:"))d=g.slice(8).trim();else if(g.toLowerCase().includes("palette:")){let u=g.match(/#[0-9A-Fa-f]{6}/g);u&&u.forEach(b=>{p.includes(b.toUpperCase())||p.push(b.toUpperCase())})}return(!d||d===e)&&(d=l.split(`
|
|
65
|
-
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),n={summary:d,palette:p.slice(0,10)},n},setSummary(i){e=i,n&&(n={...n,summary:i})},getResult(){return n}}}var _e="handler_api_key_";var je=class{static setKey(e,n,i){try{let a={key:this.encryptKey(n),created:Date.now(),lastUsed:Date.now(),label:i||e},
|
|
65
|
+
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),n={summary:d,palette:p.slice(0,10)},n},setSummary(i){e=i,n&&(n={...n,summary:i})},getResult(){return n}}}var _e="handler_api_key_";var je=class{static setKey(e,n,i){try{let a={key:this.encryptKey(n),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${_e}${e}`;localStorage.setItem(r,JSON.stringify(a))}catch(a){console.error("[ApiKeyStorage] Failed to store API key:",a)}}static getKey(e){try{let n=`${_e}${e}`,i=localStorage.getItem(n);if(!i)return null;let a=JSON.parse(i);return a.lastUsed=Date.now(),localStorage.setItem(n,JSON.stringify(a)),this.decryptKey(a.key)}catch(n){return console.error("[ApiKeyStorage] Failed to retrieve API key:",n),null}}static hasKey(e){let n=`${_e}${e}`;return localStorage.getItem(n)!==null}static removeKey(e){try{let n=`${_e}${e}`;localStorage.removeItem(n)}catch(n){console.error("[ApiKeyStorage] Failed to remove API key:",n)}}static getStoredServices(){let e=[];try{for(let n=0;n<localStorage.length;n++){let i=localStorage.key(n);if(i&&i.startsWith(_e)){let a=i.substring(_e.length),r=localStorage.getItem(i);if(r){let s=JSON.parse(r);e.push({service:a,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(n){console.error("[ApiKeyStorage] Failed to get stored services:",n)}return e.sort((n,i)=>i.lastUsed-n.lastUsed)}static clearAll(){try{let e=[];for(let n=0;n<localStorage.length;n++){let i=localStorage.key(n);i&&i.startsWith(_e)&&e.push(i)}e.forEach(n=>localStorage.removeItem(n))}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(n){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",n),e}}static decryptKey(e){try{let n=atob(e),i="handler_preview_salt_2024";return n.startsWith(i)?n.substring(i.length):n}catch(n){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",n),e}}},bn=()=>je.getKey("gemini"),yn=(t,e)=>je.setKey("gemini",t,e),Ro=()=>je.hasKey("gemini");window.ApiKeyStorage=je;window.getGeminiApiKey=bn;window.setGeminiApiKey=yn;window.hasGeminiApiKey=Ro;var xn=class{constructor(){this.modal=null;this.options=null;this.analyzer=er();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 n,i;(n=this.promptInput)==null||n.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var n;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
|
|
66
66
|
<div class="ai-modal-card">
|
|
67
67
|
<div class="ai-modal-header">
|
|
68
68
|
<div class="ai-modal-actions">
|
|
@@ -141,14 +141,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),n={summary:d,palette:p.slice(0
|
|
|
141
141
|
<button class="ai-btn primary" data-action="apply" disabled>Apply</button>
|
|
142
142
|
</div>
|
|
143
143
|
</div>
|
|
144
|
-
`,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var a;this.currentPrompt=((a=this.promptInput)==null?void 0:a.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),n=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{n.textContent=e.value}),this.modal.addEventListener("click",a=>{var o;let
|
|
144
|
+
`,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var a;this.currentPrompt=((a=this.promptInput)==null?void 0:a.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),n=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{n.textContent=e.value}),this.modal.addEventListener("click",a=>{var o;let r=a.target;switch(r.dataset.action||((o=r.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",a=>{let r=a.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let s=r.closest(".ai-gallery-item"),o=parseInt(s.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.modal.addEventListener("click",a=>{a.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var n;let e=(n=this.modal)==null?void 0:n.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let a=`${this.currentPrompt}
|
|
145
145
|
|
|
146
|
-
Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,n,i,a;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(n=this.previewEl)==null||n.classList.add("hidden");try{let
|
|
146
|
+
Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,n,i,a;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(n=this.previewEl)==null||n.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let d=await fn(this.options.currentValue);d&&(s=[{base64:d.base64,mimeType:d.mimeType}])}catch(d){console.warn("[AiEditorModal] Failed to load current image:",d)}let o=await kt(r,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await Mt(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(a=this.previewEl)==null||a.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((n,i)=>`
|
|
147
147
|
<div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
|
|
148
148
|
<img class="ai-gallery-thumb" src="${n}" alt="Generated ${i+1}" />
|
|
149
149
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
150
150
|
</div>
|
|
151
|
-
`).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 n;let e=(n=this.modal)==null?void 0:n.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var n;if(this.selectedImageIndex<0||!((n=this.options)!=null&&n.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=bn();if(e)return e;try{let n=this.analyzer.getResult();if(n&&n.apiKey)return yn(n.apiKey,"From Brand DNA"),n.apiKey}catch(n){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",n)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},vn=null;window.__openAiEditor=function(t,e,n,i){vn||(vn=new xn),vn.open({objectId:t,initialPrompt:e,currentValue:n,path:i==null?void 0:i.path,onApply:a=>{if(i!=null&&i.path){let
|
|
151
|
+
`).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 n;let e=(n=this.modal)==null?void 0:n.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var n;if(this.selectedImageIndex<0||!((n=this.options)!=null&&n.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=bn();if(e)return e;try{let n=this.analyzer.getResult();if(n&&n.apiKey)return yn(n.apiKey,"From Brand DNA"),n.apiKey}catch(n){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",n)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},vn=null;window.__openAiEditor=function(t,e,n,i){vn||(vn=new xn),vn.open({objectId:t,initialPrompt:e,currentValue:n,path:i==null?void 0:i.path,onApply:a=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(t,i.path,a);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(t);if(o){let l=i.path.split("."),d=o;for(let p=0;p<l.length-1;p++)d[l[p]]||(d[l[p]]={}),d=d[l[p]];d[l[l.length-1]]=a}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};En();var Sn=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:n,objectId:i}=this.options,a=i||"Asset Preview",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
152
152
|
<div class="asset-preview-card">
|
|
153
153
|
<div class="asset-preview-header">
|
|
154
154
|
<div class="asset-preview-title">${a}</div>
|
|
@@ -169,13 +169,13 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
169
169
|
${n==="image"?'<button class="asset-preview-ai" data-action="edit">\u2728 AI Edit</button>':""}
|
|
170
170
|
</div>
|
|
171
171
|
</div>
|
|
172
|
-
`,this.modal=
|
|
172
|
+
`,this.modal=r,this.attachEventListeners()}renderAssetContent(e,n){if(!e)return'<div class="asset-preview-placeholder">No asset selected</div>';switch(n){case"image":return`<img src="${this.resolveAssetUrl(e)}" alt="Asset preview" style="max-width: 100%; max-height: 400px; object-fit: contain;" />`;case"audio":let a=this.resolveAssetUrl(e);return`
|
|
173
173
|
<audio controls style="width: 100%;">
|
|
174
174
|
<source src="${a}" type="audio/mpeg">
|
|
175
175
|
<source src="${a}" type="audio/wav">
|
|
176
176
|
Your browser does not support the audio element.
|
|
177
177
|
</audio>
|
|
178
|
-
`;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 ${n} 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 a=i.target;(a.dataset.action==="close"||a===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let n=this.modal.querySelector('[data-action="edit"]');n&&n.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(En(),
|
|
178
|
+
`;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 ${n} 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 a=i.target;(a.dataset.action==="close"||a===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let n=this.modal.querySelector('[data-action="edit"]');n&&n.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(En(),tr)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var a;(a=this.options)!=null&&a.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:n=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(n)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(t){new Sn().open(t)};var An=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=`
|
|
179
179
|
<div class="asset-crop-card">
|
|
180
180
|
<div class="asset-crop-header">
|
|
181
181
|
<div>
|
|
@@ -226,7 +226,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
226
226
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
227
227
|
</div>
|
|
228
228
|
</div>
|
|
229
|
-
`,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,n=this.canvas.width/this.canvas.height;e>n?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*n,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/n,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 n=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,a=this.cropY+this.cropHeight/2;e>n?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,n=this.canvas.height/this.cropHeight;this.scale=Math.min(e,n)*.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,n=this.panY,i=this.cropWidth*this.scale,a=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,n,i,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,n,i,a),this.ctx.fillStyle="#ffffff";let s=8;[[e,n],[e+i-s,n],[e,n+a-s],[e+i-s,n+a-s]].forEach(([o,l])=>{var d;(d=this.ctx)==null||d.fillRect(o,l,s,s)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let n=e.getContext("2d");if(!n)return;let i=150;e.width=i,e.height=i;let a=i/this.cropWidth,s=i/this.cropHeight,r=Math.min(a,s),o=this.cropWidth*r,l=this.cropHeight*r,d=(i-o)/2,p=(i-l)/2;n.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,d,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let a=parseFloat(i.target.value);this.setZoom(a)});let n=this.modal.querySelector(".asset-crop-aspect-select");n==null||n.addEventListener("change",i=>{let a=i.target.value;this.setAspectRatio(a)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let n=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+n,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let n=e.deltaY>0?.9:1.1;this.setZoom(this.scale*n)}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 n=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+n,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 n;switch(e){case"1:1":n=1;break;case"4:3":n=4/3;break;case"16:9":n=16/9;break;case"3:2":n=3/2;break;default:n=void 0}n&&this.applyAspectRatio(n),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),n=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),n&&(n.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-n,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var a;if(!this.image||!((a=this.options)!=null&&a.onCrop))return;let e=document.createElement("canvas"),n=e.getContext("2d");if(!n)return;e.width=this.cropWidth,e.height=this.cropHeight,n.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(t){new An().open(t)};fe();fe();var ns=ae(require("lottie-web"),1);tn(Ha);typeof window!="undefined"&&!window.lottie&&(window.lottie=ns.default);hn();fe();var Cn=ya.version,Io=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ba();var cs={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"},ds=Math.random().toString(36).slice(2),He=null,De={...cs},ps="web_embed",Mn={},et,Tn=!1,Qe=!1,nt=!1,us=!1,On=1,Rt=0,jt=!1,pe=!1,$e="",ze=Math.floor(window.innerWidth),Ne=Math.floor(window.innerHeight),Pn=ze>Ne,ue=!1,tt=!1,is=!1,as=!1,_n=!1,Ot=null,Le=null,kn=!1,Rn=!1,kt=new Map;function gs(){if(!Le)return null;let t=Date.now()-Le;return!Number.isFinite(t)||t<0?null:t}function Ln(t){if(kn)return;let e=gs();e!==null&&(kn=!0,w("session_time",{duration_ms:e,reason:t}))}function ss(){if(He)return He;let t=document.createElement("div");return t.id="handler-root",t.setAttribute("data-handler-root","true"),document.body.appendChild(t),He=t,t}function It(t){switch(t){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return t}}function hs(t,e){return{event_name:t,ts:Date.now(),session_id:ds,deployment_id:De.deployment_id,variant_id:De.variant_id,export_profile_id:De.profile_id,instance_id:De.instance_id||"default",env:ps==="mraid"?"mraid":"web",attribution:et,payload:e}}function w(t,e){let n=It(t),i=hs(n,e);Jt(i,!!Mn.analytics),bt(n,i),n!==t&&bt(t,i)}function it(){Ot&&(Ot(ze,Ne),Ot=null)}function Fe(t){On=t,w("volume",t)}function Be(t){t&&(us=!0),!nt&&(nt=!0,w("pause"),Fe(0))}function at(t){!t&&us||nt&&(nt=!1,w("resume"),Fe(On))}function me(t,e){ze=Math.floor(t||window.innerWidth),Ne=Math.floor(e||window.innerHeight),Pn=ze>Ne,w("resize",{width:ze,height:Ne})}function jo(){if(Pa())try{let t=mraid.getMaxSize();me(t.width,t.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?at():Be()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();me(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();Fe(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&Fe(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),jt=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it();else{let n=()=>{ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it()};mraid.addEventListener("ready",n)}}catch(t){console.warn("MRAID hook skipped",t)}}function Do(){if(ka())try{let t=dapi.getScreenSize();me(t.width,t.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?at():Be()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();me(n.width||i.width,n.height||i.height)});let e=dapi.getAudioVolume();if(Fe(e?1:0),dapi.addEventListener("audioVolumeChange",n=>Fe(n?1:0)),jt=!0,dapi.isViewable())ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it();else{let n=()=>{ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it()};dapi.addEventListener("ready",n)}}catch(t){console.warn("DAPI hook skipped",t)}}function rs(){let t=()=>{ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it(),tt&&(tt=!1,J.start()))};window.addEventListener("resize",()=>me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(at(),t()):Be()}),document.readyState==="complete"||document.readyState==="interactive"?t():window.addEventListener("load",t),jt=!0}function $o(){let t=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(is=!0),!(is&&e instanceof MouseEvent)&&(Rt+=1,Rn||(Rn=!0,w("first_interaction",{count:Rt})),w("interaction",Rt))};document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)}function os(t){var i,a,s,r,o,l,d,p,c,g,u,b;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(t||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Oe())(s=(a=window.TJ_API)==null?void 0:a.click)==null||s.call(a);else if(Ra())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Da())(d=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||d.call(l);else if(ja())try{(c=(p=window.smxTracking)==null?void 0:p.redirect)==null||c.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Oa()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(t||$e||""):t&&window.open(t)}else Re()?(g=window.install)==null||g.call(window):Ia()?(u=window.openAppStore)==null||u.call(window):Zt()?(b=parent==null?void 0:parent.postMessage)==null||b.call(parent,"download","*"):t&&window.open(t)}function Ho(){let t=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=n=>{if(!n)return;let i=new Image;i.src=n};if(t==="bigabid"){let n=window.BIGABID_BIDTIMEMACROS;if(!n)return;B("view",()=>e(n.mraid_viewable)),B("start",()=>e(n.game_viewable)),B("engagement",()=>e(n.engagement));let i=()=>e(n.complete);B("complete",i),mt("engagement",a=>{var s;((s=a==null?void 0:a.payload)==null?void 0:s.count)>3&&i()}),B("cta_click",()=>e(n.click))}else if(t==="inmobi"){let n=window.INMOBI_DSPMACROS;if(!n)return;B("view",()=>e(n.Ad_Load_Start)),B("start",()=>e(n.Ad_Viewable)),B("engagement",()=>e(n.First_Engagement)),B("complete",()=>e(n.Gameplay_Complete)),B("cta_click",()=>e(n.DSP_Click)),B("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(n[`Spent_${i}_Seconds`]),i*1e3))})}}function zo(){if(!Oe())return;let t=window.TJ_API;t&&t.setPlayableAPI&&t.setPlayableAPI({skipAd:()=>{try{J.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function ls(){var e,n,i;let t=window.TJ_API;(e=t==null?void 0:t.objectiveComplete)==null||e.call(t),(n=t==null?void 0:t.playableFinished)==null||n.call(t),(i=t==null?void 0:t.gameplayFinished)==null||i.call(t)}function No(){Re()&&(window.mintGameStart=()=>{at(!0),me()},window.mintGameClose=()=>{Be(!0)})}function Fo(){if(!Qt())return;let t=window.NUC;!t||!t.trigger||(J.on("cta_click",()=>{var e,n;return(n=(e=t.trigger).convert)==null?void 0:n.call(e,$e)}),J.on("complete",()=>{var e,n;return(n=(e=t.trigger).tryAgain)==null?void 0:n.call(e)}))}var J={init(t={},e){var n;if(ps=t.profile||"web_embed",Mn=t.consent||{},De={...cs,...t.ids||{}},He=t.rootEl||He,et=void 0,da((n=t.telemetry)!=null&&n.endpoint?t.telemetry:null),Le=null,kn=!1,Rn=!1,kt.clear(),$e=t.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ot=e),w("init"),document.body.oncontextmenu=()=>!1,ss(),Go(He),$a(),jo(),Do(),!jt){if(document.readyState==="complete")rs();else if(!as){as=!0;let i=()=>{rs(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}$o(),Ho(),zo(),No(),Fo(),console.log(`%c @handler/playable-sdk %c v${Cn} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ue&&!pe&&(w("boot"),w("view"),w("ready"),tt&&(tt=!1,J.start()),pe=!0),pe=ue},getRoot(){return ss()},get version(){return Cn},get maxWidth(){return ze},get maxHeight(){return Ne},get isLandscape(){return Pn},get isReady(){return pe},get isStarted(){return Tn},get isPaused(){return nt},get isFinished(){return Qe},get volume(){return On},get interactions(){return Rt},on(t,e){mt(It(t),e)},off(t,e){Xt(It(t),e)},start(){var t,e;if(!Tn){if(!ue){tt=!0;return}if(Tn=!0,Le||(Le=Date.now()),w("start"),me(),Re())Be(),(t=window.gameReady)==null||t.call(window);else if(Oe()){let n=window.TJ_API;(e=n==null?void 0:n.setPlayableBuild)==null||e.call(n,{orientation:Pn?"landscape":"portrait",buildID:Cn})}}},finish(){var t,e;Qe||(Qe=!0,w("complete"),Ln("complete"),Re()?(t=window.gameEnd)==null||t.call(window):Zt()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Oe()&&ls())},install(t){if(!Qe){Qe=!0,Oe()?(ls(),setTimeout(()=>J.install(t),300)):(w("complete"),setTimeout(()=>J.install(t),0));return}_n||(_n=!0,setTimeout(()=>_n=!1,500),w("cta_click"),w("conversion"),Ln("cta"),os(t||$e))},emit(t,e){let n=It(t);if(!Io.has(n)&&n!=="resize"&&n!=="volume"&&!n.startsWith("custom."))throw new Error(`Event ${t} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=hs(n,e);Jt(i,!!Mn.analytics),bt(n,i)},gameStart(){J.start()},gameEnd(){J.finish()},ctaClick(t,e){w("cta_click",{url:t||$e,manual:!0}),(e==null?void 0:e.open)!==!1&&os(t||$e)},ctaShow(t){w("cta_show",t)},ctaDismiss(t){w("cta_dismiss",t)},getGameTimeMs(){return gs()},endSession(t="manual"){Ln(t)},setAttribution(t){et=t},abTest(t,e){if(!t)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let n=Math.abs(Bo(`${ds}:${t}`))%e.length,i=e[n];return et={...et||{},experiment_id:t},De.variant_id=i,w("ab_assign",{experiment_id:t,variant_id:i}),i},levelStart(t,e){Le||(Le=Date.now()),w("level_start",{level_id:t,...e})},levelComplete(t,e){w("level_complete",{level_id:t,...e})},levelFail(t,e){w("level_fail",{level_id:t,...e})},checkpoint(t,e){w("checkpoint",{checkpoint_id:t,...e})},reward(t,e){w("reward",{reward_id:t,...e})},tutorialStart(t,e){w("tutorial_start",{step_id:t,...e})},tutorialComplete(t,e){w("tutorial_complete",{step_id:t,...e})},tutorialSkip(t,e){w("tutorial_skip",{step_id:t,...e})},timerStart(t){t&&kt.set(t,Date.now())},timerEnd(t,e="custom",n){if(!t)return;let i=kt.get(t);if(!i)return;kt.delete(t);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){w("engagement",{action:"timer",key:t,duration_ms:a,...n});return}w(e,{key:t,duration_ms:a,...n})}},fps(t,e){w("fps",{value:t,...e})},memory(t,e){w("memory",{bytes:t,...e})},assetLoadStart(t,e){w("asset_load_start",{asset_id:t,...e})},assetLoadComplete(t,e){w("asset_load_complete",{asset_id:t,...e})},reportError(t,e,n){w("error",{code:t,message:e,...n})},retry(){var t,e,n;if(Re())(t=window.gameRetry)==null||t.call(window);else if(Qt()){let i=window.NUC;(n=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||n.call(e)}w("engagement",{action:"retry"})},pause(){Be(!0)},resume(){at(!0)},resize(t,e){me(t,e)}},Ie=J;function Bo(t){let e=2166136261;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619);return e|0}function Go(t){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
229
|
+
`,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,n=this.canvas.width/this.canvas.height;e>n?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*n,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/n,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 n=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,a=this.cropY+this.cropHeight/2;e>n?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,n=this.canvas.height/this.cropHeight;this.scale=Math.min(e,n)*.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,n=this.panY,i=this.cropWidth*this.scale,a=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,n,i,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,n,i,a),this.ctx.fillStyle="#ffffff";let r=8;[[e,n],[e+i-r,n],[e,n+a-r],[e+i-r,n+a-r]].forEach(([o,l])=>{var d;(d=this.ctx)==null||d.fillRect(o,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let n=e.getContext("2d");if(!n)return;let i=150;e.width=i,e.height=i;let a=i/this.cropWidth,r=i/this.cropHeight,s=Math.min(a,r),o=this.cropWidth*s,l=this.cropHeight*s,d=(i-o)/2,p=(i-l)/2;n.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,d,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let a=parseFloat(i.target.value);this.setZoom(a)});let n=this.modal.querySelector(".asset-crop-aspect-select");n==null||n.addEventListener("change",i=>{let a=i.target.value;this.setAspectRatio(a)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let n=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+n,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let n=e.deltaY>0?.9:1.1;this.setZoom(this.scale*n)}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 n=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+n,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 n;switch(e){case"1:1":n=1;break;case"4:3":n=4/3;break;case"16:9":n=16/9;break;case"3:2":n=3/2;break;default:n=void 0}n&&this.applyAspectRatio(n),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),n=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),n&&(n.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-n,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var a;if(!this.image||!((a=this.options)!=null&&a.onCrop))return;let e=document.createElement("canvas"),n=e.getContext("2d");if(!n)return;e.width=this.cropWidth,e.height=this.cropHeight,n.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(t){new An().open(t)};fe();fe();var nr=ae(require("lottie-web"),1);tn(Ha);typeof window!="undefined"&&!window.lottie&&(window.lottie=nr.default);hn();fe();var Cn=ya.version,Io=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ba();var cr={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"},dr=Math.random().toString(36).slice(2),He=null,De={...cr},pr="web_embed",Mn={},et,Tn=!1,Qe=!1,nt=!1,ur=!1,On=1,Rt=0,jt=!1,pe=!1,$e="",ze=Math.floor(window.innerWidth),Fe=Math.floor(window.innerHeight),kn=ze>Fe,ue=!1,tt=!1,ir=!1,ar=!1,_n=!1,Ot=null,Le=null,Pn=!1,Rn=!1,Pt=new Map;function gr(){if(!Le)return null;let t=Date.now()-Le;return!Number.isFinite(t)||t<0?null:t}function Ln(t){if(Pn)return;let e=gr();e!==null&&(Pn=!0,w("session_time",{duration_ms:e,reason:t}))}function rr(){if(He)return He;let t=document.createElement("div");return t.id="handler-root",t.setAttribute("data-handler-root","true"),document.body.appendChild(t),He=t,t}function It(t){switch(t){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return t}}function hr(t,e){return{event_name:t,ts:Date.now(),session_id:dr,deployment_id:De.deployment_id,variant_id:De.variant_id,export_profile_id:De.profile_id,instance_id:De.instance_id||"default",env:pr==="mraid"?"mraid":"web",attribution:et,payload:e}}function w(t,e){let n=It(t),i=hr(n,e);Jt(i,!!Mn.analytics),bt(n,i),n!==t&&bt(t,i)}function it(){Ot&&(Ot(ze,Fe),Ot=null)}function Ne(t){On=t,w("volume",t)}function Be(t){t&&(ur=!0),!nt&&(nt=!0,w("pause"),Ne(0))}function at(t){!t&&ur||nt&&(nt=!1,w("resume"),Ne(On))}function me(t,e){ze=Math.floor(t||window.innerWidth),Fe=Math.floor(e||window.innerHeight),kn=ze>Fe,w("resize",{width:ze,height:Fe})}function jo(){if(ka())try{let t=mraid.getMaxSize();me(t.width,t.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?at():Be()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();me(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();Ne(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&Ne(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),jt=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it();else{let n=()=>{ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it()};mraid.addEventListener("ready",n)}}catch(t){console.warn("MRAID hook skipped",t)}}function Do(){if(Pa())try{let t=dapi.getScreenSize();me(t.width,t.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?at():Be()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();me(n.width||i.width,n.height||i.height)});let e=dapi.getAudioVolume();if(Ne(e?1:0),dapi.addEventListener("audioVolumeChange",n=>Ne(n?1:0)),jt=!0,dapi.isViewable())ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it();else{let n=()=>{ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it()};dapi.addEventListener("ready",n)}}catch(t){console.warn("DAPI hook skipped",t)}}function sr(){let t=()=>{ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ue=!0,w("boot"),w("view"),w("ready"),pe=!0,it(),tt&&(tt=!1,J.start()))};window.addEventListener("resize",()=>me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(at(),t()):Be()}),document.readyState==="complete"||document.readyState==="interactive"?t():window.addEventListener("load",t),jt=!0}function $o(){let t=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(ir=!0),!(ir&&e instanceof MouseEvent)&&(Rt+=1,Rn||(Rn=!0,w("first_interaction",{count:Rt})),w("interaction",Rt))};document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)}function or(t){var i,a,r,s,o,l,d,p,c,g,u,b;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(t||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Oe())(r=(a=window.TJ_API)==null?void 0:a.click)==null||r.call(a);else if(Ra())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Da())(d=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||d.call(l);else if(ja())try{(c=(p=window.smxTracking)==null?void 0:p.redirect)==null||c.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Oa()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(t||$e||""):t&&window.open(t)}else Re()?(g=window.install)==null||g.call(window):Ia()?(u=window.openAppStore)==null||u.call(window):Zt()?(b=parent==null?void 0:parent.postMessage)==null||b.call(parent,"download","*"):t&&window.open(t)}function Ho(){let t=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=n=>{if(!n)return;let i=new Image;i.src=n};if(t==="bigabid"){let n=window.BIGABID_BIDTIMEMACROS;if(!n)return;B("view",()=>e(n.mraid_viewable)),B("start",()=>e(n.game_viewable)),B("engagement",()=>e(n.engagement));let i=()=>e(n.complete);B("complete",i),mt("engagement",a=>{var r;((r=a==null?void 0:a.payload)==null?void 0:r.count)>3&&i()}),B("cta_click",()=>e(n.click))}else if(t==="inmobi"){let n=window.INMOBI_DSPMACROS;if(!n)return;B("view",()=>e(n.Ad_Load_Start)),B("start",()=>e(n.Ad_Viewable)),B("engagement",()=>e(n.First_Engagement)),B("complete",()=>e(n.Gameplay_Complete)),B("cta_click",()=>e(n.DSP_Click)),B("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(n[`Spent_${i}_Seconds`]),i*1e3))})}}function zo(){if(!Oe())return;let t=window.TJ_API;t&&t.setPlayableAPI&&t.setPlayableAPI({skipAd:()=>{try{J.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function lr(){var e,n,i;let t=window.TJ_API;(e=t==null?void 0:t.objectiveComplete)==null||e.call(t),(n=t==null?void 0:t.playableFinished)==null||n.call(t),(i=t==null?void 0:t.gameplayFinished)==null||i.call(t)}function Fo(){Re()&&(window.mintGameStart=()=>{at(!0),me()},window.mintGameClose=()=>{Be(!0)})}function No(){if(!Qt())return;let t=window.NUC;!t||!t.trigger||(J.on("cta_click",()=>{var e,n;return(n=(e=t.trigger).convert)==null?void 0:n.call(e,$e)}),J.on("complete",()=>{var e,n;return(n=(e=t.trigger).tryAgain)==null?void 0:n.call(e)}))}var J={init(t={},e){var n;if(pr=t.profile||"web_embed",Mn=t.consent||{},De={...cr,...t.ids||{}},He=t.rootEl||He,et=void 0,da((n=t.telemetry)!=null&&n.endpoint?t.telemetry:null),Le=null,Pn=!1,Rn=!1,Pt.clear(),$e=t.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ot=e),w("init"),document.body.oncontextmenu=()=>!1,rr(),Go(He),$a(),jo(),Do(),!jt){if(document.readyState==="complete")sr();else if(!ar){ar=!0;let i=()=>{sr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}$o(),Ho(),zo(),Fo(),No(),console.log(`%c @handler/playable-sdk %c v${Cn} `,"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;"),ue&&!pe&&(w("boot"),w("view"),w("ready"),tt&&(tt=!1,J.start()),pe=!0),pe=ue},getRoot(){return rr()},get version(){return Cn},get maxWidth(){return ze},get maxHeight(){return Fe},get isLandscape(){return kn},get isReady(){return pe},get isStarted(){return Tn},get isPaused(){return nt},get isFinished(){return Qe},get volume(){return On},get interactions(){return Rt},on(t,e){mt(It(t),e)},off(t,e){Xt(It(t),e)},start(){var t,e;if(!Tn){if(!ue){tt=!0;return}if(Tn=!0,Le||(Le=Date.now()),w("start"),me(),Re())Be(),(t=window.gameReady)==null||t.call(window);else if(Oe()){let n=window.TJ_API;(e=n==null?void 0:n.setPlayableBuild)==null||e.call(n,{orientation:kn?"landscape":"portrait",buildID:Cn})}}},finish(){var t,e;Qe||(Qe=!0,w("complete"),Ln("complete"),Re()?(t=window.gameEnd)==null||t.call(window):Zt()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Oe()&&lr())},install(t){if(!Qe){Qe=!0,Oe()?(lr(),setTimeout(()=>J.install(t),300)):(w("complete"),setTimeout(()=>J.install(t),0));return}_n||(_n=!0,setTimeout(()=>_n=!1,500),w("cta_click"),w("conversion"),Ln("cta"),or(t||$e))},emit(t,e){let n=It(t);if(!Io.has(n)&&n!=="resize"&&n!=="volume"&&!n.startsWith("custom."))throw new Error(`Event ${t} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=hr(n,e);Jt(i,!!Mn.analytics),bt(n,i)},gameStart(){J.start()},gameEnd(){J.finish()},ctaClick(t,e){w("cta_click",{url:t||$e,manual:!0}),(e==null?void 0:e.open)!==!1&&or(t||$e)},ctaShow(t){w("cta_show",t)},ctaDismiss(t){w("cta_dismiss",t)},getGameTimeMs(){return gr()},endSession(t="manual"){Ln(t)},setAttribution(t){et=t},abTest(t,e){if(!t)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let n=Math.abs(Bo(`${dr}:${t}`))%e.length,i=e[n];return et={...et||{},experiment_id:t},De.variant_id=i,w("ab_assign",{experiment_id:t,variant_id:i}),i},levelStart(t,e){Le||(Le=Date.now()),w("level_start",{level_id:t,...e})},levelComplete(t,e){w("level_complete",{level_id:t,...e})},levelFail(t,e){w("level_fail",{level_id:t,...e})},checkpoint(t,e){w("checkpoint",{checkpoint_id:t,...e})},reward(t,e){w("reward",{reward_id:t,...e})},tutorialStart(t,e){w("tutorial_start",{step_id:t,...e})},tutorialComplete(t,e){w("tutorial_complete",{step_id:t,...e})},tutorialSkip(t,e){w("tutorial_skip",{step_id:t,...e})},timerStart(t){t&&Pt.set(t,Date.now())},timerEnd(t,e="custom",n){if(!t)return;let i=Pt.get(t);if(!i)return;Pt.delete(t);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){w("engagement",{action:"timer",key:t,duration_ms:a,...n});return}w(e,{key:t,duration_ms:a,...n})}},fps(t,e){w("fps",{value:t,...e})},memory(t,e){w("memory",{bytes:t,...e})},assetLoadStart(t,e){w("asset_load_start",{asset_id:t,...e})},assetLoadComplete(t,e){w("asset_load_complete",{asset_id:t,...e})},reportError(t,e,n){w("error",{code:t,message:e,...n})},retry(){var t,e,n;if(Re())(t=window.gameRetry)==null||t.call(window);else if(Qt()){let i=window.NUC;(n=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||n.call(e)}w("engagement",{action:"retry"})},pause(){Be(!0)},resume(){at(!0)},resize(t,e){me(t,e)}},Ie=J;function Bo(t){let e=2166136261;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619);return e|0}function Go(t){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
230
230
|
(function(){
|
|
231
231
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
232
232
|
function unlock(){
|
|
@@ -242,7 +242,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
242
242
|
}
|
|
243
243
|
events.forEach(function(e){ document.addEventListener(e, unlock, false); });
|
|
244
244
|
})();
|
|
245
|
-
`,t.appendChild(e)}var In=(i=>(i[i.PHONE_TALL=0]="PHONE_TALL",i[i.TABLET=1]="TABLET",i[i.LANDSCAPE=2]="LANDSCAPE",i))(In||{});function Dt(t,e){let n=t/e;return n<=.62?0:n<=.85?1:2}var Ge=class{constructor(e,n){this.root=e,this.stage=n,this.uiFrame=document.createElement("div"),this.uiFrame.style.position="absolute",this.uiFrame.style.top="0",this.uiFrame.style.bottom="0",this.uiFrame.style.left="50%",this.uiFrame.style.transform="translateX(-50%)",this.uiFrame.style.width="100%",this.uiFrame.style.maxWidth="420px",this.uiFrame.style.pointerEvents="none",this.stage.appendChild(this.uiFrame),this.uiContainer=document.createElement("div"),this.uiContainer.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","justify-content:flex-start","gap:12px","pointer-events:none","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),this.uiFrame.appendChild(this.uiContainer),this.updateLayout()}getUIFrame(){return this.uiFrame}getUIContainer(){return this.uiContainer}updateLayout(){let e=this.stage.getBoundingClientRect(),n=Dt(e.width,e.height);n===0?this.uiFrame.style.maxWidth="420px":n===1?this.uiFrame.style.maxWidth="520px":this.uiFrame.style.maxWidth="640px"}getAspectClass(){let e=this.stage.getBoundingClientRect();return Dt(e.width,e.height)}};async function
|
|
245
|
+
`,t.appendChild(e)}var In=(i=>(i[i.PHONE_TALL=0]="PHONE_TALL",i[i.TABLET=1]="TABLET",i[i.LANDSCAPE=2]="LANDSCAPE",i))(In||{});function Dt(t,e){let n=t/e;return n<=.62?0:n<=.85?1:2}var Ge=class{constructor(e,n){this.root=e,this.stage=n,this.uiFrame=document.createElement("div"),this.uiFrame.style.position="absolute",this.uiFrame.style.top="0",this.uiFrame.style.bottom="0",this.uiFrame.style.left="50%",this.uiFrame.style.transform="translateX(-50%)",this.uiFrame.style.width="100%",this.uiFrame.style.maxWidth="420px",this.uiFrame.style.pointerEvents="none",this.stage.appendChild(this.uiFrame),this.uiContainer=document.createElement("div"),this.uiContainer.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","justify-content:flex-start","gap:12px","pointer-events:none","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),this.uiFrame.appendChild(this.uiContainer),this.updateLayout()}getUIFrame(){return this.uiFrame}getUIContainer(){return this.uiContainer}updateLayout(){let e=this.stage.getBoundingClientRect(),n=Dt(e.width,e.height);n===0?this.uiFrame.style.maxWidth="420px":n===1?this.uiFrame.style.maxWidth="520px":this.uiFrame.style.maxWidth="640px"}getAspectClass(){let e=this.stage.getBoundingClientRect();return Dt(e.width,e.height)}};async function fr(t,e={}){let n=()=>{let f=t.getBoundingClientRect(),m=Math.floor(f.width),E=Math.floor(f.height);return(m<=0||!isFinite(m)||m!==m)&&(m=t.clientWidth||window.innerWidth||320),(E<=0||!isFinite(E)||E!==E)&&(E=t.clientHeight||window.innerHeight||480),(m<=0||!isFinite(m)||m!==m)&&(m=320),(E<=0||!isFinite(E)||E!==E)&&(E=480),console.log("[THREE-BASE] getSize result:",{width:m,height:E,boundingRect:{width:f.width,height:f.height},clientSize:{width:t.clientWidth,height:t.clientHeight},styleWidth:t.style.width,styleHeight:t.style.height,note:"Using boundingRect as primary source (actual rendered size)"}),{width:m,height:E}},i=t.style.width&&!t.style.width.includes("%"),a=t.style.height&&!t.style.height.includes("%");t.style.position||(t.style.position="relative"),t.style.display||(t.style.display="block"),t.style.width=t.style.width||"100%",t.style.height=t.style.height||"100%",t.style.minWidth="100%",t.style.minHeight="100%",t.style.maxWidth="100%",t.style.maxHeight="100%",t.style.boxSizing="border-box",t.style.overflow="hidden",t.style.margin="0",t.style.padding="0",t.style.border="none";let r=e.background||"linear-gradient(160deg, #0d1020, #0f1c2f)";t.style.setProperty("background",r,"important"),t.style.setProperty("background-size","cover","important"),t.style.setProperty("background-position","center","important"),t.style.setProperty("background-repeat","no-repeat","important");let s=document.createElement("div");s.style.cssText=`
|
|
246
246
|
position: absolute !important;
|
|
247
247
|
inset: 0 !important;
|
|
248
248
|
width: 100% !important;
|
|
@@ -252,7 +252,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
252
252
|
max-width: 100% !important;
|
|
253
253
|
max-height: 100% !important;
|
|
254
254
|
display: block !important;
|
|
255
|
-
background: ${
|
|
255
|
+
background: ${r} !important;
|
|
256
256
|
background-size: cover !important;
|
|
257
257
|
background-position: center !important;
|
|
258
258
|
background-repeat: no-repeat !important;
|
|
@@ -263,9 +263,9 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
263
263
|
padding: 0 !important;
|
|
264
264
|
border: none !important;
|
|
265
265
|
overflow: hidden !important;
|
|
266
|
-
`,t.appendChild(
|
|
266
|
+
`,t.appendChild(s);let o=document.createElement("div");o.setAttribute("style",["position:absolute","inset:0","width:100%","height:100%","min-width:100%","min-height:100%","max-width:100%","max-height:100%","pointer-events:auto","box-sizing:border-box","margin:0","padding:0","overflow:hidden"].join(";")),s.appendChild(o);let l=new V.Scene,{width:d,height:p}=n(),c=new V.AmbientLight(16777215,.6);l.add(c);let g=new V.DirectionalLight(16777215,.8);g.position.set(5,5,5),g.castShadow=!1,l.add(g);let u=new V.DirectionalLight(16777215,.3);u.position.set(-5,0,5),l.add(u);let b=new V.PerspectiveCamera(55,d/p,.1,100);b.position.set(0,0,3.2),b.lookAt(0,0,0),b.updateMatrixWorld();let h=new V.WebGLRenderer({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});h.setPixelRatio(window.devicePixelRatio||1),h.setSize(d,p),h.setClearColor(0,0),h.domElement.style.position="absolute",h.domElement.style.top="0",h.domElement.style.left="0",h.domElement.style.right="0",h.domElement.style.bottom="0",h.domElement.style.width="100%",h.domElement.style.height="100%",h.domElement.style.minWidth="100%",h.domElement.style.minHeight="100%",h.domElement.style.maxWidth="100%",h.domElement.style.maxHeight="100%",h.domElement.style.display="block",h.domElement.style.pointerEvents="auto",h.domElement.style.margin="0",h.domElement.style.padding="0",h.domElement.style.boxSizing="border-box",o.appendChild(h.domElement);let x=f=>{var L;let m=t.getBoundingClientRect(),E=window.getComputedStyle(t);console.log("[THREE-BASE] applySize called:",{providedSize:f,rootRect:{width:m.width,height:m.height},clientSize:{width:t.clientWidth,height:t.clientHeight},styleSize:{width:t.style.width,height:t.style.height},computedStyle:{width:E.width,height:E.height,transform:E.transform,scale:E.scale},rendererCurrentSize:{width:h.domElement.width,height:h.domElement.height},rendererStyleSize:{width:h.domElement.style.width,height:h.domElement.style.height},stackTrace:(L=new Error().stack)==null?void 0:L.split(`
|
|
267
267
|
`).slice(1,4).join(`
|
|
268
|
-
`)});let S=m.width,A=m.height;if((S<=0||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:m.width,clientWidth:t.clientWidth}),S=t.clientWidth||window.innerWidth||320),(A<=0||!isFinite(A))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:m.height,clientHeight:t.clientHeight}),A=t.clientHeight||window.innerHeight||480),typeof(f==null?void 0:f.width)=="number"&&f.width>0){let j=Math.abs(f.width-m.width),O=m.width*.1;j>O?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:f.width,container:m.width,difference:j,tolerance:O,willUse:"container size (boundingRect)"}):(S=f.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:f.width,container:m.width}))}if(typeof(f==null?void 0:f.height)=="number"&&f.height>0){let j=Math.abs(f.height-m.height),O=m.height*.1;j>O?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:f.height,container:m.height,difference:j,tolerance:O,willUse:"container size (boundingRect)"}):(A=f.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:f.height,container:m.height}))}(S<=0||A<=0||!isFinite(S)||!isFinite(A))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:S,newHeight:A,size:f,rootRect:m}),S=m.width||t.clientWidth||320,A=m.height||t.clientHeight||480);let M=Math.floor(S),R=Math.floor(A);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:M,finalHeight:R,aspectRatio:M/R,beforeRendererSize:{width:h.domElement.width,height:h.domElement.height},beforeRendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height}}),h.setSize(M,R),h.setPixelRatio(window.devicePixelRatio||1),b.aspect=M/R,b.updateProjectionMatrix();let _=t.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:h.domElement.width,height:h.domElement.height},rendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height},containerRect:{width:_.width,height:_.height},cameraAspect:b.aspect,matches:{width:Math.abs(h.domElement.width-_.width)<1,height:Math.abs(h.domElement.height-_.height)<1},sizeDifference:{width:h.domElement.width-_.width,height:h.domElement.height-_.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{x()})});let v=!1;Ie.on("pause",()=>{v=!0,document.querySelectorAll("audio").forEach(m=>m.pause())}),Ie.on("resume",()=>{v=!1,document.querySelectorAll("audio").forEach(m=>{m.currentTime>0&&!m.ended&&m.play().catch(()=>{})})});let y=new Ge(t,
|
|
268
|
+
`)});let S=m.width,A=m.height;if((S<=0||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:m.width,clientWidth:t.clientWidth}),S=t.clientWidth||window.innerWidth||320),(A<=0||!isFinite(A))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:m.height,clientHeight:t.clientHeight}),A=t.clientHeight||window.innerHeight||480),typeof(f==null?void 0:f.width)=="number"&&f.width>0){let j=Math.abs(f.width-m.width),O=m.width*.1;j>O?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:f.width,container:m.width,difference:j,tolerance:O,willUse:"container size (boundingRect)"}):(S=f.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:f.width,container:m.width}))}if(typeof(f==null?void 0:f.height)=="number"&&f.height>0){let j=Math.abs(f.height-m.height),O=m.height*.1;j>O?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:f.height,container:m.height,difference:j,tolerance:O,willUse:"container size (boundingRect)"}):(A=f.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:f.height,container:m.height}))}(S<=0||A<=0||!isFinite(S)||!isFinite(A))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:S,newHeight:A,size:f,rootRect:m}),S=m.width||t.clientWidth||320,A=m.height||t.clientHeight||480);let M=Math.floor(S),R=Math.floor(A);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:M,finalHeight:R,aspectRatio:M/R,beforeRendererSize:{width:h.domElement.width,height:h.domElement.height},beforeRendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height}}),h.setSize(M,R),h.setPixelRatio(window.devicePixelRatio||1),b.aspect=M/R,b.updateProjectionMatrix();let _=t.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:h.domElement.width,height:h.domElement.height},rendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height},containerRect:{width:_.width,height:_.height},cameraAspect:b.aspect,matches:{width:Math.abs(h.domElement.width-_.width)<1,height:Math.abs(h.domElement.height-_.height)<1},sizeDifference:{width:h.domElement.width-_.width,height:h.domElement.height-_.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{x()})});let v=!1;Ie.on("pause",()=>{v=!0,document.querySelectorAll("audio").forEach(m=>m.pause())}),Ie.on("resume",()=>{v=!1,document.querySelectorAll("audio").forEach(m=>{m.currentTime>0&&!m.ended&&m.play().catch(()=>{})})});let y=new Ge(t,s);return Ie.on("resize",({payload:f})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:f,timestamp:Date.now(),rootRect:t.getBoundingClientRect()}),x({width:f==null?void 0:f.width,height:f==null?void 0:f.height}),y.updateLayout()}),window.addEventListener("resize",()=>{console.log("[THREE-BASE] Window resize event received:",{timestamp:Date.now(),windowSize:{width:window.innerWidth,height:window.innerHeight},rootRect:t.getBoundingClientRect()}),x(),y.updateLayout()}),{scene:l,camera:b,renderer:h,uiSystem:y,applySize:x}}var D=ae(require("three"),1),rt=class{constructor(e){var n,i;this.position=(e==null?void 0:e.position)||{x:0,y:0},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(i=e==null?void 0:e.rotation)!=null?i:0}update(e){e.position!==void 0&&(this.position={...e.position}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToThree(e){let n=e.position.z,i=n===0||!isFinite(n)?.5:n;e.position.set(this.position.x,this.position.y,i),e.scale.set(this.scale,this.scale,this.scale),e.rotation.z=this.rotation}},st=class{constructor(e){var n,i,a,r;this.z_index=(n=e==null?void 0:e.z_index)!=null?n:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(a=e==null?void 0:e.visible)!=null?a:!0,this.tint=(r=e==null?void 0:e.tint)!=null?r:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToThree(e){if(e.renderOrder=this.z_index,e.visible=this.visible,e instanceof D.Mesh&&e.material&&(Array.isArray(e.material)?e.material.forEach(n=>{n instanceof D.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):e.material instanceof D.Material&&(e.material.opacity=this.alpha,e.material.transparent=this.alpha<1)),this.tint!==null&&e instanceof D.Mesh&&e.material){let n=typeof this.tint=="string"?new D.Color(this.tint):new D.Color(this.tint);Array.isArray(e.material)?e.material.forEach(i=>{(i instanceof D.MeshBasicMaterial||i instanceof D.MeshStandardMaterial)&&i.color.copy(n)}):(e.material instanceof D.MeshBasicMaterial||e.material instanceof D.MeshStandardMaterial)&&e.material.color.copy(n)}}},ot=class{constructor(e,n,i,a){this.instanceId=e,this.objectConfig=n,this.threeObject=i,this._config=a,this.transform=new rt(a.transform),this.renderer=new st(a.render),this.sync()}sync(){this.transform.syncToThree(this.threeObject),this.renderer.syncToThree(this.threeObject)}updateConfig(e){this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,n){this.transform.position={x:e,y:n},this.transform.syncToThree(this.threeObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToThree(this.threeObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToThree(this.threeObject)}},$t=class{constructor(e){this.objects=new Map;this.config=e}create(e,n){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let a=new ot(e,i.object_config||e,n,i);return this.objects.set(e,a),a}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[n,i]of this.objects.entries()){let a=e.objects.get(n);a&&i.updateConfig(a)}}getAll(){return Array.from(this.objects.values())}remove(e){this.objects.delete(e)}clear(){this.objects.clear()}};var Ht={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function Z(t){let e=Ht[t];return e?e.family:(console.warn(`Font ID "${t}" not found in registry, using fallback`),"Arial, sans-serif")}function Q(t){var n;let e=Ht[t];return e&&(n=e.weight)!=null?n:"400"}function mr(t,e){Ht[t]=e}function br(){return Object.keys(Ht)}var Ue=ae(require("three"),1);function Me(t){return{element:t,get alpha(){return parseFloat(t.style.opacity||"1")},set alpha(e){t.style.opacity=e.toString()},get visible(){return t.style.display!=="none"},set visible(e){t.style.display=e?"":"none"},position:{set(e,n){t.style.left=`${e}px`,t.style.top=`${n}px`},get x(){return parseFloat(t.style.left||"0")},get y(){return parseFloat(t.style.top||"0")}},scale:{set(e,n){t.style.transform=`scale(${e})`},get x(){let e=t.style.transform.match(/scale\(([^)]+)\)/);return e?parseFloat(e[1]):1}}}}function yr(t,e,n,i){var Qn,ei,ti,ni,ii,ai,ri,si,oi,li,ci,di,pi,ui,gi,hi,fi,mi,bi,yi,vi,xi,wi,Ei,Si,Ai,Ci,Ti,_i,Li,Mi,ki,Pi,Ri,Oi,Ii,ji,Di,$i,Hi,zi,Fi,Ni,Bi,Gi,Ui,qi,Wi,Vi,Yi,Ki,Xi,Ji,Zi,Qi,ea,ta,na,ia,aa,ra;let a=t.objects.get("ui_endgame_1"),r=t.objects.get("ui_endgame_logo_1"),s=t.objects.get("ui_endgame_title_1"),o=t.objects.get("ui_endgame_subtitle_1"),l=t.objects.get("ui_endgame_footer_1"),d=t.objects.get("ui_endgame_cta_1"),p=t.objects.get("ui_endgame_cta_hint_1"),c=t.objects.get("ui_endgame_hand_1"),g=t.engine.runtime||{},u=((Qn=a==null?void 0:a.gameplay)==null?void 0:Qn.tuning)||{},b=(a==null?void 0:a.render)||{},h=i.getBoundingClientRect(),x=h.width>0?h.width*.9:320,v=h.height>0?h.height*.85:400,y=Math.min((ei=u.panel_width)!=null?ei:320,x),f=Math.min((ti=u.panel_height)!=null?ti:400,v),m=(ni=u.panel_padding)!=null?ni:32,E=(ii=u.panel_radius)!=null?ii:24,S=b.background_color||u.panel_bg_color||"#1a0a0a",A=b.background_alpha!==void 0&&b.background_alpha!==null?b.background_alpha:(ai=u.panel_bg_alpha)!=null?ai:.98,M=b.border_color||u.panel_border_color||"#ffffff",R=(ri=u.panel_border_width)!=null?ri:2,_=(si=u.panel_border_alpha)!=null?si:.3,L=document.createElement("div");L.style.cssText=`
|
|
269
269
|
position: absolute;
|
|
270
270
|
width: ${y}px;
|
|
271
271
|
height: ${f}px;
|
|
@@ -284,67 +284,67 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
284
284
|
z-index: 1000;
|
|
285
285
|
box-sizing: border-box;
|
|
286
286
|
padding: ${m}px;
|
|
287
|
-
`,i.appendChild(L);let j=Me(L);j.element=L;let O=((oi=
|
|
287
|
+
`,i.appendChild(L);let j=Me(L);j.element=L;let O=((oi=r==null?void 0:r.gameplay)==null?void 0:oi.tuning)||{},be=(r==null?void 0:r.transform)||{},q=(li=O.logo_size)!=null?li:56,Y=(ci=be.scale)!=null?ci:1,ke=(pi=(di=be.offset)==null?void 0:di.y)!=null?pi:-130,lt=(ui=O.logo_alpha)!=null?ui:1,Lr=new Ue.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),K=new Ue.Sprite(Lr);K.position.set(0,ke,0),K.material.opacity=0;let ct=0,dt=0;if(n){let $=n.image;ct=($==null?void 0:$.width)||100,dt=($==null?void 0:$.height)||100}if(ct>0&&dt>0){let $=ct/dt,Yt,Kt;$>1?(Yt=q,Kt=q/$):(Kt=q,Yt=q*$);let gs=Yt/ct*Y,hs=Kt/dt*Y;K.scale.set(gs,hs,1)}else{let $=q/100*Y;K.scale.set($,$,1)}K.targetAlpha=lt,K.baseScaleX=K.scale.x,K.baseScaleY=K.scale.y;let H=s==null?void 0:s.ui,ee=((gi=s==null?void 0:s.gameplay)==null?void 0:gi.tuning)||{},Mr=(H==null?void 0:H.text)||"MISSION ACCOMPLISHED",Hn=(H==null?void 0:H.font)||"brand.heading",Ft=(H==null?void 0:H.fontSize)||24,kr=(hi=H==null?void 0:H.letterSpacing)!=null?hi:1,pt=(fi=s==null?void 0:s.render)==null?void 0:fi.tint,Pr=typeof pt=="string"?pt:pt?`#${pt.toString(16).padStart(6,"0")}`:"#00FF88",Rr=y-m*2-30,Or=ee.font_weight_override?ee.font_weight_override:Q(Hn),ye=document.createElement("div");ye.textContent=Mr,ye.style.cssText=`
|
|
288
288
|
font-family: ${Z(Hn)};
|
|
289
|
-
font-size: ${
|
|
290
|
-
font-weight: ${
|
|
291
|
-
color: ${
|
|
289
|
+
font-size: ${Ft}px;
|
|
290
|
+
font-weight: ${Or};
|
|
291
|
+
color: ${Pr};
|
|
292
292
|
text-align: center;
|
|
293
|
-
letter-spacing: ${
|
|
293
|
+
letter-spacing: ${kr}px;
|
|
294
294
|
-webkit-text-stroke: ${(mi=ee.stroke_width)!=null?mi:2}px ${ee.stroke_color||"#000000"};
|
|
295
295
|
text-shadow: ${(bi=ee.shadow_distance)!=null?bi:4}px ${(yi=ee.shadow_distance)!=null?yi:4}px ${(vi=ee.shadow_blur)!=null?vi:8}px rgba(0,0,0,${(xi=ee.shadow_alpha)!=null?xi:.9});
|
|
296
296
|
opacity: 0;
|
|
297
297
|
position: absolute;
|
|
298
298
|
transform: translate(-50%, -50%);
|
|
299
299
|
white-space: nowrap;
|
|
300
|
-
max-width: ${
|
|
301
|
-
`;let zn=m+30,
|
|
300
|
+
max-width: ${Rr}px;
|
|
301
|
+
`;let zn=m+30,Ir=((wi=u.title_offset_y)!=null?wi:zn+Ft/2)+((Ei=ee.animation_start_y_offset)!=null?Ei:-20);ye.style.top=`${Ir}px`,ye.style.left="50%";let Fn=Me(ye);Fn.element=ye,L.appendChild(ye);let z=o==null?void 0:o.ui,Nn=((Si=o==null?void 0:o.gameplay)==null?void 0:Si.tuning)||{},jr=(z==null?void 0:z.text)||"RESCUE COMPLETE",Bn=(z==null?void 0:z.font)||"brand.body",Nt=(z==null?void 0:z.fontSize)||11,Dr=(Ai=z==null?void 0:z.letterSpacing)!=null?Ai:.5,ut=(Ci=o==null?void 0:o.render)==null?void 0:Ci.tint,$r=typeof ut=="string"?ut:ut?`#${ut.toString(16).padStart(6,"0")}`:"#B0B0B0",ve=document.createElement("div");ve.textContent=jr,ve.style.cssText=`
|
|
302
302
|
font-family: ${Z(Bn)};
|
|
303
|
-
font-size: ${
|
|
303
|
+
font-size: ${Nt}px;
|
|
304
304
|
font-weight: ${Q(Bn)};
|
|
305
|
-
color: ${$
|
|
305
|
+
color: ${$r};
|
|
306
306
|
text-align: center;
|
|
307
|
-
letter-spacing: ${
|
|
307
|
+
letter-spacing: ${Dr}px;
|
|
308
308
|
opacity: 0;
|
|
309
309
|
position: absolute;
|
|
310
310
|
transform: translate(-50%, -50%);
|
|
311
311
|
white-space: nowrap;
|
|
312
|
-
`;let Gn=zn+
|
|
312
|
+
`;let Gn=zn+Ft+15,Hr=((Ti=u.subtitle_offset_y)!=null?Ti:Gn+Nt/2)+((_i=Nn.animation_start_y_offset)!=null?_i:-10);ve.style.top=`${Hr}px`,ve.style.left="50%";let Bt=Me(ve);Bt.element=ve,Bt.animationStartYOffset=(Li=Nn.animation_start_y_offset)!=null?Li:-10,L.appendChild(ve);let te=l==null?void 0:l.ui,Un=((Mi=l==null?void 0:l.gameplay)==null?void 0:Mi.tuning)||{},zr=(te==null?void 0:te.text)||((ki=g.ui)==null?void 0:ki.cta_hint)||"Continue the adventure!",qn=(te==null?void 0:te.font)||"brand.body",Wn=(te==null?void 0:te.fontSize)||16,gt=(Pi=l==null?void 0:l.render)==null?void 0:Pi.tint,Fr=typeof gt=="string"?gt:gt?`#${gt.toString(16).padStart(6,"0")}`:"#FFFFFF",Nr=(Ri=Un.max_width)!=null?Ri:y-m*2,Br=(Oi=Un.line_height)!=null?Oi:1.4,xe=document.createElement("div");xe.textContent=zr,xe.style.cssText=`
|
|
313
313
|
font-family: ${Z(qn)};
|
|
314
314
|
font-size: ${Wn}px;
|
|
315
315
|
font-weight: ${Q(qn)};
|
|
316
|
-
color: ${
|
|
316
|
+
color: ${Fr};
|
|
317
317
|
text-align: center;
|
|
318
318
|
opacity: 0;
|
|
319
319
|
position: absolute;
|
|
320
320
|
transform: translate(-50%, -50%);
|
|
321
|
-
max-width: ${
|
|
322
|
-
line-height: ${
|
|
321
|
+
max-width: ${Nr}px;
|
|
322
|
+
line-height: ${Br};
|
|
323
323
|
word-wrap: break-word;
|
|
324
|
-
`;let
|
|
325
|
-
width: ${
|
|
324
|
+
`;let Gr=Gn+Nt+30,Ur=(Ii=u.footer_offset_y)!=null?Ii:Gr+Wn/2;xe.style.top=`${Ur}px`,xe.style.left="50%";let Gt=Me(xe);Gt.element=xe;let qr=((ji=l==null?void 0:l.render)==null?void 0:ji.alpha)!==void 0&&((Di=l==null?void 0:l.render)==null?void 0:Di.alpha)!==null?l.render.alpha:1;Gt.targetAlpha=qr,L.appendChild(xe);let ne=(($i=d==null?void 0:d.gameplay)==null?void 0:$i.tuning)||{},F=d==null?void 0:d.ui,Wr=(Hi=ne.button_width)!=null?Hi:260,Vn=(zi=ne.button_height)!=null?zi:56,Vr=(Fi=ne.button_radius)!=null?Fi:16,Yr=ne.button_bg_color||((Ni=g.theme)==null?void 0:Ni.cta_background)||"#ffb43b",Kr=(Bi=ne.button_bg_alpha)!=null?Bi:1,Xr=ne.button_border_color||"#ffffff",Jr=(Gi=ne.button_border_width)!=null?Gi:2,Qo=(Ui=ne.button_border_alpha)!=null?Ui:.2,Ut=(qi=u.cta_offset_y)!=null?qi:f*.7,I=document.createElement("button");I.style.cssText=`
|
|
325
|
+
width: ${Wr}px;
|
|
326
326
|
height: ${Vn}px;
|
|
327
|
-
background: ${
|
|
328
|
-
opacity: ${
|
|
329
|
-
border: ${
|
|
330
|
-
border-radius: ${
|
|
327
|
+
background: ${Yr};
|
|
328
|
+
opacity: ${Kr};
|
|
329
|
+
border: ${Jr}px solid ${Xr};
|
|
330
|
+
border-radius: ${Vr}px;
|
|
331
331
|
cursor: pointer;
|
|
332
332
|
opacity: 0;
|
|
333
333
|
position: absolute;
|
|
334
334
|
transform: translate(-50%, -50%);
|
|
335
335
|
box-shadow: inset 0 0 1px rgba(0,0,0,0.15);
|
|
336
|
-
`,I.style.top=`${Ut}px`,I.style.left="50%";let qt=Me(I);qt.element=I,qt.addEventListener=I.addEventListener.bind(I),L.appendChild(I);let
|
|
336
|
+
`,I.style.top=`${Ut}px`,I.style.left="50%";let qt=Me(I);qt.element=I,qt.addEventListener=I.addEventListener.bind(I),L.appendChild(I);let Zr=(F==null?void 0:F.text)||((Wi=g.ui)==null?void 0:Wi.cta_label_end)||"DOWNLOAD",Yn=(F==null?void 0:F.font)||"brand.heading",Qr=(F==null?void 0:F.fontSize)||20,es=ne.button_text_color||((Vi=g.theme)==null?void 0:Vi.cta_text)||"#1a0a0a";I.textContent=Zr,I.style.fontFamily=Z(Yn),I.style.fontSize=`${Qr}px`,I.style.fontWeight=String(Q(Yn)),I.style.color=es,I.style.letterSpacing=`${(Yi=F==null?void 0:F.letterSpacing)!=null?Yi:1}px`;let Kn=Me(I);Kn.element=I;let N=p==null?void 0:p.ui,Xn=((Ki=p==null?void 0:p.gameplay)==null?void 0:Ki.tuning)||{},ts=(N==null?void 0:N.text)||"Play the full game",Jn=(N==null?void 0:N.font)||"brand.body",ns=(N==null?void 0:N.fontSize)||11,is=(Xi=N==null?void 0:N.letterSpacing)!=null?Xi:0,ht=(Ji=p==null?void 0:p.render)==null?void 0:Ji.tint,as=typeof ht=="string"?ht:ht?`#${ht.toString(16).padStart(6,"0")}`:"#CCCCCC",we=document.createElement("div");we.textContent=ts,we.style.cssText=`
|
|
337
337
|
font-family: ${Z(Jn)};
|
|
338
|
-
font-size: ${
|
|
338
|
+
font-size: ${ns}px;
|
|
339
339
|
font-weight: ${Q(Jn)};
|
|
340
|
-
color: ${
|
|
340
|
+
color: ${as};
|
|
341
341
|
text-align: center;
|
|
342
|
-
letter-spacing: ${
|
|
342
|
+
letter-spacing: ${is}px;
|
|
343
343
|
opacity: 0;
|
|
344
344
|
position: absolute;
|
|
345
345
|
transform: translate(-50%, -50%);
|
|
346
346
|
white-space: nowrap;
|
|
347
|
-
`;let
|
|
347
|
+
`;let rs=Ut+Vn/2+20,ss=f-m-10,os=Math.min(rs+((Zi=Xn.animation_start_y_offset)!=null?Zi:5),ss);we.style.top=`${os}px`,we.style.left="50%";let Wt=Me(we);Wt.element=we,Wt.animationStartYOffset=(Qi=Xn.animation_start_y_offset)!=null?Qi:5,L.appendChild(we);let Vt=((ea=c==null?void 0:c.gameplay)==null?void 0:ea.tuning)||{},ls=(ta=Vt.hand_offset_x)!=null?ta:50,cs=(na=Vt.hand_offset_y)!=null?na:50,ds=(aa=(ia=c==null?void 0:c.transform)==null?void 0:ia.scale)!=null?aa:.1875,ps=(ra=Vt.hand_scale_multiplier)!=null?ra:2.5,us=new Ue.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),We=new Ue.Sprite(us),Zn=ds*ps*100;return We.scale.set(Zn,Zn,1),We.position.set(ls,Ut+cs,0),We.material.opacity=0,We.visible=!1,{panel:j,logo:K,title:Fn,subtitle:Bt,footer:Gt,ctaButton:qt,ctaText:Kn,ctaHint:Wt,hand:We}}function vr(t,e,n){var S,A,M,R,_,L,j,O;let i=e.objects.get("ui_endgame_1"),a=((S=i==null?void 0:i.gameplay)==null?void 0:S.tuning)||{},r=(A=a.animation_duration_ms)!=null?A:800,s=(M=a.fade_in_duration_ms)!=null?M:600,o=(R=a.scale_animation_intensity)!=null?R:.1,l=(_=a.logo_animation_delay_ms)!=null?_:100,d=(L=a.title_animation_delay_ms)!=null?L:200,p=(j=a.footer_animation_delay_ms)!=null?j:300,c=(O=a.cta_animation_delay_ms)!=null?O:400,{panel:g,logo:u,title:b,subtitle:h,footer:x,ctaButton:v,ctaText:y,ctaHint:f}=t;g.visible=!0,g.element.style.visibility="visible";let m=Date.now(),E=()=>{let be=Date.now()-m,q=Math.min(be/s,1),Y=1-Math.pow(1-q,3);g.alpha=Y,g.element.style.opacity=Y.toString();let ke=1+o*(1-Y);g.element.style.transform=`translate(-50%, -50%) scale(${ke})`,q<1?requestAnimationFrame(E):(setTimeout(()=>Uo(u,r,e),l),setTimeout(()=>{qo(b,r),setTimeout(()=>Wo(h,r),50)},d),setTimeout(()=>Vo(x,r),p),setTimeout(()=>{Yo(v,y,r),setTimeout(()=>Ko(f,r),50),n&&n()},c))};E()}function Uo(t,e,n){var g,u,b,h,x;let i=n==null?void 0:n.objects.get("ui_endgame_logo_1"),r=(u=(((g=i==null?void 0:i.gameplay)==null?void 0:g.tuning)||{}).animation_start_scale)!=null?u:1.2,s=Date.now(),o=t.material.opacity,l=(b=t.targetAlpha)!=null?b:1,d=(h=t.baseScaleX)!=null?h:t.scale.x,p=(x=t.baseScaleY)!=null?x:t.scale.y,c=()=>{let v=Date.now()-s,y=Math.min(v/e,1),f=1-Math.pow(1-y,2);t.material.opacity=o+(l-o)*f;let m=r+(1-r)*f;t.scale.set(d*m,p*m,1),y<1&&requestAnimationFrame(c)};c()}function qo(t,e){let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),r=()=>{let s=Date.now()-n,o=Math.min(s/e,1),l=1-Math.pow(1-o,2);t.element.style.opacity=(i+(1-i)*l).toString(),t.element.style.top=`${a-20*(1-l)}px`,o<1&&requestAnimationFrame(r)};r()}function Wo(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),r=a-((o=t.animationStartYOffset)!=null?o:-10),s=()=>{let l=Date.now()-n,d=Math.min(l/e,1),p=1-Math.pow(1-d,2);t.element.style.opacity=(i+(1-i)*p).toString(),t.element.style.top=`${a+(r-a)*p}px`,d<1&&requestAnimationFrame(s)};s()}function Vo(t,e){var s;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=(s=t.targetAlpha)!=null?s:1,r=()=>{let o=Date.now()-n,l=Math.min(o/e,1),d=1-Math.pow(1-l,2);t.element.style.opacity=(i+(a-i)*d).toString(),l<1&&requestAnimationFrame(r)};r()}function Yo(t,e,n){let i=Date.now(),a=parseFloat(t.element.style.opacity||"0"),r=()=>{let s=Date.now()-i,o=Math.min(s/n,1),l=1-Math.pow(1-o,2);t.element.style.opacity=(a+(1-a)*l).toString(),e.element.style.opacity=(a+(1-a)*l).toString(),t.element.style.transform=`translate(-50%, -50%) scale(${1+.1*(1-l)})`,o<1&&requestAnimationFrame(r)};r()}function Ko(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),r=a-((o=t.animationStartYOffset)!=null?o:5),s=()=>{let l=Date.now()-n,d=Math.min(l/e,1),p=1-Math.pow(1-d,2);t.element.style.opacity=(i+(1-i)*p).toString(),t.element.style.top=`${a+(r-a)*p}px`,d<1&&requestAnimationFrame(s)};s()}function xr(t,e,n,i){var p,c,g,u;let a=n.objects.get("ui_endgame_hand_1"),r=((p=a==null?void 0:a.gameplay)==null?void 0:p.tuning)||{},s=(c=r.click_animation_duration_ms)!=null?c:600,o=(g=r.click_delay_ms)!=null?g:2e3,l=(u=r.click_repeat_delay_ms)!=null?u:3e3,d=()=>{var A,M;t.visible=!0,t.material.opacity=1;let b=t.position.x,h=t.position.y,x=(A=r.hand_offset_x)!=null?A:50,v=(M=r.hand_offset_y)!=null?M:50,y=e.element.getBoundingClientRect(),f=x,m=v,E=Date.now(),S=()=>{var Y,ke,lt;let R=Date.now()-E,_=Math.min(R/s,1),L=_<.5?2*_*_:1-Math.pow(-2*_+2,2)/2;t.position.set(b+(f-b)*L,h+(m-h)*L,0);let j=(ke=(Y=a==null?void 0:a.transform)==null?void 0:Y.scale)!=null?ke:.1875,O=(lt=r.hand_scale_multiplier)!=null?lt:2.5,be=j*O*100,q=be+be*.2*Math.sin(_*Math.PI);t.scale.set(q,q,1),_<1?requestAnimationFrame(S):(e.element.style.transform="translate(-50%, -50%) scale(0.95)",setTimeout(()=>{e.element.style.transform="translate(-50%, -50%) scale(1)",i()},100),setTimeout(()=>{t.material.opacity=0,setTimeout(()=>{t.position.set(b,h,0),d()},l)},500))};S()};setTimeout(d,o)}var zt=ae(require("three"),1);function wr(t,e,n){var u,b,h,x,v,y,f;let i=e.objects.get("hand_tutorial_1"),a=((u=i==null?void 0:i.gameplay)==null?void 0:u.tuning)||{},r=(i==null?void 0:i.render)||{},s=(i==null?void 0:i.transform)||{},o=new zt.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),l=new zt.Sprite(o),d=s.position||{},p=(b=d==null?void 0:d.z)!=null?b:0;l.position.set(n.x+((h=d==null?void 0:d.x)!=null?h:0),n.y+((x=d==null?void 0:d.y)!=null?x:0),p),l.material.opacity=r.alpha!==void 0&&r.alpha!==null?r.alpha:0,l.visible=r.visible!==void 0&&r.visible!==null?r.visible:!1;let c=(v=a.hand_scale_multiplier)!=null?v:2.5,g=(y=s.scale)!=null?y:.1875;return l.scale.set(g*c*100,g*c*100,1),l.renderOrder=(f=r.z_index)!=null?f:99999,l}function Er(t){var b,h,x,v,y,f,m,E,S;let e=t.objects.get("ui_tutorial_1"),n=e==null?void 0:e.ui,i=(e==null?void 0:e.render)||{},a=((b=t.engine.runtime)==null?void 0:b.ui_styles)||{},r=((h=t.engine.runtime)==null?void 0:h.ui)||{},s=(n==null?void 0:n.text)||r.tutorial_label||r.label_text||"CLEAN!",o=(n==null?void 0:n.font)||"brand.warning",l=(n==null?void 0:n.fontSize)||a.label_font_size||52,d=(v=n==null?void 0:n.letterSpacing)!=null?v:(x=a.label_letter_spacing)!=null?x:-1,p=(n==null?void 0:n.align)||"center",c=i.tint,g=typeof c=="string"?c:c?`#${c.toString(16).padStart(6,"0")}`:a.label_fill||"#FFF1C1",u=document.createElement("div");return u.textContent=s,u.style.cssText=`
|
|
348
348
|
font-family: ${Z(o)};
|
|
349
349
|
font-size: ${l}px;
|
|
350
350
|
font-weight: ${Q(o)};
|
|
@@ -359,4 +359,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
|
|
|
359
359
|
position: absolute;
|
|
360
360
|
transform: translate(-50%, -50%);
|
|
361
361
|
white-space: nowrap;
|
|
362
|
-
`,u}function
|
|
362
|
+
`,u}function Sr(t,e,n,i,a){var l,d,p,c,g,u,b;let r=a.objects.get("hand_tutorial_1"),s=((l=r==null?void 0:r.gameplay)==null?void 0:l.tuning)||{},o=(r==null?void 0:r.transform)||{};if(!i){let h=(d=s.animation_duration)!=null?d:1.5,x=n%h/h,v=x<.5?2*x*x:-1+(4-2*x)*x,y=(p=s.x_offset)!=null?p:0,f=(c=s.y_offset)!=null?c:0,m=(g=s.animation_range)!=null?g:40,E=m*.7,S=m,A=e.x+y+E,M=e.y+f+S,R=A+E,_=M+S;t.position.set(A+(R-A)*v,M+(_-M)*v,0);let L=(u=o.scale)!=null?u:.1875,j=(b=s.hand_scale_multiplier)!=null?b:2.5,O=L*j*100;t.scale.set(O,O,1)}}var qe=ae(require("three"),1),Ar=new qe.TextureLoader,jn=null,Dn=null;async function Cr(){if(jn)return jn;if(!Dn){let n=(()=>{if(typeof window!="undefined")try{return new URL("inline-assets.js",window.location.href).href}catch{return"./inline-assets.js"}return"./inline-assets.js"})();Dn=fetch(n).then(i=>{if(!i.ok)throw new Error(`HTTP ${i.status}`);return i.text()}).then(i=>{let a=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)return new Function("return "+a[1])();throw new Error("INLINE_ASSETS export not found")}).then(i=>i?i.INLINE_ASSETS?i.INLINE_ASSETS:(console.warn("[assets] Module does not have INLINE_ASSETS export. Module keys:",Object.keys(i)),{}):(console.warn("[assets] Module import returned undefined"),{})).catch(i=>(console.warn("[assets] Failed to load inline-assets.js:",i),{}))}let t=await Dn;return jn=t||{},t||{}}async function $n(t,e,n=16777215,i=!1){try{let r=(await Cr())[t];return await Ar.loadAsync(r||t)}catch{console.warn(`Asset missing: ${t}. Using placeholder.`);let r=document.createElement("canvas");r.width=64,r.height=64;let s=r.getContext("2d");return s&&(s.fillStyle=`#${n.toString(16).padStart(6,"0")}`,i?s.fillRect(0,0,30,60):(s.beginPath(),s.arc(32,32,30,0,Math.PI*2),s.fill(),s.fillRect(27,32,10,40))),new qe.CanvasTexture(r)}}async function Tr(t,e,n){var h,x;let a=(await Cr())[t]||t,r;try{r=await Ar.loadAsync(a),console.log("[character] loaded sheet",{path:t,sourceUsed:a})}catch(v){let m=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");r=await $n(t,e,parseInt(m,16),!0),console.warn("[character] fallback loadAsset used",{path:t,err:v})}if(!r)return[];let s=n.gameplay.character_sheet||{},o=(h=s.cols)!=null?h:3,l=(x=s.rows)!=null?x:2,d=r.image,p=(d==null?void 0:d.width)||0,c=(d==null?void 0:d.height)||0,g=p/o,u=c/l;if(!Number.isFinite(g)||!Number.isFinite(u)||g<=0||u<=0)return[r];let b=[];for(let v=0;v<l;v++)for(let y=0;y<o;y++){let f=document.createElement("canvas");f.width=g,f.height=u;let m=f.getContext("2d");m&&d&&m.drawImage(d,y*g,v*u,g,u,0,0,g,u),b.push(new qe.CanvasTexture(f))}return b.length>2&&b.push(...b.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:b.length}),b}function _r(t,e){var c,g,u,b;let n=e.gameplay.brush||{},i=e.theme.brush_color||"#ffffff",a=(c=n.radius)!=null?c:20,r=(g=n.inner_radius)!=null?g:15,s=(u=n.alpha)!=null?u:.8,o=(b=n.inner_alpha)!=null?b:.3,l=n.inner_color||"#ffffff",d=document.createElement("canvas");d.width=a*2,d.height=a*2;let p=d.getContext("2d");return p&&(p.clearRect(0,0,d.width,d.height),p.beginPath(),p.arc(a,a,a,0,Math.PI*2),p.fillStyle=i,p.globalAlpha=s,p.fill(),p.beginPath(),p.arc(a,a,r,0,Math.PI*2),p.fillStyle=l,p.globalAlpha=o,p.fill()),new qe.CanvasTexture(d)}0&&(module.exports={AspectClass,GameObject,GameObjectManager,Renderer,ResponsiveUISystem,Transform,animateHandClick,animatePanelEntrance,createBrushTexture,createEndGamePanel,createHandTutorial,createThreeBase,createTutorialLabel,getAspectClass,getRegisteredFontIds,loadAsset,loadCharacterFrames,registerFont,resolveFont,resolveFontWeight,updateHandAnimation});
|