handler-playable-sdk 0.2.4 → 0.2.7

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.
@@ -1,4 +1,4 @@
1
- "use strict";var ga=Object.create;var Pe=Object.defineProperty;var ba=Object.getOwnPropertyDescriptor;var wa=Object.getOwnPropertyNames;var Ea=Object.getPrototypeOf,xa=Object.prototype.hasOwnProperty;var _a=(e,t)=>{for(var n in t)Pe(e,n,{get:t[n],enumerable:!0})},Yn=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of wa(t))!xa.call(e,a)&&a!==n&&Pe(e,a,{get:()=>t[a],enumerable:!(i=ba(t,a))||i.enumerable});return e};var we=(e,t,n)=>(n=e!=null?ga(Ea(e)):{},Yn(t||!e||!e.__esModule?Pe(n,"default",{value:e,enumerable:!0}):n,e)),Ta=e=>Yn(Pe({},"__esModule",{value:!0}),e);var Ia={};_a(Ia,{AspectClass:()=>ut,GameObject:()=>Ce,GameObjectManager:()=>Ve,Renderer:()=>Ae,ResponsiveUISystem:()=>fe,Transform:()=>Re,animateHandClick:()=>_i,animatePanelEntrance:()=>xi,createBrushTexture:()=>Hi,createEndGamePanel:()=>Ei,createHandTutorial:()=>Ti,createThreeBase:()=>gi,createTutorialLabel:()=>vi,getAspectClass:()=>Ge,getRegisteredFontIds:()=>wi,loadAsset:()=>yt,loadCharacterFrames:()=>Ci,registerFont:()=>bi,resolveFont:()=>j,resolveFontWeight:()=>G,updateHandAnimation:()=>Si});module.exports=Ta(Ia);var N=we(require("three"));var Z={};function We(e,t,n=!1){Z[e]||(Z[e]=[]),Z[e].push({fn:t,once:n})}function st(e,t){if(Z[e]){if(!t){delete Z[e];return}Z[e]=Z[e].filter(n=>n.fn!==t)}}function ze(e,...t){let n=Z[e];if(n)for(let i of[...n])i.fn(...t),i.once&&st(e,i.fn)}function z(e,t){We(e,t,!0)}var Be={name:"handler-playable-sdk",version:"0.2.4",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.mjs",require:"./dist/pixi/index.js"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.mjs",require:"./dist/three/index.js"}},scripts:{build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --minify",lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.js patch","publish:update:minor":"node scripts/publish-and-update.js minor","publish:update:major":"node scripts/publish-and-update.js major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","LICENSE","README.md"],peerDependencies:{"pixi.js":"^8.0.0",three:"^0.160.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0}},devDependencies:{"@types/three":"^0.160.0",eslint:"^8.57.1","pixi.js":"^8.8.1",three:"^0.160.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2"}};var B=0,Sa=B++,In=B++,jn=B++,Gn=B++,Vn=B++,qn=B++,Xn=B++,Kn=B++,Jn=B++,Zn=B++,Qn=B++,Un=B++,v=Sa;function ei(){return v===In}function ti(){return v===jn}function ni(){return v===Gn}function ii(){return v===Vn}function le(){return v===qn}function ce(){return v===Xn}function ai(){return v===Kn}function si(){return v===Jn}function oi(){return v===Zn}function ot(){return v===Qn}function rt(){return v===Un}function ri(){let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",t=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(e==="mraid")try{mraid.getState(),v=In;return}catch{}else if(e==="dapi")try{dapi.isReady(),v=jn;return}catch{}if(t==="facebook")try{typeof FbPlayableAd!="undefined"&&(v=Gn)}catch{}else if(t==="google")try{typeof ExitApi!="undefined"&&(v=Vn)}catch{}else if(t==="mintegral")window.gameReady&&(v=qn);else if(t==="tapjoy")window.TJ_API&&(v=Xn);else if(t==="tiktok")window.openAppStore&&(v=Kn);else if(t==="smadex")try{window.smxTracking&&(v=Jn)}catch{}else if(t==="snapchat")try{window.ScPlayableAd&&(v=Zn)}catch{}else t==="vungle"?v=Qn:(e==="nucleo"||t==="nucleo")&&(v=Un)}var ui={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"},Ra=Math.random().toString(36).slice(2),de=null,xe={...ui},hi="web_embed",Aa={},lt=!1,Ee=!1,Te=!1,fi=!1,mt=1,dt=0,Ie=!1,K=!1,Ye="",pe=Math.floor(window.innerWidth),me=Math.floor(window.innerHeight),pt=pe>me,J=!1,_e=!1,li=!1,ci=!1,ct=!1,Oe=null;function di(){if(de)return de;let e=document.createElement("div");return e.id="handler-root",e.setAttribute("data-handler-root","true"),document.body.appendChild(e),de=e,e}function Ne(e){switch(e){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return e}}function yi(e,t){return{event_name:e,ts:Date.now(),session_id:Ra,deployment_id:xe.deployment_id,variant_id:xe.variant_id,export_profile_id:xe.profile_id,instance_id:xe.instance_id||"default",env:hi==="mraid"?"mraid":"web",payload:t}}function w(e,t){let n=Ne(e),i=yi(n,t);ze(n,i),n!==e&&ze(e,i)}function ve(){Oe&&(Oe(pe,me),Oe=null)}function ue(e){mt=e,w("volume",e)}function he(e){e&&(fi=!0),!Te&&(Te=!0,w("pause"),ue(0))}function Se(e){!e&&fi||Te&&(Te=!1,w("resume"),ue(mt))}function U(e,t){pe=Math.floor(e||window.innerWidth),me=Math.floor(t||window.innerHeight),pt=pe>me,w("resize",{width:pe,height:me})}function Ca(){if(ei())try{let e=mraid.getMaxSize();U(e.width,e.height);let t=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Se():he()};if(mraid.addEventListener("viewableChange",t),mraid.addEventListener("stateChange",t),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();U(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();ue(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&ue(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),Ie=!0,mraid.isViewable()&&mraid.getState()!=="hidden")J=!0,w("boot"),w("view"),w("ready"),K=!0,ve();else{let n=()=>{J=!0,w("boot"),w("view"),w("ready"),K=!0,ve()};mraid.addEventListener("ready",n)}}catch(e){console.warn("MRAID hook skipped",e)}}function Ha(){if(ti())try{let e=dapi.getScreenSize();U(e.width,e.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?Se():he()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();U(n.width||i.width,n.height||i.height)});let t=dapi.getAudioVolume();if(ue(t?1:0),dapi.addEventListener("audioVolumeChange",n=>ue(n?1:0)),Ie=!0,dapi.isViewable())J=!0,w("boot"),w("view"),w("ready"),K=!0,ve();else{let n=()=>{J=!0,w("boot"),w("view"),w("ready"),K=!0,ve()};dapi.addEventListener("ready",n)}}catch(e){console.warn("DAPI hook skipped",e)}}function pi(){let e=()=>{J||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(J=!0,w("boot"),w("view"),w("ready"),K=!0,ve(),_e&&(_e=!1,Q.start()))};window.addEventListener("resize",()=>U()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Se(),e()):he()}),document.readyState==="complete"||document.readyState==="interactive"?e():window.addEventListener("load",e),Ie=!0}function Ma(){let e=t=>{typeof TouchEvent!="undefined"&&t instanceof TouchEvent&&(li=!0),!(li&&t instanceof MouseEvent)&&(dt+=1,w("interaction",dt))};document.addEventListener("mousedown",e),document.addEventListener("touchstart",e)}function La(e){var i,a,s,r,u,l,m,p,y,f,h,g;let t=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(t==="mraid"&&typeof mraid!="undefined")mraid.open(e||"");else if(t==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(ce())(s=(a=window.TJ_API)==null?void 0:a.click)==null||s.call(a);else if(ni())(u=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||u.call(r);else if(oi())(m=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||m.call(l);else if(si())try{(y=(p=window.smxTracking)==null?void 0:p.redirect)==null||y.call(p)}catch(o){console.warn("Smadex redirect failed",o)}else if(ii()){let o=window.ExitApi;o&&typeof o.exit=="function"?o.exit(e||Ye||""):e&&window.open(e)}else le()?(f=window.install)==null||f.call(window):ai()?(h=window.openAppStore)==null||h.call(window):ot()?(g=parent==null?void 0:parent.postMessage)==null||g.call(parent,"download","*"):e&&window.open(e)}function ka(){let e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",t=n=>{if(!n)return;let i=new Image;i.src=n};if(e==="bigabid"){let n=window.BIGABID_BIDTIMEMACROS;if(!n)return;z("view",()=>t(n.mraid_viewable)),z("start",()=>t(n.game_viewable)),z("engagement",()=>t(n.engagement));let i=()=>t(n.complete);z("complete",i),We("engagement",a=>{var s;((s=a==null?void 0:a.payload)==null?void 0:s.count)>3&&i()}),z("cta_click",()=>t(n.click))}else if(e==="inmobi"){let n=window.INMOBI_DSPMACROS;if(!n)return;z("view",()=>t(n.Ad_Load_Start)),z("start",()=>t(n.Ad_Viewable)),z("engagement",()=>t(n.First_Engagement)),z("complete",()=>t(n.Gameplay_Complete)),z("cta_click",()=>t(n.DSP_Click)),z("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>t(n[`Spent_${i}_Seconds`]),i*1e3))})}}function Fa(){if(!ce())return;let e=window.TJ_API;e&&e.setPlayableAPI&&e.setPlayableAPI({skipAd:()=>{try{Q.finish()}catch(t){console.warn("Tapjoy skip failed",t)}}})}function mi(){var t,n,i;let e=window.TJ_API;(t=e==null?void 0:e.objectiveComplete)==null||t.call(e),(n=e==null?void 0:e.playableFinished)==null||n.call(e),(i=e==null?void 0:e.gameplayFinished)==null||i.call(e)}function Da(){le()&&(window.mintGameStart=()=>{Se(!0),U()},window.mintGameClose=()=>{he(!0)})}function $a(){if(!rt())return;let e=window.NUC;!e||!e.trigger||(Q.on("cta_click",()=>{var t,n;return(n=(t=e.trigger).convert)==null?void 0:n.call(t,Ye)}),Q.on("complete",()=>{var t,n;return(n=(t=e.trigger).tryAgain)==null?void 0:n.call(t)}))}var Q={init(e={},t){if(hi=e.profile||"web_embed",Aa=e.consent||{},xe={...ui,...e.ids||{}},de=e.rootEl||de,Ye=e.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),t&&(Oe=t),w("init"),document.body.oncontextmenu=()=>!1,di(),Pa(de),ri(),Ca(),Ha(),!Ie){if(document.readyState==="complete")pi();else if(!ci){ci=!0;let n=()=>{pi(),window.removeEventListener("load",n),document.removeEventListener("DOMContentLoaded",n)};window.addEventListener("load",n),document.addEventListener("DOMContentLoaded",n)}}Ma(),ka(),Fa(),Da(),$a(),console.log(`%c @handler/playable-sdk %c v${Be.version||"0.0.0"} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),J&&!K&&(w("boot"),w("view"),w("ready"),_e&&(_e=!1,Q.start()),K=!0),K=J},getRoot(){return di()},get version(){return Be.version||"0.0.0"},get maxWidth(){return pe},get maxHeight(){return me},get isLandscape(){return pt},get isReady(){return K},get isStarted(){return lt},get isPaused(){return Te},get isFinished(){return Ee},get volume(){return mt},get interactions(){return dt},on(e,t){We(Ne(e),t)},off(e,t){st(Ne(e),t)},start(){var e,t;if(!lt){if(!J){_e=!0;return}if(lt=!0,w("start"),U(),le())he(),(e=window.gameReady)==null||e.call(window);else if(ce()){let n=window.TJ_API;(t=n==null?void 0:n.setPlayableBuild)==null||t.call(n,{orientation:pt?"landscape":"portrait",buildID:Be.version||"dev"})}}},finish(){var e,t;Ee||(Ee=!0,w("complete"),le()?(e=window.gameEnd)==null||e.call(window):ot()?(t=parent==null?void 0:parent.postMessage)==null||t.call(parent,"complete","*"):ce()&&mi())},install(e){if(!Ee){Ee=!0,ce()?(mi(),setTimeout(()=>Q.install(e),300)):(w("complete"),setTimeout(()=>Q.install(e),0));return}ct||(ct=!0,setTimeout(()=>ct=!1,500),w("cta_click"),w("conversion"),La(e||Ye))},emit(e,t){let n=Ne(e);if(!["view","boot","start","engagement","complete","cta_click","conversion","retry","pause","resume","resize","volume","error"].includes(n)&&!n.startsWith("custom."))throw new Error(`Event ${e} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=yi(n,t);ze(n,i)},retry(){var e,t,n;if(le())(e=window.gameRetry)==null||e.call(window);else if(rt()){let i=window.NUC;(n=(t=i==null?void 0:i.trigger)==null?void 0:t.tryAgain)==null||n.call(t)}w("engagement",{action:"retry"})},pause(){he(!0)},resume(){Se(!0)},resize(e,t){U(e,t)}},je=Q;function Pa(e){let t=document.createElement("script");t.type="text/javascript",t.textContent=`
1
+ "use strict";var ga=Object.create;var Pe=Object.defineProperty;var ba=Object.getOwnPropertyDescriptor;var wa=Object.getOwnPropertyNames;var Ea=Object.getPrototypeOf,xa=Object.prototype.hasOwnProperty;var _a=(e,t)=>{for(var n in t)Pe(e,n,{get:t[n],enumerable:!0})},jn=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of wa(t))!xa.call(e,a)&&a!==n&&Pe(e,a,{get:()=>t[a],enumerable:!(i=ba(t,a))||i.enumerable});return e};var we=(e,t,n)=>(n=e!=null?ga(Ea(e)):{},jn(t||!e||!e.__esModule?Pe(n,"default",{value:e,enumerable:!0}):n,e)),Ta=e=>jn(Pe({},"__esModule",{value:!0}),e);var Ia={};_a(Ia,{AspectClass:()=>ut,GameObject:()=>Ce,GameObjectManager:()=>Ve,Renderer:()=>Ae,ResponsiveUISystem:()=>fe,Transform:()=>Re,animateHandClick:()=>_i,animatePanelEntrance:()=>xi,createBrushTexture:()=>Hi,createEndGamePanel:()=>Ei,createHandTutorial:()=>Ti,createThreeBase:()=>gi,createTutorialLabel:()=>vi,getAspectClass:()=>Ge,getRegisteredFontIds:()=>wi,loadAsset:()=>yt,loadCharacterFrames:()=>Ci,registerFont:()=>bi,resolveFont:()=>Y,resolveFontWeight:()=>G,updateHandAnimation:()=>Si});module.exports=Ta(Ia);var O=we(require("three"));var Z={};function We(e,t,n=!1){Z[e]||(Z[e]=[]),Z[e].push({fn:t,once:n})}function st(e,t){if(Z[e]){if(!t){delete Z[e];return}Z[e]=Z[e].filter(n=>n.fn!==t)}}function ze(e,...t){let n=Z[e];if(n)for(let i of[...n])i.fn(...t),i.once&&st(e,i.fn)}function z(e,t){We(e,t,!0)}var Be={name:"handler-playable-sdk",version:"0.2.7",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.mjs",require:"./dist/pixi/index.js"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.mjs",require:"./dist/three/index.js"}},scripts:{build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run obfuscate","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --external lottie-web",obfuscate:"javascript-obfuscator dist/index.js dist/index.mjs dist/pixi/index.js dist/pixi/index.mjs dist/three/index.js dist/three/index.mjs --output dist --options-preset high-obfuscation --compact true --self-defending true",lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.js patch","publish:update:minor":"node scripts/publish-and-update.js minor","publish:update:major":"node scripts/publish-and-update.js major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.160.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.160.0",eslint:"^8.57.1","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.160.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2"}};var B=0,Sa=B++,In=B++,Yn=B++,Gn=B++,Vn=B++,qn=B++,Xn=B++,Kn=B++,Jn=B++,Zn=B++,Qn=B++,Un=B++,v=Sa;function ei(){return v===In}function ti(){return v===Yn}function ni(){return v===Gn}function ii(){return v===Vn}function le(){return v===qn}function ce(){return v===Xn}function ai(){return v===Kn}function si(){return v===Jn}function oi(){return v===Zn}function ot(){return v===Qn}function rt(){return v===Un}function ri(){let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",t=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(e==="mraid")try{mraid.getState(),v=In;return}catch{}else if(e==="dapi")try{dapi.isReady(),v=Yn;return}catch{}if(t==="facebook")try{typeof FbPlayableAd!="undefined"&&(v=Gn)}catch{}else if(t==="google")try{typeof ExitApi!="undefined"&&(v=Vn)}catch{}else if(t==="mintegral")window.gameReady&&(v=qn);else if(t==="tapjoy")window.TJ_API&&(v=Xn);else if(t==="tiktok")window.openAppStore&&(v=Kn);else if(t==="smadex")try{window.smxTracking&&(v=Jn)}catch{}else if(t==="snapchat")try{window.ScPlayableAd&&(v=Zn)}catch{}else t==="vungle"?v=Qn:(e==="nucleo"||t==="nucleo")&&(v=Un)}var ui={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"},Ra=Math.random().toString(36).slice(2),de=null,xe={...ui},hi="web_embed",Aa={},lt=!1,Ee=!1,Te=!1,fi=!1,mt=1,dt=0,Ie=!1,K=!1,je="",pe=Math.floor(window.innerWidth),me=Math.floor(window.innerHeight),pt=pe>me,J=!1,_e=!1,li=!1,ci=!1,ct=!1,Ne=null;function di(){if(de)return de;let e=document.createElement("div");return e.id="handler-root",e.setAttribute("data-handler-root","true"),document.body.appendChild(e),de=e,e}function Oe(e){switch(e){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return e}}function yi(e,t){return{event_name:e,ts:Date.now(),session_id:Ra,deployment_id:xe.deployment_id,variant_id:xe.variant_id,export_profile_id:xe.profile_id,instance_id:xe.instance_id||"default",env:hi==="mraid"?"mraid":"web",payload:t}}function w(e,t){let n=Oe(e),i=yi(n,t);ze(n,i),n!==e&&ze(e,i)}function ve(){Ne&&(Ne(pe,me),Ne=null)}function ue(e){mt=e,w("volume",e)}function he(e){e&&(fi=!0),!Te&&(Te=!0,w("pause"),ue(0))}function Se(e){!e&&fi||Te&&(Te=!1,w("resume"),ue(mt))}function U(e,t){pe=Math.floor(e||window.innerWidth),me=Math.floor(t||window.innerHeight),pt=pe>me,w("resize",{width:pe,height:me})}function Ca(){if(ei())try{let e=mraid.getMaxSize();U(e.width,e.height);let t=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Se():he()};if(mraid.addEventListener("viewableChange",t),mraid.addEventListener("stateChange",t),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();U(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();ue(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&ue(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),Ie=!0,mraid.isViewable()&&mraid.getState()!=="hidden")J=!0,w("boot"),w("view"),w("ready"),K=!0,ve();else{let n=()=>{J=!0,w("boot"),w("view"),w("ready"),K=!0,ve()};mraid.addEventListener("ready",n)}}catch(e){console.warn("MRAID hook skipped",e)}}function Ha(){if(ti())try{let e=dapi.getScreenSize();U(e.width,e.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?Se():he()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();U(n.width||i.width,n.height||i.height)});let t=dapi.getAudioVolume();if(ue(t?1:0),dapi.addEventListener("audioVolumeChange",n=>ue(n?1:0)),Ie=!0,dapi.isViewable())J=!0,w("boot"),w("view"),w("ready"),K=!0,ve();else{let n=()=>{J=!0,w("boot"),w("view"),w("ready"),K=!0,ve()};dapi.addEventListener("ready",n)}}catch(e){console.warn("DAPI hook skipped",e)}}function pi(){let e=()=>{J||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(J=!0,w("boot"),w("view"),w("ready"),K=!0,ve(),_e&&(_e=!1,Q.start()))};window.addEventListener("resize",()=>U()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Se(),e()):he()}),document.readyState==="complete"||document.readyState==="interactive"?e():window.addEventListener("load",e),Ie=!0}function Ma(){let e=t=>{typeof TouchEvent!="undefined"&&t instanceof TouchEvent&&(li=!0),!(li&&t instanceof MouseEvent)&&(dt+=1,w("interaction",dt))};document.addEventListener("mousedown",e),document.addEventListener("touchstart",e)}function La(e){var i,a,s,r,u,l,m,p,y,f,h,g;let t=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(t==="mraid"&&typeof mraid!="undefined")mraid.open(e||"");else if(t==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(ce())(s=(a=window.TJ_API)==null?void 0:a.click)==null||s.call(a);else if(ni())(u=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||u.call(r);else if(oi())(m=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||m.call(l);else if(si())try{(y=(p=window.smxTracking)==null?void 0:p.redirect)==null||y.call(p)}catch(o){console.warn("Smadex redirect failed",o)}else if(ii()){let o=window.ExitApi;o&&typeof o.exit=="function"?o.exit(e||je||""):e&&window.open(e)}else le()?(f=window.install)==null||f.call(window):ai()?(h=window.openAppStore)==null||h.call(window):ot()?(g=parent==null?void 0:parent.postMessage)==null||g.call(parent,"download","*"):e&&window.open(e)}function ka(){let e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",t=n=>{if(!n)return;let i=new Image;i.src=n};if(e==="bigabid"){let n=window.BIGABID_BIDTIMEMACROS;if(!n)return;z("view",()=>t(n.mraid_viewable)),z("start",()=>t(n.game_viewable)),z("engagement",()=>t(n.engagement));let i=()=>t(n.complete);z("complete",i),We("engagement",a=>{var s;((s=a==null?void 0:a.payload)==null?void 0:s.count)>3&&i()}),z("cta_click",()=>t(n.click))}else if(e==="inmobi"){let n=window.INMOBI_DSPMACROS;if(!n)return;z("view",()=>t(n.Ad_Load_Start)),z("start",()=>t(n.Ad_Viewable)),z("engagement",()=>t(n.First_Engagement)),z("complete",()=>t(n.Gameplay_Complete)),z("cta_click",()=>t(n.DSP_Click)),z("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>t(n[`Spent_${i}_Seconds`]),i*1e3))})}}function Fa(){if(!ce())return;let e=window.TJ_API;e&&e.setPlayableAPI&&e.setPlayableAPI({skipAd:()=>{try{Q.finish()}catch(t){console.warn("Tapjoy skip failed",t)}}})}function mi(){var t,n,i;let e=window.TJ_API;(t=e==null?void 0:e.objectiveComplete)==null||t.call(e),(n=e==null?void 0:e.playableFinished)==null||n.call(e),(i=e==null?void 0:e.gameplayFinished)==null||i.call(e)}function Da(){le()&&(window.mintGameStart=()=>{Se(!0),U()},window.mintGameClose=()=>{he(!0)})}function $a(){if(!rt())return;let e=window.NUC;!e||!e.trigger||(Q.on("cta_click",()=>{var t,n;return(n=(t=e.trigger).convert)==null?void 0:n.call(t,je)}),Q.on("complete",()=>{var t,n;return(n=(t=e.trigger).tryAgain)==null?void 0:n.call(t)}))}var Q={init(e={},t){if(hi=e.profile||"web_embed",Aa=e.consent||{},xe={...ui,...e.ids||{}},de=e.rootEl||de,je=e.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),t&&(Ne=t),w("init"),document.body.oncontextmenu=()=>!1,di(),Pa(de),ri(),Ca(),Ha(),!Ie){if(document.readyState==="complete")pi();else if(!ci){ci=!0;let n=()=>{pi(),window.removeEventListener("load",n),document.removeEventListener("DOMContentLoaded",n)};window.addEventListener("load",n),document.addEventListener("DOMContentLoaded",n)}}Ma(),ka(),Fa(),Da(),$a(),console.log(`%c @handler/playable-sdk %c v${Be.version||"0.0.0"} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),J&&!K&&(w("boot"),w("view"),w("ready"),_e&&(_e=!1,Q.start()),K=!0),K=J},getRoot(){return di()},get version(){return Be.version||"0.0.0"},get maxWidth(){return pe},get maxHeight(){return me},get isLandscape(){return pt},get isReady(){return K},get isStarted(){return lt},get isPaused(){return Te},get isFinished(){return Ee},get volume(){return mt},get interactions(){return dt},on(e,t){We(Oe(e),t)},off(e,t){st(Oe(e),t)},start(){var e,t;if(!lt){if(!J){_e=!0;return}if(lt=!0,w("start"),U(),le())he(),(e=window.gameReady)==null||e.call(window);else if(ce()){let n=window.TJ_API;(t=n==null?void 0:n.setPlayableBuild)==null||t.call(n,{orientation:pt?"landscape":"portrait",buildID:Be.version||"dev"})}}},finish(){var e,t;Ee||(Ee=!0,w("complete"),le()?(e=window.gameEnd)==null||e.call(window):ot()?(t=parent==null?void 0:parent.postMessage)==null||t.call(parent,"complete","*"):ce()&&mi())},install(e){if(!Ee){Ee=!0,ce()?(mi(),setTimeout(()=>Q.install(e),300)):(w("complete"),setTimeout(()=>Q.install(e),0));return}ct||(ct=!0,setTimeout(()=>ct=!1,500),w("cta_click"),w("conversion"),La(e||je))},emit(e,t){let n=Oe(e);if(!["view","boot","start","engagement","complete","cta_click","conversion","retry","pause","resume","resize","volume","error"].includes(n)&&!n.startsWith("custom."))throw new Error(`Event ${e} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=yi(n,t);ze(n,i)},retry(){var e,t,n;if(le())(e=window.gameRetry)==null||e.call(window);else if(rt()){let i=window.NUC;(n=(t=i==null?void 0:i.trigger)==null?void 0:t.tryAgain)==null||n.call(t)}w("engagement",{action:"retry"})},pause(){he(!0)},resume(){Se(!0)},resize(e,t){U(e,t)}},Ye=Q;function Pa(e){let t=document.createElement("script");t.type="text/javascript",t.textContent=`
2
2
  (function(){
3
3
  var events = ['touchstart','touchend','mousedown','keydown'];
4
4
  function unlock(){
@@ -35,9 +35,9 @@
35
35
  padding: 0 !important;
36
36
  border: none !important;
37
37
  overflow: hidden !important;
38
- `,e.appendChild(r);let u=document.createElement("div");u.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(u);let l=new N.Scene,{width:m,height:p}=n(),y=new N.AmbientLight(16777215,.6);l.add(y);let f=new N.DirectionalLight(16777215,.8);f.position.set(5,5,5),f.castShadow=!1,l.add(f);let h=new N.DirectionalLight(16777215,.3);h.position.set(-5,0,5),l.add(h);let g=new N.PerspectiveCamera(55,m/p,.1,100);g.position.set(0,0,3.2),g.lookAt(0,0,0),g.updateMatrixWorld();let o=new N.WebGLRenderer({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});o.setPixelRatio(window.devicePixelRatio||1),o.setSize(m,p),o.setClearColor(0,0),o.domElement.style.position="absolute",o.domElement.style.top="0",o.domElement.style.left="0",o.domElement.style.right="0",o.domElement.style.bottom="0",o.domElement.style.width="100%",o.domElement.style.height="100%",o.domElement.style.minWidth="100%",o.domElement.style.minHeight="100%",o.domElement.style.maxWidth="100%",o.domElement.style.maxHeight="100%",o.domElement.style.display="block",o.domElement.style.pointerEvents="auto",o.domElement.style.margin="0",o.domElement.style.padding="0",o.domElement.style.boxSizing="border-box",u.appendChild(o.domElement);let E=d=>{var A;let c=e.getBoundingClientRect(),b=window.getComputedStyle(e);console.log("[THREE-BASE] applySize called:",{providedSize:d,rootRect:{width:c.width,height:c.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleSize:{width:e.style.width,height:e.style.height},computedStyle:{width:b.width,height:b.height,transform:b.transform,scale:b.scale},rendererCurrentSize:{width:o.domElement.width,height:o.domElement.height},rendererStyleSize:{width:o.domElement.style.width,height:o.domElement.style.height},stackTrace:(A=new Error().stack)==null?void 0:A.split(`
38
+ `,e.appendChild(r);let u=document.createElement("div");u.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(u);let l=new O.Scene,{width:m,height:p}=n(),y=new O.AmbientLight(16777215,.6);l.add(y);let f=new O.DirectionalLight(16777215,.8);f.position.set(5,5,5),f.castShadow=!1,l.add(f);let h=new O.DirectionalLight(16777215,.3);h.position.set(-5,0,5),l.add(h);let g=new O.PerspectiveCamera(55,m/p,.1,100);g.position.set(0,0,3.2),g.lookAt(0,0,0),g.updateMatrixWorld();let o=new O.WebGLRenderer({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});o.setPixelRatio(window.devicePixelRatio||1),o.setSize(m,p),o.setClearColor(0,0),o.domElement.style.position="absolute",o.domElement.style.top="0",o.domElement.style.left="0",o.domElement.style.right="0",o.domElement.style.bottom="0",o.domElement.style.width="100%",o.domElement.style.height="100%",o.domElement.style.minWidth="100%",o.domElement.style.minHeight="100%",o.domElement.style.maxWidth="100%",o.domElement.style.maxHeight="100%",o.domElement.style.display="block",o.domElement.style.pointerEvents="auto",o.domElement.style.margin="0",o.domElement.style.padding="0",o.domElement.style.boxSizing="border-box",u.appendChild(o.domElement);let E=d=>{var A;let c=e.getBoundingClientRect(),b=window.getComputedStyle(e);console.log("[THREE-BASE] applySize called:",{providedSize:d,rootRect:{width:c.width,height:c.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleSize:{width:e.style.width,height:e.style.height},computedStyle:{width:b.width,height:b.height,transform:b.transform,scale:b.scale},rendererCurrentSize:{width:o.domElement.width,height:o.domElement.height},rendererStyleSize:{width:o.domElement.style.width,height:o.domElement.style.height},stackTrace:(A=new Error().stack)==null?void 0:A.split(`
39
39
  `).slice(1,4).join(`
40
- `)});let _=c.width,S=c.height;if((_<=0||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:c.width,clientWidth:e.clientWidth}),_=e.clientWidth||window.innerWidth||320),(S<=0||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:c.height,clientHeight:e.clientHeight}),S=e.clientHeight||window.innerHeight||480),typeof(d==null?void 0:d.width)=="number"&&d.width>0){let L=Math.abs(d.width-c.width),H=c.width*.1;L>H?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:d.width,container:c.width,difference:L,tolerance:H,willUse:"container size (boundingRect)"}):(_=d.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:d.width,container:c.width}))}if(typeof(d==null?void 0:d.height)=="number"&&d.height>0){let L=Math.abs(d.height-c.height),H=c.height*.1;L>H?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:d.height,container:c.height,difference:L,tolerance:H,willUse:"container size (boundingRect)"}):(S=d.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:d.height,container:c.height}))}(_<=0||S<=0||!isFinite(_)||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:_,newHeight:S,size:d,rootRect:c}),_=c.width||e.clientWidth||320,S=c.height||e.clientHeight||480);let C=Math.floor(_),F=Math.floor(S);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:C,finalHeight:F,aspectRatio:C/F,beforeRendererSize:{width:o.domElement.width,height:o.domElement.height},beforeRendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height}}),o.setSize(C,F),o.setPixelRatio(window.devicePixelRatio||1),g.aspect=C/F,g.updateProjectionMatrix();let R=e.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:o.domElement.width,height:o.domElement.height},rendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height},containerRect:{width:R.width,height:R.height},cameraAspect:g.aspect,matches:{width:Math.abs(o.domElement.width-R.width)<1,height:Math.abs(o.domElement.height-R.height)<1},sizeDifference:{width:o.domElement.width-R.width,height:o.domElement.height-R.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{E()})});let T=!1;je.on("pause",()=>{T=!0,document.querySelectorAll("audio").forEach(c=>c.pause())}),je.on("resume",()=>{T=!1,document.querySelectorAll("audio").forEach(c=>{c.currentTime>0&&!c.ended&&c.play().catch(()=>{})})});let x=new fe(e,r);return je.on("resize",({payload:d})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:d,timestamp:Date.now(),rootRect:e.getBoundingClientRect()}),E({width:d==null?void 0:d.width,height:d==null?void 0:d.height}),x.updateLayout()}),window.addEventListener("resize",()=>{console.log("[THREE-BASE] Window resize event received:",{timestamp:Date.now(),windowSize:{width:window.innerWidth,height:window.innerHeight},rootRect:e.getBoundingClientRect()}),E(),x.updateLayout()}),{scene:l,camera:g,renderer:o,uiSystem:x,applySize:E}}var k=we(require("three")),Re=class{constructor(t){var n,i;this.position=(t==null?void 0:t.position)||{x:0,y:0},this.scale=(n=t==null?void 0:t.scale)!=null?n:1,this.rotation=(i=t==null?void 0:t.rotation)!=null?i:0}update(t){t.position!==void 0&&(this.position={...t.position}),t.scale!==void 0&&(this.scale=t.scale),t.rotation!==void 0&&(this.rotation=t.rotation)}syncToThree(t){let n=t.position.z,i=n===0||!isFinite(n)?.5:n;t.position.set(this.position.x,this.position.y,i),t.scale.set(this.scale,this.scale,this.scale),t.rotation.z=this.rotation}},Ae=class{constructor(t){var n,i,a,s;this.z_index=(n=t==null?void 0:t.z_index)!=null?n:0,this.alpha=(i=t==null?void 0:t.alpha)!=null?i:1,this.visible=(a=t==null?void 0:t.visible)!=null?a:!0,this.tint=(s=t==null?void 0:t.tint)!=null?s:null}update(t){t.z_index!==void 0&&(this.z_index=t.z_index),t.alpha!==void 0&&(this.alpha=t.alpha),t.visible!==void 0&&(this.visible=t.visible),t.tint!==void 0&&(this.tint=t.tint)}syncToThree(t){if(t.renderOrder=this.z_index,t.visible=this.visible,t instanceof k.Mesh&&t.material&&(Array.isArray(t.material)?t.material.forEach(n=>{n instanceof k.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):t.material instanceof k.Material&&(t.material.opacity=this.alpha,t.material.transparent=this.alpha<1)),this.tint!==null&&t instanceof k.Mesh&&t.material){let n=typeof this.tint=="string"?new k.Color(this.tint):new k.Color(this.tint);Array.isArray(t.material)?t.material.forEach(i=>{(i instanceof k.MeshBasicMaterial||i instanceof k.MeshStandardMaterial)&&i.color.copy(n)}):(t.material instanceof k.MeshBasicMaterial||t.material instanceof k.MeshStandardMaterial)&&t.material.color.copy(n)}}},Ce=class{constructor(t,n,i,a){this.instanceId=t,this.objectConfig=n,this.threeObject=i,this._config=a,this.transform=new Re(a.transform),this.renderer=new Ae(a.render),this.sync()}sync(){this.transform.syncToThree(this.threeObject),this.renderer.syncToThree(this.threeObject)}updateConfig(t){this._config=t,t.transform&&this.transform.update(t.transform),t.render&&this.renderer.update(t.render),this.sync()}getComponent(t){return this._config[t]}getPosition(){return{...this.transform.position}}setPosition(t,n){this.transform.position={x:t,y:n},this.transform.syncToThree(this.threeObject)}getAlpha(){return this.renderer.alpha}setAlpha(t){this.renderer.alpha=t,this.renderer.syncToThree(this.threeObject)}getVisible(){return this.renderer.visible}setVisible(t){this.renderer.visible=t,this.renderer.syncToThree(this.threeObject)}},Ve=class{constructor(t){this.objects=new Map;this.config=t}create(t,n){let i=this.config.objects.get(t);if(!i)throw new Error(`Object config not found: ${t}`);let a=new Ce(t,i.object_config||t,n,i);return this.objects.set(t,a),a}get(t){return this.objects.get(t)}updateConfig(t){this.config=t;for(let[n,i]of this.objects.entries()){let a=t.objects.get(n);a&&i.updateConfig(a)}}getAll(){return Array.from(this.objects.values())}remove(t){this.objects.delete(t)}clear(){this.objects.clear()}};var qe={"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 j(e){let t=qe[e];return t?t.family:(console.warn(`Font ID "${e}" not found in registry, using fallback`),"Arial, sans-serif")}function G(e){var n;let t=qe[e];return t&&(n=t.weight)!=null?n:"400"}function bi(e,t){qe[e]=t}function wi(){return Object.keys(qe)}var ye=we(require("three"));function se(e){return{element:e,get alpha(){return parseFloat(e.style.opacity||"1")},set alpha(t){e.style.opacity=t.toString()},get visible(){return e.style.display!=="none"},set visible(t){e.style.display=t?"":"none"},position:{set(t,n){e.style.left=`${t}px`,e.style.top=`${n}px`},get x(){return parseFloat(e.style.left||"0")},get y(){return parseFloat(e.style.top||"0")}},scale:{set(t,n){e.style.transform=`scale(${t})`},get x(){let t=e.style.transform.match(/scale\(([^)]+)\)/);return t?parseFloat(t[1]):1}}}}function Ei(e,t,n,i){var kt,Ft,Dt,$t,Pt,Wt,zt,Bt,Ot,Nt,Yt,It,jt,Gt,Vt,qt,Xt,Kt,Jt,Zt,Qt,Ut,en,tn,nn,an,sn,on,rn,ln,cn,dn,pn,mn,un,hn,fn,yn,gn,bn,wn,En,xn,_n,Tn,vn,Sn,Rn,An,Cn,Hn,Mn,Ln,kn,Fn,Dn,$n,Pn,Wn,zn,Bn,On,Nn;let a=e.objects.get("ui_endgame_1"),s=e.objects.get("ui_endgame_logo_1"),r=e.objects.get("ui_endgame_title_1"),u=e.objects.get("ui_endgame_subtitle_1"),l=e.objects.get("ui_endgame_footer_1"),m=e.objects.get("ui_endgame_cta_1"),p=e.objects.get("ui_endgame_cta_hint_1"),y=e.objects.get("ui_endgame_hand_1"),f=e.engine.runtime||{},h=((kt=a==null?void 0:a.gameplay)==null?void 0:kt.tuning)||{},g=(a==null?void 0:a.render)||{},o=i.getBoundingClientRect(),E=o.width>0?o.width*.9:320,T=o.height>0?o.height*.85:400,x=Math.min((Ft=h.panel_width)!=null?Ft:320,E),d=Math.min((Dt=h.panel_height)!=null?Dt:400,T),c=($t=h.panel_padding)!=null?$t:32,b=(Pt=h.panel_radius)!=null?Pt:24,_=g.background_color||h.panel_bg_color||"#1a0a0a",S=g.background_alpha!==void 0&&g.background_alpha!==null?g.background_alpha:(Wt=h.panel_bg_alpha)!=null?Wt:.98,C=g.border_color||h.panel_border_color||"#ffffff",F=(zt=h.panel_border_width)!=null?zt:2,R=(Bt=h.panel_border_alpha)!=null?Bt:.3,A=document.createElement("div");A.style.cssText=`
40
+ `)});let _=c.width,S=c.height;if((_<=0||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:c.width,clientWidth:e.clientWidth}),_=e.clientWidth||window.innerWidth||320),(S<=0||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:c.height,clientHeight:e.clientHeight}),S=e.clientHeight||window.innerHeight||480),typeof(d==null?void 0:d.width)=="number"&&d.width>0){let L=Math.abs(d.width-c.width),H=c.width*.1;L>H?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:d.width,container:c.width,difference:L,tolerance:H,willUse:"container size (boundingRect)"}):(_=d.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:d.width,container:c.width}))}if(typeof(d==null?void 0:d.height)=="number"&&d.height>0){let L=Math.abs(d.height-c.height),H=c.height*.1;L>H?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:d.height,container:c.height,difference:L,tolerance:H,willUse:"container size (boundingRect)"}):(S=d.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:d.height,container:c.height}))}(_<=0||S<=0||!isFinite(_)||!isFinite(S))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:_,newHeight:S,size:d,rootRect:c}),_=c.width||e.clientWidth||320,S=c.height||e.clientHeight||480);let C=Math.floor(_),F=Math.floor(S);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:C,finalHeight:F,aspectRatio:C/F,beforeRendererSize:{width:o.domElement.width,height:o.domElement.height},beforeRendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height}}),o.setSize(C,F),o.setPixelRatio(window.devicePixelRatio||1),g.aspect=C/F,g.updateProjectionMatrix();let R=e.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:o.domElement.width,height:o.domElement.height},rendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height},containerRect:{width:R.width,height:R.height},cameraAspect:g.aspect,matches:{width:Math.abs(o.domElement.width-R.width)<1,height:Math.abs(o.domElement.height-R.height)<1},sizeDifference:{width:o.domElement.width-R.width,height:o.domElement.height-R.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{E()})});let T=!1;Ye.on("pause",()=>{T=!0,document.querySelectorAll("audio").forEach(c=>c.pause())}),Ye.on("resume",()=>{T=!1,document.querySelectorAll("audio").forEach(c=>{c.currentTime>0&&!c.ended&&c.play().catch(()=>{})})});let x=new fe(e,r);return Ye.on("resize",({payload:d})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:d,timestamp:Date.now(),rootRect:e.getBoundingClientRect()}),E({width:d==null?void 0:d.width,height:d==null?void 0:d.height}),x.updateLayout()}),window.addEventListener("resize",()=>{console.log("[THREE-BASE] Window resize event received:",{timestamp:Date.now(),windowSize:{width:window.innerWidth,height:window.innerHeight},rootRect:e.getBoundingClientRect()}),E(),x.updateLayout()}),{scene:l,camera:g,renderer:o,uiSystem:x,applySize:E}}var k=we(require("three")),Re=class{constructor(t){var n,i;this.position=(t==null?void 0:t.position)||{x:0,y:0},this.scale=(n=t==null?void 0:t.scale)!=null?n:1,this.rotation=(i=t==null?void 0:t.rotation)!=null?i:0}update(t){t.position!==void 0&&(this.position={...t.position}),t.scale!==void 0&&(this.scale=t.scale),t.rotation!==void 0&&(this.rotation=t.rotation)}syncToThree(t){let n=t.position.z,i=n===0||!isFinite(n)?.5:n;t.position.set(this.position.x,this.position.y,i),t.scale.set(this.scale,this.scale,this.scale),t.rotation.z=this.rotation}},Ae=class{constructor(t){var n,i,a,s;this.z_index=(n=t==null?void 0:t.z_index)!=null?n:0,this.alpha=(i=t==null?void 0:t.alpha)!=null?i:1,this.visible=(a=t==null?void 0:t.visible)!=null?a:!0,this.tint=(s=t==null?void 0:t.tint)!=null?s:null}update(t){t.z_index!==void 0&&(this.z_index=t.z_index),t.alpha!==void 0&&(this.alpha=t.alpha),t.visible!==void 0&&(this.visible=t.visible),t.tint!==void 0&&(this.tint=t.tint)}syncToThree(t){if(t.renderOrder=this.z_index,t.visible=this.visible,t instanceof k.Mesh&&t.material&&(Array.isArray(t.material)?t.material.forEach(n=>{n instanceof k.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):t.material instanceof k.Material&&(t.material.opacity=this.alpha,t.material.transparent=this.alpha<1)),this.tint!==null&&t instanceof k.Mesh&&t.material){let n=typeof this.tint=="string"?new k.Color(this.tint):new k.Color(this.tint);Array.isArray(t.material)?t.material.forEach(i=>{(i instanceof k.MeshBasicMaterial||i instanceof k.MeshStandardMaterial)&&i.color.copy(n)}):(t.material instanceof k.MeshBasicMaterial||t.material instanceof k.MeshStandardMaterial)&&t.material.color.copy(n)}}},Ce=class{constructor(t,n,i,a){this.instanceId=t,this.objectConfig=n,this.threeObject=i,this._config=a,this.transform=new Re(a.transform),this.renderer=new Ae(a.render),this.sync()}sync(){this.transform.syncToThree(this.threeObject),this.renderer.syncToThree(this.threeObject)}updateConfig(t){this._config=t,t.transform&&this.transform.update(t.transform),t.render&&this.renderer.update(t.render),this.sync()}getComponent(t){return this._config[t]}getPosition(){return{...this.transform.position}}setPosition(t,n){this.transform.position={x:t,y:n},this.transform.syncToThree(this.threeObject)}getAlpha(){return this.renderer.alpha}setAlpha(t){this.renderer.alpha=t,this.renderer.syncToThree(this.threeObject)}getVisible(){return this.renderer.visible}setVisible(t){this.renderer.visible=t,this.renderer.syncToThree(this.threeObject)}},Ve=class{constructor(t){this.objects=new Map;this.config=t}create(t,n){let i=this.config.objects.get(t);if(!i)throw new Error(`Object config not found: ${t}`);let a=new Ce(t,i.object_config||t,n,i);return this.objects.set(t,a),a}get(t){return this.objects.get(t)}updateConfig(t){this.config=t;for(let[n,i]of this.objects.entries()){let a=t.objects.get(n);a&&i.updateConfig(a)}}getAll(){return Array.from(this.objects.values())}remove(t){this.objects.delete(t)}clear(){this.objects.clear()}};var qe={"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 Y(e){let t=qe[e];return t?t.family:(console.warn(`Font ID "${e}" not found in registry, using fallback`),"Arial, sans-serif")}function G(e){var n;let t=qe[e];return t&&(n=t.weight)!=null?n:"400"}function bi(e,t){qe[e]=t}function wi(){return Object.keys(qe)}var ye=we(require("three"));function se(e){return{element:e,get alpha(){return parseFloat(e.style.opacity||"1")},set alpha(t){e.style.opacity=t.toString()},get visible(){return e.style.display!=="none"},set visible(t){e.style.display=t?"":"none"},position:{set(t,n){e.style.left=`${t}px`,e.style.top=`${n}px`},get x(){return parseFloat(e.style.left||"0")},get y(){return parseFloat(e.style.top||"0")}},scale:{set(t,n){e.style.transform=`scale(${t})`},get x(){let t=e.style.transform.match(/scale\(([^)]+)\)/);return t?parseFloat(t[1]):1}}}}function Ei(e,t,n,i){var kt,Ft,Dt,$t,Pt,Wt,zt,Bt,Nt,Ot,jt,It,Yt,Gt,Vt,qt,Xt,Kt,Jt,Zt,Qt,Ut,en,tn,nn,an,sn,on,rn,ln,cn,dn,pn,mn,un,hn,fn,yn,gn,bn,wn,En,xn,_n,Tn,vn,Sn,Rn,An,Cn,Hn,Mn,Ln,kn,Fn,Dn,$n,Pn,Wn,zn,Bn,Nn,On;let a=e.objects.get("ui_endgame_1"),s=e.objects.get("ui_endgame_logo_1"),r=e.objects.get("ui_endgame_title_1"),u=e.objects.get("ui_endgame_subtitle_1"),l=e.objects.get("ui_endgame_footer_1"),m=e.objects.get("ui_endgame_cta_1"),p=e.objects.get("ui_endgame_cta_hint_1"),y=e.objects.get("ui_endgame_hand_1"),f=e.engine.runtime||{},h=((kt=a==null?void 0:a.gameplay)==null?void 0:kt.tuning)||{},g=(a==null?void 0:a.render)||{},o=i.getBoundingClientRect(),E=o.width>0?o.width*.9:320,T=o.height>0?o.height*.85:400,x=Math.min((Ft=h.panel_width)!=null?Ft:320,E),d=Math.min((Dt=h.panel_height)!=null?Dt:400,T),c=($t=h.panel_padding)!=null?$t:32,b=(Pt=h.panel_radius)!=null?Pt:24,_=g.background_color||h.panel_bg_color||"#1a0a0a",S=g.background_alpha!==void 0&&g.background_alpha!==null?g.background_alpha:(Wt=h.panel_bg_alpha)!=null?Wt:.98,C=g.border_color||h.panel_border_color||"#ffffff",F=(zt=h.panel_border_width)!=null?zt:2,R=(Bt=h.panel_border_alpha)!=null?Bt:.3,A=document.createElement("div");A.style.cssText=`
41
41
  position: absolute;
42
42
  width: ${x}px;
43
43
  height: ${d}px;
@@ -56,8 +56,8 @@
56
56
  z-index: 1000;
57
57
  box-sizing: border-box;
58
58
  padding: ${c}px;
59
- `,i.appendChild(A);let L=se(A);L.element=A;let H=((Ot=s==null?void 0:s.gameplay)==null?void 0:Ot.tuning)||{},ee=(s==null?void 0:s.transform)||{},O=(Nt=H.logo_size)!=null?Nt:56,Y=(Yt=ee.scale)!=null?Yt:1,oe=(jt=(It=ee.offset)==null?void 0:It.y)!=null?jt:-130,He=(Gt=H.logo_alpha)!=null?Gt:1,Mi=new ye.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),I=new ye.Sprite(Mi);I.position.set(0,oe,0),I.material.opacity=0;let Me=0,Le=0;if(n&&(Me=((Vt=n.image)==null?void 0:Vt.width)||100,Le=((qt=n.image)==null?void 0:qt.height)||100),Me>0&&Le>0){let re=Me/Le,it,at;re>1?(it=O,at=O/re):(at=O,it=O*re);let fa=it/Me*Y,ya=at/Le*Y;I.scale.set(fa,ya,1)}else{let re=O/100*Y;I.scale.set(re,re,1)}I.targetAlpha=He,I.baseScaleX=I.scale.x,I.baseScaleY=I.scale.y;let D=r==null?void 0:r.ui,V=((Xt=r==null?void 0:r.gameplay)==null?void 0:Xt.tuning)||{},Li=(D==null?void 0:D.text)||"MISSION ACCOMPLISHED",gt=(D==null?void 0:D.font)||"brand.heading",Ke=(D==null?void 0:D.fontSize)||24,ki=(Kt=D==null?void 0:D.letterSpacing)!=null?Kt:1,ke=(Jt=r==null?void 0:r.render)==null?void 0:Jt.tint,Fi=typeof ke=="string"?ke:ke?`#${ke.toString(16).padStart(6,"0")}`:"#00FF88",Di=x-c*2-30,$i=V.font_weight_override?V.font_weight_override:G(gt),te=document.createElement("div");te.textContent=Li,te.style.cssText=`
60
- font-family: ${j(gt)};
59
+ `,i.appendChild(A);let L=se(A);L.element=A;let H=((Nt=s==null?void 0:s.gameplay)==null?void 0:Nt.tuning)||{},ee=(s==null?void 0:s.transform)||{},N=(Ot=H.logo_size)!=null?Ot:56,j=(jt=ee.scale)!=null?jt:1,oe=(Yt=(It=ee.offset)==null?void 0:It.y)!=null?Yt:-130,He=(Gt=H.logo_alpha)!=null?Gt:1,Mi=new ye.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),I=new ye.Sprite(Mi);I.position.set(0,oe,0),I.material.opacity=0;let Me=0,Le=0;if(n&&(Me=((Vt=n.image)==null?void 0:Vt.width)||100,Le=((qt=n.image)==null?void 0:qt.height)||100),Me>0&&Le>0){let re=Me/Le,it,at;re>1?(it=N,at=N/re):(at=N,it=N*re);let fa=it/Me*j,ya=at/Le*j;I.scale.set(fa,ya,1)}else{let re=N/100*j;I.scale.set(re,re,1)}I.targetAlpha=He,I.baseScaleX=I.scale.x,I.baseScaleY=I.scale.y;let D=r==null?void 0:r.ui,V=((Xt=r==null?void 0:r.gameplay)==null?void 0:Xt.tuning)||{},Li=(D==null?void 0:D.text)||"MISSION ACCOMPLISHED",gt=(D==null?void 0:D.font)||"brand.heading",Ke=(D==null?void 0:D.fontSize)||24,ki=(Kt=D==null?void 0:D.letterSpacing)!=null?Kt:1,ke=(Jt=r==null?void 0:r.render)==null?void 0:Jt.tint,Fi=typeof ke=="string"?ke:ke?`#${ke.toString(16).padStart(6,"0")}`:"#00FF88",Di=x-c*2-30,$i=V.font_weight_override?V.font_weight_override:G(gt),te=document.createElement("div");te.textContent=Li,te.style.cssText=`
60
+ font-family: ${Y(gt)};
61
61
  font-size: ${Ke}px;
62
62
  font-weight: ${$i};
63
63
  color: ${Fi};
@@ -71,7 +71,7 @@
71
71
  white-space: nowrap;
72
72
  max-width: ${Di}px;
73
73
  `;let bt=c+30,Pi=((nn=h.title_offset_y)!=null?nn:bt+Ke/2)+((an=V.animation_start_y_offset)!=null?an:-20);te.style.top=`${Pi}px`,te.style.left="50%";let wt=se(te);wt.element=te,A.appendChild(te);let $=u==null?void 0:u.ui,Et=((sn=u==null?void 0:u.gameplay)==null?void 0:sn.tuning)||{},Wi=($==null?void 0:$.text)||"RESCUE COMPLETE",xt=($==null?void 0:$.font)||"brand.body",Je=($==null?void 0:$.fontSize)||11,zi=(on=$==null?void 0:$.letterSpacing)!=null?on:.5,Fe=(rn=u==null?void 0:u.render)==null?void 0:rn.tint,Bi=typeof Fe=="string"?Fe:Fe?`#${Fe.toString(16).padStart(6,"0")}`:"#B0B0B0",ne=document.createElement("div");ne.textContent=Wi,ne.style.cssText=`
74
- font-family: ${j(xt)};
74
+ font-family: ${Y(xt)};
75
75
  font-size: ${Je}px;
76
76
  font-weight: ${G(xt)};
77
77
  color: ${Bi};
@@ -81,17 +81,17 @@
81
81
  position: absolute;
82
82
  transform: translate(-50%, -50%);
83
83
  white-space: nowrap;
84
- `;let _t=bt+Ke+15,Oi=((ln=h.subtitle_offset_y)!=null?ln:_t+Je/2)+((cn=Et.animation_start_y_offset)!=null?cn:-10);ne.style.top=`${Oi}px`,ne.style.left="50%";let Ze=se(ne);Ze.element=ne,Ze.animationStartYOffset=(dn=Et.animation_start_y_offset)!=null?dn:-10,A.appendChild(ne);let q=l==null?void 0:l.ui,Tt=((pn=l==null?void 0:l.gameplay)==null?void 0:pn.tuning)||{},Ni=(q==null?void 0:q.text)||((mn=f.ui)==null?void 0:mn.cta_hint)||"Continue the adventure!",vt=(q==null?void 0:q.font)||"brand.body",St=(q==null?void 0:q.fontSize)||16,De=(un=l==null?void 0:l.render)==null?void 0:un.tint,Yi=typeof De=="string"?De:De?`#${De.toString(16).padStart(6,"0")}`:"#FFFFFF",Ii=(hn=Tt.max_width)!=null?hn:x-c*2,ji=(fn=Tt.line_height)!=null?fn:1.4,ie=document.createElement("div");ie.textContent=Ni,ie.style.cssText=`
85
- font-family: ${j(vt)};
84
+ `;let _t=bt+Ke+15,Ni=((ln=h.subtitle_offset_y)!=null?ln:_t+Je/2)+((cn=Et.animation_start_y_offset)!=null?cn:-10);ne.style.top=`${Ni}px`,ne.style.left="50%";let Ze=se(ne);Ze.element=ne,Ze.animationStartYOffset=(dn=Et.animation_start_y_offset)!=null?dn:-10,A.appendChild(ne);let q=l==null?void 0:l.ui,Tt=((pn=l==null?void 0:l.gameplay)==null?void 0:pn.tuning)||{},Oi=(q==null?void 0:q.text)||((mn=f.ui)==null?void 0:mn.cta_hint)||"Continue the adventure!",vt=(q==null?void 0:q.font)||"brand.body",St=(q==null?void 0:q.fontSize)||16,De=(un=l==null?void 0:l.render)==null?void 0:un.tint,ji=typeof De=="string"?De:De?`#${De.toString(16).padStart(6,"0")}`:"#FFFFFF",Ii=(hn=Tt.max_width)!=null?hn:x-c*2,Yi=(fn=Tt.line_height)!=null?fn:1.4,ie=document.createElement("div");ie.textContent=Oi,ie.style.cssText=`
85
+ font-family: ${Y(vt)};
86
86
  font-size: ${St}px;
87
87
  font-weight: ${G(vt)};
88
- color: ${Yi};
88
+ color: ${ji};
89
89
  text-align: center;
90
90
  opacity: 0;
91
91
  position: absolute;
92
92
  transform: translate(-50%, -50%);
93
93
  max-width: ${Ii}px;
94
- line-height: ${ji};
94
+ line-height: ${Yi};
95
95
  word-wrap: break-word;
96
96
  `;let Gi=_t+Je+30,Vi=(yn=h.footer_offset_y)!=null?yn:Gi+St/2;ie.style.top=`${Vi}px`,ie.style.left="50%";let Qe=se(ie);Qe.element=ie;let qi=((gn=l==null?void 0:l.render)==null?void 0:gn.alpha)!==void 0&&((bn=l==null?void 0:l.render)==null?void 0:bn.alpha)!==null?l.render.alpha:1;Qe.targetAlpha=qi,A.appendChild(ie);let X=((wn=m==null?void 0:m.gameplay)==null?void 0:wn.tuning)||{},P=m==null?void 0:m.ui,Xi=(En=X.button_width)!=null?En:260,Rt=(xn=X.button_height)!=null?xn:56,Ki=(_n=X.button_radius)!=null?_n:16,Ji=X.button_bg_color||((Tn=f.theme)==null?void 0:Tn.cta_background)||"#ffb43b",Zi=(vn=X.button_bg_alpha)!=null?vn:1,Qi=X.button_border_color||"#ffffff",Ui=(Sn=X.button_border_width)!=null?Sn:2,Va=(Rn=X.button_border_alpha)!=null?Rn:.2,Ue=(An=h.cta_offset_y)!=null?An:d*.7,M=document.createElement("button");M.style.cssText=`
97
97
  width: ${Xi}px;
@@ -105,8 +105,8 @@
105
105
  position: absolute;
106
106
  transform: translate(-50%, -50%);
107
107
  box-shadow: inset 0 0 1px rgba(0,0,0,0.15);
108
- `,M.style.top=`${Ue}px`,M.style.left="50%";let et=se(M);et.element=M,et.addEventListener=M.addEventListener.bind(M),A.appendChild(M);let ea=(P==null?void 0:P.text)||((Cn=f.ui)==null?void 0:Cn.cta_label_end)||"DOWNLOAD",At=(P==null?void 0:P.font)||"brand.heading",ta=(P==null?void 0:P.fontSize)||20,na=X.button_text_color||((Hn=f.theme)==null?void 0:Hn.cta_text)||"#1a0a0a";M.textContent=ea,M.style.fontFamily=j(At),M.style.fontSize=`${ta}px`,M.style.fontWeight=String(G(At)),M.style.color=na,M.style.letterSpacing=`${(Mn=P==null?void 0:P.letterSpacing)!=null?Mn:1}px`;let Ct=se(M);Ct.element=M;let W=p==null?void 0:p.ui,Ht=((Ln=p==null?void 0:p.gameplay)==null?void 0:Ln.tuning)||{},ia=(W==null?void 0:W.text)||"Play the full game",Mt=(W==null?void 0:W.font)||"brand.body",aa=(W==null?void 0:W.fontSize)||11,sa=(kn=W==null?void 0:W.letterSpacing)!=null?kn:0,$e=(Fn=p==null?void 0:p.render)==null?void 0:Fn.tint,oa=typeof $e=="string"?$e:$e?`#${$e.toString(16).padStart(6,"0")}`:"#CCCCCC",ae=document.createElement("div");ae.textContent=ia,ae.style.cssText=`
109
- font-family: ${j(Mt)};
108
+ `,M.style.top=`${Ue}px`,M.style.left="50%";let et=se(M);et.element=M,et.addEventListener=M.addEventListener.bind(M),A.appendChild(M);let ea=(P==null?void 0:P.text)||((Cn=f.ui)==null?void 0:Cn.cta_label_end)||"DOWNLOAD",At=(P==null?void 0:P.font)||"brand.heading",ta=(P==null?void 0:P.fontSize)||20,na=X.button_text_color||((Hn=f.theme)==null?void 0:Hn.cta_text)||"#1a0a0a";M.textContent=ea,M.style.fontFamily=Y(At),M.style.fontSize=`${ta}px`,M.style.fontWeight=String(G(At)),M.style.color=na,M.style.letterSpacing=`${(Mn=P==null?void 0:P.letterSpacing)!=null?Mn:1}px`;let Ct=se(M);Ct.element=M;let W=p==null?void 0:p.ui,Ht=((Ln=p==null?void 0:p.gameplay)==null?void 0:Ln.tuning)||{},ia=(W==null?void 0:W.text)||"Play the full game",Mt=(W==null?void 0:W.font)||"brand.body",aa=(W==null?void 0:W.fontSize)||11,sa=(kn=W==null?void 0:W.letterSpacing)!=null?kn:0,$e=(Fn=p==null?void 0:p.render)==null?void 0:Fn.tint,oa=typeof $e=="string"?$e:$e?`#${$e.toString(16).padStart(6,"0")}`:"#CCCCCC",ae=document.createElement("div");ae.textContent=ia,ae.style.cssText=`
109
+ font-family: ${Y(Mt)};
110
110
  font-size: ${aa}px;
111
111
  font-weight: ${G(Mt)};
112
112
  color: ${oa};
@@ -116,8 +116,8 @@
116
116
  position: absolute;
117
117
  transform: translate(-50%, -50%);
118
118
  white-space: nowrap;
119
- `;let ra=Ue+Rt/2+20,la=d-c-10,ca=Math.min(ra+((Dn=Ht.animation_start_y_offset)!=null?Dn:5),la);ae.style.top=`${ca}px`,ae.style.left="50%";let tt=se(ae);tt.element=ae,tt.animationStartYOffset=($n=Ht.animation_start_y_offset)!=null?$n:5,A.appendChild(ae);let nt=((Pn=y==null?void 0:y.gameplay)==null?void 0:Pn.tuning)||{},da=(Wn=nt.hand_offset_x)!=null?Wn:50,pa=(zn=nt.hand_offset_y)!=null?zn:50,ma=(On=(Bn=y==null?void 0:y.transform)==null?void 0:Bn.scale)!=null?On:.1875,ua=(Nn=nt.hand_scale_multiplier)!=null?Nn:2.5,ha=new ye.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),be=new ye.Sprite(ha),Lt=ma*ua*100;return be.scale.set(Lt,Lt,1),be.position.set(da,Ue+pa,0),be.material.opacity=0,be.visible=!1,{panel:L,logo:I,title:wt,subtitle:Ze,footer:Qe,ctaButton:et,ctaText:Ct,ctaHint:tt,hand:be}}function xi(e,t,n){var _,S,C,F,R,A,L,H;let i=t.objects.get("ui_endgame_1"),a=((_=i==null?void 0:i.gameplay)==null?void 0:_.tuning)||{},s=(S=a.animation_duration_ms)!=null?S:800,r=(C=a.fade_in_duration_ms)!=null?C:600,u=(F=a.scale_animation_intensity)!=null?F:.1,l=(R=a.logo_animation_delay_ms)!=null?R:100,m=(A=a.title_animation_delay_ms)!=null?A:200,p=(L=a.footer_animation_delay_ms)!=null?L:300,y=(H=a.cta_animation_delay_ms)!=null?H:400,{panel:f,logo:h,title:g,subtitle:o,footer:E,ctaButton:T,ctaText:x,ctaHint:d}=e;f.visible=!0,f.element.style.visibility="visible";let c=Date.now(),b=()=>{let ee=Date.now()-c,O=Math.min(ee/r,1),Y=1-Math.pow(1-O,3);f.alpha=Y,f.element.style.opacity=Y.toString();let oe=1+u*(1-Y);f.element.style.transform=`translate(-50%, -50%) scale(${oe})`,O<1?requestAnimationFrame(b):(setTimeout(()=>Wa(h,s,t),l),setTimeout(()=>{za(g,s),setTimeout(()=>Ba(o,s),50)},m),setTimeout(()=>Oa(E,s),p),setTimeout(()=>{Na(T,x,s),setTimeout(()=>Ya(d,s),50),n&&n()},y))};b()}function Wa(e,t,n){var f,h,g,o,E;let i=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(h=(((f=i==null?void 0:i.gameplay)==null?void 0:f.tuning)||{}).animation_start_scale)!=null?h:1.2,r=Date.now(),u=e.material.opacity,l=(g=e.targetAlpha)!=null?g:1,m=(o=e.baseScaleX)!=null?o:e.scale.x,p=(E=e.baseScaleY)!=null?E:e.scale.y,y=()=>{let T=Date.now()-r,x=Math.min(T/t,1),d=1-Math.pow(1-x,2);e.material.opacity=u+(l-u)*d;let c=s+(1-s)*d;e.scale.set(m*c,p*c,1),x<1&&requestAnimationFrame(y)};y()}function za(e,t){let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=()=>{let r=Date.now()-n,u=Math.min(r/t,1),l=1-Math.pow(1-u,2);e.element.style.opacity=(i+(1-i)*l).toString(),e.element.style.top=`${a-20*(1-l)}px`,u<1&&requestAnimationFrame(s)};s()}function Ba(e,t){var u;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=a-((u=e.animationStartYOffset)!=null?u:-10),r=()=>{let l=Date.now()-n,m=Math.min(l/t,1),p=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*p).toString(),e.element.style.top=`${a+(s-a)*p}px`,m<1&&requestAnimationFrame(r)};r()}function Oa(e,t){var r;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=(r=e.targetAlpha)!=null?r:1,s=()=>{let u=Date.now()-n,l=Math.min(u/t,1),m=1-Math.pow(1-l,2);e.element.style.opacity=(i+(a-i)*m).toString(),l<1&&requestAnimationFrame(s)};s()}function Na(e,t,n){let i=Date.now(),a=parseFloat(e.element.style.opacity||"0"),s=()=>{let r=Date.now()-i,u=Math.min(r/n,1),l=1-Math.pow(1-u,2);e.element.style.opacity=(a+(1-a)*l).toString(),t.element.style.opacity=(a+(1-a)*l).toString(),e.element.style.transform=`translate(-50%, -50%) scale(${1+.1*(1-l)})`,u<1&&requestAnimationFrame(s)};s()}function Ya(e,t){var u;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=a-((u=e.animationStartYOffset)!=null?u:5),r=()=>{let l=Date.now()-n,m=Math.min(l/t,1),p=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*p).toString(),e.element.style.top=`${a+(s-a)*p}px`,m<1&&requestAnimationFrame(r)};r()}function _i(e,t,n,i){var p,y,f,h;let a=n.objects.get("ui_endgame_hand_1"),s=((p=a==null?void 0:a.gameplay)==null?void 0:p.tuning)||{},r=(y=s.click_animation_duration_ms)!=null?y:600,u=(f=s.click_delay_ms)!=null?f:2e3,l=(h=s.click_repeat_delay_ms)!=null?h:3e3,m=()=>{var S,C;e.visible=!0,e.material.opacity=1;let g=e.position.x,o=e.position.y,E=(S=s.hand_offset_x)!=null?S:50,T=(C=s.hand_offset_y)!=null?C:50,x=t.element.getBoundingClientRect(),d=E,c=T,b=Date.now(),_=()=>{var Y,oe,He;let F=Date.now()-b,R=Math.min(F/r,1),A=R<.5?2*R*R:1-Math.pow(-2*R+2,2)/2;e.position.set(g+(d-g)*A,o+(c-o)*A,0);let L=(oe=(Y=a==null?void 0:a.transform)==null?void 0:Y.scale)!=null?oe:.1875,H=(He=s.hand_scale_multiplier)!=null?He:2.5,ee=L*H*100,O=ee+ee*.2*Math.sin(R*Math.PI);e.scale.set(O,O,1),R<1?requestAnimationFrame(_):(t.element.style.transform="translate(-50%, -50%) scale(0.95)",setTimeout(()=>{t.element.style.transform="translate(-50%, -50%) scale(1)",i()},100),setTimeout(()=>{e.material.opacity=0,setTimeout(()=>{e.position.set(g,o,0),m()},l)},500))};_()};setTimeout(m,u)}var Xe=we(require("three"));function Ti(e,t,n){var h,g,o,E,T,x,d;let i=t.objects.get("hand_tutorial_1"),a=((h=i==null?void 0:i.gameplay)==null?void 0:h.tuning)||{},s=(i==null?void 0:i.render)||{},r=(i==null?void 0:i.transform)||{},u=new Xe.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),l=new Xe.Sprite(u),m=r.position||{},p=(g=m==null?void 0:m.z)!=null?g:0;l.position.set(n.x+((o=m==null?void 0:m.x)!=null?o:0),n.y+((E=m==null?void 0:m.y)!=null?E: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 y=(T=a.hand_scale_multiplier)!=null?T:2.5,f=(x=r.scale)!=null?x:.1875;return l.scale.set(f*y*100,f*y*100,1),l.renderOrder=(d=s.z_index)!=null?d:99999,l}function vi(e){var g,o,E,T,x,d,c,b,_;let t=e.objects.get("ui_tutorial_1"),n=t==null?void 0:t.ui,i=(t==null?void 0:t.render)||{},a=((g=e.engine.runtime)==null?void 0:g.ui_styles)||{},s=((o=e.engine.runtime)==null?void 0:o.ui)||{},r=(n==null?void 0:n.text)||s.tutorial_label||s.label_text||"CLEAN!",u=(n==null?void 0:n.font)||"brand.warning",l=(n==null?void 0:n.fontSize)||a.label_font_size||52,m=(T=n==null?void 0:n.letterSpacing)!=null?T:(E=a.label_letter_spacing)!=null?E:-1,p=(n==null?void 0:n.align)||"center",y=i.tint,f=typeof y=="string"?y:y?`#${y.toString(16).padStart(6,"0")}`:a.label_fill||"#FFF1C1",h=document.createElement("div");return h.textContent=r,h.style.cssText=`
120
- font-family: ${j(u)};
119
+ `;let ra=Ue+Rt/2+20,la=d-c-10,ca=Math.min(ra+((Dn=Ht.animation_start_y_offset)!=null?Dn:5),la);ae.style.top=`${ca}px`,ae.style.left="50%";let tt=se(ae);tt.element=ae,tt.animationStartYOffset=($n=Ht.animation_start_y_offset)!=null?$n:5,A.appendChild(ae);let nt=((Pn=y==null?void 0:y.gameplay)==null?void 0:Pn.tuning)||{},da=(Wn=nt.hand_offset_x)!=null?Wn:50,pa=(zn=nt.hand_offset_y)!=null?zn:50,ma=(Nn=(Bn=y==null?void 0:y.transform)==null?void 0:Bn.scale)!=null?Nn:.1875,ua=(On=nt.hand_scale_multiplier)!=null?On:2.5,ha=new ye.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),be=new ye.Sprite(ha),Lt=ma*ua*100;return be.scale.set(Lt,Lt,1),be.position.set(da,Ue+pa,0),be.material.opacity=0,be.visible=!1,{panel:L,logo:I,title:wt,subtitle:Ze,footer:Qe,ctaButton:et,ctaText:Ct,ctaHint:tt,hand:be}}function xi(e,t,n){var _,S,C,F,R,A,L,H;let i=t.objects.get("ui_endgame_1"),a=((_=i==null?void 0:i.gameplay)==null?void 0:_.tuning)||{},s=(S=a.animation_duration_ms)!=null?S:800,r=(C=a.fade_in_duration_ms)!=null?C:600,u=(F=a.scale_animation_intensity)!=null?F:.1,l=(R=a.logo_animation_delay_ms)!=null?R:100,m=(A=a.title_animation_delay_ms)!=null?A:200,p=(L=a.footer_animation_delay_ms)!=null?L:300,y=(H=a.cta_animation_delay_ms)!=null?H:400,{panel:f,logo:h,title:g,subtitle:o,footer:E,ctaButton:T,ctaText:x,ctaHint:d}=e;f.visible=!0,f.element.style.visibility="visible";let c=Date.now(),b=()=>{let ee=Date.now()-c,N=Math.min(ee/r,1),j=1-Math.pow(1-N,3);f.alpha=j,f.element.style.opacity=j.toString();let oe=1+u*(1-j);f.element.style.transform=`translate(-50%, -50%) scale(${oe})`,N<1?requestAnimationFrame(b):(setTimeout(()=>Wa(h,s,t),l),setTimeout(()=>{za(g,s),setTimeout(()=>Ba(o,s),50)},m),setTimeout(()=>Na(E,s),p),setTimeout(()=>{Oa(T,x,s),setTimeout(()=>ja(d,s),50),n&&n()},y))};b()}function Wa(e,t,n){var f,h,g,o,E;let i=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(h=(((f=i==null?void 0:i.gameplay)==null?void 0:f.tuning)||{}).animation_start_scale)!=null?h:1.2,r=Date.now(),u=e.material.opacity,l=(g=e.targetAlpha)!=null?g:1,m=(o=e.baseScaleX)!=null?o:e.scale.x,p=(E=e.baseScaleY)!=null?E:e.scale.y,y=()=>{let T=Date.now()-r,x=Math.min(T/t,1),d=1-Math.pow(1-x,2);e.material.opacity=u+(l-u)*d;let c=s+(1-s)*d;e.scale.set(m*c,p*c,1),x<1&&requestAnimationFrame(y)};y()}function za(e,t){let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=()=>{let r=Date.now()-n,u=Math.min(r/t,1),l=1-Math.pow(1-u,2);e.element.style.opacity=(i+(1-i)*l).toString(),e.element.style.top=`${a-20*(1-l)}px`,u<1&&requestAnimationFrame(s)};s()}function Ba(e,t){var u;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=a-((u=e.animationStartYOffset)!=null?u:-10),r=()=>{let l=Date.now()-n,m=Math.min(l/t,1),p=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*p).toString(),e.element.style.top=`${a+(s-a)*p}px`,m<1&&requestAnimationFrame(r)};r()}function Na(e,t){var r;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=(r=e.targetAlpha)!=null?r:1,s=()=>{let u=Date.now()-n,l=Math.min(u/t,1),m=1-Math.pow(1-l,2);e.element.style.opacity=(i+(a-i)*m).toString(),l<1&&requestAnimationFrame(s)};s()}function Oa(e,t,n){let i=Date.now(),a=parseFloat(e.element.style.opacity||"0"),s=()=>{let r=Date.now()-i,u=Math.min(r/n,1),l=1-Math.pow(1-u,2);e.element.style.opacity=(a+(1-a)*l).toString(),t.element.style.opacity=(a+(1-a)*l).toString(),e.element.style.transform=`translate(-50%, -50%) scale(${1+.1*(1-l)})`,u<1&&requestAnimationFrame(s)};s()}function ja(e,t){var u;let n=Date.now(),i=parseFloat(e.element.style.opacity||"0"),a=parseFloat(e.element.style.top||"0"),s=a-((u=e.animationStartYOffset)!=null?u:5),r=()=>{let l=Date.now()-n,m=Math.min(l/t,1),p=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*p).toString(),e.element.style.top=`${a+(s-a)*p}px`,m<1&&requestAnimationFrame(r)};r()}function _i(e,t,n,i){var p,y,f,h;let a=n.objects.get("ui_endgame_hand_1"),s=((p=a==null?void 0:a.gameplay)==null?void 0:p.tuning)||{},r=(y=s.click_animation_duration_ms)!=null?y:600,u=(f=s.click_delay_ms)!=null?f:2e3,l=(h=s.click_repeat_delay_ms)!=null?h:3e3,m=()=>{var S,C;e.visible=!0,e.material.opacity=1;let g=e.position.x,o=e.position.y,E=(S=s.hand_offset_x)!=null?S:50,T=(C=s.hand_offset_y)!=null?C:50,x=t.element.getBoundingClientRect(),d=E,c=T,b=Date.now(),_=()=>{var j,oe,He;let F=Date.now()-b,R=Math.min(F/r,1),A=R<.5?2*R*R:1-Math.pow(-2*R+2,2)/2;e.position.set(g+(d-g)*A,o+(c-o)*A,0);let L=(oe=(j=a==null?void 0:a.transform)==null?void 0:j.scale)!=null?oe:.1875,H=(He=s.hand_scale_multiplier)!=null?He:2.5,ee=L*H*100,N=ee+ee*.2*Math.sin(R*Math.PI);e.scale.set(N,N,1),R<1?requestAnimationFrame(_):(t.element.style.transform="translate(-50%, -50%) scale(0.95)",setTimeout(()=>{t.element.style.transform="translate(-50%, -50%) scale(1)",i()},100),setTimeout(()=>{e.material.opacity=0,setTimeout(()=>{e.position.set(g,o,0),m()},l)},500))};_()};setTimeout(m,u)}var Xe=we(require("three"));function Ti(e,t,n){var h,g,o,E,T,x,d;let i=t.objects.get("hand_tutorial_1"),a=((h=i==null?void 0:i.gameplay)==null?void 0:h.tuning)||{},s=(i==null?void 0:i.render)||{},r=(i==null?void 0:i.transform)||{},u=new Xe.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),l=new Xe.Sprite(u),m=r.position||{},p=(g=m==null?void 0:m.z)!=null?g:0;l.position.set(n.x+((o=m==null?void 0:m.x)!=null?o:0),n.y+((E=m==null?void 0:m.y)!=null?E: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 y=(T=a.hand_scale_multiplier)!=null?T:2.5,f=(x=r.scale)!=null?x:.1875;return l.scale.set(f*y*100,f*y*100,1),l.renderOrder=(d=s.z_index)!=null?d:99999,l}function vi(e){var g,o,E,T,x,d,c,b,_;let t=e.objects.get("ui_tutorial_1"),n=t==null?void 0:t.ui,i=(t==null?void 0:t.render)||{},a=((g=e.engine.runtime)==null?void 0:g.ui_styles)||{},s=((o=e.engine.runtime)==null?void 0:o.ui)||{},r=(n==null?void 0:n.text)||s.tutorial_label||s.label_text||"CLEAN!",u=(n==null?void 0:n.font)||"brand.warning",l=(n==null?void 0:n.fontSize)||a.label_font_size||52,m=(T=n==null?void 0:n.letterSpacing)!=null?T:(E=a.label_letter_spacing)!=null?E:-1,p=(n==null?void 0:n.align)||"center",y=i.tint,f=typeof y=="string"?y:y?`#${y.toString(16).padStart(6,"0")}`:a.label_fill||"#FFF1C1",h=document.createElement("div");return h.textContent=r,h.style.cssText=`
120
+ font-family: ${Y(u)};
121
121
  font-size: ${l}px;
122
122
  font-weight: ${G(u)};
123
123
  color: ${f};
@@ -131,4 +131,4 @@
131
131
  position: absolute;
132
132
  transform: translate(-50%, -50%);
133
133
  white-space: nowrap;
134
- `,h}function Si(e,t,n,i,a){var l,m,p,y,f,h,g;let s=a.objects.get("hand_tutorial_1"),r=((l=s==null?void 0:s.gameplay)==null?void 0:l.tuning)||{},u=(s==null?void 0:s.transform)||{};if(!i){let o=(m=r.animation_duration)!=null?m:1.5,E=n%o/o,T=E<.5?2*E*E:-1+(4-2*E)*E,x=(p=r.x_offset)!=null?p:0,d=(y=r.y_offset)!=null?y:0,c=(f=r.animation_range)!=null?f:40,b=c*.7,_=c,S=t.x+x+b,C=t.y+d+_,F=S+b,R=C+_;e.position.set(S+(F-S)*T,C+(R-C)*T,0);let A=(h=u.scale)!=null?h:.1875,L=(g=r.hand_scale_multiplier)!=null?g:2.5,H=A*L*100;e.scale.set(H,H,1)}}var ge=we(require("three")),Ri=new ge.TextureLoader,ht=null,ft=null;async function Ai(){if(ht)return ht;if(!ft){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"})();ft=new Function("path","return import(path)")(n).then(i=>i.INLINE_ASSETS||{}).catch(i=>(console.warn("[assets] Failed to load inline-assets.js:",i),{}))}let e=await ft;return ht=e||{},e||{}}async function yt(e,t,n=16777215,i=!1){try{let s=(await Ai())[e];return await Ri.loadAsync(s||e)}catch{console.warn(`Asset missing: ${e}. 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 ge.CanvasTexture(s)}}async function Ci(e,t,n){var g,o,E,T;let a=(await Ai())[e]||e,s;try{s=await Ri.loadAsync(a),console.log("[character] loaded sheet",{path:e,sourceUsed:a})}catch(x){let b=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await yt(e,t,parseInt(b,16),!0),console.warn("[character] fallback loadAsset used",{path:e,err:x})}if(!s)return[];let r=n.gameplay.character_sheet||{},u=(g=r.cols)!=null?g:3,l=(o=r.rows)!=null?o:2,m=((E=s.image)==null?void 0:E.width)||0,p=((T=s.image)==null?void 0:T.height)||0,y=m/u,f=p/l;if(!Number.isFinite(y)||!Number.isFinite(f)||y<=0||f<=0)return[s];let h=[];for(let x=0;x<l;x++)for(let d=0;d<u;d++){let c=document.createElement("canvas");c.width=y,c.height=f;let b=c.getContext("2d");b&&s.image&&b.drawImage(s.image,d*y,x*f,y,f,0,0,y,f),h.push(new ge.CanvasTexture(c))}return h.length>2&&h.push(...h.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:h.length}),h}function Hi(e,t){var y,f,h,g;let n=t.gameplay.brush||{},i=t.theme.brush_color||"#ffffff",a=(y=n.radius)!=null?y:20,s=(f=n.inner_radius)!=null?f:15,r=(h=n.alpha)!=null?h:.8,u=(g=n.inner_alpha)!=null?g:.3,l=n.inner_color||"#ffffff",m=document.createElement("canvas");m.width=a*2,m.height=a*2;let p=m.getContext("2d");return p&&(p.clearRect(0,0,m.width,m.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=u,p.fill()),new ge.CanvasTexture(m)}0&&(module.exports={AspectClass,GameObject,GameObjectManager,Renderer,ResponsiveUISystem,Transform,animateHandClick,animatePanelEntrance,createBrushTexture,createEndGamePanel,createHandTutorial,createThreeBase,createTutorialLabel,getAspectClass,getRegisteredFontIds,loadAsset,loadCharacterFrames,registerFont,resolveFont,resolveFontWeight,updateHandAnimation});
134
+ `,h}function Si(e,t,n,i,a){var l,m,p,y,f,h,g;let s=a.objects.get("hand_tutorial_1"),r=((l=s==null?void 0:s.gameplay)==null?void 0:l.tuning)||{},u=(s==null?void 0:s.transform)||{};if(!i){let o=(m=r.animation_duration)!=null?m:1.5,E=n%o/o,T=E<.5?2*E*E:-1+(4-2*E)*E,x=(p=r.x_offset)!=null?p:0,d=(y=r.y_offset)!=null?y:0,c=(f=r.animation_range)!=null?f:40,b=c*.7,_=c,S=t.x+x+b,C=t.y+d+_,F=S+b,R=C+_;e.position.set(S+(F-S)*T,C+(R-C)*T,0);let A=(h=u.scale)!=null?h:.1875,L=(g=r.hand_scale_multiplier)!=null?g:2.5,H=A*L*100;e.scale.set(H,H,1)}}var ge=we(require("three")),Ri=new ge.TextureLoader,ht=null,ft=null;async function Ai(){if(ht)return ht;if(!ft){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"})();ft=new Function("path","return import(path)")(n).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 e=await ft;return ht=e||{},e||{}}async function yt(e,t,n=16777215,i=!1){try{let s=(await Ai())[e];return await Ri.loadAsync(s||e)}catch{console.warn(`Asset missing: ${e}. 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 ge.CanvasTexture(s)}}async function Ci(e,t,n){var g,o,E,T;let a=(await Ai())[e]||e,s;try{s=await Ri.loadAsync(a),console.log("[character] loaded sheet",{path:e,sourceUsed:a})}catch(x){let b=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await yt(e,t,parseInt(b,16),!0),console.warn("[character] fallback loadAsset used",{path:e,err:x})}if(!s)return[];let r=n.gameplay.character_sheet||{},u=(g=r.cols)!=null?g:3,l=(o=r.rows)!=null?o:2,m=((E=s.image)==null?void 0:E.width)||0,p=((T=s.image)==null?void 0:T.height)||0,y=m/u,f=p/l;if(!Number.isFinite(y)||!Number.isFinite(f)||y<=0||f<=0)return[s];let h=[];for(let x=0;x<l;x++)for(let d=0;d<u;d++){let c=document.createElement("canvas");c.width=y,c.height=f;let b=c.getContext("2d");b&&s.image&&b.drawImage(s.image,d*y,x*f,y,f,0,0,y,f),h.push(new ge.CanvasTexture(c))}return h.length>2&&h.push(...h.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:h.length}),h}function Hi(e,t){var y,f,h,g;let n=t.gameplay.brush||{},i=t.theme.brush_color||"#ffffff",a=(y=n.radius)!=null?y:20,s=(f=n.inner_radius)!=null?f:15,r=(h=n.alpha)!=null?h:.8,u=(g=n.inner_alpha)!=null?g:.3,l=n.inner_color||"#ffffff",m=document.createElement("canvas");m.width=a*2,m.height=a*2;let p=m.getContext("2d");return p&&(p.clearRect(0,0,m.width,m.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=u,p.fill()),new ge.CanvasTexture(m)}0&&(module.exports={AspectClass,GameObject,GameObjectManager,Renderer,ResponsiveUISystem,Transform,animateHandClick,animatePanelEntrance,createBrushTexture,createEndGamePanel,createHandTutorial,createThreeBase,createTutorialLabel,getAspectClass,getRegisteredFontIds,loadAsset,loadCharacterFrames,registerFont,resolveFont,resolveFontWeight,updateHandAnimation});
@@ -1,4 +1,4 @@
1
- import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a[a.PHONE_TALL=0]="PHONE_TALL",a[a.TABLET=1]="TABLET",a[a.LANDSCAPE=2]="LANDSCAPE",a))(tn||{});function Rt(e,t){let n=e/t;return n<=.62?0:n<=.85?1:2}var nt=class{constructor(t,n){this.root=t,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 t=this.stage.getBoundingClientRect(),n=Rt(t.width,t.height);n===0?this.uiFrame.style.maxWidth="420px":n===1?this.uiFrame.style.maxWidth="520px":this.uiFrame.style.maxWidth="640px"}getAspectClass(){let t=this.stage.getBoundingClientRect();return Rt(t.width,t.height)}};async function Vn(e,t={}){let n=()=>{let d=e.getBoundingClientRect(),r=Math.floor(d.width),E=Math.floor(d.height);return(r<=0||!isFinite(r)||r!==r)&&(r=e.clientWidth||window.innerWidth||320),(E<=0||!isFinite(E)||E!==E)&&(E=e.clientHeight||window.innerHeight||480),(r<=0||!isFinite(r)||r!==r)&&(r=320),(E<=0||!isFinite(E)||E!==E)&&(E=480),console.log("[THREE-BASE] getSize result:",{width:r,height:E,boundingRect:{width:d.width,height:d.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleWidth:e.style.width,styleHeight:e.style.height,note:"Using boundingRect as primary source (actual rendered size)"}),{width:r,height:E}},a=e.style.width&&!e.style.width.includes("%"),i=e.style.height&&!e.style.height.includes("%");e.style.position||(e.style.position="relative"),e.style.display||(e.style.display="block"),e.style.width=e.style.width||"100%",e.style.height=e.style.height||"100%",e.style.minWidth="100%",e.style.minHeight="100%",e.style.maxWidth="100%",e.style.maxHeight="100%",e.style.boxSizing="border-box",e.style.overflow="hidden",e.style.margin="0",e.style.padding="0",e.style.border="none";let s=t.background||"linear-gradient(160deg, #0d1020, #0f1c2f)";e.style.setProperty("background",s,"important"),e.style.setProperty("background-size","cover","important"),e.style.setProperty("background-position","center","important"),e.style.setProperty("background-repeat","no-repeat","important");let l=document.createElement("div");l.style.cssText=`
1
+ import{b as dt}from"../chunk-UVBNGLP3.mjs";import*as D from"three";var tn=(a=>(a[a.PHONE_TALL=0]="PHONE_TALL",a[a.TABLET=1]="TABLET",a[a.LANDSCAPE=2]="LANDSCAPE",a))(tn||{});function Rt(e,t){let n=e/t;return n<=.62?0:n<=.85?1:2}var nt=class{constructor(t,n){this.root=t,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 t=this.stage.getBoundingClientRect(),n=Rt(t.width,t.height);n===0?this.uiFrame.style.maxWidth="420px":n===1?this.uiFrame.style.maxWidth="520px":this.uiFrame.style.maxWidth="640px"}getAspectClass(){let t=this.stage.getBoundingClientRect();return Rt(t.width,t.height)}};async function Vn(e,t={}){let n=()=>{let d=e.getBoundingClientRect(),r=Math.floor(d.width),E=Math.floor(d.height);return(r<=0||!isFinite(r)||r!==r)&&(r=e.clientWidth||window.innerWidth||320),(E<=0||!isFinite(E)||E!==E)&&(E=e.clientHeight||window.innerHeight||480),(r<=0||!isFinite(r)||r!==r)&&(r=320),(E<=0||!isFinite(E)||E!==E)&&(E=480),console.log("[THREE-BASE] getSize result:",{width:r,height:E,boundingRect:{width:d.width,height:d.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleWidth:e.style.width,styleHeight:e.style.height,note:"Using boundingRect as primary source (actual rendered size)"}),{width:r,height:E}},a=e.style.width&&!e.style.width.includes("%"),i=e.style.height&&!e.style.height.includes("%");e.style.position||(e.style.position="relative"),e.style.display||(e.style.display="block"),e.style.width=e.style.width||"100%",e.style.height=e.style.height||"100%",e.style.minWidth="100%",e.style.minHeight="100%",e.style.maxWidth="100%",e.style.maxHeight="100%",e.style.boxSizing="border-box",e.style.overflow="hidden",e.style.margin="0",e.style.padding="0",e.style.border="none";let s=t.background||"linear-gradient(160deg, #0d1020, #0f1c2f)";e.style.setProperty("background",s,"important"),e.style.setProperty("background-size","cover","important"),e.style.setProperty("background-position","center","important"),e.style.setProperty("background-repeat","no-repeat","important");let l=document.createElement("div");l.style.cssText=`
2
2
  position: absolute !important;
3
3
  inset: 0 !important;
4
4
  width: 100% !important;
@@ -19,16 +19,16 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
19
19
  padding: 0 !important;
20
20
  border: none !important;
21
21
  overflow: hidden !important;
22
- `,e.appendChild(l);let m=document.createElement("div");m.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(";")),l.appendChild(m);let c=new k.Scene,{width:h,height:p}=n(),f=new k.AmbientLight(16777215,.6);c.add(f);let y=new k.DirectionalLight(16777215,.8);y.position.set(5,5,5),y.castShadow=!1,c.add(y);let u=new k.DirectionalLight(16777215,.3);u.position.set(-5,0,5),c.add(u);let g=new k.PerspectiveCamera(55,h/p,.1,100);g.position.set(0,0,3.2),g.lookAt(0,0,0),g.updateMatrixWorld();let o=new k.WebGLRenderer({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});o.setPixelRatio(window.devicePixelRatio||1),o.setSize(h,p),o.setClearColor(0,0),o.domElement.style.position="absolute",o.domElement.style.top="0",o.domElement.style.left="0",o.domElement.style.right="0",o.domElement.style.bottom="0",o.domElement.style.width="100%",o.domElement.style.height="100%",o.domElement.style.minWidth="100%",o.domElement.style.minHeight="100%",o.domElement.style.maxWidth="100%",o.domElement.style.maxHeight="100%",o.domElement.style.display="block",o.domElement.style.pointerEvents="auto",o.domElement.style.margin="0",o.domElement.style.padding="0",o.domElement.style.boxSizing="border-box",m.appendChild(o.domElement);let b=d=>{var S;let r=e.getBoundingClientRect(),E=window.getComputedStyle(e);console.log("[THREE-BASE] applySize called:",{providedSize:d,rootRect:{width:r.width,height:r.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleSize:{width:e.style.width,height:e.style.height},computedStyle:{width:E.width,height:E.height,transform:E.transform,scale:E.scale},rendererCurrentSize:{width:o.domElement.width,height:o.domElement.height},rendererStyleSize:{width:o.domElement.style.width,height:o.domElement.style.height},stackTrace:(S=new Error().stack)==null?void 0:S.split(`
22
+ `,e.appendChild(l);let m=document.createElement("div");m.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(";")),l.appendChild(m);let c=new D.Scene,{width:h,height:p}=n(),f=new D.AmbientLight(16777215,.6);c.add(f);let y=new D.DirectionalLight(16777215,.8);y.position.set(5,5,5),y.castShadow=!1,c.add(y);let u=new D.DirectionalLight(16777215,.3);u.position.set(-5,0,5),c.add(u);let g=new D.PerspectiveCamera(55,h/p,.1,100);g.position.set(0,0,3.2),g.lookAt(0,0,0),g.updateMatrixWorld();let o=new D.WebGLRenderer({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});o.setPixelRatio(window.devicePixelRatio||1),o.setSize(h,p),o.setClearColor(0,0),o.domElement.style.position="absolute",o.domElement.style.top="0",o.domElement.style.left="0",o.domElement.style.right="0",o.domElement.style.bottom="0",o.domElement.style.width="100%",o.domElement.style.height="100%",o.domElement.style.minWidth="100%",o.domElement.style.minHeight="100%",o.domElement.style.maxWidth="100%",o.domElement.style.maxHeight="100%",o.domElement.style.display="block",o.domElement.style.pointerEvents="auto",o.domElement.style.margin="0",o.domElement.style.padding="0",o.domElement.style.boxSizing="border-box",m.appendChild(o.domElement);let b=d=>{var H;let r=e.getBoundingClientRect(),E=window.getComputedStyle(e);console.log("[THREE-BASE] applySize called:",{providedSize:d,rootRect:{width:r.width,height:r.height},clientSize:{width:e.clientWidth,height:e.clientHeight},styleSize:{width:e.style.width,height:e.style.height},computedStyle:{width:E.width,height:E.height,transform:E.transform,scale:E.scale},rendererCurrentSize:{width:o.domElement.width,height:o.domElement.height},rendererStyleSize:{width:o.domElement.style.width,height:o.domElement.style.height},stackTrace:(H=new Error().stack)==null?void 0:H.split(`
23
23
  `).slice(1,4).join(`
24
- `)});let x=r.width,_=r.height;if((x<=0||!isFinite(x))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:r.width,clientWidth:e.clientWidth}),x=e.clientWidth||window.innerWidth||320),(_<=0||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:r.height,clientHeight:e.clientHeight}),_=e.clientHeight||window.innerHeight||480),typeof(d==null?void 0:d.width)=="number"&&d.width>0){let M=Math.abs(d.width-r.width),v=r.width*.1;M>v?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:d.width,container:r.width,difference:M,tolerance:v,willUse:"container size (boundingRect)"}):(x=d.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:d.width,container:r.width}))}if(typeof(d==null?void 0:d.height)=="number"&&d.height>0){let M=Math.abs(d.height-r.height),v=r.height*.1;M>v?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:d.height,container:r.height,difference:M,tolerance:v,willUse:"container size (boundingRect)"}):(_=d.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:d.height,container:r.height}))}(x<=0||_<=0||!isFinite(x)||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:x,newHeight:_,size:d,rootRect:r}),x=r.width||e.clientWidth||320,_=r.height||e.clientHeight||480);let R=Math.floor(x),F=Math.floor(_);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:R,finalHeight:F,aspectRatio:R/F,beforeRendererSize:{width:o.domElement.width,height:o.domElement.height},beforeRendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height}}),o.setSize(R,F),o.setPixelRatio(window.devicePixelRatio||1),g.aspect=R/F,g.updateProjectionMatrix();let H=e.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:o.domElement.width,height:o.domElement.height},rendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height},containerRect:{width:H.width,height:H.height},cameraAspect:g.aspect,matches:{width:Math.abs(o.domElement.width-H.width)<1,height:Math.abs(o.domElement.height-H.height)<1},sizeDifference:{width:o.domElement.width-H.width,height:o.domElement.height-H.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{b()})});let w=!1;dt.on("pause",()=>{w=!0,document.querySelectorAll("audio").forEach(r=>r.pause())}),dt.on("resume",()=>{w=!1,document.querySelectorAll("audio").forEach(r=>{r.currentTime>0&&!r.ended&&r.play().catch(()=>{})})});let T=new nt(e,l);return dt.on("resize",({payload:d})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:d,timestamp:Date.now(),rootRect:e.getBoundingClientRect()}),b({width:d==null?void 0:d.width,height:d==null?void 0:d.height}),T.updateLayout()}),window.addEventListener("resize",()=>{console.log("[THREE-BASE] Window resize event received:",{timestamp:Date.now(),windowSize:{width:window.innerWidth,height:window.innerHeight},rootRect:e.getBoundingClientRect()}),b(),T.updateLayout()}),{scene:c,camera:g,renderer:o,uiSystem:T,applySize:b}}import*as A from"three";var ht=class{constructor(t){var n,a;this.position=(t==null?void 0:t.position)||{x:0,y:0},this.scale=(n=t==null?void 0:t.scale)!=null?n:1,this.rotation=(a=t==null?void 0:t.rotation)!=null?a:0}update(t){t.position!==void 0&&(this.position={...t.position}),t.scale!==void 0&&(this.scale=t.scale),t.rotation!==void 0&&(this.rotation=t.rotation)}syncToThree(t){let n=t.position.z,a=n===0||!isFinite(n)?.5:n;t.position.set(this.position.x,this.position.y,a),t.scale.set(this.scale,this.scale,this.scale),t.rotation.z=this.rotation}},pt=class{constructor(t){var n,a,i,s;this.z_index=(n=t==null?void 0:t.z_index)!=null?n:0,this.alpha=(a=t==null?void 0:t.alpha)!=null?a:1,this.visible=(i=t==null?void 0:t.visible)!=null?i:!0,this.tint=(s=t==null?void 0:t.tint)!=null?s:null}update(t){t.z_index!==void 0&&(this.z_index=t.z_index),t.alpha!==void 0&&(this.alpha=t.alpha),t.visible!==void 0&&(this.visible=t.visible),t.tint!==void 0&&(this.tint=t.tint)}syncToThree(t){if(t.renderOrder=this.z_index,t.visible=this.visible,t instanceof A.Mesh&&t.material&&(Array.isArray(t.material)?t.material.forEach(n=>{n instanceof A.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):t.material instanceof A.Material&&(t.material.opacity=this.alpha,t.material.transparent=this.alpha<1)),this.tint!==null&&t instanceof A.Mesh&&t.material){let n=typeof this.tint=="string"?new A.Color(this.tint):new A.Color(this.tint);Array.isArray(t.material)?t.material.forEach(a=>{(a instanceof A.MeshBasicMaterial||a instanceof A.MeshStandardMaterial)&&a.color.copy(n)}):(t.material instanceof A.MeshBasicMaterial||t.material instanceof A.MeshStandardMaterial)&&t.material.color.copy(n)}}},mt=class{constructor(t,n,a,i){this.instanceId=t,this.objectConfig=n,this.threeObject=a,this._config=i,this.transform=new ht(i.transform),this.renderer=new pt(i.render),this.sync()}sync(){this.transform.syncToThree(this.threeObject),this.renderer.syncToThree(this.threeObject)}updateConfig(t){this._config=t,t.transform&&this.transform.update(t.transform),t.render&&this.renderer.update(t.render),this.sync()}getComponent(t){return this._config[t]}getPosition(){return{...this.transform.position}}setPosition(t,n){this.transform.position={x:t,y:n},this.transform.syncToThree(this.threeObject)}getAlpha(){return this.renderer.alpha}setAlpha(t){this.renderer.alpha=t,this.renderer.syncToThree(this.threeObject)}getVisible(){return this.renderer.visible}setVisible(t){this.renderer.visible=t,this.renderer.syncToThree(this.threeObject)}},vt=class{constructor(t){this.objects=new Map;this.config=t}create(t,n){let a=this.config.objects.get(t);if(!a)throw new Error(`Object config not found: ${t}`);let i=new mt(t,a.object_config||t,n,a);return this.objects.set(t,i),i}get(t){return this.objects.get(t)}updateConfig(t){this.config=t;for(let[n,a]of this.objects.entries()){let i=t.objects.get(n);i&&a.updateConfig(i)}}getAll(){return Array.from(this.objects.values())}remove(t){this.objects.delete(t)}clear(){this.objects.clear()}};var ut={"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 X(e){let t=ut[e];return t?t.family:(console.warn(`Font ID "${e}" not found in registry, using fallback`),"Arial, sans-serif")}function q(e){var n;let t=ut[e];return t&&(n=t.weight)!=null?n:"400"}function jn(e,t){ut[e]=t}function Jn(){return Object.keys(ut)}import*as U from"three";function Q(e){return{element:e,get alpha(){return parseFloat(e.style.opacity||"1")},set alpha(t){e.style.opacity=t.toString()},get visible(){return e.style.display!=="none"},set visible(t){e.style.display=t?"":"none"},position:{set(t,n){e.style.left=`${t}px`,e.style.top=`${n}px`},get x(){return parseFloat(e.style.left||"0")},get y(){return parseFloat(e.style.top||"0")}},scale:{set(t,n){e.style.transform=`scale(${t})`},get x(){let t=e.style.transform.match(/scale\(([^)]+)\)/);return t?parseFloat(t[1]):1}}}}function Kn(e,t,n,a){var Zt,Vt,jt,Jt,Kt,Qt,Ot,It,Ut,te,ee,ne,ae,ie,se,oe,re,le,ce,de,he,pe,me,ue,ye,fe,ge,Ee,be,Te,xe,we,_e,He,Se,Re,ve,Ce,Me,Ae,Fe,$e,Le,We,Be,De,ke,ze,Pe,Ye,Ne,Ge,Xe,qe,Ze,Ve,je,Je,Ke,Qe,Oe,Ie,Ue;let i=e.objects.get("ui_endgame_1"),s=e.objects.get("ui_endgame_logo_1"),l=e.objects.get("ui_endgame_title_1"),m=e.objects.get("ui_endgame_subtitle_1"),c=e.objects.get("ui_endgame_footer_1"),h=e.objects.get("ui_endgame_cta_1"),p=e.objects.get("ui_endgame_cta_hint_1"),f=e.objects.get("ui_endgame_hand_1"),y=e.engine.runtime||{},u=((Zt=i==null?void 0:i.gameplay)==null?void 0:Zt.tuning)||{},g=(i==null?void 0:i.render)||{},o=a.getBoundingClientRect(),b=o.width>0?o.width*.9:320,w=o.height>0?o.height*.85:400,T=Math.min((Vt=u.panel_width)!=null?Vt:320,b),d=Math.min((jt=u.panel_height)!=null?jt:400,w),r=(Jt=u.panel_padding)!=null?Jt:32,E=(Kt=u.panel_radius)!=null?Kt:24,x=g.background_color||u.panel_bg_color||"#1a0a0a",_=g.background_alpha!==void 0&&g.background_alpha!==null?g.background_alpha:(Qt=u.panel_bg_alpha)!=null?Qt:.98,R=g.border_color||u.panel_border_color||"#ffffff",F=(Ot=u.panel_border_width)!=null?Ot:2,H=(It=u.panel_border_alpha)!=null?It:.3,S=document.createElement("div");S.style.cssText=`
24
+ `)});let x=r.width,_=r.height;if((x<=0||!isFinite(x))&&(console.warn("[THREE-BASE] Invalid boundingRect.width, using clientWidth fallback",{boundingRectWidth:r.width,clientWidth:e.clientWidth}),x=e.clientWidth||window.innerWidth||320),(_<=0||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid boundingRect.height, using clientHeight fallback",{boundingRectHeight:r.height,clientHeight:e.clientHeight}),_=e.clientHeight||window.innerHeight||480),typeof(d==null?void 0:d.width)=="number"&&d.width>0){let M=Math.abs(d.width-r.width),v=r.width*.1;M>v?console.warn("[THREE-BASE] Provided width ignored (too different from container):",{provided:d.width,container:r.width,difference:M,tolerance:v,willUse:"container size (boundingRect)"}):(x=d.width,console.log("[THREE-BASE] Using provided width (within tolerance):",{provided:d.width,container:r.width}))}if(typeof(d==null?void 0:d.height)=="number"&&d.height>0){let M=Math.abs(d.height-r.height),v=r.height*.1;M>v?console.warn("[THREE-BASE] Provided height ignored (too different from container):",{provided:d.height,container:r.height,difference:M,tolerance:v,willUse:"container size (boundingRect)"}):(_=d.height,console.log("[THREE-BASE] Using provided height (within tolerance):",{provided:d.height,container:r.height}))}(x<=0||_<=0||!isFinite(x)||!isFinite(_))&&(console.warn("[THREE-BASE] Invalid size in applySize, using fallback",{newWidth:x,newHeight:_,size:d,rootRect:r}),x=r.width||e.clientWidth||320,_=r.height||e.clientHeight||480);let R=Math.floor(x),F=Math.floor(_);console.log("[THREE-BASE] applySize setting renderer size:",{finalWidth:R,finalHeight:F,aspectRatio:R/F,beforeRendererSize:{width:o.domElement.width,height:o.domElement.height},beforeRendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height}}),o.setSize(R,F),o.setPixelRatio(window.devicePixelRatio||1),g.aspect=R/F,g.updateProjectionMatrix();let S=e.getBoundingClientRect();console.log("[THREE-BASE] applySize after setting:",{rendererSize:{width:o.domElement.width,height:o.domElement.height},rendererStyle:{width:o.domElement.style.width,height:o.domElement.style.height},containerRect:{width:S.width,height:S.height},cameraAspect:g.aspect,matches:{width:Math.abs(o.domElement.width-S.width)<1,height:Math.abs(o.domElement.height-S.height)<1},sizeDifference:{width:o.domElement.width-S.width,height:o.domElement.height-S.height}})};requestAnimationFrame(()=>{requestAnimationFrame(()=>{b()})});let w=!1;dt.on("pause",()=>{w=!0,document.querySelectorAll("audio").forEach(r=>r.pause())}),dt.on("resume",()=>{w=!1,document.querySelectorAll("audio").forEach(r=>{r.currentTime>0&&!r.ended&&r.play().catch(()=>{})})});let T=new nt(e,l);return dt.on("resize",({payload:d})=>{console.log("[THREE-BASE] Handler resize event received:",{payload:d,timestamp:Date.now(),rootRect:e.getBoundingClientRect()}),b({width:d==null?void 0:d.width,height:d==null?void 0:d.height}),T.updateLayout()}),window.addEventListener("resize",()=>{console.log("[THREE-BASE] Window resize event received:",{timestamp:Date.now(),windowSize:{width:window.innerWidth,height:window.innerHeight},rootRect:e.getBoundingClientRect()}),b(),T.updateLayout()}),{scene:c,camera:g,renderer:o,uiSystem:T,applySize:b}}import*as A from"three";var ht=class{constructor(t){var n,a;this.position=(t==null?void 0:t.position)||{x:0,y:0},this.scale=(n=t==null?void 0:t.scale)!=null?n:1,this.rotation=(a=t==null?void 0:t.rotation)!=null?a:0}update(t){t.position!==void 0&&(this.position={...t.position}),t.scale!==void 0&&(this.scale=t.scale),t.rotation!==void 0&&(this.rotation=t.rotation)}syncToThree(t){let n=t.position.z,a=n===0||!isFinite(n)?.5:n;t.position.set(this.position.x,this.position.y,a),t.scale.set(this.scale,this.scale,this.scale),t.rotation.z=this.rotation}},pt=class{constructor(t){var n,a,i,s;this.z_index=(n=t==null?void 0:t.z_index)!=null?n:0,this.alpha=(a=t==null?void 0:t.alpha)!=null?a:1,this.visible=(i=t==null?void 0:t.visible)!=null?i:!0,this.tint=(s=t==null?void 0:t.tint)!=null?s:null}update(t){t.z_index!==void 0&&(this.z_index=t.z_index),t.alpha!==void 0&&(this.alpha=t.alpha),t.visible!==void 0&&(this.visible=t.visible),t.tint!==void 0&&(this.tint=t.tint)}syncToThree(t){if(t.renderOrder=this.z_index,t.visible=this.visible,t instanceof A.Mesh&&t.material&&(Array.isArray(t.material)?t.material.forEach(n=>{n instanceof A.Material&&(n.opacity=this.alpha,n.transparent=this.alpha<1)}):t.material instanceof A.Material&&(t.material.opacity=this.alpha,t.material.transparent=this.alpha<1)),this.tint!==null&&t instanceof A.Mesh&&t.material){let n=typeof this.tint=="string"?new A.Color(this.tint):new A.Color(this.tint);Array.isArray(t.material)?t.material.forEach(a=>{(a instanceof A.MeshBasicMaterial||a instanceof A.MeshStandardMaterial)&&a.color.copy(n)}):(t.material instanceof A.MeshBasicMaterial||t.material instanceof A.MeshStandardMaterial)&&t.material.color.copy(n)}}},mt=class{constructor(t,n,a,i){this.instanceId=t,this.objectConfig=n,this.threeObject=a,this._config=i,this.transform=new ht(i.transform),this.renderer=new pt(i.render),this.sync()}sync(){this.transform.syncToThree(this.threeObject),this.renderer.syncToThree(this.threeObject)}updateConfig(t){this._config=t,t.transform&&this.transform.update(t.transform),t.render&&this.renderer.update(t.render),this.sync()}getComponent(t){return this._config[t]}getPosition(){return{...this.transform.position}}setPosition(t,n){this.transform.position={x:t,y:n},this.transform.syncToThree(this.threeObject)}getAlpha(){return this.renderer.alpha}setAlpha(t){this.renderer.alpha=t,this.renderer.syncToThree(this.threeObject)}getVisible(){return this.renderer.visible}setVisible(t){this.renderer.visible=t,this.renderer.syncToThree(this.threeObject)}},vt=class{constructor(t){this.objects=new Map;this.config=t}create(t,n){let a=this.config.objects.get(t);if(!a)throw new Error(`Object config not found: ${t}`);let i=new mt(t,a.object_config||t,n,a);return this.objects.set(t,i),i}get(t){return this.objects.get(t)}updateConfig(t){this.config=t;for(let[n,a]of this.objects.entries()){let i=t.objects.get(n);i&&a.updateConfig(i)}}getAll(){return Array.from(this.objects.values())}remove(t){this.objects.delete(t)}clear(){this.objects.clear()}};var ut={"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 X(e){let t=ut[e];return t?t.family:(console.warn(`Font ID "${e}" not found in registry, using fallback`),"Arial, sans-serif")}function q(e){var n;let t=ut[e];return t&&(n=t.weight)!=null?n:"400"}function jn(e,t){ut[e]=t}function Jn(){return Object.keys(ut)}import*as U from"three";function Q(e){return{element:e,get alpha(){return parseFloat(e.style.opacity||"1")},set alpha(t){e.style.opacity=t.toString()},get visible(){return e.style.display!=="none"},set visible(t){e.style.display=t?"":"none"},position:{set(t,n){e.style.left=`${t}px`,e.style.top=`${n}px`},get x(){return parseFloat(e.style.left||"0")},get y(){return parseFloat(e.style.top||"0")}},scale:{set(t,n){e.style.transform=`scale(${t})`},get x(){let t=e.style.transform.match(/scale\(([^)]+)\)/);return t?parseFloat(t[1]):1}}}}function Kn(e,t,n,a){var Zt,Vt,jt,Jt,Kt,Qt,It,Ot,Ut,te,ee,ne,ae,ie,se,oe,re,le,ce,de,he,pe,me,ue,ye,fe,ge,Ee,be,Te,xe,we,_e,Se,He,Re,ve,Ce,Me,Ae,Fe,Le,$e,We,ke,Be,De,ze,Pe,Ye,Ne,Ge,Xe,qe,Ze,Ve,je,Je,Ke,Qe,Ie,Oe,Ue;let i=e.objects.get("ui_endgame_1"),s=e.objects.get("ui_endgame_logo_1"),l=e.objects.get("ui_endgame_title_1"),m=e.objects.get("ui_endgame_subtitle_1"),c=e.objects.get("ui_endgame_footer_1"),h=e.objects.get("ui_endgame_cta_1"),p=e.objects.get("ui_endgame_cta_hint_1"),f=e.objects.get("ui_endgame_hand_1"),y=e.engine.runtime||{},u=((Zt=i==null?void 0:i.gameplay)==null?void 0:Zt.tuning)||{},g=(i==null?void 0:i.render)||{},o=a.getBoundingClientRect(),b=o.width>0?o.width*.9:320,w=o.height>0?o.height*.85:400,T=Math.min((Vt=u.panel_width)!=null?Vt:320,b),d=Math.min((jt=u.panel_height)!=null?jt:400,w),r=(Jt=u.panel_padding)!=null?Jt:32,E=(Kt=u.panel_radius)!=null?Kt:24,x=g.background_color||u.panel_bg_color||"#1a0a0a",_=g.background_alpha!==void 0&&g.background_alpha!==null?g.background_alpha:(Qt=u.panel_bg_alpha)!=null?Qt:.98,R=g.border_color||u.panel_border_color||"#ffffff",F=(It=u.panel_border_width)!=null?It:2,S=(Ot=u.panel_border_alpha)!=null?Ot:.3,H=document.createElement("div");H.style.cssText=`
25
25
  position: absolute;
26
26
  width: ${T}px;
27
27
  height: ${d}px;
28
28
  background: ${x};
29
29
  opacity: ${_};
30
30
  border: ${F}px solid ${R};
31
- border-opacity: ${H};
31
+ border-opacity: ${S};
32
32
  border-radius: ${E}px;
33
33
  display: block;
34
34
  transform: translate(-50%, -50%);
@@ -40,7 +40,7 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
40
40
  z-index: 1000;
41
41
  box-sizing: border-box;
42
42
  padding: ${r}px;
43
- `,a.appendChild(S);let M=Q(S);M.element=S;let v=((Ut=s==null?void 0:s.gameplay)==null?void 0:Ut.tuning)||{},Z=(s==null?void 0:s.transform)||{},D=(te=v.logo_size)!=null?te:56,z=(ee=Z.scale)!=null?ee:1,O=(ae=(ne=Z.offset)==null?void 0:ne.y)!=null?ae:-130,at=(ie=v.logo_alpha)!=null?ie:1,sn=new U.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),P=new U.Sprite(sn);P.position.set(0,O,0),P.material.opacity=0;let it=0,st=0;if(n&&(it=((se=n.image)==null?void 0:se.width)||100,st=((oe=n.image)==null?void 0:oe.height)||100),it>0&&st>0){let I=it/st,Ht,St;I>1?(Ht=D,St=D/I):(St=D,Ht=D*I);let qn=Ht/it*z,Zn=St/st*z;P.scale.set(qn,Zn,1)}else{let I=D/100*z;P.scale.set(I,I,1)}P.targetAlpha=at,P.baseScaleX=P.scale.x,P.baseScaleY=P.scale.y;let $=l==null?void 0:l.ui,Y=((re=l==null?void 0:l.gameplay)==null?void 0:re.tuning)||{},on=($==null?void 0:$.text)||"MISSION ACCOMPLISHED",At=($==null?void 0:$.font)||"brand.heading",ft=($==null?void 0:$.fontSize)||24,rn=(le=$==null?void 0:$.letterSpacing)!=null?le:1,ot=(ce=l==null?void 0:l.render)==null?void 0:ce.tint,ln=typeof ot=="string"?ot:ot?`#${ot.toString(16).padStart(6,"0")}`:"#00FF88",cn=T-r*2-30,dn=Y.font_weight_override?Y.font_weight_override:q(At),V=document.createElement("div");V.textContent=on,V.style.cssText=`
43
+ `,a.appendChild(H);let M=Q(H);M.element=H;let v=((Ut=s==null?void 0:s.gameplay)==null?void 0:Ut.tuning)||{},Z=(s==null?void 0:s.transform)||{},B=(te=v.logo_size)!=null?te:56,z=(ee=Z.scale)!=null?ee:1,I=(ae=(ne=Z.offset)==null?void 0:ne.y)!=null?ae:-130,at=(ie=v.logo_alpha)!=null?ie:1,sn=new U.SpriteMaterial({map:n||void 0,transparent:!0,alphaTest:.1}),P=new U.Sprite(sn);P.position.set(0,I,0),P.material.opacity=0;let it=0,st=0;if(n&&(it=((se=n.image)==null?void 0:se.width)||100,st=((oe=n.image)==null?void 0:oe.height)||100),it>0&&st>0){let O=it/st,St,Ht;O>1?(St=B,Ht=B/O):(Ht=B,St=B*O);let qn=St/it*z,Zn=Ht/st*z;P.scale.set(qn,Zn,1)}else{let O=B/100*z;P.scale.set(O,O,1)}P.targetAlpha=at,P.baseScaleX=P.scale.x,P.baseScaleY=P.scale.y;let L=l==null?void 0:l.ui,Y=((re=l==null?void 0:l.gameplay)==null?void 0:re.tuning)||{},on=(L==null?void 0:L.text)||"MISSION ACCOMPLISHED",At=(L==null?void 0:L.font)||"brand.heading",ft=(L==null?void 0:L.fontSize)||24,rn=(le=L==null?void 0:L.letterSpacing)!=null?le:1,ot=(ce=l==null?void 0:l.render)==null?void 0:ce.tint,ln=typeof ot=="string"?ot:ot?`#${ot.toString(16).padStart(6,"0")}`:"#00FF88",cn=T-r*2-30,dn=Y.font_weight_override?Y.font_weight_override:q(At),V=document.createElement("div");V.textContent=on,V.style.cssText=`
44
44
  font-family: ${X(At)};
45
45
  font-size: ${ft}px;
46
46
  font-weight: ${dn};
@@ -54,7 +54,7 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
54
54
  transform: translate(-50%, -50%);
55
55
  white-space: nowrap;
56
56
  max-width: ${cn}px;
57
- `;let Ft=r+30,hn=((ye=u.title_offset_y)!=null?ye:Ft+ft/2)+((fe=Y.animation_start_y_offset)!=null?fe:-20);V.style.top=`${hn}px`,V.style.left="50%";let $t=Q(V);$t.element=V,S.appendChild(V);let L=m==null?void 0:m.ui,Lt=((ge=m==null?void 0:m.gameplay)==null?void 0:ge.tuning)||{},pn=(L==null?void 0:L.text)||"RESCUE COMPLETE",Wt=(L==null?void 0:L.font)||"brand.body",gt=(L==null?void 0:L.fontSize)||11,mn=(Ee=L==null?void 0:L.letterSpacing)!=null?Ee:.5,rt=(be=m==null?void 0:m.render)==null?void 0:be.tint,un=typeof rt=="string"?rt:rt?`#${rt.toString(16).padStart(6,"0")}`:"#B0B0B0",j=document.createElement("div");j.textContent=pn,j.style.cssText=`
57
+ `;let Ft=r+30,hn=((ye=u.title_offset_y)!=null?ye:Ft+ft/2)+((fe=Y.animation_start_y_offset)!=null?fe:-20);V.style.top=`${hn}px`,V.style.left="50%";let Lt=Q(V);Lt.element=V,H.appendChild(V);let $=m==null?void 0:m.ui,$t=((ge=m==null?void 0:m.gameplay)==null?void 0:ge.tuning)||{},pn=($==null?void 0:$.text)||"RESCUE COMPLETE",Wt=($==null?void 0:$.font)||"brand.body",gt=($==null?void 0:$.fontSize)||11,mn=(Ee=$==null?void 0:$.letterSpacing)!=null?Ee:.5,rt=(be=m==null?void 0:m.render)==null?void 0:be.tint,un=typeof rt=="string"?rt:rt?`#${rt.toString(16).padStart(6,"0")}`:"#B0B0B0",j=document.createElement("div");j.textContent=pn,j.style.cssText=`
58
58
  font-family: ${X(Wt)};
59
59
  font-size: ${gt}px;
60
60
  font-weight: ${q(Wt)};
@@ -65,10 +65,10 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
65
65
  position: absolute;
66
66
  transform: translate(-50%, -50%);
67
67
  white-space: nowrap;
68
- `;let Bt=Ft+ft+15,yn=((Te=u.subtitle_offset_y)!=null?Te:Bt+gt/2)+((xe=Lt.animation_start_y_offset)!=null?xe:-10);j.style.top=`${yn}px`,j.style.left="50%";let Et=Q(j);Et.element=j,Et.animationStartYOffset=(we=Lt.animation_start_y_offset)!=null?we:-10,S.appendChild(j);let N=c==null?void 0:c.ui,Dt=((_e=c==null?void 0:c.gameplay)==null?void 0:_e.tuning)||{},fn=(N==null?void 0:N.text)||((He=y.ui)==null?void 0:He.cta_hint)||"Continue the adventure!",kt=(N==null?void 0:N.font)||"brand.body",zt=(N==null?void 0:N.fontSize)||16,lt=(Se=c==null?void 0:c.render)==null?void 0:Se.tint,gn=typeof lt=="string"?lt:lt?`#${lt.toString(16).padStart(6,"0")}`:"#FFFFFF",En=(Re=Dt.max_width)!=null?Re:T-r*2,bn=(ve=Dt.line_height)!=null?ve:1.4,J=document.createElement("div");J.textContent=fn,J.style.cssText=`
69
- font-family: ${X(kt)};
68
+ `;let kt=Ft+ft+15,yn=((Te=u.subtitle_offset_y)!=null?Te:kt+gt/2)+((xe=$t.animation_start_y_offset)!=null?xe:-10);j.style.top=`${yn}px`,j.style.left="50%";let Et=Q(j);Et.element=j,Et.animationStartYOffset=(we=$t.animation_start_y_offset)!=null?we:-10,H.appendChild(j);let N=c==null?void 0:c.ui,Bt=((_e=c==null?void 0:c.gameplay)==null?void 0:_e.tuning)||{},fn=(N==null?void 0:N.text)||((Se=y.ui)==null?void 0:Se.cta_hint)||"Continue the adventure!",Dt=(N==null?void 0:N.font)||"brand.body",zt=(N==null?void 0:N.fontSize)||16,lt=(He=c==null?void 0:c.render)==null?void 0:He.tint,gn=typeof lt=="string"?lt:lt?`#${lt.toString(16).padStart(6,"0")}`:"#FFFFFF",En=(Re=Bt.max_width)!=null?Re:T-r*2,bn=(ve=Bt.line_height)!=null?ve:1.4,J=document.createElement("div");J.textContent=fn,J.style.cssText=`
69
+ font-family: ${X(Dt)};
70
70
  font-size: ${zt}px;
71
- font-weight: ${q(kt)};
71
+ font-weight: ${q(Dt)};
72
72
  color: ${gn};
73
73
  text-align: center;
74
74
  opacity: 0;
@@ -77,30 +77,30 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
77
77
  max-width: ${En}px;
78
78
  line-height: ${bn};
79
79
  word-wrap: break-word;
80
- `;let Tn=Bt+gt+30,xn=(Ce=u.footer_offset_y)!=null?Ce:Tn+zt/2;J.style.top=`${xn}px`,J.style.left="50%";let bt=Q(J);bt.element=J;let wn=((Me=c==null?void 0:c.render)==null?void 0:Me.alpha)!==void 0&&((Ae=c==null?void 0:c.render)==null?void 0:Ae.alpha)!==null?c.render.alpha:1;bt.targetAlpha=wn,S.appendChild(J);let G=((Fe=h==null?void 0:h.gameplay)==null?void 0:Fe.tuning)||{},W=h==null?void 0:h.ui,_n=($e=G.button_width)!=null?$e:260,Pt=(Le=G.button_height)!=null?Le:56,Hn=(We=G.button_radius)!=null?We:16,Sn=G.button_bg_color||((Be=y.theme)==null?void 0:Be.cta_background)||"#ffb43b",Rn=(De=G.button_bg_alpha)!=null?De:1,vn=G.button_border_color||"#ffffff",Cn=(ke=G.button_border_width)!=null?ke:2,ha=(ze=G.button_border_alpha)!=null?ze:.2,Tt=(Pe=u.cta_offset_y)!=null?Pe:d*.7,C=document.createElement("button");C.style.cssText=`
80
+ `;let Tn=kt+gt+30,xn=(Ce=u.footer_offset_y)!=null?Ce:Tn+zt/2;J.style.top=`${xn}px`,J.style.left="50%";let bt=Q(J);bt.element=J;let wn=((Me=c==null?void 0:c.render)==null?void 0:Me.alpha)!==void 0&&((Ae=c==null?void 0:c.render)==null?void 0:Ae.alpha)!==null?c.render.alpha:1;bt.targetAlpha=wn,H.appendChild(J);let G=((Fe=h==null?void 0:h.gameplay)==null?void 0:Fe.tuning)||{},W=h==null?void 0:h.ui,_n=(Le=G.button_width)!=null?Le:260,Pt=($e=G.button_height)!=null?$e:56,Sn=(We=G.button_radius)!=null?We:16,Hn=G.button_bg_color||((ke=y.theme)==null?void 0:ke.cta_background)||"#ffb43b",Rn=(Be=G.button_bg_alpha)!=null?Be:1,vn=G.button_border_color||"#ffffff",Cn=(De=G.button_border_width)!=null?De:2,ha=(ze=G.button_border_alpha)!=null?ze:.2,Tt=(Pe=u.cta_offset_y)!=null?Pe:d*.7,C=document.createElement("button");C.style.cssText=`
81
81
  width: ${_n}px;
82
82
  height: ${Pt}px;
83
- background: ${Sn};
83
+ background: ${Hn};
84
84
  opacity: ${Rn};
85
85
  border: ${Cn}px solid ${vn};
86
- border-radius: ${Hn}px;
86
+ border-radius: ${Sn}px;
87
87
  cursor: pointer;
88
88
  opacity: 0;
89
89
  position: absolute;
90
90
  transform: translate(-50%, -50%);
91
91
  box-shadow: inset 0 0 1px rgba(0,0,0,0.15);
92
- `,C.style.top=`${Tt}px`,C.style.left="50%";let xt=Q(C);xt.element=C,xt.addEventListener=C.addEventListener.bind(C),S.appendChild(C);let Mn=(W==null?void 0:W.text)||((Ye=y.ui)==null?void 0:Ye.cta_label_end)||"DOWNLOAD",Yt=(W==null?void 0:W.font)||"brand.heading",An=(W==null?void 0:W.fontSize)||20,Fn=G.button_text_color||((Ne=y.theme)==null?void 0:Ne.cta_text)||"#1a0a0a";C.textContent=Mn,C.style.fontFamily=X(Yt),C.style.fontSize=`${An}px`,C.style.fontWeight=String(q(Yt)),C.style.color=Fn,C.style.letterSpacing=`${(Ge=W==null?void 0:W.letterSpacing)!=null?Ge:1}px`;let Nt=Q(C);Nt.element=C;let B=p==null?void 0:p.ui,Gt=((Xe=p==null?void 0:p.gameplay)==null?void 0:Xe.tuning)||{},$n=(B==null?void 0:B.text)||"Play the full game",Xt=(B==null?void 0:B.font)||"brand.body",Ln=(B==null?void 0:B.fontSize)||11,Wn=(qe=B==null?void 0:B.letterSpacing)!=null?qe:0,ct=(Ze=p==null?void 0:p.render)==null?void 0:Ze.tint,Bn=typeof ct=="string"?ct:ct?`#${ct.toString(16).padStart(6,"0")}`:"#CCCCCC",K=document.createElement("div");K.textContent=$n,K.style.cssText=`
92
+ `,C.style.top=`${Tt}px`,C.style.left="50%";let xt=Q(C);xt.element=C,xt.addEventListener=C.addEventListener.bind(C),H.appendChild(C);let Mn=(W==null?void 0:W.text)||((Ye=y.ui)==null?void 0:Ye.cta_label_end)||"DOWNLOAD",Yt=(W==null?void 0:W.font)||"brand.heading",An=(W==null?void 0:W.fontSize)||20,Fn=G.button_text_color||((Ne=y.theme)==null?void 0:Ne.cta_text)||"#1a0a0a";C.textContent=Mn,C.style.fontFamily=X(Yt),C.style.fontSize=`${An}px`,C.style.fontWeight=String(q(Yt)),C.style.color=Fn,C.style.letterSpacing=`${(Ge=W==null?void 0:W.letterSpacing)!=null?Ge:1}px`;let Nt=Q(C);Nt.element=C;let k=p==null?void 0:p.ui,Gt=((Xe=p==null?void 0:p.gameplay)==null?void 0:Xe.tuning)||{},Ln=(k==null?void 0:k.text)||"Play the full game",Xt=(k==null?void 0:k.font)||"brand.body",$n=(k==null?void 0:k.fontSize)||11,Wn=(qe=k==null?void 0:k.letterSpacing)!=null?qe:0,ct=(Ze=p==null?void 0:p.render)==null?void 0:Ze.tint,kn=typeof ct=="string"?ct:ct?`#${ct.toString(16).padStart(6,"0")}`:"#CCCCCC",K=document.createElement("div");K.textContent=Ln,K.style.cssText=`
93
93
  font-family: ${X(Xt)};
94
- font-size: ${Ln}px;
94
+ font-size: ${$n}px;
95
95
  font-weight: ${q(Xt)};
96
- color: ${Bn};
96
+ color: ${kn};
97
97
  text-align: center;
98
98
  letter-spacing: ${Wn}px;
99
99
  opacity: 0;
100
100
  position: absolute;
101
101
  transform: translate(-50%, -50%);
102
102
  white-space: nowrap;
103
- `;let Dn=Tt+Pt/2+20,kn=d-r-10,zn=Math.min(Dn+((Ve=Gt.animation_start_y_offset)!=null?Ve:5),kn);K.style.top=`${zn}px`,K.style.left="50%";let wt=Q(K);wt.element=K,wt.animationStartYOffset=(je=Gt.animation_start_y_offset)!=null?je:5,S.appendChild(K);let _t=((Je=f==null?void 0:f.gameplay)==null?void 0:Je.tuning)||{},Pn=(Ke=_t.hand_offset_x)!=null?Ke:50,Yn=(Qe=_t.hand_offset_y)!=null?Qe:50,Nn=(Ie=(Oe=f==null?void 0:f.transform)==null?void 0:Oe.scale)!=null?Ie:.1875,Gn=(Ue=_t.hand_scale_multiplier)!=null?Ue:2.5,Xn=new U.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),et=new U.Sprite(Xn),qt=Nn*Gn*100;return et.scale.set(qt,qt,1),et.position.set(Pn,Tt+Yn,0),et.material.opacity=0,et.visible=!1,{panel:M,logo:P,title:$t,subtitle:Et,footer:bt,ctaButton:xt,ctaText:Nt,ctaHint:wt,hand:et}}function Qn(e,t,n){var x,_,R,F,H,S,M,v;let a=t.objects.get("ui_endgame_1"),i=((x=a==null?void 0:a.gameplay)==null?void 0:x.tuning)||{},s=(_=i.animation_duration_ms)!=null?_:800,l=(R=i.fade_in_duration_ms)!=null?R:600,m=(F=i.scale_animation_intensity)!=null?F:.1,c=(H=i.logo_animation_delay_ms)!=null?H:100,h=(S=i.title_animation_delay_ms)!=null?S:200,p=(M=i.footer_animation_delay_ms)!=null?M:300,f=(v=i.cta_animation_delay_ms)!=null?v:400,{panel:y,logo:u,title:g,subtitle:o,footer:b,ctaButton:w,ctaText:T,ctaHint:d}=e;y.visible=!0,y.element.style.visibility="visible";let r=Date.now(),E=()=>{let Z=Date.now()-r,D=Math.min(Z/l,1),z=1-Math.pow(1-D,3);y.alpha=z,y.element.style.opacity=z.toString();let O=1+m*(1-z);y.element.style.transform=`translate(-50%, -50%) scale(${O})`,D<1?requestAnimationFrame(E):(setTimeout(()=>On(u,s,t),c),setTimeout(()=>{In(g,s),setTimeout(()=>Un(o,s),50)},h),setTimeout(()=>ta(b,s),p),setTimeout(()=>{ea(w,T,s),setTimeout(()=>na(d,s),50),n&&n()},f))};E()}function On(e,t,n){var y,u,g,o,b;let a=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(u=(((y=a==null?void 0:a.gameplay)==null?void 0:y.tuning)||{}).animation_start_scale)!=null?u:1.2,l=Date.now(),m=e.material.opacity,c=(g=e.targetAlpha)!=null?g:1,h=(o=e.baseScaleX)!=null?o:e.scale.x,p=(b=e.baseScaleY)!=null?b:e.scale.y,f=()=>{let w=Date.now()-l,T=Math.min(w/t,1),d=1-Math.pow(1-T,2);e.material.opacity=m+(c-m)*d;let r=s+(1-s)*d;e.scale.set(h*r,p*r,1),T<1&&requestAnimationFrame(f)};f()}function In(e,t){let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=()=>{let l=Date.now()-n,m=Math.min(l/t,1),c=1-Math.pow(1-m,2);e.element.style.opacity=(a+(1-a)*c).toString(),e.element.style.top=`${i-20*(1-c)}px`,m<1&&requestAnimationFrame(s)};s()}function Un(e,t){var m;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=i-((m=e.animationStartYOffset)!=null?m:-10),l=()=>{let c=Date.now()-n,h=Math.min(c/t,1),p=1-Math.pow(1-h,2);e.element.style.opacity=(a+(1-a)*p).toString(),e.element.style.top=`${i+(s-i)*p}px`,h<1&&requestAnimationFrame(l)};l()}function ta(e,t){var l;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=(l=e.targetAlpha)!=null?l:1,s=()=>{let m=Date.now()-n,c=Math.min(m/t,1),h=1-Math.pow(1-c,2);e.element.style.opacity=(a+(i-a)*h).toString(),c<1&&requestAnimationFrame(s)};s()}function ea(e,t,n){let a=Date.now(),i=parseFloat(e.element.style.opacity||"0"),s=()=>{let l=Date.now()-a,m=Math.min(l/n,1),c=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*c).toString(),t.element.style.opacity=(i+(1-i)*c).toString(),e.element.style.transform=`translate(-50%, -50%) scale(${1+.1*(1-c)})`,m<1&&requestAnimationFrame(s)};s()}function na(e,t){var m;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=i-((m=e.animationStartYOffset)!=null?m:5),l=()=>{let c=Date.now()-n,h=Math.min(c/t,1),p=1-Math.pow(1-h,2);e.element.style.opacity=(a+(1-a)*p).toString(),e.element.style.top=`${i+(s-i)*p}px`,h<1&&requestAnimationFrame(l)};l()}function aa(e,t,n,a){var p,f,y,u;let i=n.objects.get("ui_endgame_hand_1"),s=((p=i==null?void 0:i.gameplay)==null?void 0:p.tuning)||{},l=(f=s.click_animation_duration_ms)!=null?f:600,m=(y=s.click_delay_ms)!=null?y:2e3,c=(u=s.click_repeat_delay_ms)!=null?u:3e3,h=()=>{var _,R;e.visible=!0,e.material.opacity=1;let g=e.position.x,o=e.position.y,b=(_=s.hand_offset_x)!=null?_:50,w=(R=s.hand_offset_y)!=null?R:50,T=t.element.getBoundingClientRect(),d=b,r=w,E=Date.now(),x=()=>{var z,O,at;let F=Date.now()-E,H=Math.min(F/l,1),S=H<.5?2*H*H:1-Math.pow(-2*H+2,2)/2;e.position.set(g+(d-g)*S,o+(r-o)*S,0);let M=(O=(z=i==null?void 0:i.transform)==null?void 0:z.scale)!=null?O:.1875,v=(at=s.hand_scale_multiplier)!=null?at:2.5,Z=M*v*100,D=Z+Z*.2*Math.sin(H*Math.PI);e.scale.set(D,D,1),H<1?requestAnimationFrame(x):(t.element.style.transform="translate(-50%, -50%) scale(0.95)",setTimeout(()=>{t.element.style.transform="translate(-50%, -50%) scale(1)",a()},100),setTimeout(()=>{e.material.opacity=0,setTimeout(()=>{e.position.set(g,o,0),h()},c)},500))};x()};setTimeout(h,m)}import*as yt from"three";function ia(e,t,n){var u,g,o,b,w,T,d;let a=t.objects.get("hand_tutorial_1"),i=((u=a==null?void 0:a.gameplay)==null?void 0:u.tuning)||{},s=(a==null?void 0:a.render)||{},l=(a==null?void 0:a.transform)||{},m=new yt.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),c=new yt.Sprite(m),h=l.position||{},p=(g=h==null?void 0:h.z)!=null?g:0;c.position.set(n.x+((o=h==null?void 0:h.x)!=null?o:0),n.y+((b=h==null?void 0:h.y)!=null?b:0),p),c.material.opacity=s.alpha!==void 0&&s.alpha!==null?s.alpha:0,c.visible=s.visible!==void 0&&s.visible!==null?s.visible:!1;let f=(w=i.hand_scale_multiplier)!=null?w:2.5,y=(T=l.scale)!=null?T:.1875;return c.scale.set(y*f*100,y*f*100,1),c.renderOrder=(d=s.z_index)!=null?d:99999,c}function sa(e){var g,o,b,w,T,d,r,E,x;let t=e.objects.get("ui_tutorial_1"),n=t==null?void 0:t.ui,a=(t==null?void 0:t.render)||{},i=((g=e.engine.runtime)==null?void 0:g.ui_styles)||{},s=((o=e.engine.runtime)==null?void 0:o.ui)||{},l=(n==null?void 0:n.text)||s.tutorial_label||s.label_text||"CLEAN!",m=(n==null?void 0:n.font)||"brand.warning",c=(n==null?void 0:n.fontSize)||i.label_font_size||52,h=(w=n==null?void 0:n.letterSpacing)!=null?w:(b=i.label_letter_spacing)!=null?b:-1,p=(n==null?void 0:n.align)||"center",f=a.tint,y=typeof f=="string"?f:f?`#${f.toString(16).padStart(6,"0")}`:i.label_fill||"#FFF1C1",u=document.createElement("div");return u.textContent=l,u.style.cssText=`
103
+ `;let Bn=Tt+Pt/2+20,Dn=d-r-10,zn=Math.min(Bn+((Ve=Gt.animation_start_y_offset)!=null?Ve:5),Dn);K.style.top=`${zn}px`,K.style.left="50%";let wt=Q(K);wt.element=K,wt.animationStartYOffset=(je=Gt.animation_start_y_offset)!=null?je:5,H.appendChild(K);let _t=((Je=f==null?void 0:f.gameplay)==null?void 0:Je.tuning)||{},Pn=(Ke=_t.hand_offset_x)!=null?Ke:50,Yn=(Qe=_t.hand_offset_y)!=null?Qe:50,Nn=(Oe=(Ie=f==null?void 0:f.transform)==null?void 0:Ie.scale)!=null?Oe:.1875,Gn=(Ue=_t.hand_scale_multiplier)!=null?Ue:2.5,Xn=new U.SpriteMaterial({map:t||void 0,transparent:!0,alphaTest:.1}),et=new U.Sprite(Xn),qt=Nn*Gn*100;return et.scale.set(qt,qt,1),et.position.set(Pn,Tt+Yn,0),et.material.opacity=0,et.visible=!1,{panel:M,logo:P,title:Lt,subtitle:Et,footer:bt,ctaButton:xt,ctaText:Nt,ctaHint:wt,hand:et}}function Qn(e,t,n){var x,_,R,F,S,H,M,v;let a=t.objects.get("ui_endgame_1"),i=((x=a==null?void 0:a.gameplay)==null?void 0:x.tuning)||{},s=(_=i.animation_duration_ms)!=null?_:800,l=(R=i.fade_in_duration_ms)!=null?R:600,m=(F=i.scale_animation_intensity)!=null?F:.1,c=(S=i.logo_animation_delay_ms)!=null?S:100,h=(H=i.title_animation_delay_ms)!=null?H:200,p=(M=i.footer_animation_delay_ms)!=null?M:300,f=(v=i.cta_animation_delay_ms)!=null?v:400,{panel:y,logo:u,title:g,subtitle:o,footer:b,ctaButton:w,ctaText:T,ctaHint:d}=e;y.visible=!0,y.element.style.visibility="visible";let r=Date.now(),E=()=>{let Z=Date.now()-r,B=Math.min(Z/l,1),z=1-Math.pow(1-B,3);y.alpha=z,y.element.style.opacity=z.toString();let I=1+m*(1-z);y.element.style.transform=`translate(-50%, -50%) scale(${I})`,B<1?requestAnimationFrame(E):(setTimeout(()=>In(u,s,t),c),setTimeout(()=>{On(g,s),setTimeout(()=>Un(o,s),50)},h),setTimeout(()=>ta(b,s),p),setTimeout(()=>{ea(w,T,s),setTimeout(()=>na(d,s),50),n&&n()},f))};E()}function In(e,t,n){var y,u,g,o,b;let a=n==null?void 0:n.objects.get("ui_endgame_logo_1"),s=(u=(((y=a==null?void 0:a.gameplay)==null?void 0:y.tuning)||{}).animation_start_scale)!=null?u:1.2,l=Date.now(),m=e.material.opacity,c=(g=e.targetAlpha)!=null?g:1,h=(o=e.baseScaleX)!=null?o:e.scale.x,p=(b=e.baseScaleY)!=null?b:e.scale.y,f=()=>{let w=Date.now()-l,T=Math.min(w/t,1),d=1-Math.pow(1-T,2);e.material.opacity=m+(c-m)*d;let r=s+(1-s)*d;e.scale.set(h*r,p*r,1),T<1&&requestAnimationFrame(f)};f()}function On(e,t){let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=()=>{let l=Date.now()-n,m=Math.min(l/t,1),c=1-Math.pow(1-m,2);e.element.style.opacity=(a+(1-a)*c).toString(),e.element.style.top=`${i-20*(1-c)}px`,m<1&&requestAnimationFrame(s)};s()}function Un(e,t){var m;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=i-((m=e.animationStartYOffset)!=null?m:-10),l=()=>{let c=Date.now()-n,h=Math.min(c/t,1),p=1-Math.pow(1-h,2);e.element.style.opacity=(a+(1-a)*p).toString(),e.element.style.top=`${i+(s-i)*p}px`,h<1&&requestAnimationFrame(l)};l()}function ta(e,t){var l;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=(l=e.targetAlpha)!=null?l:1,s=()=>{let m=Date.now()-n,c=Math.min(m/t,1),h=1-Math.pow(1-c,2);e.element.style.opacity=(a+(i-a)*h).toString(),c<1&&requestAnimationFrame(s)};s()}function ea(e,t,n){let a=Date.now(),i=parseFloat(e.element.style.opacity||"0"),s=()=>{let l=Date.now()-a,m=Math.min(l/n,1),c=1-Math.pow(1-m,2);e.element.style.opacity=(i+(1-i)*c).toString(),t.element.style.opacity=(i+(1-i)*c).toString(),e.element.style.transform=`translate(-50%, -50%) scale(${1+.1*(1-c)})`,m<1&&requestAnimationFrame(s)};s()}function na(e,t){var m;let n=Date.now(),a=parseFloat(e.element.style.opacity||"0"),i=parseFloat(e.element.style.top||"0"),s=i-((m=e.animationStartYOffset)!=null?m:5),l=()=>{let c=Date.now()-n,h=Math.min(c/t,1),p=1-Math.pow(1-h,2);e.element.style.opacity=(a+(1-a)*p).toString(),e.element.style.top=`${i+(s-i)*p}px`,h<1&&requestAnimationFrame(l)};l()}function aa(e,t,n,a){var p,f,y,u;let i=n.objects.get("ui_endgame_hand_1"),s=((p=i==null?void 0:i.gameplay)==null?void 0:p.tuning)||{},l=(f=s.click_animation_duration_ms)!=null?f:600,m=(y=s.click_delay_ms)!=null?y:2e3,c=(u=s.click_repeat_delay_ms)!=null?u:3e3,h=()=>{var _,R;e.visible=!0,e.material.opacity=1;let g=e.position.x,o=e.position.y,b=(_=s.hand_offset_x)!=null?_:50,w=(R=s.hand_offset_y)!=null?R:50,T=t.element.getBoundingClientRect(),d=b,r=w,E=Date.now(),x=()=>{var z,I,at;let F=Date.now()-E,S=Math.min(F/l,1),H=S<.5?2*S*S:1-Math.pow(-2*S+2,2)/2;e.position.set(g+(d-g)*H,o+(r-o)*H,0);let M=(I=(z=i==null?void 0:i.transform)==null?void 0:z.scale)!=null?I:.1875,v=(at=s.hand_scale_multiplier)!=null?at:2.5,Z=M*v*100,B=Z+Z*.2*Math.sin(S*Math.PI);e.scale.set(B,B,1),S<1?requestAnimationFrame(x):(t.element.style.transform="translate(-50%, -50%) scale(0.95)",setTimeout(()=>{t.element.style.transform="translate(-50%, -50%) scale(1)",a()},100),setTimeout(()=>{e.material.opacity=0,setTimeout(()=>{e.position.set(g,o,0),h()},c)},500))};x()};setTimeout(h,m)}import*as yt from"three";function ia(e,t,n){var u,g,o,b,w,T,d;let a=t.objects.get("hand_tutorial_1"),i=((u=a==null?void 0:a.gameplay)==null?void 0:u.tuning)||{},s=(a==null?void 0:a.render)||{},l=(a==null?void 0:a.transform)||{},m=new yt.SpriteMaterial({map:e||void 0,transparent:!0,alphaTest:.1}),c=new yt.Sprite(m),h=l.position||{},p=(g=h==null?void 0:h.z)!=null?g:0;c.position.set(n.x+((o=h==null?void 0:h.x)!=null?o:0),n.y+((b=h==null?void 0:h.y)!=null?b:0),p),c.material.opacity=s.alpha!==void 0&&s.alpha!==null?s.alpha:0,c.visible=s.visible!==void 0&&s.visible!==null?s.visible:!1;let f=(w=i.hand_scale_multiplier)!=null?w:2.5,y=(T=l.scale)!=null?T:.1875;return c.scale.set(y*f*100,y*f*100,1),c.renderOrder=(d=s.z_index)!=null?d:99999,c}function sa(e){var g,o,b,w,T,d,r,E,x;let t=e.objects.get("ui_tutorial_1"),n=t==null?void 0:t.ui,a=(t==null?void 0:t.render)||{},i=((g=e.engine.runtime)==null?void 0:g.ui_styles)||{},s=((o=e.engine.runtime)==null?void 0:o.ui)||{},l=(n==null?void 0:n.text)||s.tutorial_label||s.label_text||"CLEAN!",m=(n==null?void 0:n.font)||"brand.warning",c=(n==null?void 0:n.fontSize)||i.label_font_size||52,h=(w=n==null?void 0:n.letterSpacing)!=null?w:(b=i.label_letter_spacing)!=null?b:-1,p=(n==null?void 0:n.align)||"center",f=a.tint,y=typeof f=="string"?f:f?`#${f.toString(16).padStart(6,"0")}`:i.label_fill||"#FFF1C1",u=document.createElement("div");return u.textContent=l,u.style.cssText=`
104
104
  font-family: ${X(m)};
105
105
  font-size: ${c}px;
106
106
  font-weight: ${q(m)};
@@ -115,4 +115,4 @@ import{b as dt}from"../chunk-SXCFRUYM.mjs";import*as k from"three";var tn=(a=>(a
115
115
  position: absolute;
116
116
  transform: translate(-50%, -50%);
117
117
  white-space: nowrap;
118
- `,u}function oa(e,t,n,a,i){var c,h,p,f,y,u,g;let s=i.objects.get("hand_tutorial_1"),l=((c=s==null?void 0:s.gameplay)==null?void 0:c.tuning)||{},m=(s==null?void 0:s.transform)||{};if(!a){let o=(h=l.animation_duration)!=null?h:1.5,b=n%o/o,w=b<.5?2*b*b:-1+(4-2*b)*b,T=(p=l.x_offset)!=null?p:0,d=(f=l.y_offset)!=null?f:0,r=(y=l.animation_range)!=null?y:40,E=r*.7,x=r,_=t.x+T+E,R=t.y+d+x,F=_+E,H=R+x;e.position.set(_+(F-_)*w,R+(H-R)*w,0);let S=(u=m.scale)!=null?u:.1875,M=(g=l.hand_scale_multiplier)!=null?g:2.5,v=S*M*100;e.scale.set(v,v,1)}}import*as tt from"three";var en=new tt.TextureLoader,Ct=null,Mt=null;async function nn(){if(Ct)return Ct;if(!Mt){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"})();Mt=new Function("path","return import(path)")(n).then(a=>a.INLINE_ASSETS||{}).catch(a=>(console.warn("[assets] Failed to load inline-assets.js:",a),{}))}let e=await Mt;return Ct=e||{},e||{}}async function an(e,t,n=16777215,a=!1){try{let s=(await nn())[e];return await en.loadAsync(s||e)}catch{console.warn(`Asset missing: ${e}. Using placeholder.`);let s=document.createElement("canvas");s.width=64,s.height=64;let l=s.getContext("2d");return l&&(l.fillStyle=`#${n.toString(16).padStart(6,"0")}`,a?l.fillRect(0,0,30,60):(l.beginPath(),l.arc(32,32,30,0,Math.PI*2),l.fill(),l.fillRect(27,32,10,40))),new tt.CanvasTexture(s)}}async function ra(e,t,n){var g,o,b,w;let i=(await nn())[e]||e,s;try{s=await en.loadAsync(i),console.log("[character] loaded sheet",{path:e,sourceUsed:i})}catch(T){let E=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await an(e,t,parseInt(E,16),!0),console.warn("[character] fallback loadAsset used",{path:e,err:T})}if(!s)return[];let l=n.gameplay.character_sheet||{},m=(g=l.cols)!=null?g:3,c=(o=l.rows)!=null?o:2,h=((b=s.image)==null?void 0:b.width)||0,p=((w=s.image)==null?void 0:w.height)||0,f=h/m,y=p/c;if(!Number.isFinite(f)||!Number.isFinite(y)||f<=0||y<=0)return[s];let u=[];for(let T=0;T<c;T++)for(let d=0;d<m;d++){let r=document.createElement("canvas");r.width=f,r.height=y;let E=r.getContext("2d");E&&s.image&&E.drawImage(s.image,d*f,T*y,f,y,0,0,f,y),u.push(new tt.CanvasTexture(r))}return u.length>2&&u.push(...u.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:u.length}),u}function la(e,t){var f,y,u,g;let n=t.gameplay.brush||{},a=t.theme.brush_color||"#ffffff",i=(f=n.radius)!=null?f:20,s=(y=n.inner_radius)!=null?y:15,l=(u=n.alpha)!=null?u:.8,m=(g=n.inner_alpha)!=null?g:.3,c=n.inner_color||"#ffffff",h=document.createElement("canvas");h.width=i*2,h.height=i*2;let p=h.getContext("2d");return p&&(p.clearRect(0,0,h.width,h.height),p.beginPath(),p.arc(i,i,i,0,Math.PI*2),p.fillStyle=a,p.globalAlpha=l,p.fill(),p.beginPath(),p.arc(i,i,s,0,Math.PI*2),p.fillStyle=c,p.globalAlpha=m,p.fill()),new tt.CanvasTexture(h)}export{tn as AspectClass,mt as GameObject,vt as GameObjectManager,pt as Renderer,nt as ResponsiveUISystem,ht as Transform,aa as animateHandClick,Qn as animatePanelEntrance,la as createBrushTexture,Kn as createEndGamePanel,ia as createHandTutorial,Vn as createThreeBase,sa as createTutorialLabel,Rt as getAspectClass,Jn as getRegisteredFontIds,an as loadAsset,ra as loadCharacterFrames,jn as registerFont,X as resolveFont,q as resolveFontWeight,oa as updateHandAnimation};
118
+ `,u}function oa(e,t,n,a,i){var c,h,p,f,y,u,g;let s=i.objects.get("hand_tutorial_1"),l=((c=s==null?void 0:s.gameplay)==null?void 0:c.tuning)||{},m=(s==null?void 0:s.transform)||{};if(!a){let o=(h=l.animation_duration)!=null?h:1.5,b=n%o/o,w=b<.5?2*b*b:-1+(4-2*b)*b,T=(p=l.x_offset)!=null?p:0,d=(f=l.y_offset)!=null?f:0,r=(y=l.animation_range)!=null?y:40,E=r*.7,x=r,_=t.x+T+E,R=t.y+d+x,F=_+E,S=R+x;e.position.set(_+(F-_)*w,R+(S-R)*w,0);let H=(u=m.scale)!=null?u:.1875,M=(g=l.hand_scale_multiplier)!=null?g:2.5,v=H*M*100;e.scale.set(v,v,1)}}import*as tt from"three";var en=new tt.TextureLoader,Ct=null,Mt=null;async function nn(){if(Ct)return Ct;if(!Mt){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"})();Mt=new Function("path","return import(path)")(n).then(a=>a?a.INLINE_ASSETS?a.INLINE_ASSETS:(console.warn("[assets] Module does not have INLINE_ASSETS export. Module keys:",Object.keys(a)),{}):(console.warn("[assets] Module import returned undefined"),{})).catch(a=>(console.warn("[assets] Failed to load inline-assets.js:",a),{}))}let e=await Mt;return Ct=e||{},e||{}}async function an(e,t,n=16777215,a=!1){try{let s=(await nn())[e];return await en.loadAsync(s||e)}catch{console.warn(`Asset missing: ${e}. Using placeholder.`);let s=document.createElement("canvas");s.width=64,s.height=64;let l=s.getContext("2d");return l&&(l.fillStyle=`#${n.toString(16).padStart(6,"0")}`,a?l.fillRect(0,0,30,60):(l.beginPath(),l.arc(32,32,30,0,Math.PI*2),l.fill(),l.fillRect(27,32,10,40))),new tt.CanvasTexture(s)}}async function ra(e,t,n){var g,o,b,w;let i=(await nn())[e]||e,s;try{s=await en.loadAsync(i),console.log("[character] loaded sheet",{path:e,sourceUsed:i})}catch(T){let E=((n.gameplay.character_sheet||{}).fallback_color||"#ff00ff").replace("#","");s=await an(e,t,parseInt(E,16),!0),console.warn("[character] fallback loadAsset used",{path:e,err:T})}if(!s)return[];let l=n.gameplay.character_sheet||{},m=(g=l.cols)!=null?g:3,c=(o=l.rows)!=null?o:2,h=((b=s.image)==null?void 0:b.width)||0,p=((w=s.image)==null?void 0:w.height)||0,f=h/m,y=p/c;if(!Number.isFinite(f)||!Number.isFinite(y)||f<=0||y<=0)return[s];let u=[];for(let T=0;T<c;T++)for(let d=0;d<m;d++){let r=document.createElement("canvas");r.width=f,r.height=y;let E=r.getContext("2d");E&&s.image&&E.drawImage(s.image,d*f,T*y,f,y,0,0,f,y),u.push(new tt.CanvasTexture(r))}return u.length>2&&u.push(...u.slice(1,-1).reverse()),console.log("[character] frames prepared",{count:u.length}),u}function la(e,t){var f,y,u,g;let n=t.gameplay.brush||{},a=t.theme.brush_color||"#ffffff",i=(f=n.radius)!=null?f:20,s=(y=n.inner_radius)!=null?y:15,l=(u=n.alpha)!=null?u:.8,m=(g=n.inner_alpha)!=null?g:.3,c=n.inner_color||"#ffffff",h=document.createElement("canvas");h.width=i*2,h.height=i*2;let p=h.getContext("2d");return p&&(p.clearRect(0,0,h.width,h.height),p.beginPath(),p.arc(i,i,i,0,Math.PI*2),p.fillStyle=a,p.globalAlpha=l,p.fill(),p.beginPath(),p.arc(i,i,s,0,Math.PI*2),p.fillStyle=c,p.globalAlpha=m,p.fill()),new tt.CanvasTexture(h)}export{tn as AspectClass,mt as GameObject,vt as GameObjectManager,pt as Renderer,nt as ResponsiveUISystem,ht as Transform,aa as animateHandClick,Qn as animatePanelEntrance,la as createBrushTexture,Kn as createEndGamePanel,ia as createHandTutorial,Vn as createThreeBase,sa as createTutorialLabel,Rt as getAspectClass,Jn as getRegisteredFontIds,an as loadAsset,ra as loadCharacterFrames,jn as registerFont,X as resolveFont,q as resolveFontWeight,oa as updateHandAnimation};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "handler-playable-sdk",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "description": "Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -23,7 +23,9 @@
23
23
  }
24
24
  },
25
25
  "scripts": {
26
- "build": "tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --minify",
26
+ "build": "tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run obfuscate",
27
+ "build:dev": "tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --external lottie-web",
28
+ "obfuscate": "javascript-obfuscator dist/index.js dist/index.mjs dist/pixi/index.js dist/pixi/index.mjs dist/three/index.js dist/three/index.mjs --output dist --options-preset high-obfuscation --compact true --self-defending true",
27
29
  "lint": "eslint 'src/**/*.{ts,tsx}'",
28
30
  "typecheck": "tsc --noEmit",
29
31
  "prepublishOnly": "npm run build",
@@ -46,6 +48,7 @@
46
48
  "README.md"
47
49
  ],
48
50
  "peerDependencies": {
51
+ "lottie-web": "^5.0.0",
49
52
  "pixi.js": "^8.0.0",
50
53
  "three": "^0.160.0"
51
54
  },
@@ -55,12 +58,16 @@
55
58
  },
56
59
  "three": {
57
60
  "optional": true
61
+ },
62
+ "lottie-web": {
63
+ "optional": true
58
64
  }
59
65
  },
