handler-playable-sdk 0.3.61 → 0.3.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-2YFOCUIT.js → chunk-MNJSOVZS.js} +69 -69
- package/dist/cli/brand-dna.mjs +1 -1
- package/dist/cli/canva-import.mjs +1 -1
- package/dist/cli/cleanup-assets.mjs +1 -1
- package/dist/cli/fix-scales.mjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/screen-helper.mjs +1 -1
- package/dist/cli/setup-library.mjs +1 -1
- package/dist/cli/student-helper.mjs +1 -1
- package/dist/cli/sync-screens.mjs +1 -1
- package/dist/cli/validate-assets.mjs +1 -1
- package/dist/cli/validate.mjs +1 -1
- package/dist/index.cjs +72 -72
- package/dist/index.css +122 -50
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +10 -10
- package/dist/pixi/index.css +122 -50
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +40 -40
- package/dist/three/index.css +122 -50
- package/dist/three/index.js +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./chunk-LV4HGC5G.js";import{c as ot,d as It,e as lt,g as ea,h as Oi,j as ji,k as Ot,l as ta,m as ia,n as Di,o as na}from"./chunk-ZLL42OOV.js";import{a as Yr}from"./chunk-JXBG6UFL.js";import{Application as $s}from"pixi.js";var Ce={};function Dt(a,e,t=!1){Ce[a]||(Ce[a]=[]),Ce[a].push({fn:e,once:t})}function zi(a,e){if(Ce[a]){if(!e){delete Ce[a];return}Ce[a]=Ce[a].filter(t=>t.fn!==e)}}function zt(a,...e){let t=Ce[a];if(t)for(let i of[...t])i.fn(...e),i.once&&zi(a,i.fn)}function ee(a,e){Dt(a,e,!0)}var G=null,ne=[],Ne=null;function sa(a){G=a,ne=[],Ne!==null&&(clearTimeout(Ne),Ne=null)}function oa(){var a,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(a=G==null?void 0:G.batchSize)!=null?a:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function aa(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function $i(a,e){let t=oa();if(e&&t.endpoint){if(ne.push(a),ne.length>t.maxQueue&&(ne=ne.slice(ne.length-t.maxQueue)),ne.length>=t.batchSize){ra();return}Ne===null&&(Ne=window.setTimeout(()=>{Ne=null,ra()},t.flushIntervalMs))}}async function ra(){let a=oa();if(!a.endpoint||ne.length===0)return;let e=ne.splice(0,a.batchSize);await aa(a.endpoint,{events:e},a.transport,a.debug),ne.length>0&&await aa(a.endpoint,{events:ne.splice(0,a.batchSize)},a.transport,a.debug)}function la(a){return Math.max(0,Math.min(1,a))}function Wr(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ct(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Kr(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function ca(a,e,t){try{a[e]=t}catch{}}function Xr(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function da(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function pa(a,e){let t=Xr(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function ua(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},s=p=>{p.killed||(p.killed=!0,r(p))},o=()=>{var d,u;let p=ct();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=la(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let w=h-y;m=la(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)ca(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&da(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=Wr(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let S of Object.keys(d)){if(y.has(S))continue;let L=d[S];typeof L=="number"&&v.push({key:S,from:Kr(p,S),to:L})}let x=pa(p,d);return{target:p,startMs:ct(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ct())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ct(),f=ct()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&ca(p,g,f)}let u=pa(p,d);u.to&&da(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))s(u)},timeline(p={}){let d=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:h(w)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function ga(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=ua()}catch{}}var ha={name:"handler-playable-sdk",version:"0.3.61",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var te=0,Zr=te++,fa=te++,ma=te++,ba=te++,ya=te++,va=te++,xa=te++,wa=te++,Ea=te++,Aa=te++,Sa=te++,Ca=te++,F=Zr;function Ta(){return F===fa}function La(){return F===ma}function Pa(){return F===ba}function ka(){return F===ya}function Fe(){return F===va}function Ue(){return F===xa}function _a(){return F===wa}function Ma(){return F===Ea}function Ra(){return F===Aa}function Hi(){return F===Sa}function Bi(){return F===Ca}function Ia(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=fa;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=ma;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=ba)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=ya)}catch{}else if(e==="mintegral")window.gameReady&&(F=va);else if(e==="tapjoy")window.TJ_API&&(F=xa);else if(e==="tiktok")window.openAppStore&&(F=wa);else if(e==="smadex")try{window.smxTracking&&(F=Ea)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Aa)}catch{}else e==="vungle"?F=Sa:(a==="nucleo"||e==="nucleo")&&(F=Ca)}import Ni from"lottie-web";var Oa=Ni;typeof window!="undefined"&&(window.lottie=Ni,window.__baseLottie=Ni);function q(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Oo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],jo=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Do=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Fi=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var ja=[...Fi],Da=[{category:"playable",label:"Playable Ad",devices:Fi}],Ui=Fi[0];function Ge(a){return ja.find(e=>e.id===a)||Ui}function zo(a){return ja.filter(e=>e.category===a)}var $t=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
1
|
+
import{c as Ri,d as le,e as Oi}from"./chunk-I5OOVR5U.js";import{i as jt}from"./chunk-LV4HGC5G.js";import{c as st,d as Ot,e as lt,g as ea,h as Ii,j as ji,k as It,l as ta,m as ia,n as Di,o as na}from"./chunk-ZLL42OOV.js";import{a as Yr}from"./chunk-JXBG6UFL.js";import{Application as Ho}from"pixi.js";var Ce={};function Dt(a,e,t=!1){Ce[a]||(Ce[a]=[]),Ce[a].push({fn:e,once:t})}function zi(a,e){if(Ce[a]){if(!e){delete Ce[a];return}Ce[a]=Ce[a].filter(t=>t.fn!==e)}}function zt(a,...e){let t=Ce[a];if(t)for(let i of[...t])i.fn(...e),i.once&&zi(a,i.fn)}function ee(a,e){Dt(a,e,!0)}var G=null,ne=[],Ne=null;function oa(a){G=a,ne=[],Ne!==null&&(clearTimeout(Ne),Ne=null)}function sa(){var a,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(a=G==null?void 0:G.batchSize)!=null?a:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function aa(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function $i(a,e){let t=sa();if(e&&t.endpoint){if(ne.push(a),ne.length>t.maxQueue&&(ne=ne.slice(ne.length-t.maxQueue)),ne.length>=t.batchSize){ra();return}Ne===null&&(Ne=window.setTimeout(()=>{Ne=null,ra()},t.flushIntervalMs))}}async function ra(){let a=sa();if(!a.endpoint||ne.length===0)return;let e=ne.splice(0,a.batchSize);await aa(a.endpoint,{events:e},a.transport,a.debug),ne.length>0&&await aa(a.endpoint,{events:ne.splice(0,a.batchSize)},a.transport,a.debug)}function la(a){return Math.max(0,Math.min(1,a))}function Wr(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ct(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Kr(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function ca(a,e,t){try{a[e]=t}catch{}}function Xr(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function da(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function pa(a,e){let t=Xr(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function ua(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ct();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=la(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let w=h-y;m=la(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)ca(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&da(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){o(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=Wr(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let S of Object.keys(d)){if(y.has(S))continue;let L=d[S];typeof L=="number"&&v.push({key:S,from:Kr(p,S),to:L})}let x=pa(p,d);return{target:p,startMs:ct(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ct())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ct(),f=ct()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&ca(p,g,f)}let u=pa(p,d);u.to&&da(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:h(w)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function ga(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=ua()}catch{}}var ha={name:"handler-playable-sdk",version:"0.3.62",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var te=0,Zr=te++,fa=te++,ma=te++,ba=te++,ya=te++,va=te++,xa=te++,wa=te++,Ea=te++,Aa=te++,Sa=te++,Ca=te++,F=Zr;function Ta(){return F===fa}function La(){return F===ma}function ka(){return F===ba}function Pa(){return F===ya}function Fe(){return F===va}function Ue(){return F===xa}function _a(){return F===wa}function Ma(){return F===Ea}function Ra(){return F===Aa}function Hi(){return F===Sa}function Bi(){return F===Ca}function Oa(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=fa;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=ma;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=ba)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=ya)}catch{}else if(e==="mintegral")window.gameReady&&(F=va);else if(e==="tapjoy")window.TJ_API&&(F=xa);else if(e==="tiktok")window.openAppStore&&(F=wa);else if(e==="smadex")try{window.smxTracking&&(F=Ea)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Aa)}catch{}else e==="vungle"?F=Sa:(a==="nucleo"||e==="nucleo")&&(F=Ca)}import Ni from"lottie-web";var Ia=Ni;typeof window!="undefined"&&(window.lottie=Ni,window.__baseLottie=Ni);function q(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Is=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],js=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Ds=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Fi=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var ja=[...Fi],Da=[{category:"playable",label:"Playable Ad",devices:Fi}],Ui=Fi[0];function Ge(a){return ja.find(e=>e.id===a)||Ui}function zs(a){return ja.filter(e=>e.category===a)}var $t=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
2
2
|
<div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects" style="left:16px; top:72px;">
|
|
3
3
|
<div class="scene-panel-header" data-panel-handle>
|
|
4
4
|
<div class="panel-title">
|
|
@@ -31,9 +31,9 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
31
31
|
<div class="scene-object-list" data-object-list></div>
|
|
32
32
|
</div>
|
|
33
33
|
</div>
|
|
34
|
-
`}initialize(e,t){var n,r,s,
|
|
35
|
-
${
|
|
36
|
-
`,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var
|
|
34
|
+
`}initialize(e,t){var n,r,o,s,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(n=this.root)==null?void 0:n.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(s=this.root)==null?void 0:s.querySelector("#scene-screen-filter");if(i){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}catch{}i.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}i.addEventListener("change",()=>{let c=i.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,r.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(n=Array.from(d.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));n.forEach(d=>{var I,j,k,E;let u=typeof t=="function"?t(d):null;if(!u){let C=window.__editableObjectConfigs;C&&typeof C.get=="function"&&(u=(I=C.get(d))!=null?I:null)}let g=(((j=u==null?void 0:u.identity)==null?void 0:j.category)||"scene").toString(),f=(((k=u==null?void 0:u.identity)==null?void 0:k.id)||d).toString(),h=g.toLowerCase(),m=f.toLowerCase(),b=h.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(f||d),v=((E=u==null?void 0:u.render)==null?void 0:E.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:x},S=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&S!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:s)[S].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
|
|
35
|
+
${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
|
|
36
|
+
`,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var s,l;let i=window.__HANDLER_SCREEN_INDEX,n=(s=i==null?void 0:i.instanceToScreen)==null?void 0:s[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${r}`.toLowerCase();return o.includes("loading")?"loading":o.includes("start")?"start":o.includes("tutorial")?"tutorial":o.includes("endgame")||o.includes("end_card")||o.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,r,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&r.endsWith(".json")?"animation":((s=(o=e.render)==null?void 0:o.asset)==null?void 0:s.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(r=>{var p,d;let o=typeof i=="function"?i(r.id):null;if(!o){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(o=(p=u.get(r.id))!=null?p:null)}let s=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(o),c=(d=o==null?void 0:o.ui)!=null&&d.text?`"${o.ui.text.substring(0,12)}${o.ui.text.length>12?"...":""}"`:"";return`
|
|
37
37
|
<button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
|
|
38
38
|
<span class="scene-object-label">${r.label}</span>
|
|
39
39
|
${c?`<span class="scene-object-text-preview">${c}</span>`:""}
|
|
@@ -46,7 +46,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
46
46
|
${n}
|
|
47
47
|
</div>
|
|
48
48
|
</div>
|
|
49
|
-
`}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,r,s,
|
|
49
|
+
`}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,r,o,s,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((r=e.identity)==null?void 0:r.category)==="ui")return"\u{1F3A8}";if(e.effects||(s=(o=e.identity)==null?void 0:o.id)!=null&&s.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,r,o;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((r=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:r.panel_bg_color)||((o=e.ui)==null?void 0:o.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,r,o;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((r=e.interaction)!=null&&r.clickable||(o=e.ui)!=null&&o.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}};var Ht=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
|
|
50
50
|
<div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
|
|
51
51
|
<div class="scene-tools-header" data-tools-header data-panel-handle>
|
|
52
52
|
<span class="scene-tools-title">Scene Tools</span>
|
|
@@ -91,7 +91,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
91
91
|
</div>
|
|
92
92
|
</div>
|
|
93
93
|
</div>
|
|
94
|
-
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,p)=>{var u;let d=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",p)},
|
|
94
|
+
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,p)=>{var u;let d=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",p)},o=this.root.querySelector("#debug-highlight-object");o==null||o.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!o.checked),r("bounds",o.checked)});let s=this.root.querySelector("#debug-highlight-anchor");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightAnchor(!!s.checked),r("anchor",s.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{r("nudge",l.checked)})}updateInfo(e){}};var Bt=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
95
95
|
<div class="nudge-panel hidden" data-panel="nudge-panel">
|
|
96
96
|
<div class="nudge-panel-header">
|
|
97
97
|
<span class="nudge-panel-title">Nudge Controls</span>
|
|
@@ -148,7 +148,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
148
148
|
</div>
|
|
149
149
|
</div>
|
|
150
150
|
</div>
|
|
151
|
-
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let
|
|
151
|
+
`}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let o=r.dataset.nudge,s=this.getNudgeStep();switch(o){case"up":(l=this.options)==null||l.onNudge(0,-s);break;case"down":(c=this.options)==null||c.onNudge(0,s);break;case"left":(p=this.options)==null||p.onNudge(-s,0);break;case"right":(d=this.options)==null||d.onNudge(s,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let s=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Nt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&r.slots.length>0)for(let c of r.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(r.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
|
|
152
152
|
<div class="scene-panel library-panel panel-accent-purple" data-panel="library">
|
|
153
153
|
<div class="scene-panel-header" data-panel-handle>
|
|
154
154
|
<div class="panel-title">
|
|
@@ -167,7 +167,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
167
167
|
</div>
|
|
168
168
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
169
169
|
</div>
|
|
170
|
-
`}initialize(e,t){var r,s
|
|
170
|
+
`}initialize(e,t){var r,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let o=document.createElement("div");o.className="slot-current";let s=document.createElement("img");s.src=`/raw/${e.currentAsset}?t=${t}`,s.alt=e.displayName,s.className="slot-thumbnail",s.onerror=()=>{s.style.display="none"},o.appendChild(s),r.appendChild(o);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let r=await this.fileToDataUrl(i);if(!r){alert("Failed to read file");return}let s=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",s,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${s}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${s}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${s}.png`),e.currentAsset=`${s}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(r){console.error("[Library] \u274C Upload error:",r),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Ft=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var Ut=class{render(e,t,i,n){let r=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
|
|
171
171
|
<div class="inspector-property" data-property-type="image">
|
|
172
172
|
<div class="inspector-property-header">
|
|
173
173
|
<label class="inspector-label">${r}</label>
|
|
@@ -178,9 +178,9 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
178
178
|
<button class="debug-btn debug-btn-sm" data-action="reset" data-path="${n}" data-object="${e}" title="Reset">\u21BA</button>
|
|
179
179
|
</div>
|
|
180
180
|
</div>
|
|
181
|
-
${
|
|
181
|
+
${o?`
|
|
182
182
|
<div class="inspector-image-preview">
|
|
183
|
-
<img src="${
|
|
183
|
+
<img src="${o}" alt="${r}" class="inspector-thumbnail" />
|
|
184
184
|
</div>
|
|
185
185
|
`:`
|
|
186
186
|
<div class="inspector-image-preview inspector-image-empty">
|
|
@@ -242,14 +242,14 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
242
242
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
243
243
|
<div class="inspector-array-empty">Empty array</div>
|
|
244
244
|
</div>
|
|
245
|
-
`;let r=i.map((s
|
|
245
|
+
`;let r=i.map((o,s)=>typeof o=="string"?`<div class="inspector-array-item">\u2022 ${o}</div>`:typeof o=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(o)}</div>`:`<div class="inspector-array-item">\u2022 ${String(o)}</div>`).join("");return`
|
|
246
246
|
<div class="inspector-property inspector-property-array">
|
|
247
247
|
<label class="inspector-property-label">${this.formatLabel(t)} (${i.length} items)</label>
|
|
248
248
|
<div class="inspector-array-list">
|
|
249
249
|
${r}
|
|
250
250
|
</div>
|
|
251
251
|
</div>
|
|
252
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Kt=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object")return this.renderLogic(e,t,i,n);let r=[];for(let
|
|
252
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Kt=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object")return this.renderLogic(e,t,i,n);let r=[];for(let s in i){let l=i[s],c=`${n}.${s}`,p=this.registry.renderProperty(e,s,l,c);p&&r.push(p)}return r.length===0?"":r.length<=4&&r.every(s=>s.includes("inspector-property"))?`
|
|
253
253
|
<div class="inspector-subsection">
|
|
254
254
|
<div class="inspector-subsection-title">${this.formatLabel(t)}</div>
|
|
255
255
|
<div class="inspector-subsection-content">
|
|
@@ -263,7 +263,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
263
263
|
${r.join("")}
|
|
264
264
|
</div>
|
|
265
265
|
</div>
|
|
266
|
-
`}renderLogic(e,t,i,n){let r=[],
|
|
266
|
+
`}renderLogic(e,t,i,n){let r=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let p=window,d=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],g=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...d].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(g)).sort((f,h)=>f.localeCompare(h))})(),c=o&&!l.includes(o)?[o,...l]:l;r.push(`
|
|
267
267
|
<div class="inspector-property inspector-property-text">
|
|
268
268
|
<label class="inspector-property-label">Id</label>
|
|
269
269
|
<div class="inspector-input-group">
|
|
@@ -271,12 +271,12 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
271
271
|
data-property-path="${n}.id"
|
|
272
272
|
data-object-id="${e}"
|
|
273
273
|
data-logic-id-selector="true">
|
|
274
|
-
<option value="" ${
|
|
275
|
-
${c.map(p=>`<option value="${p}" ${p===
|
|
274
|
+
<option value="" ${o?"":"selected"}>None</option>
|
|
275
|
+
${c.map(p=>`<option value="${p}" ${p===o?"selected":""}>${p}</option>`).join("")}
|
|
276
276
|
</select>
|
|
277
277
|
</div>
|
|
278
278
|
</div>
|
|
279
|
-
`);for(let p in i){if(p==="id")continue;let d=i[p],u=`${n}.${p}`;if(p==="props"&&d&&typeof d=="object"){let f=[];for(let h in d){let m=d[h],b=`${u}.${h}`,y=
|
|
279
|
+
`);for(let p in i){if(p==="id")continue;let d=i[p],u=`${n}.${p}`;if(p==="props"&&d&&typeof d=="object"){let f=[];for(let h in d){let m=d[h],b=`${u}.${h}`,y=s[h];if((h==="targetId"||h==="inputId")&&typeof m=="string"){let v=(()=>{try{let S=window,L=S==null?void 0:S.__editableConfig;if(!(L!=null&&L.objects))return[];let P=[];if(L.objects instanceof Map)for(let I of L.objects.keys())P.push(I);else typeof L.objects=="object"&&P.push(...Object.keys(L.objects));return P.sort()}catch{return[]}})(),x=m||"",w=x&&!v.includes(x)?[x,...v]:v;f.push(`
|
|
280
280
|
<div class="inspector-property inspector-property-text">
|
|
281
281
|
<label class="inspector-property-label">${this.formatLabel(h)}</label>
|
|
282
282
|
<div class="inspector-input-group">
|
|
@@ -313,18 +313,18 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
313
313
|
${r.join("")}
|
|
314
314
|
</div>
|
|
315
315
|
</div>
|
|
316
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Xt=class{render(e,t,i,n,r){let
|
|
316
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Xt=class{render(e,t,i,n,r){let o=i==null?"":String(i),s=Array.from(new Set(r.map(c=>String(c)))),l=o&&!s.includes(o)?[o,...s]:s;return`
|
|
317
317
|
<div class="inspector-property inspector-property-text">
|
|
318
318
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
319
319
|
<div class="inspector-input-group">
|
|
320
320
|
<select class="inspector-component-select inspector-input"
|
|
321
321
|
data-property-path="${n}"
|
|
322
322
|
data-object-id="${e}">
|
|
323
|
-
${l.map(c=>`<option value="${c}" ${c===
|
|
323
|
+
${l.map(c=>`<option value="${c}" ${c===o?"selected":""}>${c}</option>`).join("")}
|
|
324
324
|
</select>
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
327
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Jt=class{constructor(){this.typeDetector=new Ft,this.imageRenderer=new Ut,this.colorRenderer=new Gt,this.numberRenderer=new qt,this.textRenderer=new Vt,this.booleanRenderer=new Yt,this.arrayRenderer=new Wt,this.objectRenderer=new Kt(this),this.selectRenderer=new Xt}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,r=n==null?void 0:n.schemas;if(!r)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=r instanceof Map?r.get(o):r==null?void 0:r[o];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,s)=>r.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),s=r==="logic"||r==="logic_id"||r==="logicid",o=r==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};var qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=r(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}ot({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Zt=class{constructor(){this.updateManager=new qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let s=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(r=o==null?void 0:o.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async n=>{var o;let r=(o=n.target.files)==null?void 0:o[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let s=new FileReader;s.onload=async()=>{var c,p,d;let l=s.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),f=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",m,"to category:",f);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:f,filename:`${m}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(f,`${m}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(L){console.warn("[QuickActionsBar] Setup-library not available:",L)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let w=window.__debugContext;(d=(p=w==null?void 0:w.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let S=window.__highlightLibrarySlot;typeof S=="function"&&setTimeout(()=>{S(e,f)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},s.readAsDataURL(r)},i.click()}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],r=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Qr(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Qt=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Jt,this.updateManager=new qe,this.quickActions=new Zt,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
327
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Jt=class{constructor(){this.typeDetector=new Ft,this.imageRenderer=new Ut,this.colorRenderer=new Gt,this.numberRenderer=new qt,this.textRenderer=new Vt,this.booleanRenderer=new Yt,this.arrayRenderer=new Wt,this.objectRenderer=new Kt(this),this.selectRenderer=new Xt}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,r=n==null?void 0:n.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};var qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=r(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}st({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Zt=class{constructor(){this.updateManager=new qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async n=>{var s;let r=(s=n.target.files)==null?void 0:s[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let o=new FileReader;o.onload=async()=>{var c,p,d;let l=o.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),f=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",m,"to category:",f);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:f,filename:`${m}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(f,`${m}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(L){console.warn("[QuickActionsBar] Setup-library not available:",L)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let w=window.__debugContext;(d=(p=w==null?void 0:w.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let S=window.__highlightLibrarySlot;typeof S=="function"&&setTimeout(()=>{S(e,f)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},o.readAsDataURL(r)},i.click()}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],r=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Qr(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Qt=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Jt,this.updateManager=new qe,this.quickActions=new Zt,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
328
328
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector" style="right:16px; top:72px;">
|
|
329
329
|
<div class="scene-panel-header" data-panel-handle>
|
|
330
330
|
<div class="panel-title">
|
|
@@ -345,22 +345,22 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
345
345
|
</div>
|
|
346
346
|
</div>
|
|
347
347
|
</div>
|
|
348
|
-
`}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){this.showError("Object not found");return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},r=n.id||e,
|
|
348
|
+
`}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){this.showError("Object not found");return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},r=n.id||e,o=n.category||"unknown";i.push(`
|
|
349
349
|
<div class="inspector-header">
|
|
350
350
|
<div class="inspector-header-info">
|
|
351
351
|
<div class="inspector-object-name">${r}</div>
|
|
352
|
-
<div class="inspector-object-category">${
|
|
352
|
+
<div class="inspector-object-category">${o}</div>
|
|
353
353
|
</div>
|
|
354
354
|
${this.renderConversionButtons(e,t)}
|
|
355
355
|
</div>
|
|
356
|
-
`);let
|
|
356
|
+
`);let s=["ui","transform","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of s){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!s.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners()}renderConversionButtons(e,t){var s,l,c,p;let i=!!t.ui,n=((s=t.ui)==null?void 0:s.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let o=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
|
|
357
357
|
<div class="inspector-quick-actions">
|
|
358
358
|
<button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
|
|
359
359
|
\u2728 Convert to PNG
|
|
360
360
|
</button>
|
|
361
361
|
<div class="inspector-convert-menu hidden" data-convert-menu>
|
|
362
362
|
<button class="debug-btn debug-btn-sm" data-action="library" data-path="render.asset.path" data-object="${e}">\u{1F3A8} Library</button>
|
|
363
|
-
<button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${
|
|
363
|
+
<button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${o}" data-object="${e}">\u2728 AI</button>
|
|
364
364
|
<button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
|
|
365
365
|
</div>
|
|
366
366
|
</div>
|
|
@@ -374,7 +374,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
374
374
|
<button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
|
|
375
375
|
</div>
|
|
376
376
|
</div>
|
|
377
|
-
`}renderSection(e,t,i,n){let r=[],
|
|
377
|
+
`}renderSection(e,t,i,n){let r=[],o=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let s in i){if(!this.showAdvanced&&o.includes(s))continue;let l=i[s],c=`${n}.${s}`,p=this.rendererRegistry.renderProperty(e,s,l,c);p&&r.push(p)}return r.length===0?"":`
|
|
378
378
|
<div class="inspector-section" data-section="${t}">
|
|
379
379
|
<div class="inspector-section-header" data-section-toggle="${t}">
|
|
380
380
|
<span class="inspector-section-arrow">\u25BC</span>
|
|
@@ -385,7 +385,7 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
385
385
|
${r.join("")}
|
|
386
386
|
</div>
|
|
387
387
|
</div>
|
|
388
|
-
`}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Qr((g,f,h)=>{var m,b;this.updateManager.updateProperty(g,f,h),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,f,h)},300);e.forEach(g=>{let f=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let S=b.value;if(b.type==="checkbox")S=b.checked;else if(b.type==="number"&&(S=parseFloat(b.value),isNaN(S)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,S):(this.updateManager.updateProperty(v,y,S),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,S))}},h=g.dataset.propertyPath;h==="logic.id"||h!=null&&h.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",h),g.addEventListener("change",async m=>{var
|
|
388
|
+
`}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Qr((g,f,h)=>{var m,b;this.updateManager.updateProperty(g,f,h),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,f,h)},300);e.forEach(g=>{let f=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let S=b.value;if(b.type==="checkbox")S=b.checked;else if(b.type==="number"&&(S=parseFloat(b.value),isNaN(S)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,S):(this.updateManager.updateProperty(v,y,S),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,S))}},h=g.dataset.propertyPath;h==="logic.id"||h!=null&&h.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",h),g.addEventListener("change",async m=>{var I;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,S=(I=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:I[x],L=this.getDefaultPropsForLogic(x,S);console.log("[Inspector v1.0.0] New logic default props:",L);let P=y.replace(".id",".props");await this.updateManager.updateProperty(v,P,L),console.log("[Inspector v1.0.0] Logic props updated to:",L),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",f),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",f))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",f=>{let h=f.target,m=h.dataset.action,b=h.dataset.path,y=h.dataset.object;m&&b&&y&&this.quickActions.handleAction(m,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",f=>{var b,y;let h=f.target,m=h.dataset.sectionToggle||((b=h.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(m){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${m}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let o=(p=this.root)==null?void 0:p.querySelector("[data-convert-toggle]");o==null||o.addEventListener("click",()=>{var f;let g=(f=this.root)==null?void 0:f.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let s=(d=this.contentContainer)==null?void 0:d.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");s==null||s.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}let r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=i.render)==null?void 0:r.asset)==null?void 0:o.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
389
389
|
<div class="inspector-empty">
|
|
390
390
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
391
391
|
<span class="inspector-empty-text">${e}</span>
|
|
@@ -395,11 +395,11 @@ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./c
|
|
|
395
395
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
396
396
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
397
397
|
</div>
|
|
398
|
-
`)}};import*as Wa from"jszip";function Gi(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function za(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function $a(a){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=a})}async function ei(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Gi(n),
|
|
398
|
+
`)}};import*as Wa from"jszip";function Gi(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function za(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function $a(a){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=a})}async function ei(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Gi(n),o=await $a(r),s=za(r);return console.log("[ImageUtils] Success resolution:",o==null?void 0:o.width,"x",o==null?void 0:o.height,"mime:",s.mimeType),{base64:s.base64,mimeType:s.mimeType,dataUrl:r,width:(e=o==null?void 0:o.width)!=null?e:0,height:(t=o==null?void 0:o.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Te(a){var e,t;try{let i=await Gi(a),n=await $a(i),r=za(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function qi(a){return Gi(a).then(e=>e).catch(()=>null)}function Vi(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(n),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function Ve(a,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=a}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],g=o[d+1],f=o[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function Ha(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function fe(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function Ba(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function eo(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?Ba((r=t.split("/").pop())!=null?r:t):void 0}function to(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(fe(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(n=W(e.id))!=null?n:a,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Yi(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let o of a){if(typeof o=="string"){let s=Ba((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(fe(o)){let s=eo(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(n=W(o.role))!=null?n:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(fe(a)){let r=[];for(let[o,s]of Object.entries(a)){let l=to(o,s,e);l&&r.push(l)}return r}return[]}function io(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function no(a){if(fe(a.brand_dna)&&fe(a.brand_dna.colors))return a.brand_dna;if(fe(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),fe(a.fonts)&&(e.fonts=a.fonts),e}}function ao(a){var t;let e=new Map;for(let i of a){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Wi(a,e={}){var o,s,l;let t=a.filter(fe),i=(s=(o=t.map(io).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(no).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Yi(c.layers,"visual element")),"assets"in c&&r.push(...Yi(c.assets,"visual element")),fe(c.endgame)&&"assets"in c.endgame&&r.push(...Yi(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:ao(r)}}import{GoogleGenAI as ro}from"@google/genai";async function ti(a,e,t=[],i={}){var n,r,o,s,l,c,p;try{if(!(a!=null&&a.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let d=new ro({apiKey:a}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:g}),h="",m=(o=(r=(n=f.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:o.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(s=d.message)!=null&&s.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}import{GoogleGenAI as oo}from"@google/genai";async function Ye(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new oo({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Na(a){let e=a.brandAssets.map(r=>{let o=`- ${r.id}: ${r.role}`;return r.layout&&(o+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),o}).join(`
|
|
399
399
|
`)||"None",t=a.brandDna?`Colors: ${JSON.stringify(a.brandDna.colors)}, Style: ${a.brandDna.style||"not specified"}`:"Not provided",i=a.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
|
|
400
|
-
`),n="";if(a.brandConfig){let r=a.brandConfig,
|
|
400
|
+
`),n="";if(a.brandConfig){let r=a.brandConfig,o=[];r.splash&&o.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&o.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&o.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),o.length>0&&(n=`
|
|
401
401
|
BRAND CONTENT:
|
|
402
|
-
${
|
|
402
|
+
${o.join(`
|
|
403
403
|
`)}
|
|
404
404
|
`)}return`
|
|
405
405
|
You are analyzing a brand's visual design for use in a playable ad game.
|
|
@@ -480,7 +480,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
480
480
|
|
|
481
481
|
OUTPUT:
|
|
482
482
|
Generate the requested asset matching the brand style.${a.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
483
|
-
`.trim()}function Ua(a){return a.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Ga(a,e){return!(a.includes("background")&&(a.includes("_1")||a.includes("splash")||a.includes("endgame")||a.includes("main"))||e==="text"||e==="effects"&&a.includes("particle"))}async function qa(a){var s
|
|
483
|
+
`.trim()}function Ua(a){return a.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Ga(a,e){return!(a.includes("background")&&(a.includes("_1")||a.includes("splash")||a.includes("endgame")||a.includes("main"))||e==="text"||e==="effects"&&a.includes("particle"))}async function qa(a){var o,s;let e=Ua(a.gameObjects),t={gamePrompt:a.gamePrompt,gameObjects:e,brandAssets:a.manifest.assets,brandDna:a.manifest.brand_dna,brandName:a.manifest.brand_name},i=Na(t),n=[];if(a.flatDesignDataUrl)try{let l=Va(a.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let r;try{r=await ti(a.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(o=l.message)!=null&&o.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(s=l.message)!=null&&s.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return so(r,a.gameObjects)}function so(a,e){try{let t=a,i=a.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=a.match(/\{[\s\S]*\}/);r&&(t=r[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:a,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:a,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:a,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Ki(a,e,t={}){var n;let i=e.mappings.filter(r=>r.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let r=0;r<i.length;r++){let o=i[r];(n=t.onProgress)==null||n.call(t,r+1,i.length,o.game_object);try{let s=await lo(a,o);o.output_dataUrl=s,o.status="Generated \u2713"}catch(s){console.error(`[Pipeline] Failed to generate ${o.game_object}:`,s),o.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function lo(a,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&a.manifest){let s=a.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=a.assetFiles.get(s.file);if(l){let c=await Te(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(a.flatDesignDataUrl){let s=Va(a.flatDesignDataUrl);s&&t.push(s)}let i=Ga(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:a.manifest.brand_dna,needsTransparency:i},r=Fa(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await Ye(a.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Ve(o)||o}function Va(a){let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ya(a,e){let t=a.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,r])=>({id:n,file:String(r),role:"visual element"})):i=[],a.assets=i;for(let n of i){let r=e.get(n.file);if(r){let o=await Te(r);o&&(n.dataUrl=o.dataUrl)}}}var ii=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
|
|
484
484
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
485
485
|
<div class="scene-panel-header" data-panel-handle>
|
|
486
486
|
<div class="panel-title">
|
|
@@ -596,15 +596,15 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
596
596
|
</div>
|
|
597
597
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
598
598
|
</div>
|
|
599
|
-
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,s,
|
|
600
|
-
\u{1F3F7}\uFE0F Brand: ${((
|
|
601
|
-
`:l.brand_dna||l.colors?n+=`\u2705 Brand: ${
|
|
602
|
-
`:n+=`\u2705 Loaded: ${
|
|
603
|
-
`}catch{n+=`\u274C Error in ${
|
|
604
|
-
`}try{this.normalizedManifest=Wi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let
|
|
605
|
-
\u{1F4E6} Normalized manifest: ${
|
|
606
|
-
\u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:
|
|
607
|
-
\u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,
|
|
599
|
+
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,o,s,l,c,p,d,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",h=>{this.handleZipUpload(h)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await Wa.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Wi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of r){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
|
|
600
|
+
\u{1F3F7}\uFE0F Brand: ${((s=this.normalizedManifest)==null?void 0:s.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let r=n.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},n.onerror=r=>{console.error("FileReader error:",r),i(r)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let r of e){let o=r.category||"misc";n[o]||(n[o]=[]),i.libraryAssets[o]||(i.libraryAssets[o]=[]),i.libraryAssets[o].some(l=>l.filename===r.filename)||(i.libraryAssets[o].unshift({filename:r.filename,displayName:r.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${r.filename} to registry category ${o}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let s=await o.text(),l=JSON.parse(s);this.uploadedJsons.set(o.name,l),l.layers?n+=`\u2705 Layers: ${o.name}
|
|
601
|
+
`:l.brand_dna||l.colors?n+=`\u2705 Brand: ${o.name}
|
|
602
|
+
`:n+=`\u2705 Loaded: ${o.name}
|
|
603
|
+
`}catch{n+=`\u274C Error in ${o.name}
|
|
604
|
+
`}try{this.normalizedManifest=Wi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
|
|
605
|
+
\u{1F4E6} Normalized manifest: ${o} assets`,n+=`
|
|
606
|
+
\u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:o,brandName:this.normalizedManifest.brand_name})}catch(o){console.error("[BrandVision] Failed to normalize manifest:",o),this.normalizedManifest=null,n+=`
|
|
607
|
+
\u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,o;let i=(r=e.target.files)==null?void 0:r[0];if(!i)return;let n=await Te(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let s=(o=this.root)==null?void 0:o.querySelector("[data-vision-flat-preview]");s&&(s.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,r,o,s,l,c;if(this.isAnalyzing)return;let e=(r=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:r.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Ya(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await qa(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(o=d.parseError)!=null?o:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(s=this.mappingResult)==null?void 0:s.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Ki(r,this.mappingResult,{onProgress:(o,s,l)=>{this.setStatus("apply",`Generating ${o}/${s}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var s;let e=(s=this.root)==null?void 0:s.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),o=n?`
|
|
608
608
|
<div class="vision-raw-block">
|
|
609
609
|
<div class="inspector-text-sm" style="white-space: pre-wrap;">
|
|
610
610
|
\u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
|
|
@@ -613,7 +613,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
613
613
|
<textarea class="inspector-input vision-raw-textarea" readonly>${this.analysisRawResponse||""}</textarea>
|
|
614
614
|
</div>
|
|
615
615
|
`:"";e.innerHTML=`
|
|
616
|
-
${
|
|
616
|
+
${o}
|
|
617
617
|
${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!f,m=`
|
|
618
618
|
<select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
|
|
619
619
|
<option value="">Select brand asset\u2026</option>
|
|
@@ -666,8 +666,8 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
666
666
|
</div>
|
|
667
667
|
</div>
|
|
668
668
|
`}).join("")}
|
|
669
|
-
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,r=this.getPreviewValueForMapping(n);if(!r.value)continue;let
|
|
670
|
-
`)}var
|
|
669
|
+
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,r=this.getPreviewValueForMapping(n);if(!r.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,r.value):r.value;o&&(await this.stageEngineAssetOverride(n,o),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(r=>r.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(r=this.mappingResult)==null?void 0:r.mappings.find(o=>o.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,r,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,r,o;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(o=(r=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:o.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let s={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Ki(s,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(s){console.error("[BrandVision] generateOne failed:",s),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let o=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(o!=null&&o.success)||!(o!=null&&o.path))return console.error("[BrandVision] Save to library failed:",(o==null?void 0:o.error)||o),null;let s=window.addAssetToRegistry;typeof s=="function"&&s(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(o.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let o=n.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let r=n==null?void 0:n.categories;if(Array.isArray(r)&&r.length>0){let o=e.toLowerCase(),s=l=>r.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||r[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||r[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var r;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(r=this.root)==null?void 0:r.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,r=s=>{let l=Math.max(300,n+(s.clientX-i));this.root.style.width=`${l}px`},o=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",o)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",o)})}refresh(){}};function Ka(a,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${a}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
670
|
+
`)}var co=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],po=["cta_hint","cta_label_end"],Xa=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],uo=["brand.primary","brand.heading","brand.body","brand.warning"],ni=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
|
|
671
671
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
672
672
|
<div class="scene-panel-header" data-panel-handle>
|
|
673
673
|
<div class="panel-title">
|
|
@@ -725,17 +725,17 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
725
725
|
</div>
|
|
726
726
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
727
727
|
</div>
|
|
728
|
-
`}initialize(e,t){var n,r,s,
|
|
728
|
+
`}initialize(e,t){var n,r,o,s,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-colors]"),this.fontsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-fonts]"),this.textsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let r of n){let o=t(r);o&&(o.ui||(o.ui={}),o.ui.renderMode=e?"png":"text",e&&(o.render||(o.render={}),o.render.asset||(o.render.asset={type:"image",path:""}),o.render.asset.type="image"),i(r,o))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,r,o,s,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((r=(n=e.runtime)==null?void 0:n.fonts)!=null?r:{}),this.renderTexts((s=(o=e.runtime)==null?void 0:o.ui)!=null?s:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var u;let r=document.createElement("div");r.className="customize-row";let o=document.createElement("span");o.className="customize-key",o.textContent=i;let s=document.createElement("input");s.type="text",s.value=n!=null?n:"",s.className="customize-input",s.dataset.assetKey=i,s.addEventListener("input",()=>{this.handleAssetValueChange(i,s)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
|
|
729
729
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
|
730
730
|
<path d="M12 5c5.2 0 9.2 3.7 10 6.8-.8 3.1-4.8 6.8-10 6.8S2.8 14.9 2 11.8C2.8 8.7 6.8 5 12 5z" />
|
|
731
731
|
<circle cx="12" cy="12" r="3.2" />
|
|
732
732
|
</svg>
|
|
733
|
-
`,c.addEventListener("click",()=>{this.previewAsset(i,
|
|
733
|
+
`,c.addEventListener("click",()=>{this.previewAsset(i,s.value,s.dataset.assetType,d)});let p=document.createElement("button");p.type="button",p.className="customize-icon-btn",p.title="Upload asset",p.innerHTML=`
|
|
734
734
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
|
735
735
|
<path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
|
|
736
736
|
<path d="M5 14v4h14v-4h2v6H3v-6h2z" />
|
|
737
737
|
</svg>
|
|
738
|
-
`;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,
|
|
738
|
+
`;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,s,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(o),r.appendChild(s),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",co.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=i,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=i,s.className="customize-color-text",s.dataset.colorTextKey=t,o.addEventListener("input",()=>{s.value=o.value}),s.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(s.value)&&(o.value=s.value)}),n.appendChild(r),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",uo.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=e==null?void 0:e[t])!=null?o:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",po.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.readUiValue(e,t))!=null?o:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(s=this.textsContainer)==null||s.appendChild(i)}),Xa.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let o=document.createElement("input");o.type="text",o.value=(s=this.getObjectTextValue(i))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,n.appendChild(r),n.appendChild(o),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=i.replace("_"," ");let o=document.createElement("input");o.type=i.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[i])!=null?s:""),o.className="customize-input",o.dataset.audioKey=i,i.includes("file")&&(o.placeholder="audio file path"),n.appendChild(r),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let o of n){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),o=n;for(let s of r){if(o==null)return null;o=o[s]}return typeof o=="string"?o:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(s=>{let l=s;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(s=>{let l=s,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(s=>{let l=s,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(r[c]=l.value)});let o={};this.root.querySelectorAll("[data-audio-key]").forEach(s=>{let l=s,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);o[c]=isNaN(p)?0:p}else o[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(s=>{let l=s,c=l.dataset.objectTextKey;if(!c)return;let p=Xa.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:r,fonts:n,audio:o}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await ei(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,r,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(r=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=i==null?void 0:i.dataUrl)!=null?o:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(r.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(r),n.appendChild(s),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var o,s;let i=t,n=i.dataset.assetKey,r=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var s,l,c,p,d,u,g,f,h,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
|
|
739
739
|
<div class="ai-modal-card">
|
|
740
740
|
<div class="ai-modal-header">
|
|
741
741
|
<div>
|
|
@@ -806,7 +806,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
806
806
|
</div>
|
|
807
807
|
</div>
|
|
808
808
|
</div>
|
|
809
|
-
`;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,f,h,m,b,y,v,x,w,S,L,k,O,j,P,E,C;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=n,s=n,o=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((S=l==null?void 0:l.value)==null?void 0:S.trim())||((L=this.aiBaseValue)==null?void 0:L.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let A=null,_=(k=this.getSelectedAssetKey())!=null?k:"unknown",I=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let V=Vi(this.aiOutputDataUrl,"ai-output.png");if(V){let Y=await Te(V);Y&&(A={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(A||(A=await this.getImageDataFromAsset(c)),!A){this.setAiStatus("Unable to load the base image.");return}let D=[A.input],T=!1;if(this.aiReferenceFile){let V=await Te(this.aiReferenceFile);V?(D.push({base64:V.base64,mimeType:V.mimeType}),T=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let M=Ka(i,{includeReference:T,includeMagenta:r,changeLevel:o}),H=(E=(P=this.aiReferenceFile)==null?void 0:P.name)!=null?E:"none";console.info("[AI] Final prompt:",M),console.info("[AI] Image sources:",{assetKey:_,base:I,reference:H});let Q=Ha(A.width,A.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await Ye(e,M,D,{aspectRatio:Q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((C=this.aiStatusEl)==null?void 0:C.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,s,o;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Ve(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&s)console.log("[CustomizePanel] Applying AI output directly to object:",r,s),this.applyObjectPropertyValue(r,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(m){console.warn("[CustomizePanel] Setup-library endpoint not available:",m)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let m=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof m=="function"&&b){let y=this.getFilenameFromPath(c.path);await m(u,y,n)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,n),setTimeout(()=>{h(u,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(s=>s.currentAsset===e||s.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Vi(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let s=await qi(r);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let s=await qi(r);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(f,v,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
809
|
+
`;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,f,h,m,b,y,v,x,w,S,L,P,I,j,k,E,C;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=n,o=n,s=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((S=l==null?void 0:l.value)==null?void 0:S.trim())||((L=this.aiBaseValue)==null?void 0:L.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let A=null,_=(P=this.getSelectedAssetKey())!=null?P:"unknown",O=(I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let V=Vi(this.aiOutputDataUrl,"ai-output.png");if(V){let Y=await Te(V);Y&&(A={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(A||(A=await this.getImageDataFromAsset(c)),!A){this.setAiStatus("Unable to load the base image.");return}let D=[A.input],T=!1;if(this.aiReferenceFile){let V=await Te(this.aiReferenceFile);V?(D.push({base64:V.base64,mimeType:V.mimeType}),T=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let M=Ka(i,{includeReference:T,includeMagenta:r,changeLevel:s}),H=(E=(k=this.aiReferenceFile)==null?void 0:k.name)!=null?E:"none";console.info("[AI] Final prompt:",M),console.info("[AI] Image sources:",{assetKey:_,base:O,reference:H});let Q=Ha(A.width,A.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await Ye(e,M,D,{aspectRatio:Q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((C=this.aiStatusEl)==null?void 0:C.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Ve(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(m){console.warn("[CustomizePanel] Setup-library endpoint not available:",m)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((s=f.dataset.assetKey)!=null?s:"",f)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let m=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof m=="function"&&b){let y=this.getFilenameFromPath(c.path);await m(u,y,n)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,n),setTimeout(()=>{h(u,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Vi(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let o=await qi(r);o&&this.setAiOutput(o)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let o=await qi(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(f,v,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
810
810
|
<div class="asset-preview-card">
|
|
811
811
|
<div class="asset-preview-header">
|
|
812
812
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -822,7 +822,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
822
822
|
<img class="asset-preview-ai-image" alt="AI output preview">
|
|
823
823
|
</div>
|
|
824
824
|
</div>
|
|
825
|
-
`;let
|
|
825
|
+
`;let o=r.querySelector(".asset-preview-body"),s=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(s==null||s.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=r=>{var u,g;r.preventDefault();let o=r.clientX,s=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=f=>{let h=f.clientX-o,m=Math.min(c,Math.max(l,s+h));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var h,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,r=URL.createObjectURL(e),o=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(o!=null&&o.naturalWidth)||!(o!=null&&o.naturalHeight))return null;let s=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
|
|
826
826
|
<div class="asset-crop-card" style="width:${p}px;">
|
|
827
827
|
<div class="asset-crop-header">
|
|
828
828
|
<div>
|
|
@@ -852,7 +852,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
852
852
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
853
853
|
</div>
|
|
854
854
|
</div>
|
|
855
|
-
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),S=c.querySelector(".asset-crop-close"),L=c.querySelector(".asset-crop-cancel"),
|
|
855
|
+
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),S=c.querySelector(".asset-crop-close"),L=c.querySelector(".asset-crop-cancel"),P=c.querySelector(".asset-crop-apply"),I=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let j=y.getContext("2d"),k=v.getContext("2d");if(!j||!k){l(null);return}let E=o.naturalWidth,C=o.naturalHeight,A=Math.max(y.width/E,y.height/C),_=1,O=0,D=0,T=!1,M=0,H=0,Q=0,B=0,V=()=>{let z=A*_,oe=Math.max(0,(E*z-y.width)/2),ue=Math.max(0,(C*z-y.height)/2);O=Math.min(oe,Math.max(-oe,O)),D=Math.min(ue,Math.max(-ue,D))},Y=()=>{let z=A*_;j.clearRect(0,0,y.width,y.height);let oe=y.width/2-E*z/2+O,ue=y.height/2-C*z/2+D;if(j.drawImage(o,oe,ue,E*z,C*z),k.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let he=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),Be=v.width/2-s.naturalWidth*he/2,Ae=v.height/2-s.naturalHeight*he/2;k.drawImage(s,Be,Ae,s.naturalWidth*he,s.naturalHeight*he)}else k.fillStyle="rgba(255, 255, 255, 0.04)",k.fillRect(0,0,v.width,v.height),k.strokeStyle="rgba(255, 255, 255, 0.08)",k.strokeRect(4,4,v.width-8,v.height-8);let Ee=v.width/y.width*(A*_),ge=O*(v.width/y.width),Me=D*(v.height/y.height),$e=v.width/2-E*Ee/2+ge,He=v.height/2-C*Ee/2+Me;k.save(),k.globalAlpha=.7,k.drawImage(o,$e,He,E*Ee,C*Ee),k.restore()},X=()=>{O=0,D=0,V(),Y()};x.addEventListener("input",()=>{_=Number(x.value),w.textContent=`${_.toFixed(2)}\xD7`,V(),Y()}),y.addEventListener("pointerdown",z=>{T=!0,M=z.clientX,H=z.clientY,Q=O,B=D,y.setPointerCapture(z.pointerId)}),y.addEventListener("pointermove",z=>{T&&(O=Q+(z.clientX-M),D=B+(z.clientY-H),V(),Y())}),y.addEventListener("pointerup",z=>{T=!1,y.releasePointerCapture(z.pointerId)}),y.addEventListener("pointerleave",()=>{T=!1});let we=()=>{c.remove()},ze=()=>{we(),l(null)},Lt=async()=>{let z=document.createElement("canvas");z.width=t.width,z.height=t.height;let oe=z.getContext("2d");if(!oe){we(),l(null);return}let ue=_,ge=Math.max(z.width/E,z.height/C)*ue,Me=z.width/y.width,$e=O*Me,He=D*Me,he=z.width/2-E*ge/2+$e,Be=z.height/2-C*ge/2+He;oe.drawImage(o,he,Be,E*ge,C*ge);let Ae=await new Promise(kt=>{z.toBlob(Pt=>kt(Pt),e.type||"image/png")});if(we(),!Ae){l(null);return}l(new File([Ae],e.name,{type:Ae.type}))};S==null||S.addEventListener("click",ze),L==null||L.addEventListener("click",ze),I==null||I.addEventListener("click",X),P==null||P.addEventListener("click",()=>{Lt()}),c.addEventListener("click",z=>{z.target===c&&ze()}),document.body.appendChild(c),X()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var ai=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
856
856
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
857
857
|
<div class="scene-panel-header" data-panel-handle>
|
|
858
858
|
<div class="panel-title">
|
|
@@ -918,10 +918,10 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
918
918
|
</div>
|
|
919
919
|
</div>
|
|
920
920
|
</div>
|
|
921
|
-
`}initialize(e,t){var y,v,x,w,S,L,k,O,j,P,E,C,A,_,I,D;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var M;let T=window.getEditableEngineConfig;if(typeof T=="function"){let H=T();return(M=H==null?void 0:H.loading)!=null?M:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{type:r.value}),this.updateFieldVisibility(r.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{background_color:s.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((S=n.overlay_alpha)!=null?S:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var M,H;let T=Number(o.value);l&&(l.textContent=T.toFixed(2)),(H=(M=this.options)==null?void 0:M.onUpdateLoading)==null||H.call(M,{overlay_alpha:T})}));let c=(L=this.root)==null?void 0:L.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{text:c.value})}));let p=(k=this.root)==null?void 0:k.querySelector("#loading-text-scale"),d=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");p&&(p.value=String((j=n.text_scale)!=null?j:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var M,H;let T=Number(p.value);d&&(d.textContent=T.toFixed(2)),(H=(M=this.options)==null?void 0:M.onUpdateLoading)==null||H.call(M,{text_scale:T})}));let u=(P=this.root)==null?void 0:P.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{blur_enabled:g.checked})}));let f=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength"),h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");f&&(f.value=String((_=n.blur_strength)!=null?_:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var T,M;h&&(h.textContent=f.value),(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{blur_strength:Number(f.value)})}));let m=(I=this.root)==null?void 0:I.querySelector("#loading-show-btn"),b=(D=this.root)==null?void 0:D.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onShowLoadingScreen)==null||M.call(T)}),b==null||b.addEventListener("click",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onHideLoadingScreen)==null||M.call(T)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as ri}from"pixi.js";async function Ja(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",o);let l=await ri.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)le[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Za(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,s=typeof r=="function"?r():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await ri.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)le[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Qa(a,e,t,i){var n,r,s,o,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let S=await ri.load(w);if(!S){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),le[v]=S,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let L=window.CustomAssets;L!=null&&L[v]&&(L[v].texture=S,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let k=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!k),k){let j=Array.from(((n=k.keys)==null?void 0:n.call(k))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",j);let P=k.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!P),P){let E=((r=P.getDisplayObject)==null?void 0:r.call(P))||P.pixiObject||P.pixi||P,C=(s=E==null?void 0:E.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",C),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=S,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(C==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:A}=await import("pixi.js"),_=E.parent,I=(l=(o=_==null?void 0:_.getChildIndex)==null?void 0:o.call(_,E))!=null?l:0,D={x:E.x,y:E.y},T={x:(p=(c=E.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=E.anchor)==null?void 0:d.y)!=null?u:.5},M={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},H=(b=E.alpha)!=null?b:1,Q=(y=E.visible)!=null?y:!0,B=new A(S);B.anchor.set(T.x,T.y),B.position.set(D.x,D.y),B.scale.set(M.x,M.y),B.alpha=H,B.visible=Q,_&&(_.removeChild(E),_.addChildAt(B,I),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),P.pixiObject&&(P.pixiObject=B),P.pixi&&(P.pixi=B),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let A=E.children.find(_=>_.texture);A?(A.texture=S,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${i}/${t}`;ot({objectId:v,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",O)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function er(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await ri.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}le[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}ot({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}import{Graphics as rr,Point as us}from"pixi.js";import{Point as tr}from"pixi.js";var Le=()=>window.debugConfig||{},ir=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),nr=()=>window.resolveScreenAnchorPoint||(()=>new tr),ar=()=>window.resolveScreenRatioPoint||(()=>new tr);function sr(a){si(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>oi(a))))}function or(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),pt(a)}function si(a){return a.isDebugOpen}function oi(a){var r,s,o;if(!si(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>oi(a));let e=Xi(a);if(!e){dt(a,null),pt(a);return}let t=Ji(a,e);if(!t){dt(a,null),pt(a);return}let i=new us;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Zi(a,t);dt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),a.highlightObject?nn(a,t):rn(a),a.highlightAnchor&&n?an(a,n):sn(a)}function Xi(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Ji(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function ut(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Zi(a,e){var s,o;let t=ut(a);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=Qi(a);if(!n)return null;if(i.position_ratio!=null)return ar()(n.width,n.height,i.position_ratio);let r=(o=i.anchor)!=null?o:"center";return nr()(n.width,n.height,r)}function Qi(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function en(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new rr,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function tn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new rr,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function nn(a,e){var n;let t=en(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function an(a,e){let t=tn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function rn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function sn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function dt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function lr(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function cr(a,e,t){var s;let i=e.split("."),n=i.pop(),r=a;for(let o of i)r[o]=(s=r[o])!=null?s:{},r=r[o];r[n]=t}function on(a){var i,n,r,s,o;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((o=(s=a.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function ci(a){let e=Le();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function dr(a){window.location.reload()}function di(a){let e=JSON.stringify(Le(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function pr(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,s=typeof r=="function"?r(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-VESWPZAY.js"),d=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),li(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),li(a,s),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function li(a,e){var d,u,g,f,h,m,b,y,v,x;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),s=a.container.querySelector("#config-anchor-y"),l=on(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=ir()(c);r&&(r.value=String(p.x)),s&&(s.value=String(p.y))}function ur(a){var l,c,p,d,u,g,f,h,m,b;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
|
|
921
|
+
`}initialize(e,t){var y,v,x,w,S,L,P,I,j,k,E,C,A,_,O,D;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var M;let T=window.getEditableEngineConfig;if(typeof T=="function"){let H=T();return(M=H==null?void 0:H.loading)!=null?M:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{background_color:o.value})}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((S=n.overlay_alpha)!=null?S:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var M,H;let T=Number(s.value);l&&(l.textContent=T.toFixed(2)),(H=(M=this.options)==null?void 0:M.onUpdateLoading)==null||H.call(M,{overlay_alpha:T})}));let c=(L=this.root)==null?void 0:L.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{text:c.value})}));let p=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale"),d=(I=this.root)==null?void 0:I.querySelector("#loading-text-scale-value");p&&(p.value=String((j=n.text_scale)!=null?j:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var M,H;let T=Number(p.value);d&&(d.textContent=T.toFixed(2)),(H=(M=this.options)==null?void 0:M.onUpdateLoading)==null||H.call(M,{text_scale:T})}));let u=(k=this.root)==null?void 0:k.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{blur_enabled:g.checked})}));let f=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength"),h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");f&&(f.value=String((_=n.blur_strength)!=null?_:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var T,M;h&&(h.textContent=f.value),(M=(T=this.options)==null?void 0:T.onUpdateLoading)==null||M.call(T,{blur_strength:Number(f.value)})}));let m=(O=this.root)==null?void 0:O.querySelector("#loading-show-btn"),b=(D=this.root)==null?void 0:D.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onShowLoadingScreen)==null||M.call(T)}),b==null||b.addEventListener("click",()=>{var T,M;(M=(T=this.options)==null?void 0:T.onHideLoadingScreen)==null||M.call(T)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as ri}from"pixi.js";async function Ja(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await ri.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)le[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Za(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(m=>m.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await ri.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)le[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Qa(a,e,t,i){var n,r,o,s,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let S=await ri.load(w);if(!S){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),le[v]=S,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let L=window.CustomAssets;L!=null&&L[v]&&(L[v].texture=S,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let P=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!P),P){let j=Array.from(((n=P.keys)==null?void 0:n.call(P))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",j);let k=P.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!k),k){let E=((r=k.getDisplayObject)==null?void 0:r.call(k))||k.pixiObject||k.pixi||k,C=(o=E==null?void 0:E.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",C),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=S,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(C==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:A}=await import("pixi.js"),_=E.parent,O=(l=(s=_==null?void 0:_.getChildIndex)==null?void 0:s.call(_,E))!=null?l:0,D={x:E.x,y:E.y},T={x:(p=(c=E.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=E.anchor)==null?void 0:d.y)!=null?u:.5},M={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},H=(b=E.alpha)!=null?b:1,Q=(y=E.visible)!=null?y:!0,B=new A(S);B.anchor.set(T.x,T.y),B.position.set(D.x,D.y),B.scale.set(M.x,M.y),B.alpha=H,B.visible=Q,_&&(_.removeChild(E),_.addChildAt(B,O),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),k.pixiObject&&(k.pixiObject=B),k.pixi&&(k.pixi=B),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let A=E.children.find(_=>_.texture);A?(A.texture=S,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let I=`raw/library/${i}/${t}`;st({objectId:v,path:"render.asset.path",value:I}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",I)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function er(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await ri.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}le[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}st({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}import{Graphics as rr,Point as go}from"pixi.js";import{Point as tr}from"pixi.js";var Le=()=>window.debugConfig||{},ir=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),nr=()=>window.resolveScreenAnchorPoint||(()=>new tr),ar=()=>window.resolveScreenRatioPoint||(()=>new tr);function or(a){oi(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>si(a))))}function sr(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),pt(a)}function oi(a){return a.isDebugOpen}function si(a){var r,o,s;if(!oi(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>si(a));let e=Xi(a);if(!e){dt(a,null),pt(a);return}let t=Ji(a,e);if(!t){dt(a,null),pt(a);return}let i=new go;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Zi(a,t);dt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),a.highlightObject?nn(a,t):rn(a),a.highlightAnchor&&n?an(a,n):on(a)}function Xi(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Ji(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function ut(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Zi(a,e){var o,s;let t=ut(a);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Qi(a);if(!n)return null;if(i.position_ratio!=null)return ar()(n.width,n.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return nr()(n.width,n.height,r)}function Qi(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function en(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new rr,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function tn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new rr,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function nn(a,e){var n;let t=en(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function an(a,e){let t=tn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function rn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function on(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function dt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function lr(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function cr(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[n]=t}function sn(a){var i,n,r,o,s;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=a.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function ci(a){let e=Le();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function dr(a){window.location.reload()}function di(a){let e=JSON.stringify(Le(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function pr(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await import("./config-VESWPZAY.js"),d=(((t=(await s("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),li(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),li(a,o),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function li(a,e){var d,u,g,f,h,m,b,y,v,x;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),o=a.container.querySelector("#config-anchor-y"),l=sn(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=ir()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function ur(a){var l,c,p,d,u,g,f,h,m,b;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",o=(b=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",s=`${e}:
|
|
922
922
|
position: (${t}, ${i})
|
|
923
923
|
scale: ${n}
|
|
924
|
-
anchor: (${r}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function ln(a,e){var d,u,g,f,h,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),r=Number((m=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((y=(b=a.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((x=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-JLWPHR4L.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=ut(a);on(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let S=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);S?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,S)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function gr(a,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!r,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function hr(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ln(a,{silent:!0})},150))}var gs=3e3;function fr(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=0,r=0,s=0,o=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-n,g=d.clientY-r;a.style.left=`${s+u}px`,a.style.top=`${o+g}px`},p=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=a.getBoundingClientRect(),f=i.getBoundingClientRect();s=Math.max(0,g.left-f.left),o=Math.max(0,g.top-f.top);let h=g.width,m=g.height,b=f.width,y=f.height;s=Math.min(s,b-h),o=Math.min(o,y-m),n=d.clientX,r=d.clientY,a.style.left=`${s}px`,a.style.top=`${o}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++gs);let v=a.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(a.style.left="16px",a.style.top="72px",a.style.right="auto",a.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function mr(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,s=0,o=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-o,f=u.clientY-l,h=Math.max(i,r+g),m=Math.max(n,s+f);a.style.width=`${h}px`,a.style.height=`${m}px`,t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=a.getBoundingClientRect();r=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function cn(a,e){var h,m,b;let t=(b=(m=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,s=Math.max(250,Math.floor(i.width-r*2)),o=Math.max(200,Math.floor(i.height-r*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Ie(a){if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;cn(a,e);let t={activeTab:a.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function pi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),cn(a,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function br(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",cn(a,e),Ie(a))}function yr(a){var n,r,s;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=a.toggleDebug)==null||o.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=a.toggleDebug)==null?void 0:o.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>ci(a)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>di(a)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;a.activeTab=l,dn(a),Ie(a)})}),un(a,e),pn(a,e)}function dn(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function pn(a,e){ae(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ae(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ae(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ae(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ae(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ae(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ae(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ae(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ae(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Le();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),s=Le();s.layout&&(s.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function vr(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle"),i=a.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),fr(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ie(a),br(a,e)},10)})),e&&i&&mr(e,i,()=>Ie(a)),pi(a)}function un(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ae(a,e,t,i,n){let r=e.querySelector(`#${t}`),s=e.querySelector(n);if(!r||!s)return;let o=lr(Le(),i);typeof o=="number"&&(r.value=String(o),s.textContent=String(o)),r.addEventListener("input",()=>{let l=Number(r.value);s.textContent=String(l),cr(Le(),i,l)})}var ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ta(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let l of n){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never";return`
|
|
924
|
+
anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function ln(a,e){var d,u,g,f,h,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),r=Number((m=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),o=Number((y=(b=a.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((x=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await import("./ConfigOverride-JLWPHR4L.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=ut(a);sn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let S=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);S?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,S)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function gr(a,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function hr(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ln(a,{silent:!0})},150))}var ho=3e3;function fr(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=0,r=0,o=0,s=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-n,g=d.clientY-r;a.style.left=`${o+u}px`,a.style.top=`${s+g}px`},p=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=a.getBoundingClientRect(),f=i.getBoundingClientRect();o=Math.max(0,g.left-f.left),s=Math.max(0,g.top-f.top);let h=g.width,m=g.height,b=f.width,y=f.height;o=Math.min(o,b-h),s=Math.min(s,y-m),n=d.clientX,r=d.clientY,a.style.left=`${o}px`,a.style.top=`${s}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++ho);let v=a.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(a.style.left="16px",a.style.top="72px",a.style.right="auto",a.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function mr(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-s,f=u.clientY-l,h=Math.max(i,r+g),m=Math.max(n,o+f);a.style.width=`${h}px`,a.style.height=`${m}px`,t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=a.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function cn(a,e){var h,m,b;let t=(b=(m=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Oe(a){if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;cn(a,e);let t={activeTab:a.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function pi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),cn(a,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function br(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",cn(a,e),Oe(a))}function yr(a){var n,r,o;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=a.toggleDebug)==null||s.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=a.toggleDebug)==null?void 0:s.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>ci(a)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>di(a)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;a.activeTab=l,dn(a),Oe(a)})}),un(a,e),pn(a,e)}function dn(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function pn(a,e){ae(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ae(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ae(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ae(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ae(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ae(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ae(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ae(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ae(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Le();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),o=Le();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function vr(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle"),i=a.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),fr(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Oe(a),br(a,e)},10)})),e&&i&&mr(e,i,()=>Oe(a)),pi(a)}function un(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ae(a,e,t,i,n){let r=e.querySelector(`#${t}`),o=e.querySelector(n);if(!r||!o)return;let s=lr(Le(),i);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),cr(Le(),i,l)})}var ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ta(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let l of n){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never";return`
|
|
925
925
|
<div class="config-persistence-panel">
|
|
926
926
|
<div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
|
|
927
927
|
${t?`
|
|
@@ -1033,7 +1033,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1033
1033
|
<div class="persistence-footer">
|
|
1034
1034
|
<div class="footer-row">
|
|
1035
1035
|
<span class="footer-label">Last Applied:</span>
|
|
1036
|
-
<span class="footer-value">${
|
|
1036
|
+
<span class="footer-value">${s}</span>
|
|
1037
1037
|
</div>
|
|
1038
1038
|
<div class="footer-secondary-actions">
|
|
1039
1039
|
<button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"}>Reload State</button>
|
|
@@ -1050,7 +1050,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
|
|
|
1050
1050
|
</ul>
|
|
1051
1051
|
</div>
|
|
1052
1052
|
</div>
|
|
1053
|
-
`}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var p;if(!(e.getAttribute("disabled")!==null||!confirm("Create a new version snapshot? This will save all changes with backup.")))try{let d=localStorage.getItem("handler_last_version_name")||"",g=((p=prompt("Version name (e.g. v1, test_2024):",d))!=null?p:"").trim();if(!g){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",g),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ia(g),this.showSuccessNotification(),await this.loadVersionsList(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Create version failed:",d),alert(`\u274C Failed to create version: ${d.message}`),e.textContent="\u{1F4DD} CREATE NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(!(t.getAttribute("disabled")!==null||!confirm(`Update current version "${this.currentVersion}"? This will overwrite the existing version.`)))try{t.textContent="\u23F3 Updating version...",t.setAttribute("disabled","true");let p=
|
|
1053
|
+
`}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var p;if(!(e.getAttribute("disabled")!==null||!confirm("Create a new version snapshot? This will save all changes with backup.")))try{let d=localStorage.getItem("handler_last_version_name")||"",g=((p=prompt("Version name (e.g. v1, test_2024):",d))!=null?p:"").trim();if(!g){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",g),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ia(g),this.showSuccessNotification(),await this.loadVersionsList(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Create version failed:",d),alert(`\u274C Failed to create version: ${d.message}`),e.textContent="\u{1F4DD} CREATE NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(!(t.getAttribute("disabled")!==null||!confirm(`Update current version "${this.currentVersion}"? This will overwrite the existing version.`)))try{t.textContent="\u23F3 Updating version...",t.setAttribute("disabled","true");let p=It(),d={};for(let[g,f]of Object.entries(p.objects)){let h=f,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=m),d[`objects/${m}.json`]=h}p.engine&&(p.engine.runtime&&(d["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(d["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(d["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(d["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(d["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(d["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(d["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(d["engine/engine.json"]=p.engine));for(let[g,f]of Object.entries(p.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${h}.json`]=f}let u=await fetch("/api/apply-current",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:d,assets:{},hadCacheAtApply:!0})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to current version failed")}lt(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply current failed:",p),alert(`\u274C Apply to current version failed: ${p.message}`),t.textContent=`\u{1F4BE} APPLY TO CURRENT VERSION (${this.currentVersion})`,t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
|
|
1054
1054
|
|
|
1055
1055
|
This will DIRECTLY MODIFY base configuration files.
|
|
1056
1056
|
|
|
@@ -1060,7 +1060,7 @@ This is ONLY for active development.
|
|
|
1060
1060
|
|
|
1061
1061
|
Make sure your project is under Git version control.
|
|
1062
1062
|
|
|
1063
|
-
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let p=
|
|
1063
|
+
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let p=It(),d={};for(let[g,f]of Object.entries(p.objects)){let h=f,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=m),d[`objects/${m}.json`]=h}p.engine&&(p.engine.runtime&&(d["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(d["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(d["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(d["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(d["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(d["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(d["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(d["engine/engine.json"]=p.engine));for(let[g,f]of Object.entries(p.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${h}.json`]=f}let u=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:d,assets:{}})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to base failed")}lt(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply to base failed:",p),alert(`\u274C Apply to base failed: ${p.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async c=>{let d=c.target.value;await this.switchVersion(d)}),this.container.querySelectorAll(".item-remove").forEach(c=>{c.addEventListener("click",()=>{let p=c.dataset.removePath,d=c.dataset.removeId;ea(d||void 0,p)})});let o=this.container.querySelector("#clear-all-overrides");o==null||o.addEventListener("click",()=>{confirm("Discard all staged changes?")&&Di()});let s=this.container.querySelector("#reset-to-applied-btn");s==null||s.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Di()});let l=this.container.querySelector("#reset-to-original-btn");l==null||l.addEventListener("click",async()=>{await na()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
|
|
1064
1064
|
<div class="notify-icon">\u2705</div>
|
|
1065
1065
|
<div class="notify-content">
|
|
1066
1066
|
<strong>Changes Applied!</strong>
|
|
@@ -1074,7 +1074,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
|
|
|
1074
1074
|
|
|
1075
1075
|
This cannot be undone unless you have git commits or backups.
|
|
1076
1076
|
|
|
1077
|
-
Are you absolutely sure?`))try{let t=
|
|
1077
|
+
Are you absolutely sure?`))try{let t=It(),i={};for(let[r,o]of Object.entries(t.objects)){let s=o,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}lt(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var gi=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new $t;this.sceneToolsPanel=new Ht;this.nudgePanel=new Bt;this.inspectorPanel=new Qt;this.libraryPanel=new Nt;this.brandVisionPanel=new ii;this.customizeSettingsPanel=new ni;this.configPersistencePanel=new ui;this.loadingScreenPanel=new ai}applyAssetChange(e,t){return Ja(this,e,t)}resetAsset(e){return Za(this,e)}applySlotAsset(e,t,i){return Qa(this,e,t,i)}resetSlotAsset(e,t,i){return er(this,e,t,i)}startObjectVisuals(){return or(this)}stopObjectVisuals(){return sr(this)}shouldRunObjectVisuals(){return oi(this)}updateObjectVisuals(){return si(this)}getSelectedInstanceId(){return Xi(this)}getDisplayObjectById(e){return Ji(this,e)}getSelectedObjectConfig(){return ut(this)}getConfigAnchorWorldPoint(e){return Zi(this,e)}getScreenSize(){return Qi(this)}ensureBoundsGfx(){return en(this)}ensureAnchorGfx(){return tn(this)}drawBounds(e){return nn(this,e)}drawAnchor(e){return an(this,e)}clearBounds(){return rn(this)}clearAnchor(){return on(this)}clearObjectVisuals(){return pt(this)}updateObjectInfo(e){return dt(this,e)}resetDebugConfig(){return ci(this)}applyDebugConfig(){return dr(this)}exportDebugConfig(){return di(this)}loadObjectConfig(e){return pr(this,e)}fillConfigViewer(e){return li(this,e)}copyConfigValues(){return ur(this)}applyObjectConfig(e){return ln(this,e)}applyCustomizeSettings(e,t){return gr(this,e,t)}scheduleObjectAutoApply(){return hr(this)}setupDebugEventListeners(){return yr(this)}setupDebugInputListeners(e){return pn(this,e)}setupPanelLayout(){return vr(this)}setupCollapsiblePanels(e){return un(this,e)}setupRangeInput(e,t,i,n){return ae(this,e,t,i,n)}updateWorkbenchTabs(){return dn(this)}saveWorkbenchState(){return Oe(this)}loadWorkbenchState(){return pi(this)}initialize(e){var r;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let o=localStorage.getItem("preview_workbench_state");if(o){let s=JSON.parse(o);s.activeTab&&(this.activeTab=s.activeTab)}}catch(o){console.warn("[PREVIEW] Failed to load workbench tab state",o)}this.sceneObjectsPanel.initialize(e,{onSelect:o=>this.handleObjectSelect(o)}),this.libraryPanel.initialize(e,{onApply:(o,s,l)=>this.applySlotAsset(o,s,l),onReset:(o,s,l)=>this.resetSlotAsset(o,s,l)}),this.inspectorPanel.initialize(e,{onPropertyChange:(o,s,l)=>{console.log("[Inspector] Property changed:",o,s,l)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let o="/dashboard";window.location.pathname!==o&&(window.location.href=o)}),this.customizeSettingsPanel.initialize(e,{onApply:(o,s)=>this.applyCustomizeSettings(o,s)});let t=e.querySelector("#scene-tools-container");t&&(t.innerHTML=this.sceneToolsPanel.render());let i=e.querySelector("#nudge-panel-container");i&&(i.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(t||e,{onHighlightObject:o=>{this.highlightObject=o,o?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:o=>{this.highlightAnchor=o,o?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(o,s)=>this.nudgeSelectedObject(o,s),onShowSplash:()=>{let o=window;typeof o.__previewShowSplash=="function"&&o.__previewShowSplash()},onUpdateSplash:o=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:o})}}),this.nudgePanel.initialize(i||e,{onNudge:async(o,s)=>{var f,h,m,b,y,v;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(f=l.transform)==null?void 0:f.position,p=((h=c==null?void 0:c.x)!=null?h:0)+o,d=((m=c==null?void 0:c.y)!=null?m:0)+s,{applyConfigOverride:u}=await import("./ConfigOverride-JLWPHR4L.js");u({objectId:this.selectedObjectId,path:"transform.position",value:{x:p,y:d}},{silent:!0,emitEvent:!0});let g=window.applyEditableObjectConfig;if(typeof g=="function"){let x=window.__editableConfig,w=(v=(y=(b=x==null?void 0:x.objects)==null?void 0:b.get)==null?void 0:y.call(b,this.selectedObjectId))!=null?v:l;await g(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async o=>{var u,g,f,h,m;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=(u=s.transform)==null?void 0:u.scale)!=null?g:1,c=Math.max(.1,l+o),{applyConfigOverride:p}=await import("./ConfigOverride-JLWPHR4L.js");p({objectId:this.selectedObjectId,path:"transform.scale",value:c},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let b=window.__editableConfig,y=(m=(h=(f=b==null?void 0:b.objects)==null?void 0:f.get)==null?void 0:h.call(f,this.selectedObjectId))!=null?m:s;await d(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let n=t==null?void 0:t.querySelector("#debug-nudge-enabled");n==null||n.addEventListener("change",()=>{n.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let o=window;typeof o.__previewShowLoading=="function"?o.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let o=window;typeof o.__previewHideLoading=="function"?o.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:o=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:o}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(o):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(o,s,l,c)=>{this.customizeSettingsPanel.openAiEditor(o,s,l,c)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(r=this.debugOverlay)==null||r.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=o=>this.selectObject(o),window.addEventListener("config:changed",o=>{var s,l;((s=o.detail)==null?void 0:s.action)!=="remove"&&((l=o.detail)==null?void 0:l.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(o,s,l)=>this.applySlotAsset(o,s,l),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let o=window.getActiveConfig;if(typeof o=="function"){let l=o();return((s=l==null?void 0:l.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(o,s)=>{let l=window.getEditableAssets;if(typeof l=="function"){let c=l();if(c!=null&&c.libraryAssets&&(c.libraryAssets[o]||(c.libraryAssets[o]=[]),!c.libraryAssets[o].some(d=>d.filename===s))){let d=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");c.libraryAssets[o].unshift({filename:s,displayName:d}),console.log(`[DEBUG] Added ${s} to registry category ${o}`)}}},window.__highlightLibrarySlot=(o,s)=>{this.libraryPanel.highlightSlot(o,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&(this.activeTab="inspector",this.updateWorkbenchTabs())}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
|
|
1078
1078
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
1079
1079
|
<div class="debug-workbench" id="debug-workbench">
|
|
1080
1080
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -1121,7 +1121,7 @@ Are you absolutely sure?`))try{let t=Ot(),i={};for(let[r,s]of Object.entries(t.o
|
|
|
1121
1121
|
<div id="scene-tools-container"></div>
|
|
1122
1122
|
<div id="nudge-panel-container"></div>
|
|
1123
1123
|
</div>
|
|
1124
|
-
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let
|
|
1124
|
+
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=r.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function fo(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function mo(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function bo(a){return`
|
|
1125
1125
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
1126
1126
|
|
|
1127
1127
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -1138,9 +1138,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
|
|
|
1138
1138
|
${a?`
|
|
1139
1139
|
ADDITIONAL RULES/NOTES:
|
|
1140
1140
|
${a}`:""}
|
|
1141
|
-
`.trim()}function xr(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let
|
|
1141
|
+
`.trim()}function xr(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let o=await fo(r),s=mo(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};a.push(l),n.push(l)}return n},getSources(){return a.slice()},async analyze(i,n,r){if(a.length===0)throw new Error("No screenshots to analyze.");let o=bo(n),s=a.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await ti(i,o,s,{model:r}),c=e,p=[],d=l.split(`
|
|
1142
1142
|
`);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(f=>{p.includes(f.toUpperCase())||p.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
|
|
1143
|
-
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var
|
|
1143
|
+
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ie="handler_api_key_";var We=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${Ie}${e}`;localStorage.setItem(r,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ie}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ie}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ie}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ie)){let n=i.substring(Ie.length),r=localStorage.getItem(i);if(r){let o=JSON.parse(r);e.push({service:n,label:o.label,created:o.created,lastUsed:o.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ie)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},gn=()=>We.getKey("gemini"),hn=(a,e)=>We.setKey("gemini",a,e),yo=()=>We.hasKey("gemini");window.ApiKeyStorage=We;window.getGeminiApiKey=gn;window.setGeminiApiKey=hn;window.hasGeminiApiKey=yo;var mn=class{constructor(){this.modal=null;this.options=null;this.analyzer=xr();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
|
|
1144
1144
|
<div class="ai-modal-card">
|
|
1145
1145
|
<div class="ai-modal-header">
|
|
1146
1146
|
<div class="ai-modal-actions">
|
|
@@ -1219,14 +1219,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
|
|
|
1219
1219
|
<button class="ai-btn primary" data-action="apply" disabled>Apply</button>
|
|
1220
1220
|
</div>
|
|
1221
1221
|
</div>
|
|
1222
|
-
`,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var
|
|
1222
|
+
`,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var s;let r=n.target;switch(r.dataset.action||((s=r.closest("[data-action]"))==null?void 0:s.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let r=n.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let o=r.closest(".ai-gallery-item"),s=parseInt(o.dataset.index||"-1");s>=0&&this.selectImage(s)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
|
|
1223
1223
|
|
|
1224
|
-
Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let
|
|
1224
|
+
Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let o=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await ei(this.options.currentValue);c&&(o=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let s=await Ye(r,this.currentPrompt,o,{aspectRatio:"1:1"}),l=await Ve(s);this.generatedImages.push(l||s),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
|
|
1225
1225
|
<div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
|
|
1226
1226
|
<img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
|
|
1227
1227
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
1228
1228
|
</div>
|
|
1229
|
-
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=gn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return hn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},fn=null;window.__openAiEditor=function(a,e,t,i){fn||(fn=new mn),fn.open({objectId:a,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(a,i.path,n);else{let
|
|
1229
|
+
`).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=gn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return hn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},fn=null;window.__openAiEditor=function(a,e,t,i){fn||(fn=new mn),fn.open({objectId:a,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(a,i.path,n);else{let o=window.getEditableObjectConfig,s=o==null?void 0:o(a);if(s){let l=i.path.split("."),c=s;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var bn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
|
|
1230
1230
|
<div class="asset-preview-card">
|
|
1231
1231
|
<div class="asset-preview-header">
|
|
1232
1232
|
<div class="asset-preview-title">${n}</div>
|
|
@@ -1304,7 +1304,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1304
1304
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
1305
1305
|
</div>
|
|
1306
1306
|
</div>
|
|
1307
|
-
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,s=Math.min(n,r),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new yn().open(a)};var vn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ge("playable-portrait"),Ge("iphone-14"),Ge("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=Ge(e.defaultDevice||Ui.id),this.debugPanel=new gi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ge(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
|
|
1307
|
+
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(n,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new yn().open(a)};var vn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ge("playable-portrait"),Ge("iphone-14"),Ge("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=Ge(e.defaultDevice||Ui.id),this.debugPanel=new gi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ge(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
|
|
1308
1308
|
<div class="preview-toolbar">
|
|
1309
1309
|
<div class="preview-toolbar-left">
|
|
1310
1310
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -1440,7 +1440,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1440
1440
|
<div class="console-messages" id="console-messages"></div>
|
|
1441
1441
|
</div>
|
|
1442
1442
|
</div>
|
|
1443
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var n,r,s,o,l,c,p,d,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",f=>{if(this.viewMode==="compare")return;let h=f.target.value;this.setDevice(h)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.viewToggle;h&&this.setViewMode(h)})}),(n=e.querySelector("#rotate-btn"))==null||n.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(s=e.querySelector("#zoom-out-btn"))==null||s.addEventListener("click",()=>this.adjustUserZoom(-.1)),(o=e.querySelector("#refresh-btn"))==null||o.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(p=e.querySelector("#console-clear"))==null||p.addEventListener("click",()=>this.clearConsole()),(d=e.querySelector("#corner-zoom-in-btn"))==null||d.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"0 20px 50px rgba(0,0,0,0.5)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=r/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),n=console.info.bind(console),r=(s,...o)=>{let l=o.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:s,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...s)=>{e(...s),r("log",...s)},console.warn=(...s)=>{t(...s),r("warn",...s)},console.error=(...s)=>{i(...s),r("error",...s)},console.info=(...s)=>{n(...s),r("info",...s)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!s||!o||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:s,wrapper:o,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(r=this.options).onDeviceChange)==null||s.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(r,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,s=t.canvas.height,o=Math.min(r/i.width,s/i.height),l=i.width*o,c=i.height*o,p=(r-l)/2,d=(s-c)/2;n.clearRect(0,0,r,s),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function wr(a={}){let e=new vn(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as ys,Container as Er}from"pixi.js";var vs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",xn=vs;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(xn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${xn}`))}}catch{}function xs(a){var t,i,n,r,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let o=a.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Pe=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${xn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new Er;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let s=await Ri.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=s==null?void 0:s.constructor)==null?void 0:p.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new ys(s),console.log("[ObjectFactory] Created object:",o,"type:",(d=o==null?void 0:o.constructor)==null?void 0:d.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Er)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,r,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=xs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function wn(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function Ar(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function ws(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function Sr(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};ws(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,s):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=s)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let o=t.anchor;if(o&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?d=o:Array.isArray(o)&&o.length===2&&(d={x:o[0],y:o[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function Cr(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=wn(e),i=r=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return r;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?r.filter(c=>l[c]===s):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Cr(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(wn((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return wn((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,f;let s=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return r}}function Es(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,s,o;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(h){let m=((o=h.getDisplayObject)==null?void 0:o.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Oi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,It(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Oi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,It(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,s]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:s});if(t.assets)for(let[r,s]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:s}),typeof s=="string"&&e(r,s);if(t.splash)for(let[r,s]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:s});if(t.loading)for(let[r,s]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:s});if(t.start)for(let[r,s]of Object.entries(t.start))n.push({path:`start.${r}`,value:s});n.length&&It(n,{silent:!0,persist:!0,emitEvent:!0})}}function En(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let o=t.get(r),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);o?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Pe.create(r,s,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Es(),window.applyEditableObjectConfig=(r,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(o=p==null?void 0:p.objects)!=null&&o.set&&(p.objects.set(r,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(s);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Ar(d);Sr(u,s)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,s){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let o=e();(p=o==null?void 0:o.objects)!=null&&p.set&&(o.objects.set(r,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Ar(l);Sr(u,s)}let c=[r];i==null||i(r,s,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,Cr(r))}};return n.rebuildIndexes(),n}import As from"lottie-web";Tn(Oa);typeof window!="undefined"&&!window.lottie&&(window.lottie=As);var Ke=null,Ss=async()=>{if(!Ke){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);Ke=JSON.parse(i)}else Ke=JSON.parse(e);return Ke}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}Ke=await(await fetch("./handler.config.json")).json()}return Ke},Ln,ht,Pr,Xe,Sn,Cn;function ld(a){Ln=a.initGame,ht=a.CustomAssets,Pr=a.updateScreenState,Xe=a.globalResponsiveMultipliers,Sn=a.layout,Cn=a.clearResponsiveElements}var hi="web_embed",gt="https://example.com",Tr={profile_id:hi},ke=null,ce=null,An={width:0,height:0},Cs=!0,cd=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await Ss();Tr={...a.ids||{},profile_id:hi},gt=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[hi])==null?void 0:p.destination_url)||gt,me.init({ids:Tr,profile:hi,destinationUrl:gt});let e=me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=wr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Lr()},onRefresh:Lr});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,x,w,S,L,k,O,j,P,E,C;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(An.width=b,An.height=y,Pr(b,y),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,y);let A=h.view;A&&(A.style.width="100%",A.style.height="100%",A.style.display="block")}catch(A){console.warn("[SCREEN] Error resizing renderer:",A);return}if(t&&m&&Sn)try{let A=(v=window.__mainContainer)!=null?v:h.stage,_=(O=(k=(S=window.__tutorialLabel)!=null?S:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?k:(L=m.get("label_1"))==null?void 0:L.pixiObject)!=null?O:m.get("label_1"),I=m.get("background_1"),D=(C=(E=(P=window.__background)!=null?P:(j=I==null?void 0:I.getDisplayObject)==null?void 0:j.call(I))!=null?E:I==null?void 0:I.pixiObject)!=null?C:I;if(A){let T=A===h.stage;Sn({mainContainer:A,label:_,background:D,backgroundTexture:(D==null?void 0:D.texture)||null,app:h},t,0,An,m,{skipMainContainerTransform:T})}}catch(A){console.warn("[SCREEN] Error in layout:",A)}}})}let t=await jt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await jt("scene.main"));let i=await Ln(e,t,gt,ce);ke=i.app;let n=i.gameObjectManager;window.gameApp=ke,window.gameObjectManager=n;try{window.__liveEditBridge=En({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(Xe.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),o(ke,n);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),S=w==null?void 0:w.elements;if(!Array.isArray(S))continue;let L=S.map(k=>k==null?void 0:k.instance_id).filter(k=>typeof k=="string");m[y]=L;for(let k of L)b[k]||(b[k]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(Cs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${Xe.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let S=x.scale.x||1,L=x.scale.y||1;x.__originalScale||(x.__originalScale={x:S,y:L},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${S.toFixed(3)}, ${L.toFixed(3)}`));let k=x.__originalScale.x*Xe.scale,O=x.__originalScale.y*Xe.scale;typeof x.scale.set=="function"?x.scale.set(k,O):(x.scale.x=k,x.scale.y=O),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${S.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){Xe.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(o(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,me.start()},Lr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{Cn&&Cn()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=ce.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),ke){try{ke.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}ke=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof ht.resetScene=="function"&&ht.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{jt("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(o)),Ln(r,o,gt).then(l=>{ke=l.app,window.gameApp=ke,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=En({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ce&&ce.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{me.start()}catch{}})})},100)},1e3)}};var be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ts=1.25,Ls={fontFamily:"Inter, system-ui, sans-serif"};var Pn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
|
|
1443
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var n,r,o,s,l,c,p,d,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",f=>{if(this.viewMode==="compare")return;let h=f.target.value;this.setDevice(h)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.viewToggle;h&&this.setViewMode(h)})}),(n=e.querySelector("#rotate-btn"))==null||n.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(o=e.querySelector("#zoom-out-btn"))==null||o.addEventListener("click",()=>this.adjustUserZoom(-.1)),(s=e.querySelector("#refresh-btn"))==null||s.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(p=e.querySelector("#console-clear"))==null||p.addEventListener("click",()=>this.clearConsole()),(d=e.querySelector("#corner-zoom-in-btn"))==null||d.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),n=console.info.bind(console),r=(o,...s)=>{let l=s.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:o,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...o)=>{e(...o),r("log",...o)},console.warn=(...o)=>{t(...o),r("warn",...o)},console.error=(...o)=>{i(...o),r("error",...o)},console.info=(...o)=>{n(...o),r("info",...o)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,o;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(r-l)/2,d=(o-c)/2;n.clearRect(0,0,r,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function wr(a={}){let e=new vn(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as vo,Container as Er}from"pixi.js";var xo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",xn=xo;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(xn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${xn}`))}}catch{}function wo(a){var t,i,n,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let s=a.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var ke=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${xn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new Er;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let o=await Ri.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new vo(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof Er)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){s=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=s==null?void 0:s.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=wo(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function wn(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function Ar(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function Eo(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function Sr(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};Eo(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,o):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=o)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let s=t.anchor;if(s&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(s):typeof s=="object"&&s.x!==void 0&&s.y!==void 0?d=s:Array.isArray(s)&&s.length===2&&(d={x:s[0],y:s[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function Cr(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=wn(e),i=r=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?r.filter(c=>l[c]===o):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Cr(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(wn((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return wn((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,f;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function Ao(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,o,s;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(o=f==null?void 0:f.get)==null?void 0:o.call(f,t);if(h){let m=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ii();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ot(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ii();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ot(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))n.push({path:`start.${r}`,value:o});n.length&&Ot(n,{silent:!0,persist:!0,emitEvent:!0})}}function En(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await ke.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Ao(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Ar(d);Sr(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Ar(l);Sr(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,Cr(r))}};return n.rebuildIndexes(),n}import So from"lottie-web";Tn(Ia);typeof window!="undefined"&&!window.lottie&&(window.lottie=So);var Ke=null,Co=async()=>{if(!Ke){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);Ke=JSON.parse(i)}else Ke=JSON.parse(e);return Ke}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}Ke=await(await fetch("./handler.config.json")).json()}return Ke},Ln,ht,kr,Xe,Sn,Cn;function ld(a){Ln=a.initGame,ht=a.CustomAssets,kr=a.updateScreenState,Xe=a.globalResponsiveMultipliers,Sn=a.layout,Cn=a.clearResponsiveElements}var hi="web_embed",gt="https://example.com",Tr={profile_id:hi},Pe=null,ce=null,An={width:0,height:0},To=!0,cd=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await Co();Tr={...a.ids||{},profile_id:hi},gt=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[hi])==null?void 0:p.destination_url)||gt,me.init({ids:Tr,profile:hi,destinationUrl:gt});let e=me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=wr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Lr()},onRefresh:Lr});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,x,w,S,L,P,I,j,k,E,C;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(An.width=b,An.height=y,kr(b,y),!(!h||!h.renderer)){m&&s(h,m);try{h.renderer.resize(b,y);let A=h.view;A&&(A.style.width="100%",A.style.height="100%",A.style.display="block")}catch(A){console.warn("[SCREEN] Error resizing renderer:",A);return}if(t&&m&&Sn)try{let A=(v=window.__mainContainer)!=null?v:h.stage,_=(I=(P=(S=window.__tutorialLabel)!=null?S:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?P:(L=m.get("label_1"))==null?void 0:L.pixiObject)!=null?I:m.get("label_1"),O=m.get("background_1"),D=(C=(E=(k=window.__background)!=null?k:(j=O==null?void 0:O.getDisplayObject)==null?void 0:j.call(O))!=null?E:O==null?void 0:O.pixiObject)!=null?C:O;if(A){let T=A===h.stage;Sn({mainContainer:A,label:_,background:D,backgroundTexture:(D==null?void 0:D.texture)||null,app:h},t,0,An,m,{skipMainContainerTransform:T})}}catch(A){console.warn("[SCREEN] Error in layout:",A)}}})}let t=await jt("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await jt("scene.main"));let i=await Ln(e,t,gt,ce);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=En({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(Xe.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(Pe,n);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),S=w==null?void 0:w.elements;if(!Array.isArray(S))continue;let L=S.map(P=>P==null?void 0:P.instance_id).filter(P=>typeof P=="string");m[y]=L;for(let P of L)b[P]||(b[P]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,f){if(To){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${Xe.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let S=x.scale.x||1,L=x.scale.y||1;x.__originalScale||(x.__originalScale={x:S,y:L},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${S.toFixed(3)}, ${L.toFixed(3)}`));let P=x.__originalScale.x*Xe.scale,I=x.__originalScale.y*Xe.scale;typeof x.scale.set=="function"?x.scale.set(P,I):(x.scale.x=P,x.scale.y=I),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${S.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){Xe.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(s(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,me.start()},Lr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{Cn&&Cn()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=ce.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof ht.resetScene=="function"&&ht.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{jt("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(s)),Ln(r,s,gt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=En({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ce&&ce.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{me.start()}catch{}})})},100)},1e3)}};var be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Lo=1.25,ko={fontFamily:"Inter, system-ui, sans-serif"};var kn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
|
|
1444
1444
|
position: fixed;
|
|
1445
1445
|
inset: 0;
|
|
1446
1446
|
display: flex;
|
|
@@ -1475,17 +1475,17 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1475
1475
|
justify-content: space-between;
|
|
1476
1476
|
align-items: flex-end;
|
|
1477
1477
|
margin-bottom: 8px;
|
|
1478
|
-
`;let
|
|
1478
|
+
`;let o=document.createElement("span");o.style.cssText=`
|
|
1479
1479
|
font-size: 12px;
|
|
1480
1480
|
font-weight: 900;
|
|
1481
1481
|
letter-spacing: 0.15em;
|
|
1482
1482
|
color: ${be.ink};
|
|
1483
|
-
`,
|
|
1483
|
+
`,o.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
|
|
1484
1484
|
font-size: 10px;
|
|
1485
1485
|
font-family: monospace;
|
|
1486
1486
|
font-weight: bold;
|
|
1487
1487
|
color: ${be.primaryAccent};
|
|
1488
|
-
`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,r.appendChild(
|
|
1488
|
+
`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,r.appendChild(o),r.appendChild(this.progressText);let s=document.createElement("div");s.style.cssText=`
|
|
1489
1489
|
height: 4px;
|
|
1490
1490
|
width: 100%;
|
|
1491
1491
|
background-color: #E0DDD8;
|
|
@@ -1508,7 +1508,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1508
1508
|
width: 50%;
|
|
1509
1509
|
filter: blur(4px);
|
|
1510
1510
|
animation: shimmer 2s infinite;
|
|
1511
|
-
`,this.progressBar.appendChild(l),
|
|
1511
|
+
`,this.progressBar.appendChild(l),s.appendChild(this.progressBar);let c=document.createElement("div");c.style.cssText=`
|
|
1512
1512
|
display: flex;
|
|
1513
1513
|
justify-content: space-between;
|
|
1514
1514
|
width: 100%;
|
|
@@ -1519,7 +1519,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1519
1519
|
width: 1.5px;
|
|
1520
1520
|
background-color: black;
|
|
1521
1521
|
height: ${u%4===0?"6px":"2px"};
|
|
1522
|
-
`,c.appendChild(g)}n.appendChild(r),n.appendChild(
|
|
1522
|
+
`,c.appendChild(g)}n.appendChild(r),n.appendChild(s),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
|
|
1523
1523
|
position: absolute;
|
|
1524
1524
|
top: 48px;
|
|
1525
1525
|
width: 600px;
|
|
@@ -1639,7 +1639,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1639
1639
|
0%, 100% { opacity: 1; }
|
|
1640
1640
|
50% { opacity: 0.3; }
|
|
1641
1641
|
}
|
|
1642
|
-
`,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var kn=ha.version,Ps=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ga();var jr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Dr=Math.random().toString(36).slice(2),Qe=null,Je={...jr},zr="web_embed",In={},mt,_n=!1,ft=!1,yt=!1,$r=!1,zn=1,mi=0,vi=!1,ye=!1,Ze="",et=Math.floor(window.innerWidth),tt=Math.floor(window.innerHeight),On=et>tt,ve=!1,bt=!1,kr=!1,_r=!1,Mn=!1,bi=null,je=null,jn=!1,Dn=!1,fi=new Map;function Hr(){if(!je)return null;let a=Date.now()-je;return!Number.isFinite(a)||a<0?null:a}function Rn(a){if(jn)return;let e=Hr();e!==null&&(jn=!0,R("session_time",{duration_ms:e,reason:a}))}function Mr(){if(Qe)return Qe;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),Qe=a,a}function yi(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Br(a,e){return{event_name:a,ts:Date.now(),session_id:Dr,deployment_id:Je.deployment_id,variant_id:Je.variant_id,export_profile_id:Je.profile_id,instance_id:Je.instance_id||"default",env:zr==="mraid"?"mraid":"web",attribution:mt,payload:e}}function R(a,e){let t=yi(a),i=Br(t,e);$i(i,!!In.analytics),zt(t,i),t!==a&&zt(a,i)}function vt(){bi&&(bi(et,tt),bi=null)}function it(a){zn=a,R("volume",a)}function nt(a){a&&($r=!0),!yt&&(yt=!0,R("pause"),it(0))}function xt(a){!a&&$r||yt&&(yt=!1,R("resume"),it(zn))}function _e(a,e){et=Math.floor(a||window.innerWidth),tt=Math.floor(e||window.innerHeight),On=et>tt,R("resize",{width:et,height:tt})}function ks(){if(Ta())try{let a=mraid.getMaxSize();_e(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?xt():nt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();it(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&it(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),vi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function _s(){if(La())try{let a=dapi.getScreenSize();_e(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?xt():nt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(it(e?1:0),dapi.addEventListener("audioVolumeChange",t=>it(t?1:0)),vi=!0,dapi.isViewable())ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Rr(){let a=()=>{ve||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt(),bt&&(bt=!1,de.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(xt(),a()):nt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),vi=!0}function Ms(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(kr=!0),!(kr&&e instanceof MouseEvent)&&(mi+=1,Dn||(Dn=!0,R("first_interaction",{count:mi})),R("interaction",mi))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function Ir(a){var i,n,r,s,o,l,c,p,d,u,g,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ue())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(Pa())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Ra())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ma())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(ka()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||Ze||""):a&&window.open(a)}else Fe()?(u=window.install)==null||u.call(window):_a()?(g=window.openAppStore)==null||g.call(window):Hi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function Rs(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),Dt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Is(){if(!Ue())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Or(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function Os(){Fe()&&(window.mintGameStart=()=>{xt(!0),_e()},window.mintGameClose=()=>{nt(!0)})}function js(){if(!Bi())return;let a=window.NUC;!a||!a.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,Ze)}),de.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(a={},e){var t;if(zr=a.profile||"web_embed",In=a.consent||{},Je={...jr,...a.ids||{}},Qe=a.rootEl||Qe,mt=void 0,sa((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),je=null,jn=!1,Dn=!1,fi.clear(),Ze=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(bi=e),R("init"),document.body.oncontextmenu=()=>!1,Mr(),zs(Qe),Ia(),ks(),_s(),!vi){if(document.readyState==="complete")Rr();else if(!_r){_r=!0;let i=()=>{Rr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Ms(),Rs(),Is(),Os(),js(),console.log(`%c @handler/playable-sdk %c v${kn} `,"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;"),ve&&!ye&&(R("boot"),R("view"),R("ready"),bt&&(bt=!1,de.start()),ye=!0),ye=ve},getRoot(){return Mr()},get version(){return kn},get maxWidth(){return et},get maxHeight(){return tt},get isLandscape(){return On},get isReady(){return ye},get isStarted(){return _n},get isPaused(){return yt},get isFinished(){return ft},get volume(){return zn},get interactions(){return mi},on(a,e){Dt(yi(a),e)},off(a,e){zi(yi(a),e)},start(){var a,e;if(!_n){if(!ve){bt=!0;return}if(_n=!0,je||(je=Date.now()),R("start"),_e(),Fe())nt(),(a=window.gameReady)==null||a.call(window);else if(Ue()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:On?"landscape":"portrait",buildID:kn})}}},finish(){var a,e;ft||(ft=!0,R("complete"),Rn("complete"),Fe()?(a=window.gameEnd)==null||a.call(window):Hi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ue()&&Or())},install(a){if(!ft){ft=!0,Ue()?(Or(),setTimeout(()=>de.install(a),300)):(R("complete"),setTimeout(()=>de.install(a),0));return}Mn||(Mn=!0,setTimeout(()=>Mn=!1,500),R("cta_click"),R("conversion"),Rn("cta"),Ir(a||Ze))},emit(a,e){let t=yi(a);if(!Ps.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Br(t,e);$i(i,!!In.analytics),zt(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(a,e){R("cta_click",{url:a||Ze,manual:!0}),(e==null?void 0:e.open)!==!1&&Ir(a||Ze)},ctaShow(a){R("cta_show",a)},ctaDismiss(a){R("cta_dismiss",a)},getGameTimeMs(){return Hr()},endSession(a="manual"){Rn(a)},setAttribution(a){mt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Ds(`${Dr}:${a}`))%e.length,i=e[t];return mt={...mt||{},experiment_id:a},Je.variant_id=i,R("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){je||(je=Date.now()),R("level_start",{level_id:a,...e})},levelComplete(a,e){R("level_complete",{level_id:a,...e})},levelFail(a,e){R("level_fail",{level_id:a,...e})},checkpoint(a,e){R("checkpoint",{checkpoint_id:a,...e})},reward(a,e){R("reward",{reward_id:a,...e})},tutorialStart(a,e){R("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){R("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){R("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&fi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=fi.get(a);if(!i)return;fi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:a,duration_ms:n,...t});return}R(e,{key:a,duration_ms:n,...t})}},fps(a,e){R("fps",{value:a,...e})},memory(a,e){R("memory",{bytes:a,...e})},assetLoadStart(a,e){R("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){R("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){R("error",{code:a,message:e,...t})},retry(){var a,e,t;if(Fe())(a=window.gameRetry)==null||a.call(window);else if(Bi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){nt(!0)},resume(){xt(!0)},resize(a,e){_e(a,e)}},me=de;function Ds(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function zs(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
1642
|
+
`,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var Pn=ha.version,Po=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ga();var jr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Dr=Math.random().toString(36).slice(2),Qe=null,Je={...jr},zr="web_embed",On={},mt,_n=!1,ft=!1,yt=!1,$r=!1,zn=1,mi=0,vi=!1,ye=!1,Ze="",et=Math.floor(window.innerWidth),tt=Math.floor(window.innerHeight),In=et>tt,ve=!1,bt=!1,Pr=!1,_r=!1,Mn=!1,bi=null,je=null,jn=!1,Dn=!1,fi=new Map;function Hr(){if(!je)return null;let a=Date.now()-je;return!Number.isFinite(a)||a<0?null:a}function Rn(a){if(jn)return;let e=Hr();e!==null&&(jn=!0,R("session_time",{duration_ms:e,reason:a}))}function Mr(){if(Qe)return Qe;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),Qe=a,a}function yi(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Br(a,e){return{event_name:a,ts:Date.now(),session_id:Dr,deployment_id:Je.deployment_id,variant_id:Je.variant_id,export_profile_id:Je.profile_id,instance_id:Je.instance_id||"default",env:zr==="mraid"?"mraid":"web",attribution:mt,payload:e}}function R(a,e){let t=yi(a),i=Br(t,e);$i(i,!!On.analytics),zt(t,i),t!==a&&zt(a,i)}function vt(){bi&&(bi(et,tt),bi=null)}function it(a){zn=a,R("volume",a)}function nt(a){a&&($r=!0),!yt&&(yt=!0,R("pause"),it(0))}function xt(a){!a&&$r||yt&&(yt=!1,R("resume"),it(zn))}function _e(a,e){et=Math.floor(a||window.innerWidth),tt=Math.floor(e||window.innerHeight),In=et>tt,R("resize",{width:et,height:tt})}function _o(){if(Ta())try{let a=mraid.getMaxSize();_e(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?xt():nt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();it(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&it(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),vi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function Mo(){if(La())try{let a=dapi.getScreenSize();_e(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?xt():nt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(it(e?1:0),dapi.addEventListener("audioVolumeChange",t=>it(t?1:0)),vi=!0,dapi.isViewable())ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Rr(){let a=()=>{ve||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt(),bt&&(bt=!1,de.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(xt(),a()):nt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),vi=!0}function Ro(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Pr=!0),!(Pr&&e instanceof MouseEvent)&&(mi+=1,Dn||(Dn=!0,R("first_interaction",{count:mi})),R("interaction",mi))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function Or(a){var i,n,r,o,s,l,c,p,d,u,g,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ue())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(ka())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(Ra())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ma())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Pa()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||Ze||""):a&&window.open(a)}else Fe()?(u=window.install)==null||u.call(window):_a()?(g=window.openAppStore)==null||g.call(window):Hi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function Oo(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),Dt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Io(){if(!Ue())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Ir(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function jo(){Fe()&&(window.mintGameStart=()=>{xt(!0),_e()},window.mintGameClose=()=>{nt(!0)})}function Do(){if(!Bi())return;let a=window.NUC;!a||!a.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,Ze)}),de.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(a={},e){var t;if(zr=a.profile||"web_embed",On=a.consent||{},Je={...jr,...a.ids||{}},Qe=a.rootEl||Qe,mt=void 0,oa((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),je=null,jn=!1,Dn=!1,fi.clear(),Ze=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(bi=e),R("init"),document.body.oncontextmenu=()=>!1,Mr(),$o(Qe),Oa(),_o(),Mo(),!vi){if(document.readyState==="complete")Rr();else if(!_r){_r=!0;let i=()=>{Rr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Ro(),Oo(),Io(),jo(),Do(),console.log(`%c @handler/playable-sdk %c v${Pn} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ve&&!ye&&(R("boot"),R("view"),R("ready"),bt&&(bt=!1,de.start()),ye=!0),ye=ve},getRoot(){return Mr()},get version(){return Pn},get maxWidth(){return et},get maxHeight(){return tt},get isLandscape(){return In},get isReady(){return ye},get isStarted(){return _n},get isPaused(){return yt},get isFinished(){return ft},get volume(){return zn},get interactions(){return mi},on(a,e){Dt(yi(a),e)},off(a,e){zi(yi(a),e)},start(){var a,e;if(!_n){if(!ve){bt=!0;return}if(_n=!0,je||(je=Date.now()),R("start"),_e(),Fe())nt(),(a=window.gameReady)==null||a.call(window);else if(Ue()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:In?"landscape":"portrait",buildID:Pn})}}},finish(){var a,e;ft||(ft=!0,R("complete"),Rn("complete"),Fe()?(a=window.gameEnd)==null||a.call(window):Hi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ue()&&Ir())},install(a){if(!ft){ft=!0,Ue()?(Ir(),setTimeout(()=>de.install(a),300)):(R("complete"),setTimeout(()=>de.install(a),0));return}Mn||(Mn=!0,setTimeout(()=>Mn=!1,500),R("cta_click"),R("conversion"),Rn("cta"),Or(a||Ze))},emit(a,e){let t=yi(a);if(!Po.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Br(t,e);$i(i,!!On.analytics),zt(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(a,e){R("cta_click",{url:a||Ze,manual:!0}),(e==null?void 0:e.open)!==!1&&Or(a||Ze)},ctaShow(a){R("cta_show",a)},ctaDismiss(a){R("cta_dismiss",a)},getGameTimeMs(){return Hr()},endSession(a="manual"){Rn(a)},setAttribution(a){mt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(zo(`${Dr}:${a}`))%e.length,i=e[t];return mt={...mt||{},experiment_id:a},Je.variant_id=i,R("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){je||(je=Date.now()),R("level_start",{level_id:a,...e})},levelComplete(a,e){R("level_complete",{level_id:a,...e})},levelFail(a,e){R("level_fail",{level_id:a,...e})},checkpoint(a,e){R("checkpoint",{checkpoint_id:a,...e})},reward(a,e){R("reward",{reward_id:a,...e})},tutorialStart(a,e){R("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){R("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){R("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&fi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=fi.get(a);if(!i)return;fi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:a,duration_ms:n,...t});return}R(e,{key:a,duration_ms:n,...t})}},fps(a,e){R("fps",{value:a,...e})},memory(a,e){R("memory",{bytes:a,...e})},assetLoadStart(a,e){R("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){R("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){R("error",{code:a,message:e,...t})},retry(){var a,e,t;if(Fe())(a=window.gameRetry)==null||a.call(window);else if(Bi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){nt(!0)},resume(){xt(!0)},resize(a,e){_e(a,e)}},me=de;function zo(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function $o(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
1643
1643
|
(function(){
|
|
1644
1644
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
1645
1645
|
function unlock(){
|
|
@@ -1655,7 +1655,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1655
1655
|
}
|
|
1656
1656
|
events.forEach(function(e){ document.addEventListener(e, unlock, false); });
|
|
1657
1657
|
})();
|
|
1658
|
-
`,a.appendChild(e)}async function $n(a,e={}){let t=new $s;await t.init({resizeTo:a,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var d,u,g,f;if(!t.renderer)return;let o=(d=s==null?void 0:s.width)!=null?d:a.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:a.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,p=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,p)};a.appendChild(t.canvas),a.style.position="relative",a.style.display="flex",a.style.flexDirection="column",a.style.alignItems="stretch",a.style.width="100%",a.style.height="100dvh",a.style.minHeight="100vh",a.style.maxWidth="100%",a.style.maxHeight="100%",a.style.boxSizing="border-box",a.style.overflow="hidden",e.background&&(a.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),a.appendChild(n),me.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),me.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),me.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let p={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:p}))}}}).observe(a),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Hn,Ticker as at,ColorMatrixFilter as Hs}from"pixi.js";var xi=class{constructor(e){var n,r;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(r=e==null?void 0:e.rotation)!=null?r:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},wi=class{constructor(e){var t,i,n,r;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(r=e==null?void 0:e.tint)!=null?r:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=Yr("handler-playable-sdk/pixi");if(n&&n[t]){let r=n[t];r&&(e.texture=r)}}catch{}}},Ei=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new xi(n.transform),this.renderer=new wi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(at.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,p,d,u,g,f,h,m,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(p=e==null?void 0:e.motion)==null?void 0:p.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(d=this._config)==null?void 0:d.render)==null?void 0:u.asset)==null?void 0:g.type,r=(h=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:h.type,s=(b=(m=this._config)==null?void 0:m.ui)==null?void 0:b.renderMode,o=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==r||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${r}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,r,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(r=(n=this._config)==null?void 0:n.render)==null?void 0:r.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var r,s,o;if(!((r=this.pixiObject)!=null&&r.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,r,s,o,l,c,p,d;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new Hn;u.blur=(r=e.blur.strength)!=null?r:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Hn;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new Hn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Hs,h=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(h),t.push(f)}}(p=e.stroke)!=null&&p.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(d=e.distortion)!=null&&d.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var p,d,u,g,f,h,m;let e=(p=this._config)==null?void 0:p.motion;if(!e||!((d=e.intro)!=null&&d.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,r=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((h=(f=this._config)==null?void 0:f.effects)==null?void 0:h.scale_y)||1);if(this.pixiObject.alpha=(m=t.startAlpha)!=null?m:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=r+(t.startYOffset||0)),this._introTicker&&at.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(s,o);return}let l=0,c=b=>{var O,j,P,E,C,A;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),x=this.renderer.alpha,w=this.transform.scale*(((j=(O=this._config)==null?void 0:O.effects)==null?void 0:j.scale_x)||1),S=this.transform.scale*(((E=(P=this._config)==null?void 0:P.effects)==null?void 0:E.scale_y)||1),L=this.transform.position.y,k=this.transform.position.x;if(this.pixiObject.alpha=((C=t.startAlpha)!=null?C:0)+(x-((A=t.startAlpha)!=null?A:0))*v,t.startScale!==void 0){let _=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(w*_,S*_)}t.startYOffset!==void 0&&(this.pixiObject.y=L+t.startYOffset+(L-(L+t.startYOffset))*v),y>=1&&(at.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=k,this.pixiObject.y=L,this.pixiObject.scale.set(w,S))};this._introTicker=c,at.shared.add(c)}applyMotion(){var n,r,s;let e=(n=this._config)==null?void 0:n.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(!(this._lastMotionStr===i&&this._tickerCleanup)){if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),(r=e.pulse)!=null&&r.enabled||(s=e.swing)!=null&&s.enabled){let o=0,l=c=>{var h,m,b,y,v,x,w,S,L,k,O;o+=c.deltaTime*.05;let p=this.transform.scale,d=p*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_x)||1),u=p*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_y)||1),g=this.transform.position.x,f=this.transform.position.y;if((v=e.pulse)!=null&&v.enabled){let j=(x=e.pulse.intensity)!=null?x:.1,P=(w=e.pulse.speed)!=null?w:1,C=1+Math.sin(o*P)*j;(S=this.pixiObject.scale)!=null&&S.set?this.pixiObject.scale.set(d*C,u*C):this.pixiObject.scale&&(this.pixiObject.scale.x=d*C,this.pixiObject.scale.y=u*C)}if((L=e.swing)!=null&&L.enabled){let j=(k=e.swing.amplitude)!=null?k:10,P=(O=e.swing.speed)!=null?O:1,E=Math.sin(o*P)*j;e.swing.axis==="vertical"?this.pixiObject.y=f+E:e.swing.axis==="both"?(this.pixiObject.x=g+E,this.pixiObject.y=f+E):this.pixiObject.x=g+E}};at.shared.add(l),this._tickerCleanup=()=>{var c,p,d,u,g;if(at.shared.remove(l),this.pixiObject){let f=this.transform.scale*(((p=(c=this._config)==null?void 0:c.effects)==null?void 0:p.scale_x)||1),h=this.transform.scale*(((u=(d=this._config)==null?void 0:d.effects)==null?void 0:u.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,(g=this.pixiObject.scale)!=null&&g.set?this.pixiObject.scale.set(f,h):this.pixiObject.scale&&(this.pixiObject.scale.x=f,this.pixiObject.scale.y=h)}}}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},wt=class{constructor(e){this.objects=new Map;this.onObjectRebuildRequired=null;this.config=e}create(e,t){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let n=new Ei(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(r,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),r.updateConfig(s)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Ai={"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 Bs(a){let e=Ai[a];return e?e.family:(console.warn(`Font ID "${a}" not found in registry, using fallback`),"Arial, sans-serif")}function Ns(a){var t;let e=Ai[a];return e&&(t=e.weight)!=null?t:"400"}function Fs(a,e){Ai[a]=e}function Us(){return Object.keys(Ai)}var rt=null;function Gs(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!rt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),rt||(typeof window!="undefined"&&window.lottie?(rt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(a=>a.toLowerCase().includes("lottie")):"no window"),rt=null)),rt}function qs(a){return!a||a.startsWith("http://")||a.startsWith("https://")||a.startsWith("/")?a:`/${a.replace(/^\.\//,"")}`}function Vs(a){try{let e=new XMLHttpRequest;return e.open("GET",qs(a),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Nr(a){return!a||typeof a!="object"||!Array.isArray(a.layers)?null:(Array.isArray(a.assets)||(a.assets=[]),Array.isArray(a.chars)||(a.chars=[]),a)}function Tn(a){rt=a}function Ys(a,e,t,i){var S,L,k,O,j,P,E,C,A,_,I,D,T,M,H,Q,B,V,Y;let n=t.objects.get(a);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${a}`),null;let r=((S=n.effects)==null?void 0:S.lottie)||{},s=n.transform||{},o=n.render||{};if(r.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[a],c=Nr(l);if(!c){let X=(k=(L=n.render)==null?void 0:L.asset)==null?void 0:k.path;if(typeof X=="string"&&X.toLowerCase().endsWith(".json")){let we=Vs(X);if(c=Nr(we),c)try{i[a]=c}catch{}}}if(!c){let X=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${a}`,{kind:X}),null}let p=Gs();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${a}`),null;let d=(O=r.width)!=null?O:300,u=(j=r.height)!=null?j:300,g=(P=s.scale)!=null?P:1,f=((C=(E=s.position)==null?void 0:E.x)!=null?C:0)+((_=(A=s.offset)==null?void 0:A.x)!=null?_:0),h=((D=(I=s.position)==null?void 0:I.y)!=null?D:0)+((M=(T=s.offset)==null?void 0:T.y)!=null?M:0),m=(H=s.rotation)!=null?H:0,b=(Q=o.z_index)!=null?Q:100,y=(B=o.alpha)!=null?B:1,v=document.createElement("div");v.style.cssText=`
|
|
1658
|
+
`,a.appendChild(e)}async function $n(a,e={}){let t=new Ho;await t.init({resizeTo:a,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=o=>{var d,u,g,f;if(!t.renderer)return;let s=(d=o==null?void 0:o.width)!=null?d:a.clientWidth,l=(u=o==null?void 0:o.height)!=null?u:a.clientHeight,c=s&&s>0?s:(g=window.innerWidth)!=null?g:320,p=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,p)};a.appendChild(t.canvas),a.style.position="relative",a.style.display="flex",a.style.flexDirection="column",a.style.alignItems="stretch",a.style.width="100%",a.style.height="100dvh",a.style.minHeight="100vh",a.style.maxWidth="100%",a.style.maxHeight="100%",a.style.boxSizing="border-box",a.style.overflow="hidden",e.background&&(a.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),a.appendChild(n),me.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(s=>s.pause())}),me.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(s=>{s.currentTime>0&&!s.ended&&s.play().catch(()=>{})})}),me.on("resize",({payload:o})=>{i({width:o==null?void 0:o.width,height:o==null?void 0:o.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(o=>{let s=o[0];if(s&&s.contentRect.width>0&&s.contentRect.height>0){let l=Math.round(s.contentRect.width),c=Math.round(s.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let p={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:p}))}}}).observe(a),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Hn,Ticker as at,ColorMatrixFilter as Bo}from"pixi.js";var xi=class{constructor(e){var n,r;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(r=e==null?void 0:e.rotation)!=null?r:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},wi=class{constructor(e){var t,i,n,r;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(r=e==null?void 0:e.tint)!=null?r:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=Yr("handler-playable-sdk/pixi");if(n&&n[t]){let r=n[t];r&&(e.texture=r)}}catch{}}},Ei=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new xi(n.transform),this.renderer=new wi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(at.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,p,d,u,g,f,h,m,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(p=e==null?void 0:e.motion)==null?void 0:p.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(d=this._config)==null?void 0:d.render)==null?void 0:u.asset)==null?void 0:g.type,r=(h=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:h.type,o=(b=(m=this._config)==null?void 0:m.ui)==null?void 0:b.renderMode,s=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==r||o!==s)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${o} to ${r}/${s}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,r,o,s;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(r=(n=this._config)==null?void 0:n.render)==null?void 0:r.anchor,t=(s=(o=this._config)==null?void 0:o.transform)==null?void 0:s.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var r,o,s;if(!((r=this.pixiObject)!=null&&r.scale))return;let e=(o=this._config)==null?void 0:o.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(s=this.transform.scale)!=null?s:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,r,o,s,l,c,p,d;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new Hn;u.blur=(r=e.blur.strength)!=null?r:4,t.push(u)}if((o=e.shadow)!=null&&o.enabled){let u=e.shadow,g=new Hn;g.blur=(s=u.blur)!=null?s:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new Hn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Bo,h=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(h),t.push(f)}}(p=e.stroke)!=null&&p.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(d=e.distortion)!=null&&d.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var p,d,u,g,f,h,m;let e=(p=this._config)==null?void 0:p.motion;if(!e||!((d=e.intro)!=null&&d.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,r=this.transform.position.y,o=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),s=this.transform.scale*(((h=(f=this._config)==null?void 0:f.effects)==null?void 0:h.scale_y)||1);if(this.pixiObject.alpha=(m=t.startAlpha)!=null?m:0,t.startScale!==void 0&&this.pixiObject.scale.set(o*t.startScale,s*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=r+(t.startYOffset||0)),this._introTicker&&at.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(o,s);return}let l=0,c=b=>{var I,j,k,E,C,A;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),x=this.renderer.alpha,w=this.transform.scale*(((j=(I=this._config)==null?void 0:I.effects)==null?void 0:j.scale_x)||1),S=this.transform.scale*(((E=(k=this._config)==null?void 0:k.effects)==null?void 0:E.scale_y)||1),L=this.transform.position.y,P=this.transform.position.x;if(this.pixiObject.alpha=((C=t.startAlpha)!=null?C:0)+(x-((A=t.startAlpha)!=null?A:0))*v,t.startScale!==void 0){let _=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(w*_,S*_)}t.startYOffset!==void 0&&(this.pixiObject.y=L+t.startYOffset+(L-(L+t.startYOffset))*v),y>=1&&(at.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=P,this.pixiObject.y=L,this.pixiObject.scale.set(w,S))};this._introTicker=c,at.shared.add(c)}applyMotion(){var n,r,o;let e=(n=this._config)==null?void 0:n.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(!(this._lastMotionStr===i&&this._tickerCleanup)){if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),(r=e.pulse)!=null&&r.enabled||(o=e.swing)!=null&&o.enabled){let s=0,l=c=>{var h,m,b,y,v,x,w,S,L,P,I;s+=c.deltaTime*.05;let p=this.transform.scale,d=p*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_x)||1),u=p*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_y)||1),g=this.transform.position.x,f=this.transform.position.y;if((v=e.pulse)!=null&&v.enabled){let j=(x=e.pulse.intensity)!=null?x:.1,k=(w=e.pulse.speed)!=null?w:1,C=1+Math.sin(s*k)*j;(S=this.pixiObject.scale)!=null&&S.set?this.pixiObject.scale.set(d*C,u*C):this.pixiObject.scale&&(this.pixiObject.scale.x=d*C,this.pixiObject.scale.y=u*C)}if((L=e.swing)!=null&&L.enabled){let j=(P=e.swing.amplitude)!=null?P:10,k=(I=e.swing.speed)!=null?I:1,E=Math.sin(s*k)*j;e.swing.axis==="vertical"?this.pixiObject.y=f+E:e.swing.axis==="both"?(this.pixiObject.x=g+E,this.pixiObject.y=f+E):this.pixiObject.x=g+E}};at.shared.add(l),this._tickerCleanup=()=>{var c,p,d,u,g;if(at.shared.remove(l),this.pixiObject){let f=this.transform.scale*(((p=(c=this._config)==null?void 0:c.effects)==null?void 0:p.scale_x)||1),h=this.transform.scale*(((u=(d=this._config)==null?void 0:d.effects)==null?void 0:u.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,(g=this.pixiObject.scale)!=null&&g.set?this.pixiObject.scale.set(f,h):this.pixiObject.scale&&(this.pixiObject.scale.x=f,this.pixiObject.scale.y=h)}}}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},wt=class{constructor(e){this.objects=new Map;this.onObjectRebuildRequired=null;this.config=e}create(e,t){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let n=new Ei(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(r,o)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let s=await this.onObjectRebuildRequired(e,o);s&&this.objects.get(e)===s&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),r.updateConfig(o)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Ai={"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 No(a){let e=Ai[a];return e?e.family:(console.warn(`Font ID "${a}" not found in registry, using fallback`),"Arial, sans-serif")}function Fo(a){var t;let e=Ai[a];return e&&(t=e.weight)!=null?t:"400"}function Uo(a,e){Ai[a]=e}function Go(){return Object.keys(Ai)}var rt=null;function qo(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!rt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),rt||(typeof window!="undefined"&&window.lottie?(rt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(a=>a.toLowerCase().includes("lottie")):"no window"),rt=null)),rt}function Vo(a){return!a||a.startsWith("http://")||a.startsWith("https://")||a.startsWith("/")?a:`/${a.replace(/^\.\//,"")}`}function Yo(a){try{let e=new XMLHttpRequest;return e.open("GET",Vo(a),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Nr(a){return!a||typeof a!="object"||!Array.isArray(a.layers)?null:(Array.isArray(a.assets)||(a.assets=[]),Array.isArray(a.chars)||(a.chars=[]),a)}function Tn(a){rt=a}function Wo(a,e,t,i){var S,L,P,I,j,k,E,C,A,_,O,D,T,M,H,Q,B,V,Y;let n=t.objects.get(a);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${a}`),null;let r=((S=n.effects)==null?void 0:S.lottie)||{},o=n.transform||{},s=n.render||{};if(r.enabled===!1||s.visible===!1)return null;let l=i==null?void 0:i[a],c=Nr(l);if(!c){let X=(P=(L=n.render)==null?void 0:L.asset)==null?void 0:P.path;if(typeof X=="string"&&X.toLowerCase().endsWith(".json")){let we=Yo(X);if(c=Nr(we),c)try{i[a]=c}catch{}}}if(!c){let X=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${a}`,{kind:X}),null}let p=qo();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${a}`),null;let d=(I=r.width)!=null?I:300,u=(j=r.height)!=null?j:300,g=(k=o.scale)!=null?k:1,f=((C=(E=o.position)==null?void 0:E.x)!=null?C:0)+((_=(A=o.offset)==null?void 0:A.x)!=null?_:0),h=((D=(O=o.position)==null?void 0:O.y)!=null?D:0)+((M=(T=o.offset)==null?void 0:T.y)!=null?M:0),m=(H=o.rotation)!=null?H:0,b=(Q=s.z_index)!=null?Q:100,y=(B=s.alpha)!=null?B:1,v=document.createElement("div");v.style.cssText=`
|
|
1659
1659
|
position: absolute;
|
|
1660
1660
|
top: calc(50% + ${h}px);
|
|
1661
1661
|
left: calc(50% + ${f}px);
|
|
@@ -1665,4 +1665,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1665
1665
|
pointer-events: none;
|
|
1666
1666
|
z-index: ${b};
|
|
1667
1667
|
opacity: ${y};
|
|
1668
|
-
`,e.appendChild(v);let x;try{x=p.loadAnimation({container:v,renderer:r.renderer||"svg",loop:(V=r.loop)!=null?V:!1,autoplay:(Y=r.autoplay)!=null?Y:!0,animationData:c})}catch(X){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${a}`,X),null}r.speed!==void 0&&x.setSpeed(r.speed);let w=()=>{x.destroy(),v.parentNode&&v.parentNode.removeChild(v)};return r.loop||x.addEventListener("complete",w),{animation:x,cleanup:w}}var Bn=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await $n(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new wt(this.config),this.stage.eventMode="passive",this.stage.interactive=!1,this.stage.interactiveChildren=!0,this.stage.sortableChildren=!0,this.context={app:this.app,stage:this.stage,config:this.config,gameObjectManager:this.gameObjectManager,destinationUrl:this.destinationUrl,root:this.root,engine:this};for(let n of this.systems)n.setContext(this.context);return{app:this.app,gameObjectManager:this.gameObjectManager}}async initSystems(){if(!this.context)throw new Error("[GameEngine] createApp() must be called before initSystems()");for(let e of this.systems)e.init&&await e.init()}async init(e){return await this.createApp(e),await this.initSystems(),{app:this.app,gameObjectManager:this.gameObjectManager}}registerSystems(e){this.systems.push(...e)}async start(){for(let e of this.systems)e.onStart&&await e.onStart();this.app.ticker.add(this.update.bind(this)),window.addEventListener("handler-preview:screen",e=>{let{width:t,height:i}=e.detail;this.resize(t,i)})}update(e){let t=e.deltaTime/60;this.totalTime+=t;for(let i of this.systems)i.update&&i.update(t,this.totalTime)}resize(e,t){for(let i of this.systems)i.onResize&&i.onResize(e,t)}updateConfig(e){this.config=e;for(let t of this.systems)t.context.config=e,t.onConfigUpdate&&t.onConfigUpdate(e)}destroy(){for(let e of this.systems)e.onDestroy&&e.onDestroy();this.app.ticker.remove(this.update.bind(this)),this.app.destroy(!0,{children:!0,texture:!1})}getApp(){return this.app}getGameObjectManager(){return this.gameObjectManager}getTotalTime(){return this.totalTime}getSystem(e){let t=this.systems.find(i=>i instanceof e);if(!t)throw new Error(`System ${e.name} not found!`);return t}};var Et=class{setContext(e){this.context=e}};var At=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as Fr from"pixi.js";var Ws=Fr;typeof window!="undefined"&&(window.__basePixi=Fr);import{Sprite as Ks,Text as Xs,TextStyle as Js,Texture as Ur}from"pixi.js";var Gr=a=>a*Math.PI/180;function Zs(a,e){var s,o,l,c,p;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new Js({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(p=t.letterSpacing)!=null?p:0}),r=new Xs({text:t.text,style:n});return r.label=a,r}function Qs(a){var p,d,u,g,f,h,m,b,y,v;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:r,denyList:s}=a,o={},l={},c={};t.sortableChildren=!0;for(let[x,w]of i.objects.entries()){if(s!=null&&s.has(x)||r&&!r.has(x)||(w==null?void 0:w.enabled)===!1)continue;let S=(d=(p=w==null?void 0:w.render)==null?void 0:p.asset)==null?void 0:d.path,L=(g=(u=w==null?void 0:w.render)==null?void 0:u.asset)==null?void 0:g.type,k=!!(S&&L==="image"),O=!!((f=w==null?void 0:w.ui)!=null&&f.text),j=O?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,P;if(j==="png"&&k?P="png":j==="text"&&O?P="text":k?P="png":O?P="text":P="skip",P!=="skip"){if(P==="text"){let E=Zs(x,w);if(!E)continue;let C=w.render;E.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,E.visible=(C==null?void 0:C.visible)!==!1,E.zIndex=typeof(C==null?void 0:C.z_index)=="number"?C.z_index:0,C!=null&&C.anchor&&typeof C.anchor.x=="number"&&typeof C.anchor.y=="number"?E.anchor.set(C.anchor.x,C.anchor.y):E.anchor.set(.5,.5);let A=w.transform,_=(A==null?void 0:A.position)||(A==null?void 0:A.offset);_&&E.position.set((m=_.x)!=null?m:0,(b=_.y)!=null?b:0);let I=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(I,I);let D=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=Gr(D),E.parent||t.addChild(E);try{n.create(x,E)}catch{}o[x]=E,c[x]=E}else if(P==="png"){let E=le[x]||(typeof Ur!="undefined"?Ur.EMPTY:void 0),C=new Ks(E);C.label=x;let A=w.render;C.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,C.visible=(A==null?void 0:A.visible)!==!1,C.zIndex=typeof(A==null?void 0:A.z_index)=="number"?A.z_index:0,A!=null&&A.anchor&&typeof A.anchor.x=="number"&&typeof A.anchor.y=="number"&&C.anchor.set(A.anchor.x,A.anchor.y);let _=w.transform,I=(_==null?void 0:_.position)||(_==null?void 0:_.offset);I&&C.position.set((y=I.x)!=null?y:0,(v=I.y)!=null?v:0);let D=typeof(_==null?void 0:_.scale)=="number"?_.scale:1;C.scale.set(D,D);let T=typeof(_==null?void 0:_.rotation)=="number"?_.rotation:0;C.rotation=Gr(T),C.parent||t.addChild(C);try{n.create(x,C)}catch{}o[x]=C,l[x]=C}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Nn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new At}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var o;let s=this.registry.get(r);if(!s){console.warn("[Assets] No config found for object:",r);return}try{let l=await Pe.create(r,s,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Pe.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},qr=new Nn,eo=new Proxy(qr,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});function to(a,e){qr.init(a,e)}var Fn=class extends Et{async init(){Ii(this.context.config,this.context.app),await le.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as io,Point as no}from"pixi.js";var xe={width:400,height:600,designWidth:400,scaleFactor:1},Ci={scale:1,position:1},Ti=[];function ao(a,e,t,i,n,r,s){Ti.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,s,!1)}function ro(){Ti.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(a,xe.width,xe.height,i,n,!0,!1)})}function so(){Ti.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Un(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),xe.width=a,xe.height=e,xe.scaleFactor=Math.min(a/xe.designWidth,1.15),Ci.scale=xe.scaleFactor,Ci.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ci.scale.toFixed(3)}`),ro()}var U={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function oo(a,e,t){let i=U[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function lo(){return U}var co={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Si(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function st(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Si(a[0],e.x),y:Si(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Si(i.x,e.x),y:Si(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=co[i])!=null?t:e}return e}function Ct(a,e,t,i={}){var g,f,h,m,b,y;let n=st(t),r=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=r.left)!=null?h:0)+s.x,l=((m=r.right)!=null?m:0)+s.x,c=((b=r.top)!=null?b:0)+s.y,p=((y=r.bottom)!=null?y:0)+s.y,d=Math.max(0,a-o-l),u=Math.max(0,e-c-p);return{x:o+d*n.x,y:c+u*n.y}}function Tt(a,e,t,i={}){var h,m,b,y,v,x;let n=(h=i.inset)!=null?h:{},r=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+r.x,o=((y=n.right)!=null?y:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((x=n.bottom)!=null?x:0)+r.y,p=Math.max(0,a-s-o),d=Math.max(0,e-l-c),u=st(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+p*g,y:l+d*f}}function Gn(a,e,t,i={}){var p,d,u;if(!a)return;let n=i.positionRatio?Tt(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ct(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),r=(p=i.offset)!=null?p:{x:0,y:0},s=n.x+r.x,o=n.y+r.y;a.anchor&&i.renderAnchor&&a.anchor.set(i.renderAnchor.x,i.renderAnchor.y),re(a,s,o);let l=(d=i.scale)!=null?d:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&pe(a,l*c)}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,Un(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Un(window.innerWidth,window.innerHeight),window.updateDebugConfig=oo,window.getDebugConfig=lo,window.copyConfig=wo,window.applyConfig=St,window.applyConfigForRatio=Eo,window.positionAtBottom=Vr,window.positionAtTop=go,window.positionAtCenter=ho,window.positionAtLeft=fo,window.positionAtRight=mo,window.positionAtBottomLeft=bo,window.positionAtBottomRight=yo,window.positionAtTopLeft=vo,window.positionAtTopRight=xo,window.applyPositionContract=uo,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Li(a,e,t=0){return a*e+t}function Pi(a,e,t=0){return a*(1-e)+t}function ki(a,e,t=0){return a*e+t}function _i(a,e,t=0){return a*(1-e)+t}function ie(a,e=0){return a/2+e}function po(a,e){return a*e}function uo(a,e,t,i){var s,o,l,c,p,d,u,g,f,h,m,b,y,v,x,w,S,L,k,O;let n=0,r=0;switch(i.type){case"top":n=ie(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),r=Li(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ie(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Pi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ki(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),r=ie(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=_i(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=ie(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":n=ie(e,(L=(S=i.offset)==null?void 0:S.x)!=null?L:0),r=ie(t,(O=(k=i.offset)==null?void 0:k.y)!=null?O:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function Vr(a,e,t,i=.2,n=1,r=!0,s=!1){let o=po(t,i),l=Pi(t,i/2);re(a,ie(e),l);let c=r?n*xe.scaleFactor:n;pe(a,c),s&&!Ti.find(p=>p.element===a)&&ao(a,Vr,e,t,i,n,r)}function go(a,e,t,i=.1,n=1){re(a,ie(e),Li(t,i)),pe(a,n)}function ho(a,e,t,i=0,n=0,r=1){re(a,ie(e,i),ie(t,n)),pe(a,r)}function fo(a,e,t,i=.1,n=1){re(a,ki(e,i),ie(t)),pe(a,n)}function mo(a,e,t,i=.1,n=1){re(a,_i(e,i),ie(t)),pe(a,n)}function bo(a,e,t,i=.05,n=.05,r=1){re(a,ki(e,n),Pi(t,i)),pe(a,r)}function yo(a,e,t,i=.05,n=.05,r=1){re(a,_i(e,n),Pi(t,i)),pe(a,r)}function vo(a,e,t,i=.05,n=.05,r=1){re(a,ki(e,n),Li(t,i)),pe(a,r)}function xo(a,e,t,i=.05,n=.05,r=1){re(a,_i(e,n),Li(t,i)),pe(a,r)}function re(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function pe(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var De={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function wo(a){return a&&De[a]?JSON.parse(JSON.stringify(De[a])):JSON.parse(JSON.stringify(U))}function St(a){Object.keys(a).forEach(e=>{let t=e;U[t]&&a[t]&&Object.assign(U[t],a[t])}),console.log("Config applied:",a)}function Eo(a,e){let t=a/e;t>1.6?(St(De.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(St(De.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(St(De.square),console.log("Applied SQUARE config for ratio:",t)):(St(De.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=De,a.resolveAnchorVec2=a.resolveAnchorVec2||st,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||Ct,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||Tt}var Z=null;function Ao(a,e,t,i,n,r={}){var D,T,M,H,Q,B,V,Y,X,we,ze,Lt,z,se,ue,Ee,ge,Me,$e,He,he,Be,Ae,Pt,kt,qn,Vn,Yn,Wn,Kn,Xn,Jn,Zn,Qn;let s=(D=r.enableDebugLogs)!=null?D:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",r));let{mainContainer:o,label:l,background:c,backgroundTexture:p,app:d}=a;if(!d||!d.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:d.renderer.width,height:d.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:d.screen.width,height:d.screen.height}));let u=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*U.layout.screen_scale_x,h=g*U.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:U.layout.screen_scale_x,screen_scale_y:U.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:h,midX:m}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=y.design_width_portrait||400,x=f/v;x=Math.min(x,1.15);let w=x*((T=U.engine.scale)!=null?T:1),S=(M=r.skipMainContainerTransform)!=null?M:!1;!S&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(w):(o.scale.x=w,o.scale.y=w));let L=(H=y.main_container_anchor)!=null?H:"center",k=(Q=y.main_container_position_ratio)!=null?Q:{x:.5,y:.5},O=(B=y.main_container_offset)!=null?B:{x:0,y:0},j=y.main_container_position_ratio?Tt(u,g,k):Ct(u,g,L),P=j.x+O.x+U.layout.position_offset.x,E=j.y+O.y+U.layout.position_offset.y;if(!S&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(P,E):(o.position.x=P,o.position.y=E)),n&&(o!=null&&o.toLocal))for(let[J,K]of e.objects.entries()){let N=K==null?void 0:K.transform;if(!N||((V=N.position_mode)!=null?V:"static")!=="static")continue;let $=(Y=n.get)==null?void 0:Y.call(n,J),oe=((X=$==null?void 0:$.getDisplayObject)==null?void 0:X.call($))||($==null?void 0:$.pixiObject)||$;if(!oe||oe.parent!==o)continue;let _t=N.position_ratio!=null?Tt(u,g,N.position_ratio):Ct(u,g,(we=N.anchor)!=null?we:"center"),Mt=o.toLocal(new no(_t.x,_t.y)),Rt=(ze=N.position)!=null?ze:{x:0,y:0},Re=Mt.x+Rt.x,Mi=Mt.y+Rt.y;typeof($==null?void 0:$.setPosition)=="function"?$.setPosition(Re,Mi):(re(oe,Re,Mi),(Lt=$==null?void 0:$.transform)!=null&&Lt.position&&($.transform.position.x=Re,$.transform.position.y=Mi))}let C=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,_=((C==null?void 0:C.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(U.layout.debug_rect_visible&&_){(!Z||Z.parent!==d.stage)&&(Z==null||Z.destroy(),Z=new io,Z.zIndex=9999,d.stage.addChild(Z)),Z.clear();let J=U.layout.debug_rect_scale_x,K=U.layout.debug_rect_scale_y,N=(u-4)*J,Se=(g-4)*K,$=(u-N)/2,oe=(g-Se)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:N,rectH:Se,offsetX:$,offsetY:oe}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+$,y:2+oe,width:N,height:Se})),Z.rect(2+$,2+oe,N,Se).stroke({width:U.layout.debug_rect_thickness,color:U.layout.debug_rect_color})}else Z&&(Z.destroy(),Z=null);let I=((z=a.label)==null?void 0:z.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&I){let J=(ue=(se=I==null?void 0:I.transform)==null?void 0:se.anchor)!=null?ue:"center",K=(Ee=I==null?void 0:I.transform)==null?void 0:Ee.position_ratio,N=((ge=I==null?void 0:I.transform)==null?void 0:ge.offset)||{x:0,y:0};Gn(l,u,g,{anchor:J,positionRatio:K,offset:{x:N.x*w,y:N.y*w},renderAnchor:st(J)})}if(l&&l.alpha>0){let J=1+Math.sin(t*U.engine.label_pulse_speed)*U.engine.label_pulse_intensity,K=($e=(Me=I==null?void 0:I.transform)==null?void 0:Me.scale)!=null?$e:1,N=J*w*K;l.scale&&(typeof l.scale.set=="function"?l.scale.set(N):(l.scale.x=N,l.scale.y=N))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(He=c.constructor)==null?void 0:He.name)),c.alpha=((Be=(he=b.background)==null?void 0:he.alpha)!=null?Be:.98)*U.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let J=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",J);let K=(J==null?void 0:J.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",K);let N=K.offset||{x:0,y:0},Se=((Pt=(Ae=b.background)==null?void 0:Ae.offset_y)!=null?Pt:0)+U.engine.background_offset_y,$=(kt=K.anchor)!=null?kt:"center",oe=K.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:N,bgRuntimeOffsetY:Se,bgScreenAnchor:$,bgPositionRatio:oe,baseWidth:u,baseHeight:g,finalScale:w}),Gn(c,u,g,{anchor:$,positionRatio:oe,offset:{x:N.x*w,y:N.y*w+Se},renderAnchor:st($)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(qn=c.scale)==null?void 0:qn.x,scaleY:(Vn=c.scale)==null?void 0:Vn.y,anchorX:(Yn=c.anchor)==null?void 0:Yn.x,anchorY:(Wn=c.anchor)==null?void 0:Wn.y,pivotX:(Kn=c.pivot)==null?void 0:Kn.x,pivotY:(Xn=c.pivot)==null?void 0:Xn.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:p==null?void 0:p.width,textureHeight:p==null?void 0:p.height})),p){let _t=Math.max(f/p.width,h/p.height),Mt=(Zn=(Jn=b.background)==null?void 0:Jn.scale_multiplier)!=null?Zn:1.05,Rt=(Qn=K.scale)!=null?Qn:1,Re=_t*Mt*U.engine.background_scale*Rt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Re):(c.scale.x=Re,c.scale.y=Re))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function So(a){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:r}=a,s=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(r.showHook),setTimeout(()=>{t(1),i(1),e(r.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=s.tutorial_delay_ms)!=null?c:1500)}export{Oa as a,$n as b,xi as c,wi as d,Ei as e,wt as f,Bs as g,Ns as h,Fs as i,Us as j,Tn as k,Ys as l,Pe as m,Bn as n,Et as o,At as p,Ws as q,Qs as r,eo as s,to as t,Fn as u,Ci as v,so as w,Un as x,st as y,Ct as z,Tt as A,Gn as B,Ao as C,So as D,ja as E,Da as F,Ui as G,Ge as H,zo as I,gi as J,vn as K,wr as L,En as M,ld as N,cd as O,be as P,Ts as Q,Ls as R,Pn as S,de as T,me as U};
|
|
1668
|
+
`,e.appendChild(v);let x;try{x=p.loadAnimation({container:v,renderer:r.renderer||"svg",loop:(V=r.loop)!=null?V:!1,autoplay:(Y=r.autoplay)!=null?Y:!0,animationData:c})}catch(X){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${a}`,X),null}r.speed!==void 0&&x.setSpeed(r.speed);let w=()=>{x.destroy(),v.parentNode&&v.parentNode.removeChild(v)};return r.loop||x.addEventListener("complete",w),{animation:x,cleanup:w}}var Bn=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await $n(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new wt(this.config),this.stage.eventMode="passive",this.stage.interactive=!1,this.stage.interactiveChildren=!0,this.stage.sortableChildren=!0,this.context={app:this.app,stage:this.stage,config:this.config,gameObjectManager:this.gameObjectManager,destinationUrl:this.destinationUrl,root:this.root,engine:this};for(let n of this.systems)n.setContext(this.context);return{app:this.app,gameObjectManager:this.gameObjectManager}}async initSystems(){if(!this.context)throw new Error("[GameEngine] createApp() must be called before initSystems()");for(let e of this.systems)e.init&&await e.init()}async init(e){return await this.createApp(e),await this.initSystems(),{app:this.app,gameObjectManager:this.gameObjectManager}}registerSystems(e){this.systems.push(...e)}async start(){for(let e of this.systems)e.onStart&&await e.onStart();this.app.ticker.add(this.update.bind(this)),window.addEventListener("handler-preview:screen",e=>{let{width:t,height:i}=e.detail;this.resize(t,i)})}update(e){let t=e.deltaTime/60;this.totalTime+=t;for(let i of this.systems)i.update&&i.update(t,this.totalTime)}resize(e,t){for(let i of this.systems)i.onResize&&i.onResize(e,t)}updateConfig(e){this.config=e;for(let t of this.systems)t.context.config=e,t.onConfigUpdate&&t.onConfigUpdate(e)}destroy(){for(let e of this.systems)e.onDestroy&&e.onDestroy();this.app.ticker.remove(this.update.bind(this)),this.app.destroy(!0,{children:!0,texture:!1})}getApp(){return this.app}getGameObjectManager(){return this.gameObjectManager}getTotalTime(){return this.totalTime}getSystem(e){let t=this.systems.find(i=>i instanceof e);if(!t)throw new Error(`System ${e.name} not found!`);return t}};var Et=class{setContext(e){this.context=e}};var At=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as Fr from"pixi.js";var Ko=Fr;typeof window!="undefined"&&(window.__basePixi=Fr);import{Sprite as Xo,Text as Jo,TextStyle as Zo,Texture as Ur}from"pixi.js";var Gr=a=>a*Math.PI/180;function Qo(a,e){var o,s,l,c,p;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(o=e.render)!=null&&o.tint&&(i=e.render.tint);let n=new Zo({fontFamily:(s=t.font)!=null?s:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(p=t.letterSpacing)!=null?p:0}),r=new Jo({text:t.text,style:n});return r.label=a,r}function es(a){var p,d,u,g,f,h,m,b,y,v;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:r,denyList:o}=a,s={},l={},c={};t.sortableChildren=!0;for(let[x,w]of i.objects.entries()){if(o!=null&&o.has(x)||r&&!r.has(x)||(w==null?void 0:w.enabled)===!1)continue;let S=(d=(p=w==null?void 0:w.render)==null?void 0:p.asset)==null?void 0:d.path,L=(g=(u=w==null?void 0:w.render)==null?void 0:u.asset)==null?void 0:g.type,P=!!(S&&L==="image"),I=!!((f=w==null?void 0:w.ui)!=null&&f.text),j=I?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,k;if(j==="png"&&P?k="png":j==="text"&&I?k="text":P?k="png":I?k="text":k="skip",k!=="skip"){if(k==="text"){let E=Qo(x,w);if(!E)continue;let C=w.render;E.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,E.visible=(C==null?void 0:C.visible)!==!1,E.zIndex=typeof(C==null?void 0:C.z_index)=="number"?C.z_index:0,C!=null&&C.anchor&&typeof C.anchor.x=="number"&&typeof C.anchor.y=="number"?E.anchor.set(C.anchor.x,C.anchor.y):E.anchor.set(.5,.5);let A=w.transform,_=(A==null?void 0:A.position)||(A==null?void 0:A.offset);_&&E.position.set((m=_.x)!=null?m:0,(b=_.y)!=null?b:0);let O=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(O,O);let D=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=Gr(D),E.parent||t.addChild(E);try{n.create(x,E)}catch{}s[x]=E,c[x]=E}else if(k==="png"){let E=le[x]||(typeof Ur!="undefined"?Ur.EMPTY:void 0),C=new Xo(E);C.label=x;let A=w.render;C.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,C.visible=(A==null?void 0:A.visible)!==!1,C.zIndex=typeof(A==null?void 0:A.z_index)=="number"?A.z_index:0,A!=null&&A.anchor&&typeof A.anchor.x=="number"&&typeof A.anchor.y=="number"&&C.anchor.set(A.anchor.x,A.anchor.y);let _=w.transform,O=(_==null?void 0:_.position)||(_==null?void 0:_.offset);O&&C.position.set((y=O.x)!=null?y:0,(v=O.y)!=null?v:0);let D=typeof(_==null?void 0:_.scale)=="number"?_.scale:1;C.scale.set(D,D);let T=typeof(_==null?void 0:_.rotation)=="number"?_.rotation:0;C.rotation=Gr(T),C.parent||t.addChild(C);try{n.create(x,C)}catch{}s[x]=C,l[x]=C}}}return t.parent||e.addChild(t),{objects:s,sprites:l,texts:c}}var Nn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new At}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await ke.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await ke.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},qr=new Nn,ts=new Proxy(qr,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});function is(a,e){qr.init(a,e)}var Fn=class extends Et{async init(){Oi(this.context.config,this.context.app),await le.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as ns,Point as as}from"pixi.js";var xe={width:400,height:600,designWidth:400,scaleFactor:1},Ci={scale:1,position:1},Ti=[];function rs(a,e,t,i,n,r,o){Ti.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,o,!1)}function os(){Ti.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(a,xe.width,xe.height,i,n,!0,!1)})}function ss(){Ti.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Un(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),xe.width=a,xe.height=e,xe.scaleFactor=Math.min(a/xe.designWidth,1.15),Ci.scale=xe.scaleFactor,Ci.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ci.scale.toFixed(3)}`),os()}var U={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function ls(a,e,t){let i=U[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function cs(){return U}var ds={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Si(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function ot(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Si(a[0],e.x),y:Si(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Si(i.x,e.x),y:Si(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=ds[i])!=null?t:e}return e}function Ct(a,e,t,i={}){var g,f,h,m,b,y;let n=ot(t),r=(g=i.inset)!=null?g:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((h=r.left)!=null?h:0)+o.x,l=((m=r.right)!=null?m:0)+o.x,c=((b=r.top)!=null?b:0)+o.y,p=((y=r.bottom)!=null?y:0)+o.y,d=Math.max(0,a-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function Tt(a,e,t,i={}){var h,m,b,y,v,x;let n=(h=i.inset)!=null?h:{},r=(m=i.padding)!=null?m:{x:0,y:0},o=((b=n.left)!=null?b:0)+r.x,s=((y=n.right)!=null?y:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((x=n.bottom)!=null?x:0)+r.y,p=Math.max(0,a-o-s),d=Math.max(0,e-l-c),u=ot(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*f}}function Gn(a,e,t,i={}){var p,d,u;if(!a)return;let n=i.positionRatio?Tt(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ct(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),r=(p=i.offset)!=null?p:{x:0,y:0},o=n.x+r.x,s=n.y+r.y;a.anchor&&i.renderAnchor&&a.anchor.set(i.renderAnchor.x,i.renderAnchor.y),re(a,o,s);let l=(d=i.scale)!=null?d:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&pe(a,l*c)}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,Un(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Un(window.innerWidth,window.innerHeight),window.updateDebugConfig=ls,window.getDebugConfig=cs,window.copyConfig=ws,window.applyConfig=St,window.applyConfigForRatio=Es,window.positionAtBottom=Vr,window.positionAtTop=gs,window.positionAtCenter=hs,window.positionAtLeft=fs,window.positionAtRight=ms,window.positionAtBottomLeft=bs,window.positionAtBottomRight=ys,window.positionAtTopLeft=vs,window.positionAtTopRight=xs,window.applyPositionContract=us,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Li(a,e,t=0){return a*e+t}function ki(a,e,t=0){return a*(1-e)+t}function Pi(a,e,t=0){return a*e+t}function _i(a,e,t=0){return a*(1-e)+t}function ie(a,e=0){return a/2+e}function ps(a,e){return a*e}function us(a,e,t,i){var o,s,l,c,p,d,u,g,f,h,m,b,y,v,x,w,S,L,P,I;let n=0,r=0;switch(i.type){case"top":n=ie(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Li(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ie(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=ki(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Pi(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),r=ie(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=_i(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=ie(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":n=ie(e,(L=(S=i.offset)==null?void 0:S.x)!=null?L:0),r=ie(t,(I=(P=i.offset)==null?void 0:P.y)!=null?I:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function Vr(a,e,t,i=.2,n=1,r=!0,o=!1){let s=ps(t,i),l=ki(t,i/2);re(a,ie(e),l);let c=r?n*xe.scaleFactor:n;pe(a,c),o&&!Ti.find(p=>p.element===a)&&rs(a,Vr,e,t,i,n,r)}function gs(a,e,t,i=.1,n=1){re(a,ie(e),Li(t,i)),pe(a,n)}function hs(a,e,t,i=0,n=0,r=1){re(a,ie(e,i),ie(t,n)),pe(a,r)}function fs(a,e,t,i=.1,n=1){re(a,Pi(e,i),ie(t)),pe(a,n)}function ms(a,e,t,i=.1,n=1){re(a,_i(e,i),ie(t)),pe(a,n)}function bs(a,e,t,i=.05,n=.05,r=1){re(a,Pi(e,n),ki(t,i)),pe(a,r)}function ys(a,e,t,i=.05,n=.05,r=1){re(a,_i(e,n),ki(t,i)),pe(a,r)}function vs(a,e,t,i=.05,n=.05,r=1){re(a,Pi(e,n),Li(t,i)),pe(a,r)}function xs(a,e,t,i=.05,n=.05,r=1){re(a,_i(e,n),Li(t,i)),pe(a,r)}function re(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function pe(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var De={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function ws(a){return a&&De[a]?JSON.parse(JSON.stringify(De[a])):JSON.parse(JSON.stringify(U))}function St(a){Object.keys(a).forEach(e=>{let t=e;U[t]&&a[t]&&Object.assign(U[t],a[t])}),console.log("Config applied:",a)}function Es(a,e){let t=a/e;t>1.6?(St(De.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(St(De.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(St(De.square),console.log("Applied SQUARE config for ratio:",t)):(St(De.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=De,a.resolveAnchorVec2=a.resolveAnchorVec2||ot,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||Ct,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||Tt}var Z=null;function As(a,e,t,i,n,r={}){var D,T,M,H,Q,B,V,Y,X,we,ze,Lt,z,oe,ue,Ee,ge,Me,$e,He,he,Be,Ae,kt,Pt,qn,Vn,Yn,Wn,Kn,Xn,Jn,Zn,Qn;let o=(D=r.enableDebugLogs)!=null?D:!1;o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",r));let{mainContainer:s,label:l,background:c,backgroundTexture:p,app:d}=a;if(!d||!d.renderer){o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:d.renderer.width,height:d.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:d.screen.width,height:d.screen.height}));let u=i.width,g=i.height;o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*U.layout.screen_scale_x,h=g*U.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},y=b.layout||{};o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:U.layout.screen_scale_x,screen_scale_y:U.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:h,midX:m}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=y.design_width_portrait||400,x=f/v;x=Math.min(x,1.15);let w=x*((T=U.engine.scale)!=null?T:1),S=(M=r.skipMainContainerTransform)!=null?M:!1;!S&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(w):(s.scale.x=w,s.scale.y=w));let L=(H=y.main_container_anchor)!=null?H:"center",P=(Q=y.main_container_position_ratio)!=null?Q:{x:.5,y:.5},I=(B=y.main_container_offset)!=null?B:{x:0,y:0},j=y.main_container_position_ratio?Tt(u,g,P):Ct(u,g,L),k=j.x+I.x+U.layout.position_offset.x,E=j.y+I.y+U.layout.position_offset.y;if(!S&&s&&s.position&&(typeof s.position.set=="function"?s.position.set(k,E):(s.position.x=k,s.position.y=E)),n&&(s!=null&&s.toLocal))for(let[J,K]of e.objects.entries()){let N=K==null?void 0:K.transform;if(!N||((V=N.position_mode)!=null?V:"static")!=="static")continue;let $=(Y=n.get)==null?void 0:Y.call(n,J),se=((X=$==null?void 0:$.getDisplayObject)==null?void 0:X.call($))||($==null?void 0:$.pixiObject)||$;if(!se||se.parent!==s)continue;let _t=N.position_ratio!=null?Tt(u,g,N.position_ratio):Ct(u,g,(we=N.anchor)!=null?we:"center"),Mt=s.toLocal(new as(_t.x,_t.y)),Rt=(ze=N.position)!=null?ze:{x:0,y:0},Re=Mt.x+Rt.x,Mi=Mt.y+Rt.y;typeof($==null?void 0:$.setPosition)=="function"?$.setPosition(Re,Mi):(re(se,Re,Mi),(Lt=$==null?void 0:$.transform)!=null&&Lt.position&&($.transform.position.x=Re,$.transform.position.y=Mi))}let C=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,_=((C==null?void 0:C.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(U.layout.debug_rect_visible&&_){(!Z||Z.parent!==d.stage)&&(Z==null||Z.destroy(),Z=new ns,Z.zIndex=9999,d.stage.addChild(Z)),Z.clear();let J=U.layout.debug_rect_scale_x,K=U.layout.debug_rect_scale_y,N=(u-4)*J,Se=(g-4)*K,$=(u-N)/2,se=(g-Se)/2;o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:N,rectH:Se,offsetX:$,offsetY:se}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+$,y:2+se,width:N,height:Se})),Z.rect(2+$,2+se,N,Se).stroke({width:U.layout.debug_rect_thickness,color:U.layout.debug_rect_color})}else Z&&(Z.destroy(),Z=null);let O=((z=a.label)==null?void 0:z.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&O){let J=(ue=(oe=O==null?void 0:O.transform)==null?void 0:oe.anchor)!=null?ue:"center",K=(Ee=O==null?void 0:O.transform)==null?void 0:Ee.position_ratio,N=((ge=O==null?void 0:O.transform)==null?void 0:ge.offset)||{x:0,y:0};Gn(l,u,g,{anchor:J,positionRatio:K,offset:{x:N.x*w,y:N.y*w},renderAnchor:ot(J)})}if(l&&l.alpha>0){let J=1+Math.sin(t*U.engine.label_pulse_speed)*U.engine.label_pulse_intensity,K=($e=(Me=O==null?void 0:O.transform)==null?void 0:Me.scale)!=null?$e:1,N=J*w*K;l.scale&&(typeof l.scale.set=="function"?l.scale.set(N):(l.scale.x=N,l.scale.y=N))}if(o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(He=c.constructor)==null?void 0:He.name)),c.alpha=((Be=(he=b.background)==null?void 0:he.alpha)!=null?Be:.98)*U.engine.background_alpha,o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let J=e.objects.get("background_1");o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",J);let K=(J==null?void 0:J.transform)||{};o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",K);let N=K.offset||{x:0,y:0},Se=((kt=(Ae=b.background)==null?void 0:Ae.offset_y)!=null?kt:0)+U.engine.background_offset_y,$=(Pt=K.anchor)!=null?Pt:"center",se=K.position_ratio;if(o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:N,bgRuntimeOffsetY:Se,bgScreenAnchor:$,bgPositionRatio:se,baseWidth:u,baseHeight:g,finalScale:w}),Gn(c,u,g,{anchor:$,positionRatio:se,offset:{x:N.x*w,y:N.y*w+Se},renderAnchor:ot($)}),o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(qn=c.scale)==null?void 0:qn.x,scaleY:(Vn=c.scale)==null?void 0:Vn.y,anchorX:(Yn=c.anchor)==null?void 0:Yn.x,anchorY:(Wn=c.anchor)==null?void 0:Wn.y,pivotX:(Kn=c.pivot)==null?void 0:Kn.x,pivotY:(Xn=c.pivot)==null?void 0:Xn.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:p==null?void 0:p.width,textureHeight:p==null?void 0:p.height})),p){let _t=Math.max(f/p.width,h/p.height),Mt=(Zn=(Jn=b.background)==null?void 0:Jn.scale_multiplier)!=null?Zn:1.05,Rt=(Qn=K.scale)!=null?Qn:1,Re=_t*Mt*U.engine.background_scale*Rt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Re):(c.scale.x=Re,c.scale.y=Re))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function Ss(a){var s,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:r}=a,o=((l=(s=n.engine)==null?void 0:s.runtime)==null?void 0:l.timeline)||{};e(r.showHook),setTimeout(()=>{t(1),i(1),e(r.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=o.tutorial_delay_ms)!=null?c:1500)}export{Ia as a,$n as b,xi as c,wi as d,Ei as e,wt as f,No as g,Fo as h,Uo as i,Go as j,Tn as k,Wo as l,ke as m,Bn as n,Et as o,At as p,Ko as q,es as r,ts as s,is as t,Fn as u,Ci as v,ss as w,Un as x,ot as y,Ct as z,Tt as A,Gn as B,As as C,Ss as D,ja as E,Da as F,Ui as G,Ge as H,zs as I,gi as J,vn as K,wr as L,En as M,ld as N,cd as O,be as P,Lo as Q,ko as R,kn as S,de as T,me as U};
|