handler-playable-sdk 1.0.70 → 1.0.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/{chunk-GO4SOCXF.js → chunk-CGDNQEKM.js} +149 -149
  2. package/dist/cli/brand-dna.mjs +1 -1
  3. package/dist/cli/canva-import.mjs +1 -1
  4. package/dist/cli/cleanup-assets.mjs +1 -1
  5. package/dist/cli/fix-scales.mjs +1 -1
  6. package/dist/cli/index.js +1 -1
  7. package/dist/cli/screen-helper.mjs +1 -1
  8. package/dist/cli/setup-library.mjs +1 -1
  9. package/dist/cli/student-helper/add-logic.mjs +1 -1
  10. package/dist/cli/student-helper/add-object.mjs +1 -1
  11. package/dist/cli/student-helper/arg-parsing.mjs +1 -1
  12. package/dist/cli/student-helper/asset-registry.mjs +1 -1
  13. package/dist/cli/student-helper/bullet-system.mjs +1 -1
  14. package/dist/cli/student-helper/collectable-system.mjs +1 -1
  15. package/dist/cli/student-helper/constants.mjs +1 -1
  16. package/dist/cli/student-helper/drag-snap-couples.mjs +1 -1
  17. package/dist/cli/student-helper/endgame-screen.mjs +1 -1
  18. package/dist/cli/student-helper/fs-io.mjs +1 -1
  19. package/dist/cli/student-helper/logic-defaults.mjs +1 -1
  20. package/dist/cli/student-helper/print-help.mjs +1 -1
  21. package/dist/cli/student-helper/prompts.mjs +1 -1
  22. package/dist/cli/student-helper/scratch-card.mjs +1 -1
  23. package/dist/cli/student-helper/screen-utils.mjs +1 -1
  24. package/dist/cli/student-helper/snippets.mjs +1 -1
  25. package/dist/cli/student-helper/start-screen.mjs +1 -1
  26. package/dist/cli/student-helper/swerve-collect.mjs +1 -1
  27. package/dist/cli/student-helper/tap-destroy.mjs +1 -1
  28. package/dist/cli/student-helper/template-packs.mjs +1 -1
  29. package/dist/cli/student-helper.mjs +1 -1
  30. package/dist/cli/sync-screens.mjs +1 -1
  31. package/dist/cli/validate-assets.mjs +1 -1
  32. package/dist/cli/validate.mjs +1 -1
  33. package/dist/index.cjs +65 -65
  34. package/dist/index.js +1 -1
  35. package/dist/pixi/index.cjs +9 -9
  36. package/dist/pixi/index.js +1 -1
  37. package/dist/three/index.cjs +28 -28
  38. package/dist/three/index.js +1 -1
  39. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- "use strict";var yr=Object.create;var yt=Object.defineProperty;var br=Object.getOwnPropertyDescriptor;var vr=Object.getOwnPropertyNames;var wr=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty;var se=(t,e)=>()=>(t&&(e=t(t=0)),e);var ca=(t,e)=>{for(var n in e)yt(t,n,{get:e[n],enumerable:!0})},da=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of vr(e))!xr.call(t,a)&&a!==n&&yt(t,a,{get:()=>e[a],enumerable:!(i=br(e,a))||i.enumerable});return t};var ge=(t,e,n)=>(n=t!=null?yr(wr(t)):{},da(e||!t||!t.__esModule?yt(n,"default",{value:t,enumerable:!0}):n,t)),Sr=t=>da(yt({},"__esModule",{value:!0}),t);var X,xt=se(()=>{"use strict";X=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()}};X.store=new Map});function _r(){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 Ir(){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 jr(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${A}`),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(!(A==="publish"&&J!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),re;if(!sn){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),sn=(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 sn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(re)),re}function rn(t){return t===null||typeof t!="object"||(Object.freeze(t),Object.values(t).forEach(e=>rn(e))),t}function Or(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 on(t,e){Ua.set(t,e)}var oe,Ba,Ga,Ee,A,J,me,re,sn,Ua,Ce,St=se(()=>{"use strict";oe=require("pixi.js");xt();Ba=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ga=_r(),Ee=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,A=Ga?"publish":Ba,J=Ee==null?void 0:Ee.assetsInlined;Ee!=null&&Ee.buildMode&&(A=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${A}`));me=Ir();me!=null&&me.buildMode&&(A=me.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${A}`));(me==null?void 0:me.assetsInlined)!==void 0&&(J=me.assetsInlined);Mr().then(t=>{t!=null&&t.buildMode&&t.buildMode!==A&&(A=t.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${A}`)),(t==null?void 0:t.assetsInlined)!==void 0&&(J=t.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${Ba}, Runtime: ${Ga?"publish":"dev"}, Effective: ${A}`);re={},sn=null;Ua=new Map;Ce=class{static async load(e,n,i,a){let s=`${e}:${n.path}`,r=X.get(s);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${n.type}, Effective mode: ${A}`),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 jr(),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"),A==="publish"&&J!==!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=Ua.get(n.type);if(p)try{let c=await p(n.path,l,e,i);return X.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=rn(c);break;default:throw new Error(`Unknown asset type: ${n.type}`)}return X.set(s,c),c}catch(c){return this.handleFailure(e,n.type,c)}}static async loadImage(e,n){let i=A==="publish",a=i&&J!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${A}, 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=A==="publish",a=i&&J!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${A}, 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(A==="dev"){let s=n==="image"?Or():rn({__placeholder:!0,type:n});return X.set(e+":"+((i==null?void 0:i.path)||"missing"),s),s}throw i}};on("image",async(t,e)=>{let n=A==="publish",i=n&&J!==!1,a=A==="brand",s=n&&J===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${A}, 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)});on("json",async(t,e)=>{let n=A==="publish",i=n&&J!==!1,a=A==="brand",s=n&&J===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${A}, 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 cn,Nr,Et,Ze=se(()=>{"use strict";St();cn=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 Ce.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())}},Nr=new cn,Et=new Proxy(Nr,{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 co,Z=se(()=>{"use strict";co="handler_preview_override_mode";if(typeof window!="undefined"){let t=window.localStorage.getItem(co);window.__enableConfigOverrides=t===null?!0:t==="true"}});var Va,Te,Lc,mn=se(()=>{"use strict";Z();Va=null,Te="dev";if(typeof window!="undefined"){let t=window.__BUILD_SETTINGS__;if(t!=null&&t.buildMode)Va=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);Va=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);Lc=Te==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});var fn=se(()=>{"use strict"});var Ya=se(()=>{"use strict";fn();mn()});var yn=se(()=>{"use strict";mn();fn();Ya()});var is={};ca(is,{AssetEditorModal:()=>Cn});var Cn,An=se(()=>{"use strict";Cn=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 yr=Object.create;var yt=Object.defineProperty;var br=Object.getOwnPropertyDescriptor;var vr=Object.getOwnPropertyNames;var wr=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty;var se=(t,e)=>()=>(t&&(e=t(t=0)),e);var da=(t,e)=>{for(var n in e)yt(t,n,{get:e[n],enumerable:!0})},pa=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of vr(e))!xr.call(t,a)&&a!==n&&yt(t,a,{get:()=>e[a],enumerable:!(i=br(e,a))||i.enumerable});return t};var ge=(t,e,n)=>(n=t!=null?yr(wr(t)):{},pa(e||!t||!t.__esModule?yt(n,"default",{value:t,enumerable:!0}):n,t)),Sr=t=>pa(yt({},"__esModule",{value:!0}),t);var X,xt=se(()=>{"use strict";X=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()}};X.store=new Map});function Mr(){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 _r(){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 Ir(){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 jr(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${A}`),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(!(A==="publish"&&J!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),re;if(!sn){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),sn=(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 sn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(re)),re}function rn(t){return t===null||typeof t!="object"||(Object.freeze(t),Object.values(t).forEach(e=>rn(e))),t}function Or(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 on(t,e){qa.set(t,e)}var oe,Ga,Ua,Ee,A,J,me,re,sn,qa,Ce,St=se(()=>{"use strict";oe=require("pixi.js");xt();Ga=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ua=Mr(),Ee=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,A=Ua?"publish":Ga,J=Ee==null?void 0:Ee.assetsInlined;Ee!=null&&Ee.buildMode&&(A=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${A}`));me=Ir();me!=null&&me.buildMode&&(A=me.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${A}`));(me==null?void 0:me.assetsInlined)!==void 0&&(J=me.assetsInlined);_r().then(t=>{t!=null&&t.buildMode&&t.buildMode!==A&&(A=t.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${A}`)),(t==null?void 0:t.assetsInlined)!==void 0&&(J=t.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${Ga}, Runtime: ${Ua?"publish":"dev"}, Effective: ${A}`);re={},sn=null;qa=new Map;Ce=class{static async load(e,n,i,a){let s=`${e}:${n.path}`,r=X.get(s);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${n.type}, Effective mode: ${A}`),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 jr(),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"),A==="publish"&&J!==!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=qa.get(n.type);if(p)try{let c=await p(n.path,l,e,i);return X.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=rn(c);break;default:throw new Error(`Unknown asset type: ${n.type}`)}return X.set(s,c),c}catch(c){return this.handleFailure(e,n.type,c)}}static async loadImage(e,n){let i=A==="publish",a=i&&J!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${A}, 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=A==="publish",a=i&&J!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${A}, 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(A==="dev"){let s=n==="image"?Or():rn({__placeholder:!0,type:n});return X.set(e+":"+((i==null?void 0:i.path)||"missing"),s),s}throw i}};on("image",async(t,e)=>{let n=A==="publish",i=n&&J!==!1,a=A==="brand",s=n&&J===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${A}, 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)});on("json",async(t,e)=>{let n=A==="publish",i=n&&J!==!1,a=A==="brand",s=n&&J===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${A}, 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 cn,Nr,Et,Ze=se(()=>{"use strict";St();cn=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 Ce.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())}},Nr=new cn,Et=new Proxy(Nr,{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 co,Z=se(()=>{"use strict";co="handler_preview_override_mode";if(typeof window!="undefined"){let t=window.localStorage.getItem(co);window.__enableConfigOverrides=t===null?!0:t==="true"}});var Wa,Te,Lc,mn=se(()=>{"use strict";Z();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);Lc=Te==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});var fn=se(()=>{"use strict"});var Ka=se(()=>{"use strict";fn();mn()});var yn=se(()=>{"use strict";mn();fn();Ka()});var is={};da(is,{AssetEditorModal:()=>An});var An,Tn=se(()=>{"use strict";An=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 el={};ca(el,{AspectClass:()=>$n,GameObject:()=>ct,GameObjectManager:()=>Dt,Renderer:()=>lt,ResponsiveUISystem:()=>qe,Transform:()=>ot,animateHandClick:()=>Ss,animatePanelEntrance:()=>xs,createBrushTexture:()=>Ps,createEndGamePanel:()=>ws,createHandTutorial:()=>Es,createThreeBase:()=>ys,createTutorialLabel:()=>Cs,getAspectClass:()=>Ht,getRegisteredFontIds:()=>vs,loadAsset:()=>Nn,loadCharacterFrames:()=>ks,registerFont:()=>bs,resolveFont:()=>ee,resolveFontWeight:()=>te,updateHandAnimation:()=>As});module.exports=Sr(el);var W=ge(require("three"),1);var he={};function bt(t,e,n=!1){he[t]||(he[t]=[]),he[t].push({fn:e,once:n})}function Zt(t,e){if(he[t]){if(!e){delete he[t];return}he[t]=he[t].filter(n=>n.fn!==e)}}function vt(t,...e){let n=he[t];if(n)for(let i of[...n])i.fn(...e),i.once&&Zt(t,i.fn)}function B(t,e){bt(t,e,!0)}var _=null,V=[],Ie=null;function ga(t){_=t,V=[],Ie!==null&&(clearTimeout(Ie),Ie=null)}function ha(){var t,e,n;return{endpoint:(_==null?void 0:_.endpoint)||"",transport:(_==null?void 0:_.transport)||"beacon",batchSize:(t=_==null?void 0:_.batchSize)!=null?t:10,flushIntervalMs:(e=_==null?void 0:_.flushIntervalMs)!=null?e:300,maxQueue:(n=_==null?void 0:_.maxQueue)!=null?n:200,debug:!!(_!=null&&_.debug)}}async function pa(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 Qt(t,e){let n=ha();if(e&&n.endpoint){if(V.push(t),V.length>n.maxQueue&&(V=V.slice(V.length-n.maxQueue)),V.length>=n.batchSize){ua();return}Ie===null&&(Ie=window.setTimeout(()=>{Ie=null,ua()},n.flushIntervalMs))}}async function ua(){let t=ha();if(!t.endpoint||V.length===0)return;let e=V.splice(0,t.batchSize);await pa(t.endpoint,{events:e},t.transport,t.debug),V.length>0&&await pa(t.endpoint,{events:V.splice(0,t.batchSize)},t.transport,t.debug)}function ma(t){return Math.max(0,Math.min(1,t))}function Er(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 Ke(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Cr(t,e){let n=t==null?void 0:t[e];return typeof n=="number"?n:0}function fa(t,e,n){try{t[e]=n}catch{}}function Ar(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 ya(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 ba(t,e){let n=Ar(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 va(){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=Ke();for(let u of Array.from(t)){if(u.killed||u.paused)continue;let y=p-u.startMs-u.delayMs;if(y<0)continue;let h=u.durationMs>0?y/u.durationMs:1,w=ma(h),v=u.repeat>=0?u.repeat+1:1,b=u.repeat>0?Math.min(Math.floor(h),v-1):0;if(u.repeat>0&&h>=1){let S=h-b;w=ma(S)}let m=u.ease(w);u.yoyo&&b%2===1&&(m=1-m);for(let S of u.props)fa(u.target,S.key,S.from+(S.to-S.from)*m);u.scaleFrom&&u.scaleTo&&ya(u.target,{x:u.scaleFrom.x+(u.scaleTo.x-u.scaleFrom.x)*m,y:u.scaleFrom.y+(u.scaleTo.y-u.scaleFrom.y)*m});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 S;let u=Math.max(0,(typeof c.duration=="number"?c.duration:.5)*1e3),y=Math.max(0,(typeof c.delay=="number"?c.delay:0)*1e3+((S=g==null?void 0:g.delayMsOverride)!=null?S:0)),h=Er(c.ease),w=typeof c.repeat=="number"?Math.max(0,c.repeat|0):0,v=c.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),m=[];for(let E of Object.keys(c)){if(b.has(E))continue;let C=c[E];typeof C=="number"&&m.push({key:E,from:Cr(p,E),to:C})}let f=ba(p,c);return{target:p,startMs:Ke(),delayMs:y,durationMs:u,ease:h,props:m,scaleFrom:f.from,scaleTo:f.to,repeat:w,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=Ke())},resume:()=>{var h;if(!g.paused)return;let u=(h=g.pauseAtMs)!=null?h:Ke(),y=Ke()-u;g.startMs+=y,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 y=c[u];u==="scale"||u==="scaleX"||u==="scaleY"||typeof y=="number"&&fa(p,u,y)}let g=ba(p,c);g.to&&ya(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,y=[],h=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let m=typeof b=="string"?b.trim():"";return m.startsWith("+=")?g+Math.max(0,Number(m.slice(2))*1e3||0):m?Math.max(0,Number(m)*1e3||0):g},w=b=>{c.push(b);let m=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);g=Math.max(g,b.atMs+m)},v={to(b,m,f){return w({kind:"to",target:b,vars:m,atMs:h(f)}),v},fromTo(b,m,f,S){return w({kind:"fromTo",target:b,vars:f,from:m,atMs:h(S)}),v},play(){var b,m;if(u)return v;u=!0,y=[];for(let f of c)f.kind==="fromTo"&&d.set(f.target,(b=f.from)!=null?b:{}),y.push(d.to(f.target,{...f.vars,delay:f.atMs/1e3+((m=f.vars.delay)!=null?m:0)}));return v},pause(){for(let b of y)b.pause();return v},kill(){for(let b of y)b.kill();y=[],u=!1}};return p.paused||v.play(),v}};return d}function wa(){if(typeof window=="undefined")return;let t=window;if(!t.gsap)try{t.gsap=va()}catch{}}var xa={name:"handler-playable-sdk",version:"1.0.70",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs dist/cli/student-helper/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var G=0,Lr=G++,Sa=G++,Ea=G++,Ca=G++,Aa=G++,Ta=G++,La=G++,ka=G++,Pa=G++,_a=G++,Ma=G++,Ia=G++,T=Lr;function ja(){return T===Sa}function Oa(){return T===Ea}function Ra(){return T===Ca}function za(){return T===Aa}function je(){return T===Ta}function Oe(){return T===La}function $a(){return T===ka}function Ha(){return T===Pa}function Da(){return T===_a}function en(){return T===Ma}function tn(){return T===Ia}function Na(){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=Sa;return}catch{}else if(t==="dapi")try{dapi.isReady(),T=Ea;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(T=Ca)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(T=Aa)}catch{}else if(e==="mintegral")window.gameReady&&(T=Ta);else if(e==="tapjoy")window.TJ_API&&(T=La);else if(e==="tiktok")window.openAppStore&&(T=ka);else if(e==="smadex")try{window.smxTracking&&(T=Pa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(T=_a)}catch{}else e==="vungle"?T=Ma:(t==="nucleo"||e==="nucleo")&&(T=Ia)}var wt=ge(require("lottie-web"),1),Fa=wt.default;typeof window!="undefined"&&(window.lottie=wt.default,window.__baseLottie=wt.default);var kr=require("pixi.js");var nn=require("pixi.js");var Pr=null;function an(t){Pr=t}St();xt();var Xe=require("pixi.js");St();var Rr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",ln=Rr;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&&(ln=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${ln}`))}}catch{}function zr(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 fe=class{static async create(e,n,i){var l,d,p,c,g,u,y;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${ln}`);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 Xe.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 Ce.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 Xe.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 Xe.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}`],w=!1;for(let v of h)try{let b=await fetch(v);if(b.ok){o=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"type:",(y=o==null?void 0:o.constructor)==null?void 0:y.name),w=!0;break}}catch{continue}w||(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=zr(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 Je=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 Dr=ge(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=Dr);Ze();var Ct=require("pixi.js");Ze();var dn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Je}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 fe.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 fe.create(e,n,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Fr=new dn,Br=new Proxy(Fr,{get(t,e){if(e in t&&typeof t[e]=="function")return t[e].bind(t);if(t.get(e))return t.get(e)}});Ze();var qr=require("pixi.js"),le={width:400,height:600,designWidth:400,scaleFactor:1},Tt={scale:1,position:1},un=[];function Vr(t,e,n,i,a,s,r){un.push({element:t,originalScale:s,positionHelper:e,heightPercent:a}),e(t,n,i,a,s,r,!1)}function Wr(){un.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 pn(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),Tt.scale=le.scaleFactor,Tt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Tt.scale.toFixed(3)}`),Wr()}var et={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 Yr(t,e,n){let i=et[t];i&&i[e]!==void 0&&(i[e]=n,console.log(`Updated ${t}.${e} = ${n}`))}function Kr(){return et}var Xr={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 At(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function ze(t,e={x:.5,y:.5}){var n;if(Array.isArray(t))return{x:At(t[0],e.x),y:At(t[1],e.y)};if(t&&typeof t=="object"){let i=t;return{x:At(i.x,e.x),y:At(i.y,e.y)}}if(typeof t=="string"){let i=t.trim().toLowerCase();return(n=Xr[i])!=null?n:e}return e}function gn(t,e,n,i={}){var u,y,h,w,v,b;let a=ze(n),s=(u=i.inset)!=null?u:{},r=(y=i.padding)!=null?y:{x:0,y:0},o=((h=s.left)!=null?h:0)+r.x,l=((w=s.right)!=null?w:0)+r.x,d=((v=s.top)!=null?v:0)+r.y,p=((b=s.bottom)!=null?b: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 hn(t,e,n,i={}){var h,w,v,b,m,f;let a=(h=i.inset)!=null?h:{},s=(w=i.padding)!=null?w:{x:0,y:0},r=((v=a.left)!=null?v:0)+s.x,o=((b=a.right)!=null?b:0)+s.x,l=((m=a.top)!=null?m:0)+s.y,d=((f=a.bottom)!=null?f:0)+s.y,p=Math.max(0,t-r-o),c=Math.max(0,e-l-d),g=ze(n,{x:.5,y:.5}),u=Math.min(Math.max(g.x,0),1),y=Math.min(Math.max(g.y,0),1);return{x:r+p*u,y:l+c*y}}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,pn(i,a))};window.addEventListener("resize",n),window.addEventListener("orientationchange",()=>{setTimeout(n,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",n),window.mraid.addEventListener("sizeChange",n)),pn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Yr,window.getDebugConfig=Kr,window.copyConfig=oo,window.applyConfig=Qe,window.applyConfigForRatio=lo,window.positionAtBottom=qa,window.positionAtTop=Qr,window.positionAtCenter=eo,window.positionAtLeft=to,window.positionAtRight=no,window.positionAtBottomLeft=io,window.positionAtBottomRight=ao,window.positionAtTopLeft=so,window.positionAtTopRight=ro,window.applyPositionContract=Zr,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 Lt(t,e,n=0){return t*e+n}function kt(t,e,n=0){return t*(1-e)+n}function Pt(t,e,n=0){return t*e+n}function _t(t,e,n=0){return t*(1-e)+n}function U(t,e=0){return t/2+e}function Jr(t,e){return t*e}function Zr(t,e,n,i){var r,o,l,d,p,c,g,u,y,h,w,v,b,m,f,S,E,C,P,I;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=Lt(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=kt(n,i.percent,(u=(g=i.offset)==null?void 0:g.y)!=null?u:0);break;case"left":a=Pt(e,i.percent,(h=(y=i.offset)==null?void 0:y.x)!=null?h:0),s=U(n,(v=(w=i.offset)==null?void 0:w.y)!=null?v:0);break;case"right":a=_t(e,i.percent,(m=(b=i.offset)==null?void 0:b.x)!=null?m:0),s=U(n,(S=(f=i.offset)==null?void 0:f.y)!=null?S:0);break;case"center":a=U(e,(C=(E=i.offset)==null?void 0:E.x)!=null?C:0),s=U(n,(I=(P=i.offset)==null?void 0:P.y)!=null?I: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=Jr(n,i),l=kt(n,i/2);ce(t,U(e),l);let d=s?a*le.scaleFactor:a;de(t,d),r&&!un.find(p=>p.element===t)&&Vr(t,qa,e,n,i,a,s)}function Qr(t,e,n,i=.1,a=1){ce(t,U(e),Lt(n,i)),de(t,a)}function eo(t,e,n,i=0,a=0,s=1){ce(t,U(e,i),U(n,a)),de(t,s)}function to(t,e,n,i=.1,a=1){ce(t,Pt(e,i),U(n)),de(t,a)}function no(t,e,n,i=.1,a=1){ce(t,_t(e,i),U(n)),de(t,a)}function io(t,e,n,i=.05,a=.05,s=1){ce(t,Pt(e,a),kt(n,i)),de(t,s)}function ao(t,e,n,i=.05,a=.05,s=1){ce(t,_t(e,a),kt(n,i)),de(t,s)}function so(t,e,n,i=.05,a=.05,s=1){ce(t,Pt(e,a),Lt(n,i)),de(t,s)}function ro(t,e,n,i=.05,a=.05,s=1){ce(t,_t(e,a),Lt(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 Ae={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 oo(t){return t&&Ae[t]?JSON.parse(JSON.stringify(Ae[t])):JSON.parse(JSON.stringify(et))}function Qe(t){Object.keys(t).forEach(e=>{let n=e;et[n]&&t[n]&&Object.assign(et[n],t[n])}),console.log("Config applied:",t)}function lo(t,e){let n=t/e;n>1.6?(Qe(Ae.wide),console.log("Applied WIDE config for ratio:",n)):n<.7?(Qe(Ae.tall),console.log("Applied TALL config for ratio:",n)):n>.8&&n<1.2?(Qe(Ae.square),console.log("Applied SQUARE config for ratio:",n)):(Qe(Ae.default),console.log("Applied DEFAULT config for ratio:",n))}if(typeof window!="undefined"){let t=window;t.configPresets=Ae,t.resolveAnchorVec2=t.resolveAnchorVec2||ze,t.resolveScreenAnchorPoint=t.resolveScreenAnchorPoint||gn,t.resolveScreenRatioPoint=t.resolveScreenRatioPoint||hn}yn();function M(t,e){let n=(a,s)=>s===0?a:n(s,a%s),i=n(t,e);return`${t/i}:${e/i}`}var Wc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:M(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:M(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:M(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:M(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:M(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:M(360,780)}],Yc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:M(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:M(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:M(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:M(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:M(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:M(412,915)}],Kc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:M(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:M(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:M(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:M(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:M(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:M(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:M(768,1024),mraidScale:.7}];var Xc=[...Ka];var yo=Ka[0];Z();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 vo(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 wo(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 bn(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 wo(s),o=vo(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],y=r[c+2],h=!1;for(let w of l)if(Math.sqrt(Math.pow(g-w.r,2)+Math.pow(u-w.g,2)+Math.pow(y-w.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 Za=require("@google/genai");async function vn(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 b=n[v];if(!b.base64||!b.mimeType)throw new Error(`Image ${v+1} is missing required data`);if(b.base64.length<1e3&&console.warn(`Image ${v+1} data appears very small, may be corrupted`),!b.mimeType.startsWith("image/"))throw new Error(`Image ${v+1} has invalid MIME type: ${b.mimeType}`)}let c=new Za.GoogleGenAI({apiKey:t}),g="gemini-2.5-flash",u=[e];n.length>0&&n.forEach((v,b)=>{u.push({inlineData:{data:v.base64,mimeType:v.mimeType}}),console.log(`[Gemini] Added image ${b+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 y=await c.models.generateContent({model:g,contents:u}),h="",w=(r=(s=(a=y.candidates)==null?void 0:a[0])==null?void 0:s.content)==null?void 0:r.parts;if(w)for(let v of w)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 Qa=require("@google/genai");async function It(t,e,n=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new Qa.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 xo=require("pixi.js");Ze();xt();Z();var ts=require("pixi.js");var Eo=require("pixi.js");Z();function jo(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 Oo(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 Ro(t){return`
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 el={};da(el,{AspectClass:()=>Hn,GameObject:()=>ct,GameObjectManager:()=>Dt,Renderer:()=>lt,ResponsiveUISystem:()=>qe,Transform:()=>ot,animateHandClick:()=>Ss,animatePanelEntrance:()=>xs,createBrushTexture:()=>Ps,createEndGamePanel:()=>ws,createHandTutorial:()=>Es,createThreeBase:()=>ys,createTutorialLabel:()=>Cs,getAspectClass:()=>Ht,getRegisteredFontIds:()=>vs,loadAsset:()=>Fn,loadCharacterFrames:()=>ks,registerFont:()=>bs,resolveFont:()=>ee,resolveFontWeight:()=>te,updateHandAnimation:()=>As});module.exports=Sr(el);var W=ge(require("three"),1);var he={};function bt(t,e,n=!1){he[t]||(he[t]=[]),he[t].push({fn:e,once:n})}function Zt(t,e){if(he[t]){if(!e){delete he[t];return}he[t]=he[t].filter(n=>n.fn!==e)}}function vt(t,...e){let n=he[t];if(n)for(let i of[...n])i.fn(...e),i.once&&Zt(t,i.fn)}function B(t,e){bt(t,e,!0)}var M=null,V=[],Ie=null;function ha(t){M=t,V=[],Ie!==null&&(clearTimeout(Ie),Ie=null)}function ma(){var t,e,n;return{endpoint:(M==null?void 0:M.endpoint)||"",transport:(M==null?void 0:M.transport)||"beacon",batchSize:(t=M==null?void 0:M.batchSize)!=null?t:10,flushIntervalMs:(e=M==null?void 0:M.flushIntervalMs)!=null?e:300,maxQueue:(n=M==null?void 0:M.maxQueue)!=null?n:200,debug:!!(M!=null&&M.debug)}}async function ua(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 Qt(t,e){let n=ma();if(e&&n.endpoint){if(V.push(t),V.length>n.maxQueue&&(V=V.slice(V.length-n.maxQueue)),V.length>=n.batchSize){ga();return}Ie===null&&(Ie=window.setTimeout(()=>{Ie=null,ga()},n.flushIntervalMs))}}async function ga(){let t=ma();if(!t.endpoint||V.length===0)return;let e=V.splice(0,t.batchSize);await ua(t.endpoint,{events:e},t.transport,t.debug),V.length>0&&await ua(t.endpoint,{events:V.splice(0,t.batchSize)},t.transport,t.debug)}function fa(t){return Math.max(0,Math.min(1,t))}function Er(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 Ke(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Cr(t,e){let n=t==null?void 0:t[e];return typeof n=="number"?n:0}function ya(t,e,n){try{t[e]=n}catch{}}function Ar(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 ba(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 va(t,e){let n=Ar(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 wa(){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=Ke();for(let u of Array.from(t)){if(u.killed||u.paused)continue;let y=p-u.startMs-u.delayMs;if(y<0)continue;let h=u.durationMs>0?y/u.durationMs:1,w=fa(h),v=u.repeat>=0?u.repeat+1:1,b=u.repeat>0?Math.min(Math.floor(h),v-1):0;if(u.repeat>0&&h>=1){let S=h-b;w=fa(S)}let m=u.ease(w);u.yoyo&&b%2===1&&(m=1-m);for(let S of u.props)ya(u.target,S.key,S.from+(S.to-S.from)*m);u.scaleFrom&&u.scaleTo&&ba(u.target,{x:u.scaleFrom.x+(u.scaleTo.x-u.scaleFrom.x)*m,y:u.scaleFrom.y+(u.scaleTo.y-u.scaleFrom.y)*m});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 S;let u=Math.max(0,(typeof c.duration=="number"?c.duration:.5)*1e3),y=Math.max(0,(typeof c.delay=="number"?c.delay:0)*1e3+((S=g==null?void 0:g.delayMsOverride)!=null?S:0)),h=Er(c.ease),w=typeof c.repeat=="number"?Math.max(0,c.repeat|0):0,v=c.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),m=[];for(let E of Object.keys(c)){if(b.has(E))continue;let C=c[E];typeof C=="number"&&m.push({key:E,from:Cr(p,E),to:C})}let f=va(p,c);return{target:p,startMs:Ke(),delayMs:y,durationMs:u,ease:h,props:m,scaleFrom:f.from,scaleTo:f.to,repeat:w,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=Ke())},resume:()=>{var h;if(!g.paused)return;let u=(h=g.pauseAtMs)!=null?h:Ke(),y=Ke()-u;g.startMs+=y,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 y=c[u];u==="scale"||u==="scaleX"||u==="scaleY"||typeof y=="number"&&ya(p,u,y)}let g=va(p,c);g.to&&ba(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,y=[],h=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let m=typeof b=="string"?b.trim():"";return m.startsWith("+=")?g+Math.max(0,Number(m.slice(2))*1e3||0):m?Math.max(0,Number(m)*1e3||0):g},w=b=>{c.push(b);let m=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);g=Math.max(g,b.atMs+m)},v={to(b,m,f){return w({kind:"to",target:b,vars:m,atMs:h(f)}),v},fromTo(b,m,f,S){return w({kind:"fromTo",target:b,vars:f,from:m,atMs:h(S)}),v},play(){var b,m;if(u)return v;u=!0,y=[];for(let f of c)f.kind==="fromTo"&&d.set(f.target,(b=f.from)!=null?b:{}),y.push(d.to(f.target,{...f.vars,delay:f.atMs/1e3+((m=f.vars.delay)!=null?m:0)}));return v},pause(){for(let b of y)b.pause();return v},kill(){for(let b of y)b.kill();y=[],u=!1}};return p.paused||v.play(),v}};return d}function xa(){if(typeof window=="undefined")return;let t=window;if(!t.gsap)try{t.gsap=wa()}catch{}}var Sa={name:"handler-playable-sdk",version:"1.0.71",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs dist/cli/student-helper/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var G=0,Lr=G++,Ea=G++,Ca=G++,Aa=G++,Ta=G++,La=G++,ka=G++,Pa=G++,Ma=G++,_a=G++,Ia=G++,ja=G++,T=Lr;function Oa(){return T===Ea}function Ra(){return T===Ca}function za(){return T===Aa}function $a(){return T===Ta}function je(){return T===La}function Oe(){return T===ka}function Ha(){return T===Pa}function Da(){return T===Ma}function Na(){return T===_a}function en(){return T===Ia}function tn(){return T===ja}function Fa(){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=Ea;return}catch{}else if(t==="dapi")try{dapi.isReady(),T=Ca;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(T=Aa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(T=Ta)}catch{}else if(e==="mintegral")window.gameReady&&(T=La);else if(e==="tapjoy")window.TJ_API&&(T=ka);else if(e==="tiktok")window.openAppStore&&(T=Pa);else if(e==="smadex")try{window.smxTracking&&(T=Ma)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(T=_a)}catch{}else e==="vungle"?T=Ia:(t==="nucleo"||e==="nucleo")&&(T=ja)}var wt=ge(require("lottie-web"),1),Ba=wt.default;typeof window!="undefined"&&(window.lottie=wt.default,window.__baseLottie=wt.default);var kr=require("pixi.js");var nn=require("pixi.js");var Pr=null;function an(t){Pr=t}St();xt();var Xe=require("pixi.js");St();var Rr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",ln=Rr;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&&(ln=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${ln}`))}}catch{}function zr(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 fe=class{static async create(e,n,i){var l,d,p,c,g,u,y;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${ln}`);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 Xe.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 Ce.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 Xe.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 Xe.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}`],w=!1;for(let v of h)try{let b=await fetch(v);if(b.ok){o=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"type:",(y=o==null?void 0:o.constructor)==null?void 0:y.name),w=!0;break}}catch{continue}w||(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=zr(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 Je=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 Dr=ge(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=Dr);Ze();var Ct=require("pixi.js");Ze();var dn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Je}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 fe.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 fe.create(e,n,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Fr=new dn,Br=new Proxy(Fr,{get(t,e){if(e in t&&typeof t[e]=="function")return t[e].bind(t);if(t.get(e))return t.get(e)}});Ze();var qr=require("pixi.js"),le={width:400,height:600,designWidth:400,scaleFactor:1},Tt={scale:1,position:1},un=[];function Vr(t,e,n,i,a,s,r){un.push({element:t,originalScale:s,positionHelper:e,heightPercent:a}),e(t,n,i,a,s,r,!1)}function Wr(){un.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 pn(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),Tt.scale=le.scaleFactor,Tt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Tt.scale.toFixed(3)}`),Wr()}var et={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 Yr(t,e,n){let i=et[t];i&&i[e]!==void 0&&(i[e]=n,console.log(`Updated ${t}.${e} = ${n}`))}function Kr(){return et}var Xr={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 At(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function ze(t,e={x:.5,y:.5}){var n;if(Array.isArray(t))return{x:At(t[0],e.x),y:At(t[1],e.y)};if(t&&typeof t=="object"){let i=t;return{x:At(i.x,e.x),y:At(i.y,e.y)}}if(typeof t=="string"){let i=t.trim().toLowerCase();return(n=Xr[i])!=null?n:e}return e}function gn(t,e,n,i={}){var u,y,h,w,v,b;let a=ze(n),s=(u=i.inset)!=null?u:{},r=(y=i.padding)!=null?y:{x:0,y:0},o=((h=s.left)!=null?h:0)+r.x,l=((w=s.right)!=null?w:0)+r.x,d=((v=s.top)!=null?v:0)+r.y,p=((b=s.bottom)!=null?b: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 hn(t,e,n,i={}){var h,w,v,b,m,f;let a=(h=i.inset)!=null?h:{},s=(w=i.padding)!=null?w:{x:0,y:0},r=((v=a.left)!=null?v:0)+s.x,o=((b=a.right)!=null?b:0)+s.x,l=((m=a.top)!=null?m:0)+s.y,d=((f=a.bottom)!=null?f:0)+s.y,p=Math.max(0,t-r-o),c=Math.max(0,e-l-d),g=ze(n,{x:.5,y:.5}),u=Math.min(Math.max(g.x,0),1),y=Math.min(Math.max(g.y,0),1);return{x:r+p*u,y:l+c*y}}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,pn(i,a))};window.addEventListener("resize",n),window.addEventListener("orientationchange",()=>{setTimeout(n,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",n),window.mraid.addEventListener("sizeChange",n)),pn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Yr,window.getDebugConfig=Kr,window.copyConfig=oo,window.applyConfig=Qe,window.applyConfigForRatio=lo,window.positionAtBottom=Va,window.positionAtTop=Qr,window.positionAtCenter=eo,window.positionAtLeft=to,window.positionAtRight=no,window.positionAtBottomLeft=io,window.positionAtBottomRight=ao,window.positionAtTopLeft=so,window.positionAtTopRight=ro,window.applyPositionContract=Zr,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 Lt(t,e,n=0){return t*e+n}function kt(t,e,n=0){return t*(1-e)+n}function Pt(t,e,n=0){return t*e+n}function Mt(t,e,n=0){return t*(1-e)+n}function U(t,e=0){return t/2+e}function Jr(t,e){return t*e}function Zr(t,e,n,i){var r,o,l,d,p,c,g,u,y,h,w,v,b,m,f,S,E,C,P,I;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=Lt(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=kt(n,i.percent,(u=(g=i.offset)==null?void 0:g.y)!=null?u:0);break;case"left":a=Pt(e,i.percent,(h=(y=i.offset)==null?void 0:y.x)!=null?h:0),s=U(n,(v=(w=i.offset)==null?void 0:w.y)!=null?v:0);break;case"right":a=Mt(e,i.percent,(m=(b=i.offset)==null?void 0:b.x)!=null?m:0),s=U(n,(S=(f=i.offset)==null?void 0:f.y)!=null?S:0);break;case"center":a=U(e,(C=(E=i.offset)==null?void 0:E.x)!=null?C:0),s=U(n,(I=(P=i.offset)==null?void 0:P.y)!=null?I: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 Va(t,e,n,i=.2,a=1,s=!0,r=!1){let o=Jr(n,i),l=kt(n,i/2);ce(t,U(e),l);let d=s?a*le.scaleFactor:a;de(t,d),r&&!un.find(p=>p.element===t)&&Vr(t,Va,e,n,i,a,s)}function Qr(t,e,n,i=.1,a=1){ce(t,U(e),Lt(n,i)),de(t,a)}function eo(t,e,n,i=0,a=0,s=1){ce(t,U(e,i),U(n,a)),de(t,s)}function to(t,e,n,i=.1,a=1){ce(t,Pt(e,i),U(n)),de(t,a)}function no(t,e,n,i=.1,a=1){ce(t,Mt(e,i),U(n)),de(t,a)}function io(t,e,n,i=.05,a=.05,s=1){ce(t,Pt(e,a),kt(n,i)),de(t,s)}function ao(t,e,n,i=.05,a=.05,s=1){ce(t,Mt(e,a),kt(n,i)),de(t,s)}function so(t,e,n,i=.05,a=.05,s=1){ce(t,Pt(e,a),Lt(n,i)),de(t,s)}function ro(t,e,n,i=.05,a=.05,s=1){ce(t,Mt(e,a),Lt(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 Ae={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 oo(t){return t&&Ae[t]?JSON.parse(JSON.stringify(Ae[t])):JSON.parse(JSON.stringify(et))}function Qe(t){Object.keys(t).forEach(e=>{let n=e;et[n]&&t[n]&&Object.assign(et[n],t[n])}),console.log("Config applied:",t)}function lo(t,e){let n=t/e;n>1.6?(Qe(Ae.wide),console.log("Applied WIDE config for ratio:",n)):n<.7?(Qe(Ae.tall),console.log("Applied TALL config for ratio:",n)):n>.8&&n<1.2?(Qe(Ae.square),console.log("Applied SQUARE config for ratio:",n)):(Qe(Ae.default),console.log("Applied DEFAULT config for ratio:",n))}if(typeof window!="undefined"){let t=window;t.configPresets=Ae,t.resolveAnchorVec2=t.resolveAnchorVec2||ze,t.resolveScreenAnchorPoint=t.resolveScreenAnchorPoint||gn,t.resolveScreenRatioPoint=t.resolveScreenRatioPoint||hn}yn();function _(t,e){let n=(a,s)=>s===0?a:n(s,a%s),i=n(t,e);return`${t/i}:${e/i}`}var Wc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:_(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:_(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:_(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:_(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:_(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:_(360,780)}],Yc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:_(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:_(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:_(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:_(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:_(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:_(412,915)}],Kc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:_(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:_(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:_(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:_(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:_(800,1280)}],Xa=[{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:_(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:_(768,1024),mraidScale:.7}];var Xc=[...Xa];var yo=Xa[0];Z();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 vo(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 wo(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 vn(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 wo(s),o=vo(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 _t(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],y=r[c+2],h=!1;for(let w of l)if(Math.sqrt(Math.pow(g-w.r,2)+Math.pow(u-w.g,2)+Math.pow(y-w.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 Za=require("@google/genai");async function wn(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 b=n[v];if(!b.base64||!b.mimeType)throw new Error(`Image ${v+1} is missing required data`);if(b.base64.length<1e3&&console.warn(`Image ${v+1} data appears very small, may be corrupted`),!b.mimeType.startsWith("image/"))throw new Error(`Image ${v+1} has invalid MIME type: ${b.mimeType}`)}let c=new Za.GoogleGenAI({apiKey:t}),g="gemini-2.5-flash",u=[e];n.length>0&&n.forEach((v,b)=>{u.push({inlineData:{data:v.base64,mimeType:v.mimeType}}),console.log(`[Gemini] Added image ${b+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 y=await c.models.generateContent({model:g,contents:u}),h="",w=(r=(s=(a=y.candidates)==null?void 0:a[0])==null?void 0:s.content)==null?void 0:r.parts;if(w)for(let v of w)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 Qa=require("@google/genai");async function It(t,e,n=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new Qa.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 xo=require("pixi.js");Ze();xt();Z();var ts=require("pixi.js");var Eo=require("pixi.js");Z();function jo(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 Oo(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 Ro(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 ns(){let t=[],e="",n=null;return{async addSources(i){let a=[];for(let s of i){let r=await jo(s),o=Oo(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:s.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};t.push(l),a.push(l)}return a},getSources(){return t.slice()},async analyze(i,a,s){if(t.length===0)throw new Error("No screenshots to analyze.");let r=Ro(a),o=t.map(g=>({base64:g.base64,mimeType:g.mimeType})),l=await vn(i,r,o,{model:s}),d=e,p=[],c=l.split(`
63
+ `.trim()}function ns(){let t=[],e="",n=null;return{async addSources(i){let a=[];for(let s of i){let r=await jo(s),o=Oo(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:s.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};t.push(l),a.push(l)}return a},getSources(){return t.slice()},async analyze(i,a,s){if(t.length===0)throw new Error("No screenshots to analyze.");let r=Ro(a),o=t.map(g=>({base64:g.base64,mimeType:g.mimeType})),l=await wn(i,r,o,{model:s}),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(y=>{p.includes(y.toUpperCase())||p.push(y.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 Le="handler_api_key_";var $e=class{static setKey(e,n,i){try{let a={key:this.encryptKey(n),created:Date.now(),lastUsed:Date.now(),label:i||e},s=`${Le}${e}`;localStorage.setItem(s,JSON.stringify(a))}catch(a){console.error("[ApiKeyStorage] Failed to store API key:",a)}}static getKey(e){try{let n=`${Le}${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=`${Le}${e}`;return localStorage.getItem(n)!==null}static removeKey(e){try{let n=`${Le}${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(Le)){let a=i.substring(Le.length),s=localStorage.getItem(i);if(s){let r=JSON.parse(s);e.push({service:a,label:r.label,created:r.created,lastUsed:r.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(Le)&&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}}},wn=()=>$e.getKey("gemini"),xn=(t,e)=>$e.setKey("gemini",t,e),zo=()=>$e.hasKey("gemini");window.ApiKeyStorage=$e;window.getGeminiApiKey=wn;window.setGeminiApiKey=xn;window.hasGeminiApiKey=zo;var En=class{constructor(){this.modal=null;this.options=null;this.analyzer=ns();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=`
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 Le="handler_api_key_";var $e=class{static setKey(e,n,i){try{let a={key:this.encryptKey(n),created:Date.now(),lastUsed:Date.now(),label:i||e},s=`${Le}${e}`;localStorage.setItem(s,JSON.stringify(a))}catch(a){console.error("[ApiKeyStorage] Failed to store API key:",a)}}static getKey(e){try{let n=`${Le}${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=`${Le}${e}`;return localStorage.getItem(n)!==null}static removeKey(e){try{let n=`${Le}${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(Le)){let a=i.substring(Le.length),s=localStorage.getItem(i);if(s){let r=JSON.parse(s);e.push({service:a,label:r.label,created:r.created,lastUsed:r.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(Le)&&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}}},xn=()=>$e.getKey("gemini"),Sn=(t,e)=>$e.setKey("gemini",t,e),zo=()=>$e.hasKey("gemini");window.ApiKeyStorage=$e;window.getGeminiApiKey=xn;window.setGeminiApiKey=Sn;window.hasGeminiApiKey=zo;var Cn=class{constructor(){this.modal=null;this.options=null;this.analyzer=ns();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">
@@ -143,12 +143,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),n={summary:d,palette:p.slice(0
143
143
  </div>
144
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 s=a.target;switch(s.dataset.action||((o=s.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 s=a.target;if(s.classList.contains("ai-gallery-item")||s.closest(".ai-gallery-item")){let r=s.closest(".ai-gallery-item"),o=parseInt(r.dataset.index||"-1");o>=0&&this.selectImage(o)}}),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 s=this.getApiKey();if(!s){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let d=await bn(this.options.currentValue);d&&(r=[{base64:d.base64,mimeType:d.mimeType}])}catch(d){console.warn("[AiEditorModal] Failed to load current image:",d)}let o=await It(s,this.currentPrompt,r,{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(s){console.error("[AiEditorModal] Generation failed:",s),alert(`Generation failed: ${s instanceof Error?s.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)=>`
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 s=this.getApiKey();if(!s){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let d=await vn(this.options.currentValue);d&&(r=[{base64:d.base64,mimeType:d.mimeType}])}catch(d){console.warn("[AiEditorModal] Failed to load current image:",d)}let o=await It(s,this.currentPrompt,r,{aspectRatio:"1:1"}),l=await _t(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(s){console.error("[AiEditorModal] Generation failed:",s),alert(`Generation failed: ${s instanceof Error?s.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=wn();if(e)return e;try{let n=this.analyzer.getResult();if(n&&n.apiKey)return xn(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}},Sn=null;window.__openAiEditor=function(t,e,n,i){Sn||(Sn=new En),Sn.open({objectId:t,initialPrompt:e,currentValue:n,path:i==null?void 0:i.path,onApply:a=>{if(i!=null&&i.path){let s=window.updateManager;if(s)s.updateProperty(t,i.path,a);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(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"))}})};An();var Tn=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",s=document.createElement("div");s.className="asset-preview-modal",s.innerHTML=`
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=xn();if(e)return e;try{let n=this.analyzer.getResult();if(n&&n.apiKey)return Sn(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}},En=null;window.__openAiEditor=function(t,e,n,i){En||(En=new Cn),En.open({objectId:t,initialPrompt:e,currentValue:n,path:i==null?void 0:i.path,onApply:a=>{if(i!=null&&i.path){let s=window.updateManager;if(s)s.updateProperty(t,i.path,a);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(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"))}})};Tn();var Ln=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",s=document.createElement("div");s.className="asset-preview-modal",s.innerHTML=`
152
152
  <div class="asset-preview-card">
153
153
  <div class="asset-preview-header">
154
154
  <div class="asset-preview-title">${a}</div>
@@ -175,7 +175,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
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(()=>(An(),is)).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 Tn().open(t)};var Ln=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=`
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(()=>(Tn(),is)).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 Ln().open(t)};var kn=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 Ln().open(t)};Z();var ke=require("pixi.js");Z();Z();Z();var as=ge(require("lottie-web"),1);an(Fa);typeof window!="undefined"&&!window.lottie&&(window.lottie=as.default);yn();Z();var kn=xa.version,Ho=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"]);wa();var ps={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"},us=Math.random().toString(36).slice(2),Ne=null,He={...ps},gs="web_embed",In={},nt,Pn=!1,tt=!1,at=!1,hs=!1,zn=1,Ot=0,$t=!1,pe=!1,De="",Fe=Math.floor(window.innerWidth),Be=Math.floor(window.innerHeight),jn=Fe>Be,ue=!1,it=!1,ss=!1,rs=!1,_n=!1,Rt=null,Pe=null,On=!1,Rn=!1,jt=new Map;function ms(){if(!Pe)return null;let t=Date.now()-Pe;return!Number.isFinite(t)||t<0?null:t}function Mn(t){if(On)return;let e=ms();e!==null&&(On=!0,x("session_time",{duration_ms:e,reason:t}))}function os(){if(Ne)return Ne;let t=document.createElement("div");return t.id="handler-root",t.setAttribute("data-handler-root","true"),document.body.appendChild(t),Ne=t,t}function zt(t){switch(t){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return t}}function fs(t,e){return{event_name:t,ts:Date.now(),session_id:us,deployment_id:He.deployment_id,variant_id:He.variant_id,export_profile_id:He.profile_id,instance_id:He.instance_id||"default",env:gs==="mraid"?"mraid":"web",attribution:nt,payload:e}}function x(t,e){let n=zt(t),i=fs(n,e);Qt(i,!!In.analytics),vt(n,i),n!==t&&vt(t,i)}function st(){Rt&&(Rt(Fe,Be),Rt=null)}function Ge(t){zn=t,x("volume",t)}function Ue(t){t&&(hs=!0),!at&&(at=!0,x("pause"),Ge(0))}function rt(t){!t&&hs||at&&(at=!1,x("resume"),Ge(zn))}function ye(t,e){Fe=Math.floor(t||window.innerWidth),Be=Math.floor(e||window.innerHeight),jn=Fe>Be,x("resize",{width:Fe,height:Be})}function Do(){if(ja())try{let t=mraid.getMaxSize();ye(t.width,t.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?rt():Ue()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();ye(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();Ge(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&Ge(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),$t=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st();else{let n=()=>{ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st()};mraid.addEventListener("ready",n)}}catch(t){console.warn("MRAID hook skipped",t)}}function No(){if(Oa())try{let t=dapi.getScreenSize();ye(t.width,t.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?rt():Ue()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();ye(n.width||i.width,n.height||i.height)});let e=dapi.getAudioVolume();if(Ge(e?1:0),dapi.addEventListener("audioVolumeChange",n=>Ge(n?1:0)),$t=!0,dapi.isViewable())ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st();else{let n=()=>{ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st()};dapi.addEventListener("ready",n)}}catch(t){console.warn("DAPI hook skipped",t)}}function ls(){let t=()=>{ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st(),it&&(it=!1,Q.start()))};window.addEventListener("resize",()=>ye()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(rt(),t()):Ue()}),document.readyState==="complete"||document.readyState==="interactive"?t():window.addEventListener("load",t),$t=!0}function Fo(){let t=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(ss=!0),!(ss&&e instanceof MouseEvent)&&(Ot+=1,Rn||(Rn=!0,x("first_interaction",{count:Ot})),x("interaction",Ot))};document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)}function cs(t){var i,a,s,r,o,l,d,p,c,g,u,y;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(Ha())try{(c=(p=window.smxTracking)==null?void 0:p.redirect)==null||c.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(za()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(t||De||""):t&&window.open(t)}else je()?(g=window.install)==null||g.call(window):$a()?(u=window.openAppStore)==null||u.call(window):en()?(y=parent==null?void 0:parent.postMessage)==null||y.call(parent,"download","*"):t&&window.open(t)}function Bo(){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),bt("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 Go(){if(!Oe())return;let t=window.TJ_API;t&&t.setPlayableAPI&&t.setPlayableAPI({skipAd:()=>{try{Q.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function ds(){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 Uo(){je()&&(window.mintGameStart=()=>{rt(!0),ye()},window.mintGameClose=()=>{Ue(!0)})}function qo(){if(!tn())return;let t=window.NUC;!t||!t.trigger||(Q.on("cta_click",()=>{var e,n;return(n=(e=t.trigger).convert)==null?void 0:n.call(e,De)}),Q.on("complete",()=>{var e,n;return(n=(e=t.trigger).tryAgain)==null?void 0:n.call(e)}))}var Q={init(t={},e){var n;if(gs=t.profile||"web_embed",In=t.consent||{},He={...ps,...t.ids||{}},Ne=t.rootEl||Ne,nt=void 0,ga((n=t.telemetry)!=null&&n.endpoint?t.telemetry:null),Pe=null,On=!1,Rn=!1,jt.clear(),De=t.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Rt=e),x("init"),document.body.oncontextmenu=()=>!1,os(),Wo(Ne),Na(),Do(),No(),!$t){if(document.readyState==="complete")ls();else if(!rs){rs=!0;let i=()=>{ls(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Fo(),Bo(),Go(),Uo(),qo(),console.log(`%c @handler/playable-sdk %c v${kn} `,"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&&(x("boot"),x("view"),x("ready"),it&&(it=!1,Q.start()),pe=!0),pe=ue},getRoot(){return os()},get version(){return kn},get maxWidth(){return Fe},get maxHeight(){return Be},get isLandscape(){return jn},get isReady(){return pe},get isStarted(){return Pn},get isPaused(){return at},get isFinished(){return tt},get volume(){return zn},get interactions(){return Ot},on(t,e){bt(zt(t),e)},off(t,e){Zt(zt(t),e)},start(){var t,e;if(!Pn){if(!ue){it=!0;return}if(Pn=!0,Pe||(Pe=Date.now()),x("start"),ye(),je())Ue(),(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:jn?"landscape":"portrait",buildID:kn})}}},finish(){var t,e;tt||(tt=!0,x("complete"),Mn("complete"),je()?(t=window.gameEnd)==null||t.call(window):en()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Oe()&&ds())},install(t){if(!tt){tt=!0,Oe()?(ds(),setTimeout(()=>Q.install(t),300)):(x("complete"),setTimeout(()=>Q.install(t),0));return}_n||(_n=!0,setTimeout(()=>_n=!1,500),x("cta_click"),x("conversion"),Mn("cta"),cs(t||De))},emit(t,e){let n=zt(t);if(!Ho.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=fs(n,e);Qt(i,!!In.analytics),vt(n,i)},gameStart(){Q.start()},gameEnd(){Q.finish()},ctaClick(t,e){x("cta_click",{url:t||De,manual:!0}),(e==null?void 0:e.open)!==!1&&cs(t||De)},ctaShow(t){x("cta_show",t)},ctaDismiss(t){x("cta_dismiss",t)},getGameTimeMs(){return ms()},endSession(t="manual"){Mn(t)},setAttribution(t){nt=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(Vo(`${us}:${t}`))%e.length,i=e[n];return nt={...nt||{},experiment_id:t},He.variant_id=i,x("ab_assign",{experiment_id:t,variant_id:i}),i},levelStart(t,e){Pe||(Pe=Date.now()),x("level_start",{level_id:t,...e})},levelComplete(t,e){x("level_complete",{level_id:t,...e})},levelFail(t,e){x("level_fail",{level_id:t,...e})},checkpoint(t,e){x("checkpoint",{checkpoint_id:t,...e})},reward(t,e){x("reward",{reward_id:t,...e})},tutorialStart(t,e){x("tutorial_start",{step_id:t,...e})},tutorialComplete(t,e){x("tutorial_complete",{step_id:t,...e})},tutorialSkip(t,e){x("tutorial_skip",{step_id:t,...e})},timerStart(t){t&&jt.set(t,Date.now())},timerEnd(t,e="custom",n){if(!t)return;let i=jt.get(t);if(!i)return;jt.delete(t);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){x("engagement",{action:"timer",key:t,duration_ms:a,...n});return}x(e,{key:t,duration_ms:a,...n})}},fps(t,e){x("fps",{value:t,...e})},memory(t,e){x("memory",{bytes:t,...e})},assetLoadStart(t,e){x("asset_load_start",{asset_id:t,...e})},assetLoadComplete(t,e){x("asset_load_complete",{asset_id:t,...e})},reportError(t,e,n){x("error",{code:t,message:e,...n})},retry(){var t,e,n;if(je())(t=window.gameRetry)==null||t.call(window);else if(tn()){let i=window.NUC;(n=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||n.call(e)}x("engagement",{action:"retry"})},pause(){Ue(!0)},resume(){rt(!0)},resize(t,e){ye(t,e)}},Re=Q;function Vo(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 Wo(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 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 kn().open(t)};Z();var ke=require("pixi.js");Z();Z();Z();var as=ge(require("lottie-web"),1);an(Ba);typeof window!="undefined"&&!window.lottie&&(window.lottie=as.default);yn();Z();var Pn=Sa.version,Ho=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"]);xa();var ps={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"},us=Math.random().toString(36).slice(2),Ne=null,He={...ps},gs="web_embed",jn={},nt,Mn=!1,tt=!1,at=!1,hs=!1,$n=1,Ot=0,$t=!1,pe=!1,De="",Fe=Math.floor(window.innerWidth),Be=Math.floor(window.innerHeight),On=Fe>Be,ue=!1,it=!1,ss=!1,rs=!1,_n=!1,Rt=null,Pe=null,Rn=!1,zn=!1,jt=new Map;function ms(){if(!Pe)return null;let t=Date.now()-Pe;return!Number.isFinite(t)||t<0?null:t}function In(t){if(Rn)return;let e=ms();e!==null&&(Rn=!0,x("session_time",{duration_ms:e,reason:t}))}function os(){if(Ne)return Ne;let t=document.createElement("div");return t.id="handler-root",t.setAttribute("data-handler-root","true"),document.body.appendChild(t),Ne=t,t}function zt(t){switch(t){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return t}}function fs(t,e){return{event_name:t,ts:Date.now(),session_id:us,deployment_id:He.deployment_id,variant_id:He.variant_id,export_profile_id:He.profile_id,instance_id:He.instance_id||"default",env:gs==="mraid"?"mraid":"web",attribution:nt,payload:e}}function x(t,e){let n=zt(t),i=fs(n,e);Qt(i,!!jn.analytics),vt(n,i),n!==t&&vt(t,i)}function st(){Rt&&(Rt(Fe,Be),Rt=null)}function Ge(t){$n=t,x("volume",t)}function Ue(t){t&&(hs=!0),!at&&(at=!0,x("pause"),Ge(0))}function rt(t){!t&&hs||at&&(at=!1,x("resume"),Ge($n))}function ye(t,e){Fe=Math.floor(t||window.innerWidth),Be=Math.floor(e||window.innerHeight),On=Fe>Be,x("resize",{width:Fe,height:Be})}function Do(){if(Oa())try{let t=mraid.getMaxSize();ye(t.width,t.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?rt():Ue()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();ye(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();Ge(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&Ge(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),$t=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st();else{let n=()=>{ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st()};mraid.addEventListener("ready",n)}}catch(t){console.warn("MRAID hook skipped",t)}}function No(){if(Ra())try{let t=dapi.getScreenSize();ye(t.width,t.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?rt():Ue()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();ye(n.width||i.width,n.height||i.height)});let e=dapi.getAudioVolume();if(Ge(e?1:0),dapi.addEventListener("audioVolumeChange",n=>Ge(n?1:0)),$t=!0,dapi.isViewable())ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st();else{let n=()=>{ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st()};dapi.addEventListener("ready",n)}}catch(t){console.warn("DAPI hook skipped",t)}}function ls(){let t=()=>{ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ue=!0,x("boot"),x("view"),x("ready"),pe=!0,st(),it&&(it=!1,Q.start()))};window.addEventListener("resize",()=>ye()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(rt(),t()):Ue()}),document.readyState==="complete"||document.readyState==="interactive"?t():window.addEventListener("load",t),$t=!0}function Fo(){let t=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(ss=!0),!(ss&&e instanceof MouseEvent)&&(Ot+=1,zn||(zn=!0,x("first_interaction",{count:Ot})),x("interaction",Ot))};document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)}function cs(t){var i,a,s,r,o,l,d,p,c,g,u,y;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(za())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Na())(d=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||d.call(l);else if(Da())try{(c=(p=window.smxTracking)==null?void 0:p.redirect)==null||c.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if($a()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(t||De||""):t&&window.open(t)}else je()?(g=window.install)==null||g.call(window):Ha()?(u=window.openAppStore)==null||u.call(window):en()?(y=parent==null?void 0:parent.postMessage)==null||y.call(parent,"download","*"):t&&window.open(t)}function Bo(){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),bt("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 Go(){if(!Oe())return;let t=window.TJ_API;t&&t.setPlayableAPI&&t.setPlayableAPI({skipAd:()=>{try{Q.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function ds(){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 Uo(){je()&&(window.mintGameStart=()=>{rt(!0),ye()},window.mintGameClose=()=>{Ue(!0)})}function qo(){if(!tn())return;let t=window.NUC;!t||!t.trigger||(Q.on("cta_click",()=>{var e,n;return(n=(e=t.trigger).convert)==null?void 0:n.call(e,De)}),Q.on("complete",()=>{var e,n;return(n=(e=t.trigger).tryAgain)==null?void 0:n.call(e)}))}var Q={init(t={},e){var n;if(gs=t.profile||"web_embed",jn=t.consent||{},He={...ps,...t.ids||{}},Ne=t.rootEl||Ne,nt=void 0,ha((n=t.telemetry)!=null&&n.endpoint?t.telemetry:null),Pe=null,Rn=!1,zn=!1,jt.clear(),De=t.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Rt=e),x("init"),document.body.oncontextmenu=()=>!1,os(),Wo(Ne),Fa(),Do(),No(),!$t){if(document.readyState==="complete")ls();else if(!rs){rs=!0;let i=()=>{ls(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Fo(),Bo(),Go(),Uo(),qo(),console.log(`%c @handler/playable-sdk %c v${Pn} `,"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&&(x("boot"),x("view"),x("ready"),it&&(it=!1,Q.start()),pe=!0),pe=ue},getRoot(){return os()},get version(){return Pn},get maxWidth(){return Fe},get maxHeight(){return Be},get isLandscape(){return On},get isReady(){return pe},get isStarted(){return Mn},get isPaused(){return at},get isFinished(){return tt},get volume(){return $n},get interactions(){return Ot},on(t,e){bt(zt(t),e)},off(t,e){Zt(zt(t),e)},start(){var t,e;if(!Mn){if(!ue){it=!0;return}if(Mn=!0,Pe||(Pe=Date.now()),x("start"),ye(),je())Ue(),(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:On?"landscape":"portrait",buildID:Pn})}}},finish(){var t,e;tt||(tt=!0,x("complete"),In("complete"),je()?(t=window.gameEnd)==null||t.call(window):en()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Oe()&&ds())},install(t){if(!tt){tt=!0,Oe()?(ds(),setTimeout(()=>Q.install(t),300)):(x("complete"),setTimeout(()=>Q.install(t),0));return}_n||(_n=!0,setTimeout(()=>_n=!1,500),x("cta_click"),x("conversion"),In("cta"),cs(t||De))},emit(t,e){let n=zt(t);if(!Ho.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=fs(n,e);Qt(i,!!jn.analytics),vt(n,i)},gameStart(){Q.start()},gameEnd(){Q.finish()},ctaClick(t,e){x("cta_click",{url:t||De,manual:!0}),(e==null?void 0:e.open)!==!1&&cs(t||De)},ctaShow(t){x("cta_show",t)},ctaDismiss(t){x("cta_dismiss",t)},getGameTimeMs(){return ms()},endSession(t="manual"){In(t)},setAttribution(t){nt=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(Vo(`${us}:${t}`))%e.length,i=e[n];return nt={...nt||{},experiment_id:t},He.variant_id=i,x("ab_assign",{experiment_id:t,variant_id:i}),i},levelStart(t,e){Pe||(Pe=Date.now()),x("level_start",{level_id:t,...e})},levelComplete(t,e){x("level_complete",{level_id:t,...e})},levelFail(t,e){x("level_fail",{level_id:t,...e})},checkpoint(t,e){x("checkpoint",{checkpoint_id:t,...e})},reward(t,e){x("reward",{reward_id:t,...e})},tutorialStart(t,e){x("tutorial_start",{step_id:t,...e})},tutorialComplete(t,e){x("tutorial_complete",{step_id:t,...e})},tutorialSkip(t,e){x("tutorial_skip",{step_id:t,...e})},timerStart(t){t&&jt.set(t,Date.now())},timerEnd(t,e="custom",n){if(!t)return;let i=jt.get(t);if(!i)return;jt.delete(t);let a=Date.now()-i;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){x("engagement",{action:"timer",key:t,duration_ms:a,...n});return}x(e,{key:t,duration_ms:a,...n})}},fps(t,e){x("fps",{value:t,...e})},memory(t,e){x("memory",{bytes:t,...e})},assetLoadStart(t,e){x("asset_load_start",{asset_id:t,...e})},assetLoadComplete(t,e){x("asset_load_complete",{asset_id:t,...e})},reportError(t,e,n){x("error",{code:t,message:e,...n})},retry(){var t,e,n;if(je())(t=window.gameRetry)==null||t.call(window);else if(tn()){let i=window.NUC;(n=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||n.call(e)}x("engagement",{action:"retry"})},pause(){Ue(!0)},resume(){rt(!0)},resize(t,e){ye(t,e)}},Re=Q;function Vo(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 Wo(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 $n=(i=>(i[i.PHONE_TALL=0]="PHONE_TALL",i[i.TABLET=1]="TABLET",i[i.LANDSCAPE=2]="LANDSCAPE",i))($n||{});function Ht(t,e){let n=t/e;return n<=.62?0:n<=.85?1:2}var qe=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=Ht(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 Ht(e.width,e.height)}};async function ys(t,e={}){let n=()=>{let m=t.getBoundingClientRect(),f=Math.floor(m.width),S=Math.floor(m.height);return(f<=0||!isFinite(f)||f!==f)&&(f=t.clientWidth||window.innerWidth||320),(S<=0||!isFinite(S)||S!==S)&&(S=t.clientHeight||window.innerHeight||480),(f<=0||!isFinite(f)||f!==f)&&(f=320),(S<=0||!isFinite(S)||S!==S)&&(S=480),console.log("[THREE-BASE] getSize result:",{width:f,height:S,boundingRect:{width:m.width,height:m.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:f,height:S}},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 s=e.background||"linear-gradient(160deg, #0d1020, #0f1c2f)";t.style.setProperty("background",s,"important"),t.style.setProperty("background-size","cover","important"),t.style.setProperty("background-position","center","important"),t.style.setProperty("background-repeat","no-repeat","important");let r=document.createElement("div");r.style.cssText=`
245
+ `,t.appendChild(e)}var Hn=(i=>(i[i.PHONE_TALL=0]="PHONE_TALL",i[i.TABLET=1]="TABLET",i[i.LANDSCAPE=2]="LANDSCAPE",i))(Hn||{});function Ht(t,e){let n=t/e;return n<=.62?0:n<=.85?1:2}var qe=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=Ht(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 Ht(e.width,e.height)}};async function ys(t,e={}){let n=()=>{let m=t.getBoundingClientRect(),f=Math.floor(m.width),S=Math.floor(m.height);return(f<=0||!isFinite(f)||f!==f)&&(f=t.clientWidth||window.innerWidth||320),(S<=0||!isFinite(S)||S!==S)&&(S=t.clientHeight||window.innerHeight||480),(f<=0||!isFinite(f)||f!==f)&&(f=320),(S<=0||!isFinite(S)||S!==S)&&(S=480),console.log("[THREE-BASE] getSize result:",{width:f,height:S,boundingRect:{width:m.width,height:m.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:f,height:S}},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 s=e.background||"linear-gradient(160deg, #0d1020, #0f1c2f)";t.style.setProperty("background",s,"important"),t.style.setProperty("background-size","cover","important"),t.style.setProperty("background-position","center","important"),t.style.setProperty("background-repeat","no-repeat","important");let r=document.createElement("div");r.style.cssText=`
246
246
  position: absolute !important;
247
247
  inset: 0 !important;
248
248
  width: 100% !important;
@@ -265,7 +265,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
265
265
  overflow: hidden !important;
266
266
  `,t.appendChild(r);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(";")),r.appendChild(o);let l=new W.Scene,{width:d,height:p}=n(),c=new W.AmbientLight(16777215,.6);l.add(c);let g=new W.DirectionalLight(16777215,.8);g.position.set(5,5,5),g.castShadow=!1,l.add(g);let u=new W.DirectionalLight(16777215,.3);u.position.set(-5,0,5),l.add(u);let y=new W.PerspectiveCamera(55,d/p,.1,100);y.position.set(0,0,3.2),y.lookAt(0,0,0),y.updateMatrixWorld();let h=new W.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 w=m=>{var k;let f=t.getBoundingClientRect(),S=window.getComputedStyle(t);console.log("[THREE-BASE] applySize called:",{providedSize:m,rootRect:{width:f.width,height:f.height},clientSize:{width:t.clientWidth,height:t.clientHeight},styleSize:{width:t.style.width,height:t.style.height},computedStyle:{width:S.width,height:S.height,transform:S.transform,scale:S.scale},rendererCurrentSize:{width:h.domElement.width,height:h.domElement.height},rendererStyleSize:{width:h.domElement.style.width,height:h.domElement.style.height},stackTrace:(k=new Error().stack)==null?void 0:k.split(`
267
267
  `).slice(1,4).join(`
268
- `)});let E=f.width,C=f.height;if((E<=0||!isFinite(E))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:f.width,clientWidth:t.clientWidth}),E=t.clientWidth||window.innerWidth||320),(C<=0||!isFinite(C))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:f.height,clientHeight:t.clientHeight}),C=t.clientHeight||window.innerHeight||480),typeof(m==null?void 0:m.width)=="number"&&m.width>0){let R=Math.abs(m.width-f.width),j=f.width*.1;R>j?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:m.width,container:f.width,difference:R,tolerance:j,willUse:"container size (boundingRect)"}):(E=m.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:m.width,container:f.width}))}if(typeof(m==null?void 0:m.height)=="number"&&m.height>0){let R=Math.abs(m.height-f.height),j=f.height*.1;R>j?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:m.height,container:f.height,difference:R,tolerance:j,willUse:"container size (boundingRect)"}):(C=m.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:m.height,container:f.height}))}(E<=0||C<=0||!isFinite(E)||!isFinite(C))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:E,newHeight:C,size:m,rootRect:f}),E=f.width||t.clientWidth||320,C=f.height||t.clientHeight||480);let P=Math.floor(E),I=Math.floor(C);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:P,finalHeight:I,aspectRatio:P/I,beforeRendererSize:{width:h.domElement.width,height:h.domElement.height},beforeRendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height}}),h.setSize(P,I),h.setPixelRatio(window.devicePixelRatio||1),y.aspect=P/I,y.updateProjectionMatrix();let L=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:L.width,height:L.height},cameraAspect:y.aspect,matches:{width:Math.abs(h.domElement.width-L.width)<1,height:Math.abs(h.domElement.height-L.height)<1},sizeDifference:{width:h.domElement.width-L.width,height:h.domElement.height-L.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{w()})});let v=!1;Re.on("pause",()=>{v=!0,document.querySelectorAll("audio").forEach(f=>f.pause())}),Re.on("resume",()=>{v=!1,document.querySelectorAll("audio").forEach(f=>{f.currentTime>0&&!f.ended&&f.play().catch(()=>{})})});let b=new qe(t,r);return Re.on("resize",({payload:m})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:m,timestamp:Date.now(),rootRect:t.getBoundingClientRect()}),w({width:m==null?void 0:m.width,height:m==null?void 0:m.height}),b.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()}),w(),b.updateLayout()}),{scene:l,camera:y,renderer:h,uiSystem:b,applySize:w}}var z=ge(require("three"),1),ot=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}},lt=class{constructor(e){var n,i,a,s;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=(s=e==null?void 0:e.tint)!=null?s: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 z.Mesh&&e.material&&(Array.isArray(e.material)?e.material.forEach(n=>{n instanceof z.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):e.material instanceof z.Material&&(e.material.opacity=this.alpha,e.material.transparent=this.alpha<1)),this.tint!==null&&e instanceof z.Mesh&&e.material){let n=typeof this.tint=="string"?new z.Color(this.tint):new z.Color(this.tint);Array.isArray(e.material)?e.material.forEach(i=>{(i instanceof z.MeshBasicMaterial||i instanceof z.MeshStandardMaterial)&&i.color.copy(n)}):(e.material instanceof z.MeshBasicMaterial||e.material instanceof z.MeshStandardMaterial)&&e.material.color.copy(n)}}},ct=class{constructor(e,n,i,a){this.instanceId=e,this.objectConfig=n,this.threeObject=i,this._config=a,this.transform=new ot(a.transform),this.renderer=new lt(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)}},Dt=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 ct(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 Nt={"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 ee(t){let e=Nt[t];return e?e.family:(console.warn(`Font ID "${t}" not found in registry, using fallback`),"Arial, sans-serif")}function te(t){var n;let e=Nt[t];return e&&(n=e.weight)!=null?n:"400"}function bs(t,e){Nt[t]=e}function vs(){return Object.keys(Nt)}var Ve=ge(require("three"),1);function _e(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 ws(t,e,n,i){var ni,ii,ai,si,ri,oi,li,ci,di,pi,ui,gi,hi,mi,fi,yi,bi,vi,wi,xi,Si,Ei,Ci,Ai,Ti,Li,ki,Pi,_i,Mi,Ii,ji,Oi,Ri,zi,$i,Hi,Di,Ni,Fi,Bi,Gi,Ui,qi,Vi,Wi,Yi,Ki,Xi,Ji,Zi,Qi,ea,ta,na,ia,aa,sa,ra,oa,la;let a=t.objects.get("ui_endgame_1"),s=t.objects.get("ui_endgame_logo_1"),r=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=((ni=a==null?void 0:a.gameplay)==null?void 0:ni.tuning)||{},y=(a==null?void 0:a.render)||{},h=i.getBoundingClientRect(),w=h.width>0?h.width*.9:320,v=h.height>0?h.height*.85:400,b=Math.min((ii=u.panel_width)!=null?ii:320,w),m=Math.min((ai=u.panel_height)!=null?ai:400,v),f=(si=u.panel_padding)!=null?si:32,S=(ri=u.panel_radius)!=null?ri:24,E=y.background_color||u.panel_bg_color||"#1a0a0a",C=y.background_alpha!==void 0&&y.background_alpha!==null?y.background_alpha:(oi=u.panel_bg_alpha)!=null?oi:.98,P=y.border_color||u.panel_border_color||"#ffffff",I=(li=u.panel_border_width)!=null?li:2,L=(ci=u.panel_border_alpha)!=null?ci:.3,k=document.createElement("div");k.style.cssText=`
268
+ `)});let E=f.width,C=f.height;if((E<=0||!isFinite(E))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:f.width,clientWidth:t.clientWidth}),E=t.clientWidth||window.innerWidth||320),(C<=0||!isFinite(C))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:f.height,clientHeight:t.clientHeight}),C=t.clientHeight||window.innerHeight||480),typeof(m==null?void 0:m.width)=="number"&&m.width>0){let R=Math.abs(m.width-f.width),j=f.width*.1;R>j?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:m.width,container:f.width,difference:R,tolerance:j,willUse:"container size (boundingRect)"}):(E=m.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:m.width,container:f.width}))}if(typeof(m==null?void 0:m.height)=="number"&&m.height>0){let R=Math.abs(m.height-f.height),j=f.height*.1;R>j?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:m.height,container:f.height,difference:R,tolerance:j,willUse:"container size (boundingRect)"}):(C=m.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:m.height,container:f.height}))}(E<=0||C<=0||!isFinite(E)||!isFinite(C))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:E,newHeight:C,size:m,rootRect:f}),E=f.width||t.clientWidth||320,C=f.height||t.clientHeight||480);let P=Math.floor(E),I=Math.floor(C);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:P,finalHeight:I,aspectRatio:P/I,beforeRendererSize:{width:h.domElement.width,height:h.domElement.height},beforeRendererStyle:{width:h.domElement.style.width,height:h.domElement.style.height}}),h.setSize(P,I),h.setPixelRatio(window.devicePixelRatio||1),y.aspect=P/I,y.updateProjectionMatrix();let L=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:L.width,height:L.height},cameraAspect:y.aspect,matches:{width:Math.abs(h.domElement.width-L.width)<1,height:Math.abs(h.domElement.height-L.height)<1},sizeDifference:{width:h.domElement.width-L.width,height:h.domElement.height-L.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{w()})});let v=!1;Re.on("pause",()=>{v=!0,document.querySelectorAll("audio").forEach(f=>f.pause())}),Re.on("resume",()=>{v=!1,document.querySelectorAll("audio").forEach(f=>{f.currentTime>0&&!f.ended&&f.play().catch(()=>{})})});let b=new qe(t,r);return Re.on("resize",({payload:m})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:m,timestamp:Date.now(),rootRect:t.getBoundingClientRect()}),w({width:m==null?void 0:m.width,height:m==null?void 0:m.height}),b.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()}),w(),b.updateLayout()}),{scene:l,camera:y,renderer:h,uiSystem:b,applySize:w}}var z=ge(require("three"),1),ot=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}},lt=class{constructor(e){var n,i,a,s;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=(s=e==null?void 0:e.tint)!=null?s: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 z.Mesh&&e.material&&(Array.isArray(e.material)?e.material.forEach(n=>{n instanceof z.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):e.material instanceof z.Material&&(e.material.opacity=this.alpha,e.material.transparent=this.alpha<1)),this.tint!==null&&e instanceof z.Mesh&&e.material){let n=typeof this.tint=="string"?new z.Color(this.tint):new z.Color(this.tint);Array.isArray(e.material)?e.material.forEach(i=>{(i instanceof z.MeshBasicMaterial||i instanceof z.MeshStandardMaterial)&&i.color.copy(n)}):(e.material instanceof z.MeshBasicMaterial||e.material instanceof z.MeshStandardMaterial)&&e.material.color.copy(n)}}},ct=class{constructor(e,n,i,a){this.instanceId=e,this.objectConfig=n,this.threeObject=i,this._config=a,this.transform=new ot(a.transform),this.renderer=new lt(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)}},Dt=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 ct(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 Nt={"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 ee(t){let e=Nt[t];return e?e.family:(console.warn(`Font ID "${t}" not found in registry, using fallback`),"Arial, sans-serif")}function te(t){var n;let e=Nt[t];return e&&(n=e.weight)!=null?n:"400"}function bs(t,e){Nt[t]=e}function vs(){return Object.keys(Nt)}var Ve=ge(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 ws(t,e,n,i){var ii,ai,si,ri,oi,li,ci,di,pi,ui,gi,hi,mi,fi,yi,bi,vi,wi,xi,Si,Ei,Ci,Ai,Ti,Li,ki,Pi,Mi,_i,Ii,ji,Oi,Ri,zi,$i,Hi,Di,Ni,Fi,Bi,Gi,Ui,qi,Vi,Wi,Yi,Ki,Xi,Ji,Zi,Qi,ea,ta,na,ia,aa,sa,ra,oa,la,ca;let a=t.objects.get("ui_endgame_1"),s=t.objects.get("ui_endgame_logo_1"),r=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=((ii=a==null?void 0:a.gameplay)==null?void 0:ii.tuning)||{},y=(a==null?void 0:a.render)||{},h=i.getBoundingClientRect(),w=h.width>0?h.width*.9:320,v=h.height>0?h.height*.85:400,b=Math.min((ai=u.panel_width)!=null?ai:320,w),m=Math.min((si=u.panel_height)!=null?si:400,v),f=(ri=u.panel_padding)!=null?ri:32,S=(oi=u.panel_radius)!=null?oi:24,E=y.background_color||u.panel_bg_color||"#1a0a0a",C=y.background_alpha!==void 0&&y.background_alpha!==null?y.background_alpha:(li=u.panel_bg_alpha)!=null?li:.98,P=y.border_color||u.panel_border_color||"#ffffff",I=(ci=u.panel_border_width)!=null?ci:2,L=(di=u.panel_border_alpha)!=null?di:.3,k=document.createElement("div");k.style.cssText=`
269
269
  position: absolute;
270
270
  width: ${b}px;
271
271
  height: ${m}px;
@@ -284,24 +284,24 @@ 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: ${f}px;
287
- `,i.appendChild(k);let R=_e(k);R.element=k;let j=((di=s==null?void 0:s.gameplay)==null?void 0:di.tuning)||{},be=(s==null?void 0:s.transform)||{},q=(pi=j.logo_size)!=null?pi:56,Y=(ui=be.scale)!=null?ui:1,Me=(hi=(gi=be.offset)==null?void 0:gi.y)!=null?hi:-130,dt=(mi=j.logo_alpha)!=null?mi:1,_s=new Ve.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),K=new Ve.Sprite(_s);K.position.set(0,Me,0),K.material.opacity=0;let pt=0,ut=0;if(n){let $=n.image;pt=($==null?void 0:$.width)||100,ut=($==null?void 0:$.height)||100}if(pt>0&&ut>0){let $=pt/ut,Xt,Jt;$>1?(Xt=q,Jt=q/$):(Jt=q,Xt=q*$);let mr=Xt/pt*Y,fr=Jt/ut*Y;K.scale.set(mr,fr,1)}else{let $=q/100*Y;K.scale.set($,$,1)}K.targetAlpha=dt,K.baseScaleX=K.scale.x,K.baseScaleY=K.scale.y;let H=r==null?void 0:r.ui,ne=((fi=r==null?void 0:r.gameplay)==null?void 0:fi.tuning)||{},Ms=(H==null?void 0:H.text)||"MISSION ACCOMPLISHED",Fn=(H==null?void 0:H.font)||"brand.heading",Bt=(H==null?void 0:H.fontSize)||24,Is=(yi=H==null?void 0:H.letterSpacing)!=null?yi:1,gt=(bi=r==null?void 0:r.render)==null?void 0:bi.tint,js=typeof gt=="string"?gt:gt?`#${gt.toString(16).padStart(6,"0")}`:"#00FF88",Os=b-f*2-30,Rs=ne.font_weight_override?ne.font_weight_override:te(Fn),ve=document.createElement("div");ve.textContent=Ms,ve.style.cssText=`
288
- font-family: ${ee(Fn)};
287
+ `,i.appendChild(k);let R=Me(k);R.element=k;let j=((pi=s==null?void 0:s.gameplay)==null?void 0:pi.tuning)||{},be=(s==null?void 0:s.transform)||{},q=(ui=j.logo_size)!=null?ui:56,Y=(gi=be.scale)!=null?gi:1,_e=(mi=(hi=be.offset)==null?void 0:hi.y)!=null?mi:-130,dt=(fi=j.logo_alpha)!=null?fi:1,Ms=new Ve.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),K=new Ve.Sprite(Ms);K.position.set(0,_e,0),K.material.opacity=0;let pt=0,ut=0;if(n){let $=n.image;pt=($==null?void 0:$.width)||100,ut=($==null?void 0:$.height)||100}if(pt>0&&ut>0){let $=pt/ut,Xt,Jt;$>1?(Xt=q,Jt=q/$):(Jt=q,Xt=q*$);let mr=Xt/pt*Y,fr=Jt/ut*Y;K.scale.set(mr,fr,1)}else{let $=q/100*Y;K.scale.set($,$,1)}K.targetAlpha=dt,K.baseScaleX=K.scale.x,K.baseScaleY=K.scale.y;let H=r==null?void 0:r.ui,ne=((yi=r==null?void 0:r.gameplay)==null?void 0:yi.tuning)||{},_s=(H==null?void 0:H.text)||"MISSION ACCOMPLISHED",Bn=(H==null?void 0:H.font)||"brand.heading",Bt=(H==null?void 0:H.fontSize)||24,Is=(bi=H==null?void 0:H.letterSpacing)!=null?bi:1,gt=(vi=r==null?void 0:r.render)==null?void 0:vi.tint,js=typeof gt=="string"?gt:gt?`#${gt.toString(16).padStart(6,"0")}`:"#00FF88",Os=b-f*2-30,Rs=ne.font_weight_override?ne.font_weight_override:te(Bn),ve=document.createElement("div");ve.textContent=_s,ve.style.cssText=`
288
+ font-family: ${ee(Bn)};
289
289
  font-size: ${Bt}px;
290
290
  font-weight: ${Rs};
291
291
  color: ${js};
292
292
  text-align: center;
293
293
  letter-spacing: ${Is}px;
294
- -webkit-text-stroke: ${(vi=ne.stroke_width)!=null?vi:2}px ${ne.stroke_color||"#000000"};
295
- text-shadow: ${(wi=ne.shadow_distance)!=null?wi:4}px ${(xi=ne.shadow_distance)!=null?xi:4}px ${(Si=ne.shadow_blur)!=null?Si:8}px rgba(0,0,0,${(Ei=ne.shadow_alpha)!=null?Ei:.9});
294
+ -webkit-text-stroke: ${(wi=ne.stroke_width)!=null?wi:2}px ${ne.stroke_color||"#000000"};
295
+ text-shadow: ${(xi=ne.shadow_distance)!=null?xi:4}px ${(Si=ne.shadow_distance)!=null?Si:4}px ${(Ei=ne.shadow_blur)!=null?Ei:8}px rgba(0,0,0,${(Ci=ne.shadow_alpha)!=null?Ci:.9});
296
296
  opacity: 0;
297
297
  position: absolute;
298
298
  transform: translate(-50%, -50%);
299
299
  white-space: nowrap;
300
300
  max-width: ${Os}px;
301
- `;let Bn=f+30,zs=((Ci=u.title_offset_y)!=null?Ci:Bn+Bt/2)+((Ai=ne.animation_start_y_offset)!=null?Ai:-20);ve.style.top=`${zs}px`,ve.style.left="50%";let Gn=_e(ve);Gn.element=ve,k.appendChild(ve);let D=o==null?void 0:o.ui,Un=((Ti=o==null?void 0:o.gameplay)==null?void 0:Ti.tuning)||{},$s=(D==null?void 0:D.text)||"RESCUE COMPLETE",qn=(D==null?void 0:D.font)||"brand.body",Gt=(D==null?void 0:D.fontSize)||11,Hs=(Li=D==null?void 0:D.letterSpacing)!=null?Li:.5,ht=(ki=o==null?void 0:o.render)==null?void 0:ki.tint,Ds=typeof ht=="string"?ht:ht?`#${ht.toString(16).padStart(6,"0")}`:"#B0B0B0",we=document.createElement("div");we.textContent=$s,we.style.cssText=`
302
- font-family: ${ee(qn)};
301
+ `;let Gn=f+30,zs=((Ai=u.title_offset_y)!=null?Ai:Gn+Bt/2)+((Ti=ne.animation_start_y_offset)!=null?Ti:-20);ve.style.top=`${zs}px`,ve.style.left="50%";let Un=Me(ve);Un.element=ve,k.appendChild(ve);let D=o==null?void 0:o.ui,qn=((Li=o==null?void 0:o.gameplay)==null?void 0:Li.tuning)||{},$s=(D==null?void 0:D.text)||"RESCUE COMPLETE",Vn=(D==null?void 0:D.font)||"brand.body",Gt=(D==null?void 0:D.fontSize)||11,Hs=(ki=D==null?void 0:D.letterSpacing)!=null?ki:.5,ht=(Pi=o==null?void 0:o.render)==null?void 0:Pi.tint,Ds=typeof ht=="string"?ht:ht?`#${ht.toString(16).padStart(6,"0")}`:"#B0B0B0",we=document.createElement("div");we.textContent=$s,we.style.cssText=`
302
+ font-family: ${ee(Vn)};
303
303
  font-size: ${Gt}px;
304
- font-weight: ${te(qn)};
304
+ font-weight: ${te(Vn)};
305
305
  color: ${Ds};
306
306
  text-align: center;
307
307
  letter-spacing: ${Hs}px;
@@ -309,10 +309,10 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
309
309
  position: absolute;
310
310
  transform: translate(-50%, -50%);
311
311
  white-space: nowrap;
312
- `;let Vn=Bn+Bt+15,Ns=((Pi=u.subtitle_offset_y)!=null?Pi:Vn+Gt/2)+((_i=Un.animation_start_y_offset)!=null?_i:-10);we.style.top=`${Ns}px`,we.style.left="50%";let Ut=_e(we);Ut.element=we,Ut.animationStartYOffset=(Mi=Un.animation_start_y_offset)!=null?Mi:-10,k.appendChild(we);let ie=l==null?void 0:l.ui,Wn=((Ii=l==null?void 0:l.gameplay)==null?void 0:Ii.tuning)||{},Fs=(ie==null?void 0:ie.text)||((ji=g.ui)==null?void 0:ji.cta_hint)||"Continue the adventure!",Yn=(ie==null?void 0:ie.font)||"brand.body",Kn=(ie==null?void 0:ie.fontSize)||16,mt=(Oi=l==null?void 0:l.render)==null?void 0:Oi.tint,Bs=typeof mt=="string"?mt:mt?`#${mt.toString(16).padStart(6,"0")}`:"#FFFFFF",Gs=(Ri=Wn.max_width)!=null?Ri:b-f*2,Us=(zi=Wn.line_height)!=null?zi:1.4,xe=document.createElement("div");xe.textContent=Fs,xe.style.cssText=`
313
- font-family: ${ee(Yn)};
314
- font-size: ${Kn}px;
315
- font-weight: ${te(Yn)};
312
+ `;let Wn=Gn+Bt+15,Ns=((Mi=u.subtitle_offset_y)!=null?Mi:Wn+Gt/2)+((_i=qn.animation_start_y_offset)!=null?_i:-10);we.style.top=`${Ns}px`,we.style.left="50%";let Ut=Me(we);Ut.element=we,Ut.animationStartYOffset=(Ii=qn.animation_start_y_offset)!=null?Ii:-10,k.appendChild(we);let ie=l==null?void 0:l.ui,Yn=((ji=l==null?void 0:l.gameplay)==null?void 0:ji.tuning)||{},Fs=(ie==null?void 0:ie.text)||((Oi=g.ui)==null?void 0:Oi.cta_hint)||"Continue the adventure!",Kn=(ie==null?void 0:ie.font)||"brand.body",Xn=(ie==null?void 0:ie.fontSize)||16,mt=(Ri=l==null?void 0:l.render)==null?void 0:Ri.tint,Bs=typeof mt=="string"?mt:mt?`#${mt.toString(16).padStart(6,"0")}`:"#FFFFFF",Gs=(zi=Yn.max_width)!=null?zi:b-f*2,Us=($i=Yn.line_height)!=null?$i:1.4,xe=document.createElement("div");xe.textContent=Fs,xe.style.cssText=`
313
+ font-family: ${ee(Kn)};
314
+ font-size: ${Xn}px;
315
+ font-weight: ${te(Kn)};
316
316
  color: ${Bs};
317
317
  text-align: center;
318
318
  opacity: 0;
@@ -321,9 +321,9 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
321
321
  max-width: ${Gs}px;
322
322
  line-height: ${Us};
323
323
  word-wrap: break-word;
324
- `;let qs=Vn+Gt+30,Vs=($i=u.footer_offset_y)!=null?$i:qs+Kn/2;xe.style.top=`${Vs}px`,xe.style.left="50%";let qt=_e(xe);qt.element=xe;let Ws=((Hi=l==null?void 0:l.render)==null?void 0:Hi.alpha)!==void 0&&((Di=l==null?void 0:l.render)==null?void 0:Di.alpha)!==null?l.render.alpha:1;qt.targetAlpha=Ws,k.appendChild(xe);let ae=((Ni=d==null?void 0:d.gameplay)==null?void 0:Ni.tuning)||{},N=d==null?void 0:d.ui,Ys=(Fi=ae.button_width)!=null?Fi:260,Xn=(Bi=ae.button_height)!=null?Bi:56,Ks=(Gi=ae.button_radius)!=null?Gi:16,Xs=ae.button_bg_color||((Ui=g.theme)==null?void 0:Ui.cta_background)||"#ffb43b",Js=(qi=ae.button_bg_alpha)!=null?qi:1,Zs=ae.button_border_color||"#ffffff",Qs=(Vi=ae.button_border_width)!=null?Vi:2,il=(Wi=ae.button_border_alpha)!=null?Wi:.2,Vt=(Yi=u.cta_offset_y)!=null?Yi:m*.7,O=document.createElement("button");O.style.cssText=`
324
+ `;let qs=Wn+Gt+30,Vs=(Hi=u.footer_offset_y)!=null?Hi:qs+Xn/2;xe.style.top=`${Vs}px`,xe.style.left="50%";let qt=Me(xe);qt.element=xe;let Ws=((Di=l==null?void 0:l.render)==null?void 0:Di.alpha)!==void 0&&((Ni=l==null?void 0:l.render)==null?void 0:Ni.alpha)!==null?l.render.alpha:1;qt.targetAlpha=Ws,k.appendChild(xe);let ae=((Fi=d==null?void 0:d.gameplay)==null?void 0:Fi.tuning)||{},N=d==null?void 0:d.ui,Ys=(Bi=ae.button_width)!=null?Bi:260,Jn=(Gi=ae.button_height)!=null?Gi:56,Ks=(Ui=ae.button_radius)!=null?Ui:16,Xs=ae.button_bg_color||((qi=g.theme)==null?void 0:qi.cta_background)||"#ffb43b",Js=(Vi=ae.button_bg_alpha)!=null?Vi:1,Zs=ae.button_border_color||"#ffffff",Qs=(Wi=ae.button_border_width)!=null?Wi:2,il=(Yi=ae.button_border_alpha)!=null?Yi:.2,Vt=(Ki=u.cta_offset_y)!=null?Ki:m*.7,O=document.createElement("button");O.style.cssText=`
325
325
  width: ${Ys}px;
326
- height: ${Xn}px;
326
+ height: ${Jn}px;
327
327
  background: ${Xs};
328
328
  opacity: ${Js};
329
329
  border: ${Qs}px solid ${Zs};
@@ -333,10 +333,10 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
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
- `,O.style.top=`${Vt}px`,O.style.left="50%";let Wt=_e(O);Wt.element=O,Wt.addEventListener=O.addEventListener.bind(O),k.appendChild(O);let er=(N==null?void 0:N.text)||((Ki=g.ui)==null?void 0:Ki.cta_label_end)||"DOWNLOAD",Jn=(N==null?void 0:N.font)||"brand.heading",tr=(N==null?void 0:N.fontSize)||20,nr=ae.button_text_color||((Xi=g.theme)==null?void 0:Xi.cta_text)||"#1a0a0a";O.textContent=er,O.style.fontFamily=ee(Jn),O.style.fontSize=`${tr}px`,O.style.fontWeight=String(te(Jn)),O.style.color=nr,O.style.letterSpacing=`${(Ji=N==null?void 0:N.letterSpacing)!=null?Ji:1}px`;let Zn=_e(O);Zn.element=O;let F=p==null?void 0:p.ui,Qn=((Zi=p==null?void 0:p.gameplay)==null?void 0:Zi.tuning)||{},ir=(F==null?void 0:F.text)||"Play the full game",ei=(F==null?void 0:F.font)||"brand.body",ar=(F==null?void 0:F.fontSize)||11,sr=(Qi=F==null?void 0:F.letterSpacing)!=null?Qi:0,ft=(ea=p==null?void 0:p.render)==null?void 0:ea.tint,rr=typeof ft=="string"?ft:ft?`#${ft.toString(16).padStart(6,"0")}`:"#CCCCCC",Se=document.createElement("div");Se.textContent=ir,Se.style.cssText=`
337
- font-family: ${ee(ei)};
336
+ `,O.style.top=`${Vt}px`,O.style.left="50%";let Wt=Me(O);Wt.element=O,Wt.addEventListener=O.addEventListener.bind(O),k.appendChild(O);let er=(N==null?void 0:N.text)||((Xi=g.ui)==null?void 0:Xi.cta_label_end)||"DOWNLOAD",Zn=(N==null?void 0:N.font)||"brand.heading",tr=(N==null?void 0:N.fontSize)||20,nr=ae.button_text_color||((Ji=g.theme)==null?void 0:Ji.cta_text)||"#1a0a0a";O.textContent=er,O.style.fontFamily=ee(Zn),O.style.fontSize=`${tr}px`,O.style.fontWeight=String(te(Zn)),O.style.color=nr,O.style.letterSpacing=`${(Zi=N==null?void 0:N.letterSpacing)!=null?Zi:1}px`;let Qn=Me(O);Qn.element=O;let F=p==null?void 0:p.ui,ei=((Qi=p==null?void 0:p.gameplay)==null?void 0:Qi.tuning)||{},ir=(F==null?void 0:F.text)||"Play the full game",ti=(F==null?void 0:F.font)||"brand.body",ar=(F==null?void 0:F.fontSize)||11,sr=(ea=F==null?void 0:F.letterSpacing)!=null?ea:0,ft=(ta=p==null?void 0:p.render)==null?void 0:ta.tint,rr=typeof ft=="string"?ft:ft?`#${ft.toString(16).padStart(6,"0")}`:"#CCCCCC",Se=document.createElement("div");Se.textContent=ir,Se.style.cssText=`
337
+ font-family: ${ee(ti)};
338
338
  font-size: ${ar}px;
339
- font-weight: ${te(ei)};
339
+ font-weight: ${te(ti)};
340
340
  color: ${rr};
341
341
  text-align: center;
342
342
  letter-spacing: ${sr}px;
@@ -344,7 +344,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
344
344
  position: absolute;
345
345
  transform: translate(-50%, -50%);
346
346
  white-space: nowrap;
347
- `;let or=Vt+Xn/2+20,lr=m-f-10,cr=Math.min(or+((ta=Qn.animation_start_y_offset)!=null?ta:5),lr);Se.style.top=`${cr}px`,Se.style.left="50%";let Yt=_e(Se);Yt.element=Se,Yt.animationStartYOffset=(na=Qn.animation_start_y_offset)!=null?na:5,k.appendChild(Se);let Kt=((ia=c==null?void 0:c.gameplay)==null?void 0:ia.tuning)||{},dr=(aa=Kt.hand_offset_x)!=null?aa:50,pr=(sa=Kt.hand_offset_y)!=null?sa:50,ur=(oa=(ra=c==null?void 0:c.transform)==null?void 0:ra.scale)!=null?oa:.1875,gr=(la=Kt.hand_scale_multiplier)!=null?la:2.5,hr=new Ve.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),Ye=new Ve.Sprite(hr),ti=ur*gr*100;return Ye.scale.set(ti,ti,1),Ye.position.set(dr,Vt+pr,0),Ye.material.opacity=0,Ye.visible=!1,{panel:R,logo:K,title:Gn,subtitle:Ut,footer:qt,ctaButton:Wt,ctaText:Zn,ctaHint:Yt,hand:Ye}}function xs(t,e,n){var E,C,P,I,L,k,R,j;let i=e.objects.get("ui_endgame_1"),a=((E=i==null?void 0:i.gameplay)==null?void 0:E.tuning)||{},s=(C=a.animation_duration_ms)!=null?C:800,r=(P=a.fade_in_duration_ms)!=null?P:600,o=(I=a.scale_animation_intensity)!=null?I:.1,l=(L=a.logo_animation_delay_ms)!=null?L:100,d=(k=a.title_animation_delay_ms)!=null?k:200,p=(R=a.footer_animation_delay_ms)!=null?R:300,c=(j=a.cta_animation_delay_ms)!=null?j:400,{panel:g,logo:u,title:y,subtitle:h,footer:w,ctaButton:v,ctaText:b,ctaHint:m}=t;g.visible=!0,g.element.style.visibility="visible";let f=Date.now(),S=()=>{let be=Date.now()-f,q=Math.min(be/r,1),Y=1-Math.pow(1-q,3);g.alpha=Y,g.element.style.opacity=Y.toString();let Me=1+o*(1-Y);g.element.style.transform=`translate(-50%, -50%) scale(${Me})`,q<1?requestAnimationFrame(S):(setTimeout(()=>Yo(u,s,e),l),setTimeout(()=>{Ko(y,s),setTimeout(()=>Xo(h,s),50)},d),setTimeout(()=>Jo(w,s),p),setTimeout(()=>{Zo(v,b,s),setTimeout(()=>Qo(m,s),50),n&&n()},c))};S()}function Yo(t,e,n){var g,u,y,h,w;let i=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(u=(((g=i==null?void 0:i.gameplay)==null?void 0:g.tuning)||{}).animation_start_scale)!=null?u:1.2,r=Date.now(),o=t.material.opacity,l=(y=t.targetAlpha)!=null?y:1,d=(h=t.baseScaleX)!=null?h:t.scale.x,p=(w=t.baseScaleY)!=null?w:t.scale.y,c=()=>{let v=Date.now()-r,b=Math.min(v/e,1),m=1-Math.pow(1-b,2);t.material.opacity=o+(l-o)*m;let f=s+(1-s)*m;t.scale.set(d*f,p*f,1),b<1&&requestAnimationFrame(c)};c()}function Ko(t,e){let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=()=>{let r=Date.now()-n,o=Math.min(r/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(s)};s()}function Xo(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=a-((o=t.animationStartYOffset)!=null?o:-10),r=()=>{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+(s-a)*p}px`,d<1&&requestAnimationFrame(r)};r()}function Jo(t,e){var r;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=(r=t.targetAlpha)!=null?r:1,s=()=>{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(s)};s()}function Zo(t,e,n){let i=Date.now(),a=parseFloat(t.element.style.opacity||"0"),s=()=>{let r=Date.now()-i,o=Math.min(r/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(s)};s()}function Qo(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=a-((o=t.animationStartYOffset)!=null?o:5),r=()=>{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+(s-a)*p}px`,d<1&&requestAnimationFrame(r)};r()}function Ss(t,e,n,i){var p,c,g,u;let a=n.objects.get("ui_endgame_hand_1"),s=((p=a==null?void 0:a.gameplay)==null?void 0:p.tuning)||{},r=(c=s.click_animation_duration_ms)!=null?c:600,o=(g=s.click_delay_ms)!=null?g:2e3,l=(u=s.click_repeat_delay_ms)!=null?u:3e3,d=()=>{var C,P;t.visible=!0,t.material.opacity=1;let y=t.position.x,h=t.position.y,w=(C=s.hand_offset_x)!=null?C:50,v=(P=s.hand_offset_y)!=null?P:50,b=e.element.getBoundingClientRect(),m=w,f=v,S=Date.now(),E=()=>{var Y,Me,dt;let I=Date.now()-S,L=Math.min(I/r,1),k=L<.5?2*L*L:1-Math.pow(-2*L+2,2)/2;t.position.set(y+(m-y)*k,h+(f-h)*k,0);let R=(Me=(Y=a==null?void 0:a.transform)==null?void 0:Y.scale)!=null?Me:.1875,j=(dt=s.hand_scale_multiplier)!=null?dt:2.5,be=R*j*100,q=be+be*.2*Math.sin(L*Math.PI);t.scale.set(q,q,1),L<1?requestAnimationFrame(E):(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(y,h,0),d()},l)},500))};E()};setTimeout(d,o)}var Ft=ge(require("three"),1);function Es(t,e,n){var u,y,h,w,v,b,m;let i=e.objects.get("hand_tutorial_1"),a=((u=i==null?void 0:i.gameplay)==null?void 0:u.tuning)||{},s=(i==null?void 0:i.render)||{},r=(i==null?void 0:i.transform)||{},o=new Ft.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),l=new Ft.Sprite(o),d=r.position||{},p=(y=d==null?void 0:d.z)!=null?y:0;l.position.set(n.x+((h=d==null?void 0:d.x)!=null?h:0),n.y+((w=d==null?void 0:d.y)!=null?w:0),p),l.material.opacity=s.alpha!==void 0&&s.alpha!==null?s.alpha:0,l.visible=s.visible!==void 0&&s.visible!==null?s.visible:!1;let c=(v=a.hand_scale_multiplier)!=null?v:2.5,g=(b=r.scale)!=null?b:.1875;return l.scale.set(g*c*100,g*c*100,1),l.renderOrder=(m=s.z_index)!=null?m:99999,l}function Cs(t){var y,h,w,v,b,m,f,S,E;let e=t.objects.get("ui_tutorial_1"),n=e==null?void 0:e.ui,i=(e==null?void 0:e.render)||{},a=((y=t.engine.runtime)==null?void 0:y.ui_styles)||{},s=((h=t.engine.runtime)==null?void 0:h.ui)||{},r=(n==null?void 0:n.text)||s.tutorial_label||s.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:(w=a.label_letter_spacing)!=null?w:-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=r,u.style.cssText=`
347
+ `;let or=Vt+Jn/2+20,lr=m-f-10,cr=Math.min(or+((na=ei.animation_start_y_offset)!=null?na:5),lr);Se.style.top=`${cr}px`,Se.style.left="50%";let Yt=Me(Se);Yt.element=Se,Yt.animationStartYOffset=(ia=ei.animation_start_y_offset)!=null?ia:5,k.appendChild(Se);let Kt=((aa=c==null?void 0:c.gameplay)==null?void 0:aa.tuning)||{},dr=(sa=Kt.hand_offset_x)!=null?sa:50,pr=(ra=Kt.hand_offset_y)!=null?ra:50,ur=(la=(oa=c==null?void 0:c.transform)==null?void 0:oa.scale)!=null?la:.1875,gr=(ca=Kt.hand_scale_multiplier)!=null?ca:2.5,hr=new Ve.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),Ye=new Ve.Sprite(hr),ni=ur*gr*100;return Ye.scale.set(ni,ni,1),Ye.position.set(dr,Vt+pr,0),Ye.material.opacity=0,Ye.visible=!1,{panel:R,logo:K,title:Un,subtitle:Ut,footer:qt,ctaButton:Wt,ctaText:Qn,ctaHint:Yt,hand:Ye}}function xs(t,e,n){var E,C,P,I,L,k,R,j;let i=e.objects.get("ui_endgame_1"),a=((E=i==null?void 0:i.gameplay)==null?void 0:E.tuning)||{},s=(C=a.animation_duration_ms)!=null?C:800,r=(P=a.fade_in_duration_ms)!=null?P:600,o=(I=a.scale_animation_intensity)!=null?I:.1,l=(L=a.logo_animation_delay_ms)!=null?L:100,d=(k=a.title_animation_delay_ms)!=null?k:200,p=(R=a.footer_animation_delay_ms)!=null?R:300,c=(j=a.cta_animation_delay_ms)!=null?j:400,{panel:g,logo:u,title:y,subtitle:h,footer:w,ctaButton:v,ctaText:b,ctaHint:m}=t;g.visible=!0,g.element.style.visibility="visible";let f=Date.now(),S=()=>{let be=Date.now()-f,q=Math.min(be/r,1),Y=1-Math.pow(1-q,3);g.alpha=Y,g.element.style.opacity=Y.toString();let _e=1+o*(1-Y);g.element.style.transform=`translate(-50%, -50%) scale(${_e})`,q<1?requestAnimationFrame(S):(setTimeout(()=>Yo(u,s,e),l),setTimeout(()=>{Ko(y,s),setTimeout(()=>Xo(h,s),50)},d),setTimeout(()=>Jo(w,s),p),setTimeout(()=>{Zo(v,b,s),setTimeout(()=>Qo(m,s),50),n&&n()},c))};S()}function Yo(t,e,n){var g,u,y,h,w;let i=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(u=(((g=i==null?void 0:i.gameplay)==null?void 0:g.tuning)||{}).animation_start_scale)!=null?u:1.2,r=Date.now(),o=t.material.opacity,l=(y=t.targetAlpha)!=null?y:1,d=(h=t.baseScaleX)!=null?h:t.scale.x,p=(w=t.baseScaleY)!=null?w:t.scale.y,c=()=>{let v=Date.now()-r,b=Math.min(v/e,1),m=1-Math.pow(1-b,2);t.material.opacity=o+(l-o)*m;let f=s+(1-s)*m;t.scale.set(d*f,p*f,1),b<1&&requestAnimationFrame(c)};c()}function Ko(t,e){let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=()=>{let r=Date.now()-n,o=Math.min(r/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(s)};s()}function Xo(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=a-((o=t.animationStartYOffset)!=null?o:-10),r=()=>{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+(s-a)*p}px`,d<1&&requestAnimationFrame(r)};r()}function Jo(t,e){var r;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=(r=t.targetAlpha)!=null?r:1,s=()=>{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(s)};s()}function Zo(t,e,n){let i=Date.now(),a=parseFloat(t.element.style.opacity||"0"),s=()=>{let r=Date.now()-i,o=Math.min(r/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(s)};s()}function Qo(t,e){var o;let n=Date.now(),i=parseFloat(t.element.style.opacity||"0"),a=parseFloat(t.element.style.top||"0"),s=a-((o=t.animationStartYOffset)!=null?o:5),r=()=>{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+(s-a)*p}px`,d<1&&requestAnimationFrame(r)};r()}function Ss(t,e,n,i){var p,c,g,u;let a=n.objects.get("ui_endgame_hand_1"),s=((p=a==null?void 0:a.gameplay)==null?void 0:p.tuning)||{},r=(c=s.click_animation_duration_ms)!=null?c:600,o=(g=s.click_delay_ms)!=null?g:2e3,l=(u=s.click_repeat_delay_ms)!=null?u:3e3,d=()=>{var C,P;t.visible=!0,t.material.opacity=1;let y=t.position.x,h=t.position.y,w=(C=s.hand_offset_x)!=null?C:50,v=(P=s.hand_offset_y)!=null?P:50,b=e.element.getBoundingClientRect(),m=w,f=v,S=Date.now(),E=()=>{var Y,_e,dt;let I=Date.now()-S,L=Math.min(I/r,1),k=L<.5?2*L*L:1-Math.pow(-2*L+2,2)/2;t.position.set(y+(m-y)*k,h+(f-h)*k,0);let R=(_e=(Y=a==null?void 0:a.transform)==null?void 0:Y.scale)!=null?_e:.1875,j=(dt=s.hand_scale_multiplier)!=null?dt:2.5,be=R*j*100,q=be+be*.2*Math.sin(L*Math.PI);t.scale.set(q,q,1),L<1?requestAnimationFrame(E):(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(y,h,0),d()},l)},500))};E()};setTimeout(d,o)}var Ft=ge(require("three"),1);function Es(t,e,n){var u,y,h,w,v,b,m;let i=e.objects.get("hand_tutorial_1"),a=((u=i==null?void 0:i.gameplay)==null?void 0:u.tuning)||{},s=(i==null?void 0:i.render)||{},r=(i==null?void 0:i.transform)||{},o=new Ft.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),l=new Ft.Sprite(o),d=r.position||{},p=(y=d==null?void 0:d.z)!=null?y:0;l.position.set(n.x+((h=d==null?void 0:d.x)!=null?h:0),n.y+((w=d==null?void 0:d.y)!=null?w:0),p),l.material.opacity=s.alpha!==void 0&&s.alpha!==null?s.alpha:0,l.visible=s.visible!==void 0&&s.visible!==null?s.visible:!1;let c=(v=a.hand_scale_multiplier)!=null?v:2.5,g=(b=r.scale)!=null?b:.1875;return l.scale.set(g*c*100,g*c*100,1),l.renderOrder=(m=s.z_index)!=null?m:99999,l}function Cs(t){var y,h,w,v,b,m,f,S,E;let e=t.objects.get("ui_tutorial_1"),n=e==null?void 0:e.ui,i=(e==null?void 0:e.render)||{},a=((y=t.engine.runtime)==null?void 0:y.ui_styles)||{},s=((h=t.engine.runtime)==null?void 0:h.ui)||{},r=(n==null?void 0:n.text)||s.tutorial_label||s.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:(w=a.label_letter_spacing)!=null?w:-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=r,u.style.cssText=`
348
348
  font-family: ${ee(o)};
349
349
  font-size: ${l}px;
350
350
  font-weight: ${te(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 As(t,e,n,i,a){var l,d,p,c,g,u,y;let s=a.objects.get("hand_tutorial_1"),r=((l=s==null?void 0:s.gameplay)==null?void 0:l.tuning)||{},o=(s==null?void 0:s.transform)||{};if(!i){let h=(d=r.animation_duration)!=null?d:1.5,w=n%h/h,v=w<.5?2*w*w:-1+(4-2*w)*w,b=(p=r.x_offset)!=null?p:0,m=(c=r.y_offset)!=null?c:0,f=(g=r.animation_range)!=null?g:40,S=f*.7,E=f,C=e.x+b+S,P=e.y+m+E,I=C+S,L=P+E;t.position.set(C+(I-C)*v,P+(L-P)*v,0);let k=(u=o.scale)!=null?u:.1875,R=(y=r.hand_scale_multiplier)!=null?y:2.5,j=k*R*100;t.scale.set(j,j,1)}}var We=ge(require("three"),1),Ts=new We.TextureLoader,Hn=null,Dn=null;async function Ls(){if(Hn)return Hn;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 Hn=t||{},t||{}}async function Nn(t,e,n=16777215,i=!1){try{let s=(await Ls())[t];return await Ts.loadAsync(s||t)}catch{console.warn(`Asset missing: ${t}. Using placeholder.`);let s=document.createElement("canvas");s.width=64,s.height=64;let r=s.getContext("2d");return r&&(r.fillStyle=`#${n.toString(16).padStart(6,"0")}`,i?r.fillRect(0,0,30,60):(r.beginPath(),r.arc(32,32,30,0,Math.PI*2),r.fill(),r.fillRect(27,32,10,40))),new We.CanvasTexture(s)}}async function ks(t,e,n){var h,w;let a=(await Ls())[t]||t,s;try{s=await Ts.loadAsync(a),console.log("[character] loaded sheet",{path:t,sourceUsed:a})}catch(v){let f=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await Nn(t,e,parseInt(f,16),!0),console.warn("[character] fallback loadAsset used",{path:t,err:v})}if(!s)return[];let r=n.gameplay.character_sheet||{},o=(h=r.cols)!=null?h:3,l=(w=r.rows)!=null?w:2,d=s.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[s];let y=[];for(let v=0;v<l;v++)for(let b=0;b<o;b++){let m=document.createElement("canvas");m.width=g,m.height=u;let f=m.getContext("2d");f&&d&&f.drawImage(d,b*g,v*u,g,u,0,0,g,u),y.push(new We.CanvasTexture(m))}return y.length>2&&y.push(...y.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:y.length}),y}function Ps(t,e){var c,g,u,y;let n=e.gameplay.brush||{},i=e.theme.brush_color||"#ffffff",a=(c=n.radius)!=null?c:20,s=(g=n.inner_radius)!=null?g:15,r=(u=n.alpha)!=null?u:.8,o=(y=n.inner_alpha)!=null?y:.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=r,p.fill(),p.beginPath(),p.arc(a,a,s,0,Math.PI*2),p.fillStyle=l,p.globalAlpha=o,p.fill()),new We.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});
362
+ `,u}function As(t,e,n,i,a){var l,d,p,c,g,u,y;let s=a.objects.get("hand_tutorial_1"),r=((l=s==null?void 0:s.gameplay)==null?void 0:l.tuning)||{},o=(s==null?void 0:s.transform)||{};if(!i){let h=(d=r.animation_duration)!=null?d:1.5,w=n%h/h,v=w<.5?2*w*w:-1+(4-2*w)*w,b=(p=r.x_offset)!=null?p:0,m=(c=r.y_offset)!=null?c:0,f=(g=r.animation_range)!=null?g:40,S=f*.7,E=f,C=e.x+b+S,P=e.y+m+E,I=C+S,L=P+E;t.position.set(C+(I-C)*v,P+(L-P)*v,0);let k=(u=o.scale)!=null?u:.1875,R=(y=r.hand_scale_multiplier)!=null?y:2.5,j=k*R*100;t.scale.set(j,j,1)}}var We=ge(require("three"),1),Ts=new We.TextureLoader,Dn=null,Nn=null;async function Ls(){if(Dn)return Dn;if(!Nn){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"})();Nn=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 Nn;return Dn=t||{},t||{}}async function Fn(t,e,n=16777215,i=!1){try{let s=(await Ls())[t];return await Ts.loadAsync(s||t)}catch{console.warn(`Asset missing: ${t}. Using placeholder.`);let s=document.createElement("canvas");s.width=64,s.height=64;let r=s.getContext("2d");return r&&(r.fillStyle=`#${n.toString(16).padStart(6,"0")}`,i?r.fillRect(0,0,30,60):(r.beginPath(),r.arc(32,32,30,0,Math.PI*2),r.fill(),r.fillRect(27,32,10,40))),new We.CanvasTexture(s)}}async function ks(t,e,n){var h,w;let a=(await Ls())[t]||t,s;try{s=await Ts.loadAsync(a),console.log("[character] loaded sheet",{path:t,sourceUsed:a})}catch(v){let f=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await Fn(t,e,parseInt(f,16),!0),console.warn("[character] fallback loadAsset used",{path:t,err:v})}if(!s)return[];let r=n.gameplay.character_sheet||{},o=(h=r.cols)!=null?h:3,l=(w=r.rows)!=null?w:2,d=s.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[s];let y=[];for(let v=0;v<l;v++)for(let b=0;b<o;b++){let m=document.createElement("canvas");m.width=g,m.height=u;let f=m.getContext("2d");f&&d&&f.drawImage(d,b*g,v*u,g,u,0,0,g,u),y.push(new We.CanvasTexture(m))}return y.length>2&&y.push(...y.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:y.length}),y}function Ps(t,e){var c,g,u,y;let n=e.gameplay.brush||{},i=e.theme.brush_color||"#ffffff",a=(c=n.radius)!=null?c:20,s=(g=n.inner_radius)!=null?g:15,r=(u=n.alpha)!=null?u:.8,o=(y=n.inner_alpha)!=null?y:.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=r,p.fill(),p.beginPath(),p.arc(a,a,s,0,Math.PI*2),p.fillStyle=l,p.globalAlpha=o,p.fill()),new We.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});