60
66
  "devDependencies": {
61
67
  "@types/three": "^0.160.0",
62
68
  "eslint": "^8.57.1",
63
- "pixi.js": "^8.8.1",
69
+ "javascript-obfuscator": "^5.1.0",
70
+ "pixi.js": "8.8.1",
64
71
  "three": "^0.160.0",
65
72
  "ts-node": "^10.9.2",
66
73
  "tsup": "^8.4.0",
@@ -1,17 +0,0 @@
1
- var u={};function I(e,t,n=!1){u[e]||(u[e]=[]),u[e].push({fn:t,once:n})}function V(e,t){if(u[e]){if(!t){delete u[e];return}u[e]=u[e].filter(n=>n.fn!==t)}}function P(e,...t){let n=u[e];if(n)for(let i of[...n])i.fn(...t),i.once&&V(e,i.fn)}function a(e,t){I(e,t,!0)}var R={name:"handler-playable-sdk",version:"0.2.4",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.js",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.js"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.mjs",require:"./dist/pixi/index.js"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.mjs",require:"./dist/three/index.js"}},scripts:{build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts --format cjs,esm --dts --clean --minify",lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.js patch","publish:update:minor":"node scripts/publish-and-update.js minor","publish:update:major":"node scripts/publish-and-update.js major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","LICENSE","README.md"],peerDependencies:{"pixi.js":"^8.0.0",three:"^0.160.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0}},devDependencies:{"@types/three":"^0.160.0",eslint:"^8.57.1","pixi.js":"^8.8.1",three:"^0.160.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2"}};var s=0,Se=s++,Z=s++,ee=s++,te=s++,ne=s++,ie=s++,oe=s++,re=s++,ae=s++,se=s++,de=s++,le=s++,r=Se;function ce(){return r===Z}function ue(){return r===ee}function pe(){return r===te}function fe(){return r===ne}function g(){return r===ie}function y(){return r===oe}function me(){return r===re}function ge(){return r===ae}function ye(){return r===se}function H(){return r===de}function F(){return r===le}function we(){let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",t=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(e==="mraid")try{mraid.getState(),r=Z;return}catch{}else if(e==="dapi")try{dapi.isReady(),r=ee;return}catch{}if(t==="facebook")try{typeof FbPlayableAd!="undefined"&&(r=te)}catch{}else if(t==="google")try{typeof ExitApi!="undefined"&&(r=ne)}catch{}else if(t==="mintegral")window.gameReady&&(r=ie);else if(t==="tapjoy")window.TJ_API&&(r=oe);else if(t==="tiktok")window.openAppStore&&(r=re);else if(t==="smadex")try{window.smxTracking&&(r=ae)}catch{}else if(t==="snapchat")try{window.ScPlayableAd&&(r=se)}catch{}else t==="vungle"?r=de:(e==="nucleo"||t==="nucleo")&&(r=le)}var Ee={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"},Ce=Math.random().toString(36).slice(2),w=null,A={...Ee},Ae="web_embed",De={},G=!1,E=!1,T=!1,ke=!1,B=1,W=0,z=!1,d=!1,N="",h=Math.floor(window.innerWidth),b=Math.floor(window.innerHeight),K=h>b,l=!1,k=!1,he=!1,be=!1,U=!1,M=null;function _e(){if(w)return w;let e=document.createElement("div");return e.id="handler-root",e.setAttribute("data-handler-root","true"),document.body.appendChild(e),w=e,e}function j(e){switch(e){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return e}}function Te(e,t){return{event_name:e,ts:Date.now(),session_id:Ce,deployment_id:A.deployment_id,variant_id:A.variant_id,export_profile_id:A.profile_id,instance_id:A.instance_id||"default",env:Ae==="mraid"?"mraid":"web",payload:t}}function o(e,t){let n=j(e),i=Te(n,t);P(n,i),n!==e&&P(e,i)}function O(){M&&(M(h,b),M=null)}function _(e){B=e,o("volume",e)}function v(e){e&&(ke=!0),!T&&(T=!0,o("pause"),_(0))}function S(e){!e&&ke||T&&(T=!1,o("resume"),_(B))}function f(e,t){h=Math.floor(e||window.innerWidth),b=Math.floor(t||window.innerHeight),K=h>b,o("resize",{width:h,height:b})}function Le(){if(ce())try{let e=mraid.getMaxSize();f(e.width,e.height);let t=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?S():v()};if(mraid.addEventListener("viewableChange",t),mraid.addEventListener("stateChange",t),mraid.addEventListener("sizeChange",()=>{let n=mraid.getMaxSize();f(n.width,n.height)}),mraid.getAudioVolume){let n=mraid.getAudioVolume();_(n?1:0)}if(mraid.addEventListener("audioVolumeChange",n=>{n!==null&&_(n>0?1:0)}),mraid.addEventListener("error",(n,i)=>{console.warn("mraid error:",n,"action:",i)}),z=!0,mraid.isViewable()&&mraid.getState()!=="hidden")l=!0,o("boot"),o("view"),o("ready"),d=!0,O();else{let n=()=>{l=!0,o("boot"),o("view"),o("ready"),d=!0,O()};mraid.addEventListener("ready",n)}}catch(e){console.warn("MRAID hook skipped",e)}}function Ie(){if(ue())try{let e=dapi.getScreenSize();f(e.width,e.height),dapi.addEventListener("viewableChange",n=>{n.isViewable?S():v()}),dapi.addEventListener("adResized",n=>{let i=dapi.getScreenSize();f(n.width||i.width,n.height||i.height)});let t=dapi.getAudioVolume();if(_(t?1:0),dapi.addEventListener("audioVolumeChange",n=>_(n?1:0)),z=!0,dapi.isViewable())l=!0,o("boot"),o("view"),o("ready"),d=!0,O();else{let n=()=>{l=!0,o("boot"),o("view"),o("ready"),d=!0,O()};dapi.addEventListener("ready",n)}}catch(e){console.warn("DAPI hook skipped",e)}}function ve(){let e=()=>{l||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(l=!0,o("boot"),o("view"),o("ready"),d=!0,O(),k&&(k=!1,p.start()))};window.addEventListener("resize",()=>f()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(S(),e()):v()}),document.readyState==="complete"||document.readyState==="interactive"?e():window.addEventListener("load",e),z=!0}function Pe(){let e=t=>{typeof TouchEvent!="undefined"&&t instanceof TouchEvent&&(he=!0),!(he&&t instanceof MouseEvent)&&(W+=1,o("interaction",W))};document.addEventListener("mousedown",e),document.addEventListener("touchstart",e)}function Re(e){var i,c,x,C,J,D,q,L,$,X,Y,Q;let t=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(t==="mraid"&&typeof mraid!="undefined")mraid.open(e||"");else if(t==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(y())(x=(c=window.TJ_API)==null?void 0:c.click)==null||x.call(c);else if(pe())(J=(C=window.FbPlayableAd)==null?void 0:C.onCTAClick)==null||J.call(C);else if(ye())(q=(D=window.ScPlayableAd)==null?void 0:D.onCTAClick)==null||q.call(D);else if(ge())try{($=(L=window.smxTracking)==null?void 0:L.redirect)==null||$.call(L)}catch(m){console.warn("Smadex redirect failed",m)}else if(fe()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(e||N||""):e&&window.open(e)}else g()?(X=window.install)==null||X.call(window):me()?(Y=window.openAppStore)==null||Y.call(window):H()?(Q=parent==null?void 0:parent.postMessage)==null||Q.call(parent,"download","*"):e&&window.open(e)}function Me(){let e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",t=n=>{if(!n)return;let i=new Image;i.src=n};if(e==="bigabid"){let n=window.BIGABID_BIDTIMEMACROS;if(!n)return;a("view",()=>t(n.mraid_viewable)),a("start",()=>t(n.game_viewable)),a("engagement",()=>t(n.engagement));let i=()=>t(n.complete);a("complete",i),I("engagement",c=>{var x;((x=c==null?void 0:c.payload)==null?void 0:x.count)>3&&i()}),a("cta_click",()=>t(n.click))}else if(e==="inmobi"){let n=window.INMOBI_DSPMACROS;if(!n)return;a("view",()=>t(n.Ad_Load_Start)),a("start",()=>t(n.Ad_Viewable)),a("engagement",()=>t(n.First_Engagement)),a("complete",()=>t(n.Gameplay_Complete)),a("cta_click",()=>t(n.DSP_Click)),a("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>t(n[`Spent_${i}_Seconds`]),i*1e3))})}}function je(){if(!y())return;let e=window.TJ_API;e&&e.setPlayableAPI&&e.setPlayableAPI({skipAd:()=>{try{p.finish()}catch(t){console.warn("Tapjoy skip failed",t)}}})}function xe(){var t,n,i;let e=window.TJ_API;(t=e==null?void 0:e.objectiveComplete)==null||t.call(e),(n=e==null?void 0:e.playableFinished)==null||n.call(e),(i=e==null?void 0:e.gameplayFinished)==null||i.call(e)}function Ne(){g()&&(window.mintGameStart=()=>{S(!0),f()},window.mintGameClose=()=>{v(!0)})}function ze(){if(!F())return;let e=window.NUC;!e||!e.trigger||(p.on("cta_click",()=>{var t,n;return(n=(t=e.trigger).convert)==null?void 0:n.call(t,N)}),p.on("complete",()=>{var t,n;return(n=(t=e.trigger).tryAgain)==null?void 0:n.call(t)}))}var p={init(e={},t){if(Ae=e.profile||"web_embed",De=e.consent||{},A={...Ee,...e.ids||{}},w=e.rootEl||w,N=e.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),t&&(M=t),o("init"),document.body.oncontextmenu=()=>!1,_e(),Ve(w),we(),Le(),Ie(),!z){if(document.readyState==="complete")ve();else if(!be){be=!0;let n=()=>{ve(),window.removeEventListener("load",n),document.removeEventListener("DOMContentLoaded",n)};window.addEventListener("load",n),document.addEventListener("DOMContentLoaded",n)}}Pe(),Me(),je(),Ne(),ze(),console.log(`%c @handler/playable-sdk %c v${R.version||"0.0.0"} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),l&&!d&&(o("boot"),o("view"),o("ready"),k&&(k=!1,p.start()),d=!0),d=l},getRoot(){return _e()},get version(){return R.version||"0.0.0"},get maxWidth(){return h},get maxHeight(){return b},get isLandscape(){return K},get isReady(){return d},get isStarted(){return G},get isPaused(){return T},get isFinished(){return E},get volume(){return B},get interactions(){return W},on(e,t){I(j(e),t)},off(e,t){V(j(e),t)},start(){var e,t;if(!G){if(!l){k=!0;return}if(G=!0,o("start"),f(),g())v(),(e=window.gameReady)==null||e.call(window);else if(y()){let n=window.TJ_API;(t=n==null?void 0:n.setPlayableBuild)==null||t.call(n,{orientation:K?"landscape":"portrait",buildID:R.version||"dev"})}}},finish(){var e,t;E||(E=!0,o("complete"),g()?(e=window.gameEnd)==null||e.call(window):H()?(t=parent==null?void 0:parent.postMessage)==null||t.call(parent,"complete","*"):y()&&xe())},install(e){if(!E){E=!0,y()?(xe(),setTimeout(()=>p.install(e),300)):(o("complete"),setTimeout(()=>p.install(e),0));return}U||(U=!0,setTimeout(()=>U=!1,500),o("cta_click"),o("conversion"),Re(e||N))},emit(e,t){let n=j(e);if(!["view","boot","start","engagement","complete","cta_click","conversion","retry","pause","resume","resize","volume","error"].includes(n)&&!n.startsWith("custom."))throw new Error(`Event ${e} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Te(n,t);P(n,i)},retry(){var e,t,n;if(g())(e=window.gameRetry)==null||e.call(window);else if(F()){let i=window.NUC;(n=(t=i==null?void 0:i.trigger)==null?void 0:t.tryAgain)==null||n.call(t)}o("engagement",{action:"retry"})},pause(){v(!0)},resume(){S(!0)},resize(e,t){f(e,t)}},Be=p;function Ve(e){let t=document.createElement("script");t.type="text/javascript",t.textContent=`
2
- (function(){
3
- var events = ['touchstart','touchend','mousedown','keydown'];
4
- function unlock(){
5
- if(window.AudioContext && AudioContext.prototype.resume){
6
- if(!window.__handler_audio_ctx){
7
- window.__handler_audio_ctx = new AudioContext();
8
- }
9
- if(window.__handler_audio_ctx.state === 'suspended'){
10
- window.__handler_audio_ctx.resume();
11
- }
12
- }
13
- events.forEach(function(e){ document.removeEventListener(e, unlock); });
14
- }
15
- events.forEach(function(e){ document.addEventListener(e, unlock, false); });
16
- })();
17
- `,e.appendChild(t)}export{p as a,Be as b};