handler-playable-sdk 0.5.26 → 0.5.28
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-CFNCYJKB.js → chunk-EZMANCHN.js} +211 -105
- 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 +195 -89
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +13 -13
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +17 -17
- package/dist/three/index.js +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as Di,d as le,e as Hi}from"./chunk-I5OOVR5U.js";import{i as Dt}from"./chunk-LV4HGC5G.js";import{c as lt,d as jt,e as Be,g as la,h as $i,j as Bi,k as zt,l as Ni,m as ca,n as Fi,o as da}from"./chunk-ZLL42OOV.js";import{a as Qr}from"./chunk-JXBG6UFL.js";import{Application as Wo}from"pixi.js";var Ce={};function Ht(r,e,t=!1){Ce[r]||(Ce[r]=[]),Ce[r].push({fn:e,once:t})}function Ui(r,e){if(Ce[r]){if(!e){delete Ce[r];return}Ce[r]=Ce[r].filter(t=>t.fn!==e)}}function $t(r,...e){let t=Ce[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Ui(r,i.fn)}function ee(r,e){Ht(r,e,!0)}var G=null,ne=[],Ne=null;function ga(r){G=r,ne=[],Ne!==null&&(clearTimeout(Ne),Ne=null)}function ha(){var r,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(r=G==null?void 0:G.batchSize)!=null?r: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 pa(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Gi(r,e){let t=ha();if(e&&t.endpoint){if(ne.push(r),ne.length>t.maxQueue&&(ne=ne.slice(ne.length-t.maxQueue)),ne.length>=t.batchSize){ua();return}Ne===null&&(Ne=window.setTimeout(()=>{Ne=null,ua()},t.flushIntervalMs))}}async function ua(){let r=ha();if(!r.endpoint||ne.length===0)return;let e=ne.splice(0,r.batchSize);await pa(r.endpoint,{events:e},r.transport,r.debug),ne.length>0&&await pa(r.endpoint,{events:ne.splice(0,r.batchSize)},r.transport,r.debug)}function fa(r){return Math.max(0,Math.min(1,r))}function eo(r){let e=String(r!=null?r:"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 to(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function ma(r,e,t){try{r[e]=t}catch{}}function io(r){let e=r==null?void 0:r.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 ba(r,e){let t=r==null?void 0:r.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 va(r,e){let t=io(r);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 ya(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),r.size>0&&i()})},n=p=>{var u;r.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},a=p=>{r.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,a(p))},s=()=>{var d,u;let p=ct();for(let g of Array.from(r)){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=fa(h),v=g.repeat>=0?g.repeat+1:1,b=g.repeat>0?Math.min(Math.floor(h),v-1):0;if(g.repeat>0&&h>=1){let w=h-b;m=fa(w)}let y=g.ease(m);g.yoyo&&b%2===1&&(y=1-y);for(let w of g.props)ma(g.target,w.key,w.from+(w.to-w.from)*y);g.scaleFrom&&g.scaleTo&&ba(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*y,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*y});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=v){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=eo(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,v=d.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),y=[];for(let E of Object.keys(d)){if(b.has(E))continue;let L=d[E];typeof L=="number"&&y.push({key:E,from:to(p,E),to:L})}let x=va(p,d);return{target:p,startMs:ct(),delayMs:f,durationMs:g,ease:h,props:y,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:v,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"&&ma(p,g,f)}let u=va(p,d);u.to&&ba(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=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let y=typeof b=="string"?b.trim():"";return y.startsWith("+=")?u+Math.max(0,Number(y.slice(2))*1e3||0):y?Math.max(0,Number(y)*1e3||0):u},m=b=>{d.push(b);let y=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);u=Math.max(u,b.atMs+y)},v={to(b,y,x){return m({kind:"to",target:b,vars:y,atMs:h(x)}),v},fromTo(b,y,x,w){return m({kind:"fromTo",target:b,vars:x,from:y,atMs:h(w)}),v},play(){var b,y;if(g)return v;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(b=x.from)!=null?b:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((y=x.vars.delay)!=null?y:0)}));return v},pause(){for(let b of f)b.pause();return v},kill(){for(let b of f)b.kill();f=[],g=!1}};return p.paused||v.play(),v}};return c}function xa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=ya()}catch{}}var wa={name:"handler-playable-sdk",version:"0.5.26",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,ao=te++,Ea=te++,Sa=te++,Aa=te++,Ca=te++,Ta=te++,La=te++,ka=te++,Pa=te++,Ma=te++,_a=te++,Ia=te++,F=ao;function Oa(){return F===Ea}function Ra(){return F===Sa}function ja(){return F===Aa}function za(){return F===Ca}function Fe(){return F===Ta}function Ue(){return F===La}function Da(){return F===ka}function Ha(){return F===Pa}function $a(){return F===Ma}function qi(){return F===_a}function Vi(){return F===Ia}function Ba(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),F=Ea;return}catch{}else if(r==="dapi")try{dapi.isReady(),F=Sa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=Aa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=Ca)}catch{}else if(e==="mintegral")window.gameReady&&(F=Ta);else if(e==="tapjoy")window.TJ_API&&(F=La);else if(e==="tiktok")window.openAppStore&&(F=ka);else if(e==="smadex")try{window.smxTracking&&(F=Pa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ma)}catch{}else e==="vungle"?F=_a:(r==="nucleo"||e==="nucleo")&&(F=Ia)}import Yi from"lottie-web";var Na=Yi;typeof window!="undefined"&&(window.lottie=Yi,window.__baseLottie=Yi);function q(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Us=[{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)}],Gs=[{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)}],qs=[{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)}],Wi=[{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 Fa=[...Wi],Ua=[{category:"playable",label:"Playable Ad",devices:Wi}],Ki=Wi[0];function Ge(r){return Fa.find(e=>e.id===r)||Ki}function Vs(r){return Fa.filter(e=>e.category===r)}var qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=a(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}lt({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 a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Xi(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Bt=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 a=n(t);if(!a)return;let o=this.updateManager.getNestedProperty(a,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,a),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 a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===a||p.slotId===a)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category: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 a;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=(a=s==null?void 0:s.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");Xi({objectId:e,category:a,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),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 a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let 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")}};var ro=["loading","start","gameplay","tutorial","endgame"],oo=["environment","ui","character","system","backgrounds"],so=["bg","world","ui"],Ga={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Nt=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
1
|
+
import{c as Ni,d as be,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./chunk-LV4HGC5G.js";import{c as ut,d as zt,e as Be,g as ca,h as Fi,j as Ui,k as Dt,l as $t,m as da,n as Gi,o as pa}from"./chunk-ZLL42OOV.js";import{a as eo}from"./chunk-JXBG6UFL.js";import{Application as Ko}from"pixi.js";var Ie={};function Nt(r,e,t=!1){Ie[r]||(Ie[r]=[]),Ie[r].push({fn:e,once:t})}function qi(r,e){if(Ie[r]){if(!e){delete Ie[r];return}Ie[r]=Ie[r].filter(t=>t.fn!==e)}}function Bt(r,...e){let t=Ie[r];if(t)for(let i of[...t])i.fn(...e),i.once&&qi(r,i.fn)}function se(r,e){Nt(r,e,!0)}var K=null,ue=[],qe=null;function ha(r){K=r,ue=[],qe!==null&&(clearTimeout(qe),qe=null)}function fa(){var r,e,t;return{endpoint:(K==null?void 0:K.endpoint)||"",transport:(K==null?void 0:K.transport)||"beacon",batchSize:(r=K==null?void 0:K.batchSize)!=null?r:10,flushIntervalMs:(e=K==null?void 0:K.flushIntervalMs)!=null?e:300,maxQueue:(t=K==null?void 0:K.maxQueue)!=null?t:200,debug:!!(K!=null&&K.debug)}}async function ua(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Vi(r,e){let t=fa();if(e&&t.endpoint){if(ue.push(r),ue.length>t.maxQueue&&(ue=ue.slice(ue.length-t.maxQueue)),ue.length>=t.batchSize){ga();return}qe===null&&(qe=window.setTimeout(()=>{qe=null,ga()},t.flushIntervalMs))}}async function ga(){let r=fa();if(!r.endpoint||ue.length===0)return;let e=ue.splice(0,r.batchSize);await ua(r.endpoint,{events:e},r.transport,r.debug),ue.length>0&&await ua(r.endpoint,{events:ue.splice(0,r.batchSize)},r.transport,r.debug)}function ma(r){return Math.max(0,Math.min(1,r))}function to(r){let e=String(r!=null?r:"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 gt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function io(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function ba(r,e,t){try{r[e]=t}catch{}}function no(r){let e=r==null?void 0:r.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 va(r,e){let t=r==null?void 0:r.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 ya(r,e){let t=no(r);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 xa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),r.size>0&&i()})},n=p=>{var u;r.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},a=p=>{r.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,a(p))},s=()=>{var d,u;let p=gt();for(let g of Array.from(r)){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=ma(h),b=g.repeat>=0?g.repeat+1:1,v=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let E=h-v;m=ma(E)}let y=g.ease(m);g.yoyo&&v%2===1&&(y=1-y);for(let E of g.props)ba(g.target,E.key,E.from+(E.to-E.from)*y);g.scaleFrom&&g.scaleTo&&va(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*y,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*y});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 E;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+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),h=to(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),y=[];for(let M of Object.keys(d)){if(v.has(M))continue;let j=d[M];typeof j=="number"&&y.push({key:M,from:io(p,M),to:j})}let x=ya(p,d);return{target:p,startMs:gt(),delayMs:f,durationMs:g,ease:h,props:y,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=gt())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:gt(),f=gt()-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"&&ba(p,g,f)}let u=ya(p,d);u.to&&va(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=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let y=typeof v=="string"?v.trim():"";return y.startsWith("+=")?u+Math.max(0,Number(y.slice(2))*1e3||0):y?Math.max(0,Number(y)*1e3||0):u},m=v=>{d.push(v);let y=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+y)},b={to(v,y,x){return m({kind:"to",target:v,vars:y,atMs:h(x)}),b},fromTo(v,y,x,E){return m({kind:"fromTo",target:v,vars:x,from:y,atMs:h(E)}),b},play(){var v,y;if(g)return b;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(v=x.from)!=null?v:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((y=x.vars.delay)!=null?y:0)}));return b},pause(){for(let v of f)v.pause();return b},kill(){for(let v of f)v.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function wa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=xa()}catch{}}var Ea={name:"handler-playable-sdk",version:"0.5.28",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 le=0,ro=le++,Sa=le++,Aa=le++,Ta=le++,Ca=le++,La=le++,ka=le++,Pa=le++,Ma=le++,_a=le++,Ia=le++,Oa=le++,G=ro;function Ra(){return G===Sa}function ja(){return G===Aa}function za(){return G===Ta}function Da(){return G===Ca}function Ve(){return G===La}function Ye(){return G===ka}function $a(){return G===Pa}function Ha(){return G===Ma}function Na(){return G===_a}function Yi(){return G===Ia}function Wi(){return G===Oa}function Ba(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),G=Sa;return}catch{}else if(r==="dapi")try{dapi.isReady(),G=Aa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(G=Ta)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(G=Ca)}catch{}else if(e==="mintegral")window.gameReady&&(G=La);else if(e==="tapjoy")window.TJ_API&&(G=ka);else if(e==="tiktok")window.openAppStore&&(G=Pa);else if(e==="smadex")try{window.smxTracking&&(G=Ma)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(G=_a)}catch{}else e==="vungle"?G=Ia:(r==="nucleo"||e==="nucleo")&&(G=Oa)}import Ki from"lottie-web";var Fa=Ki;typeof window!="undefined"&&(window.lottie=Ki,window.__baseLottie=Ki);function X(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Gs=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:X(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:X(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:X(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:X(360,780)}],qs=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:X(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:X(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:X(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:X(412,915)}],Vs=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:X(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:X(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:X(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:X(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:X(800,1280)}],Xi=[{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:X(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:X(768,1024),mraidScale:.7}];var Ua=[...Xi],Ga=[{category:"playable",label:"Playable Ad",devices:Xi}],Ji=Xi[0];function We(r){return Ua.find(e=>e.id===r)||Ji}function Ys(r){return Ua.filter(e=>e.category===r)}var Ke=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=a(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}ut({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 a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Zi(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ft=class{constructor(){this.updateManager=new Ke}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let o=this.updateManager.getNestedProperty(a,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,a),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 a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===a||p.slotId===a)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category: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 a;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=(a=s==null?void 0:s.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");Zi({objectId:e,category:a,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),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 a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let 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")}};var oo=["loading","start","gameplay","tutorial","endgame"],so=["environment","ui","character","system","backgrounds"],lo=["bg","world","ui"],qa={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Ut=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
|
|
2
2
|
<div class="wizard-card">
|
|
3
3
|
<div class="wizard-header">
|
|
4
4
|
<div class="wizard-title">
|
|
@@ -50,19 +50,19 @@ import{c as Di,d as le,e as Hi}from"./chunk-I5OOVR5U.js";import{i as Dt}from"./c
|
|
|
50
50
|
<div class="wizard-field-group">
|
|
51
51
|
<label class="wizard-label required">Category</label>
|
|
52
52
|
<select class="wizard-select" data-field="category">
|
|
53
|
-
${
|
|
53
|
+
${so.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
54
54
|
</select>
|
|
55
55
|
</div>
|
|
56
56
|
<div class="wizard-field-group">
|
|
57
57
|
<label class="wizard-label required">Screen</label>
|
|
58
58
|
<select class="wizard-select" data-field="screenId">
|
|
59
|
-
${
|
|
59
|
+
${oo.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
60
60
|
</select>
|
|
61
61
|
</div>
|
|
62
62
|
<div class="wizard-field-group">
|
|
63
63
|
<label class="wizard-label required">Layer</label>
|
|
64
64
|
<select class="wizard-select" data-field="layer">
|
|
65
|
-
${
|
|
65
|
+
${lo.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
66
66
|
</select>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
@@ -221,7 +221,7 @@ import{c as Di,d as le,e as Hi}from"./chunk-I5OOVR5U.js";import{i as Dt}from"./c
|
|
|
221
221
|
<label class="wizard-label">Logic Component</label>
|
|
222
222
|
<select class="wizard-select" data-field="logicId">
|
|
223
223
|
<option value="">None</option>
|
|
224
|
-
${Object.keys(
|
|
224
|
+
${Object.keys(qa).map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
225
225
|
</select>
|
|
226
226
|
</div>
|
|
227
227
|
<div class="wizard-field-group">
|
|
@@ -248,14 +248,14 @@ import{c as Di,d as le,e as Hi}from"./chunk-I5OOVR5U.js";import{i as Dt}from"./c
|
|
|
248
248
|
<div class="wizard-type-icon">${t}</div>
|
|
249
249
|
<div class="wizard-type-name">${i}</div>
|
|
250
250
|
</button>
|
|
251
|
-
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";
|
|
251
|
+
`}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";Zi({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=qa[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
|
|
252
252
|
<div class="wizard-step-indicator">
|
|
253
253
|
<span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
|
|
254
254
|
<span class="wizard-step-label">Step ${a}</span>
|
|
255
255
|
</div>
|
|
256
256
|
`});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,s=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=s?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let o=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!o:typeof o!="undefined"&&(n.value=String(o))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
|
|
257
257
|
`)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t)}}buildObjectConfig(e){if(!this.state)return{};let t={identity:{id:e,category:this.state.category},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:{x:this.state.anchorX,y:this.state.anchorY},position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(t.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(t.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},t.render.tint=null),this.state.objectType==="graphics"&&(t.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(t.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(t.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),t}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let o=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
|
|
258
|
-
`))||(a==null?void 0:a.error)||"Failed to create object.";alert(o);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}};var
|
|
258
|
+
`))||(a==null?void 0:a.error)||"Failed to create object.";alert(o);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}};var Gt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
|
|
259
259
|
<div class="context-menu-item" data-action="duplicate">Duplicate</div>
|
|
260
260
|
<div class="context-menu-item" data-action="rename">Rename</div>
|
|
261
261
|
<div class="context-menu-item" data-action="move">Move to Screen</div>
|
|
@@ -268,7 +268,7 @@ import{c as Di,d as le,e as Hi}from"./chunk-I5OOVR5U.js";import{i as Dt}from"./c
|
|
|
268
268
|
OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),p=await c.json().catch(()=>({}));if(!c.ok||(p==null?void 0:p.success)===!1){let d=((n=p==null?void 0:p.errors)==null?void 0:n.join(`
|
|
269
269
|
`))||(p==null?void 0:p.error)||"Duplicate failed.";alert(d);return}(o=(a=this.options).onRefresh)==null||o.call(a),(l=(s=this.options).onSelect)==null||l.call(s,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,o;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let s=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await s.json().catch(()=>({}));if(!s.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
|
|
270
270
|
`))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(o=(a=this.options).onSelect)==null||o.call(a,e),this.close()}catch(s){alert(`Rename failed: ${s instanceof Error?s.message:String(s)}`)}}}async handleMove(){var i,n,a;let e=window.prompt("Move to screen (loading/start/gameplay/tutorial/endgame)",this.options.screenId);if(!e)return;let t=e.trim();if(!["loading","start","gameplay","tutorial","endgame"].includes(t)){alert("Invalid screen. Use: loading, start, gameplay, tutorial, endgame.");return}if(t!==this.options.screenId)try{let o=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),s=await o.json().catch(()=>({}));if(!o.ok||(s==null?void 0:s.success)===!1){let l=((i=s==null?void 0:s.errors)==null?void 0:i.join(`
|
|
271
|
-
`))||(s==null?void 0:s.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let o=window.__editableObjectConfigs;o&&typeof o.get=="function"&&(t=(n=o.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var
|
|
271
|
+
`))||(s==null?void 0:s.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let o=window.__editableObjectConfigs;o&&typeof o.get=="function"&&(t=(n=o.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var qt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
|
|
272
272
|
<div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
|
|
273
273
|
<div class="scene-panel-header" data-panel-handle>
|
|
274
274
|
<div class="panel-title">
|
|
@@ -303,7 +303,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
303
303
|
</div>
|
|
304
304
|
<div class="panel-resize-handle-v" data-panel-resize-v></div>
|
|
305
305
|
</div>
|
|
306
|
-
`}initialize(e,t){var a,o,s,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;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()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var y;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,
|
|
306
|
+
`}initialize(e,t){var a,o,s,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;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()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var y;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let x=window.__editableObjectConfigs;x&&typeof x.get=="function"&&(b=(y=x.get(h))!=null?y:null)}let v=this.inferScreen(h,b);this.showContextMenu(h,v,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>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]"),a=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&a)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,a.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 a=(((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,T,w;let u=typeof t=="function"?t(d):null;if(!u){let A=window.__editableObjectConfigs;A&&typeof A.get=="function"&&(u=(_=A.get(d))!=null?_:null)}let g=(((I=u==null?void 0:u.identity)==null?void 0:I.category)||"scene").toString(),f=(((T=u==null?void 0:u.identity)==null?void 0:T.id)||d).toString(),h=g.toLowerCase(),m=f.toLowerCase(),b=h.includes("ui")||m.startsWith("ui")||m.includes("label"),v=this.formatDisplayName(f||d),y=((w=u==null?void 0:u.render)==null?void 0:w.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),E={id:d,label:v,category:g,isUi:b,isUnused:y,objectType:x},M=this.inferScreen(E.id,u);if(this.screenFilter!=="all"&&M!==this.screenFilter||!(!a||E.id.toLowerCase().includes(a)||E.label.toLowerCase().includes(a)))return;(E.isUnused?l:s)[M].push(E)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
|
|
307
307
|
${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
|
|
308
308
|
`,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 a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${a}`.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,a,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.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(a=>{var p,d;let o=typeof i=="function"?i(a.id):null;if(!o){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(o=(p=u.get(a.id))!=null?p:null)}let s=this.getTypeIconByType(a.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`
|
|
309
309
|
<button class="scene-object-item ${a.isUnused?"unused":""}" data-object-id="${a.id}">
|
|
@@ -318,8 +318,8 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
318
318
|
${n}
|
|
319
319
|
</div>
|
|
320
320
|
</div>
|
|
321
|
-
`}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,a,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(((a=e.identity)==null?void 0:a.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,a,o;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.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,a,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}`),((a=e.interaction)!=null&&a.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)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectWizard(e){try{new
|
|
322
|
-
`))||(a==null?void 0:a.error)||"Delete failed.";alert(o);return}this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}};var
|
|
321
|
+
`}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,a,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(((a=e.identity)==null?void 0:a.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,a,o;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.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,a,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}`),((a=e.interaction)!=null&&a.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)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectWizard(e){try{new Ut().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0;try{new Gt({objectId:e,screenId:t,onSelect:o=>{o&&this.select(o)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:o=>this.deleteObject(o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var i;if(window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))try{let n=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),a=await n.json().catch(()=>null);if(!n.ok||(a==null?void 0:a.success)===!1){let o=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
|
|
322
|
+
`))||(a==null?void 0:a.error)||"Delete failed.";alert(o);return}this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}};var Vt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
|
|
323
323
|
<div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
|
|
324
324
|
<div class="scene-tools-header" data-tools-header data-panel-handle>
|
|
325
325
|
<span class="scene-tools-title">Scene Tools</span>
|
|
@@ -364,7 +364,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
364
364
|
</div>
|
|
365
365
|
</div>
|
|
366
366
|
</div>
|
|
367
|
-
`}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 a=(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),a("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),a("anchor",s.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)})}updateInfo(e){}};var
|
|
367
|
+
`}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 a=(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),a("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),a("anchor",s.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)})}updateInfo(e){}};var Yt=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
368
368
|
<div class="nudge-panel hidden" data-panel="nudge-panel">
|
|
369
369
|
<div class="nudge-panel-header" data-panel-handle>
|
|
370
370
|
<span class="nudge-panel-title">Nudge Controls</span>
|
|
@@ -421,7 +421,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
421
421
|
</div>
|
|
422
422
|
</div>
|
|
423
423
|
</div>
|
|
424
|
-
`}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(a=>{a.addEventListener("click",()=>{var l,c,p,d;let o=a.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(a=>{a.addEventListener("click",()=>{var l;let s=a.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
|
|
424
|
+
`}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(a=>{a.addEventListener("click",()=>{var l,c,p,d;let o=a.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(a=>{a.addEventListener("click",()=>{var l;let s=a.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 ht=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||{},a={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&&a.slots.length>0)for(let c of a.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;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let d=new Set((a.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)||(a.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
|
|
425
425
|
<div class="scene-panel library-panel panel-accent-purple" data-panel="library">
|
|
426
426
|
<div class="scene-panel-header" data-panel-handle>
|
|
427
427
|
<div class="panel-title">
|
|
@@ -440,7 +440,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
440
440
|
</div>
|
|
441
441
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
442
442
|
</div>
|
|
443
|
-
`}initialize(e,t){var a,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(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(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),a.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)}a.appendChild(s),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let 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),a.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),a.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),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(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(),a=[],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," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let 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:a,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(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let a=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Vt=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 Yt=class{render(e,t,i,n){let a=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
|
|
443
|
+
`}initialize(e,t){var a,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(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(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),a.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)}a.appendChild(s),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let 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),a.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),a.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),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(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(),a=[],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," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let 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:a,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(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let a=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Wt=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 Kt=class{render(e,t,i,n){let a=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
|
|
444
444
|
<div class="inspector-property" data-property-type="image">
|
|
445
445
|
<div class="inspector-property-header">
|
|
446
446
|
<label class="inspector-label">${a}</label>
|
|
@@ -462,7 +462,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
462
462
|
</div>
|
|
463
463
|
`}
|
|
464
464
|
</div>
|
|
465
|
-
`}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
465
|
+
`}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}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){let a=i||"#000000";return`
|
|
466
466
|
<div class="inspector-property inspector-property-color">
|
|
467
467
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
468
468
|
<div class="inspector-color-group">
|
|
@@ -478,7 +478,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
478
478
|
data-object-id="${e}" />
|
|
479
479
|
</div>
|
|
480
480
|
</div>
|
|
481
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
481
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Jt=class{render(e,t,i,n){return`
|
|
482
482
|
<div class="inspector-property inspector-property-number">
|
|
483
483
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
484
484
|
<input type="number"
|
|
@@ -488,7 +488,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
488
488
|
data-object-id="${e}"
|
|
489
489
|
step="any" />
|
|
490
490
|
</div>
|
|
491
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
491
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Zt=class{render(e,t,i,n){let a=String(i||"");return`
|
|
492
492
|
<div class="inspector-property inspector-property-text">
|
|
493
493
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
494
494
|
<div class="inspector-input-group">
|
|
@@ -499,7 +499,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
499
499
|
data-object-id="${e}" />
|
|
500
500
|
</div>
|
|
501
501
|
</div>
|
|
502
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
502
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Qt=class{render(e,t,i,n){return`
|
|
503
503
|
<div class="inspector-property inspector-property-boolean">
|
|
504
504
|
<label class="inspector-property-label">
|
|
505
505
|
<input type="checkbox"
|
|
@@ -510,7 +510,59 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
510
510
|
<span>${this.formatLabel(t)}</span>
|
|
511
511
|
</label>
|
|
512
512
|
</div>
|
|
513
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
513
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ei=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let o=Array.isArray(i)?i:[],s=o.map((c,p)=>{let d=`${n}.${p}`,u=`
|
|
514
|
+
<button class="inspector-button inspector-button-small"
|
|
515
|
+
data-logic-remove="true"
|
|
516
|
+
data-object-id="${e}"
|
|
517
|
+
data-property-path="${n}"
|
|
518
|
+
data-index="${p}">
|
|
519
|
+
Remove
|
|
520
|
+
</button>
|
|
521
|
+
`;if(c&&typeof c=="object"&&!Array.isArray(c)){let f=this.registry.renderProperty(e,"logic",c,d);return`
|
|
522
|
+
<div class="inspector-array-item inspector-logic-item">
|
|
523
|
+
<div class="inspector-array-item-header">
|
|
524
|
+
<span>Logic ${p+1}</span>
|
|
525
|
+
${u}
|
|
526
|
+
</div>
|
|
527
|
+
<div class="inspector-array-item-body">
|
|
528
|
+
${f}
|
|
529
|
+
</div>
|
|
530
|
+
</div>
|
|
531
|
+
`}let g=typeof c=="string"?c:JSON.stringify(c);return`
|
|
532
|
+
<div class="inspector-array-item inspector-logic-item">
|
|
533
|
+
<div class="inspector-array-item-header">
|
|
534
|
+
<span>Logic ${p+1}</span>
|
|
535
|
+
${u}
|
|
536
|
+
<button class="inspector-button inspector-button-small"
|
|
537
|
+
data-logic-convert="true"
|
|
538
|
+
data-object-id="${e}"
|
|
539
|
+
data-property-path="${n}"
|
|
540
|
+
data-index="${p}">
|
|
541
|
+
Convert
|
|
542
|
+
</button>
|
|
543
|
+
</div>
|
|
544
|
+
<div class="inspector-array-item-body inspector-array-item-raw">
|
|
545
|
+
${g}
|
|
546
|
+
</div>
|
|
547
|
+
</div>
|
|
548
|
+
`}).join(""),l=`
|
|
549
|
+
<button class="inspector-button"
|
|
550
|
+
data-logic-add="true"
|
|
551
|
+
data-object-id="${e}"
|
|
552
|
+
data-property-path="${n}">
|
|
553
|
+
Add Logic
|
|
554
|
+
</button>
|
|
555
|
+
`;return`
|
|
556
|
+
<div class="inspector-property inspector-property-array">
|
|
557
|
+
<label class="inspector-property-label">${this.formatLabel(t)} (${o.length} items)</label>
|
|
558
|
+
<div class="inspector-array-list">
|
|
559
|
+
${s||'<div class="inspector-array-empty">Empty array</div>'}
|
|
560
|
+
</div>
|
|
561
|
+
<div class="inspector-array-actions">
|
|
562
|
+
${l}
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
`}if(!Array.isArray(i)||i.length===0)return`
|
|
514
566
|
<div class="inspector-property inspector-property-array">
|
|
515
567
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
516
568
|
<div class="inspector-array-empty">Empty array</div>
|
|
@@ -522,7 +574,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
522
574
|
${a}
|
|
523
575
|
</div>
|
|
524
576
|
</div>
|
|
525
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
577
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ti=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 a=[];for(let s in i){let l=i[s],c=`${n}.${s}`,p=this.registry.renderProperty(e,s,l,c);p&&a.push(p)}return a.length===0?"":a.length<=4&&a.every(s=>s.includes("inspector-property"))?`
|
|
526
578
|
<div class="inspector-subsection">
|
|
527
579
|
<div class="inspector-subsection-title">${this.formatLabel(t)}</div>
|
|
528
580
|
<div class="inspector-subsection-content">
|
|
@@ -536,7 +588,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
536
588
|
${a.join("")}
|
|
537
589
|
</div>
|
|
538
590
|
</div>
|
|
539
|
-
`}renderLogic(e,t,i,n){let a=[],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
|
|
591
|
+
`}renderLogic(e,t,i,n){let a=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=o&&!l.includes(o)?[o,...l]:l;a.push(`
|
|
540
592
|
<div class="inspector-property inspector-property-text">
|
|
541
593
|
<label class="inspector-property-label">Id</label>
|
|
542
594
|
<div class="inspector-input-group">
|
|
@@ -545,48 +597,58 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
545
597
|
data-object-id="${e}"
|
|
546
598
|
data-logic-id-selector="true">
|
|
547
599
|
<option value="" ${o?"":"selected"}>None</option>
|
|
548
|
-
${c.map(
|
|
600
|
+
${c.map(u=>`<option value="${u}" ${u===o?"selected":""}>${u}</option>`).join("")}
|
|
549
601
|
</select>
|
|
550
602
|
</div>
|
|
551
603
|
</div>
|
|
552
|
-
`);for(let
|
|
604
|
+
`);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let v=g[b],y=`${f}.${b}`,x=s[b];if((b==="targetId"||b==="inputId")&&typeof v=="string"){let E=this.registry.getObjectIds(),M=v||"",j=M&&!E.includes(M)?[M,...E]:E;m.push(`
|
|
553
605
|
<div class="inspector-property inspector-property-text">
|
|
554
|
-
<label class="inspector-property-label">${this.formatLabel(
|
|
606
|
+
<label class="inspector-property-label">${this.formatLabel(b)}</label>
|
|
555
607
|
<div class="inspector-input-group">
|
|
556
608
|
<select class="inspector-component-select inspector-input"
|
|
557
|
-
data-property-path="${
|
|
609
|
+
data-property-path="${y}"
|
|
558
610
|
data-object-id="${e}">
|
|
559
|
-
<option value="" ${
|
|
560
|
-
${
|
|
611
|
+
<option value="" ${M?"":"selected"}>None</option>
|
|
612
|
+
${j.map(C=>`<option value="${C}" ${C===M?"selected":""}>${C}</option>`).join("")}
|
|
561
613
|
</select>
|
|
562
614
|
</div>
|
|
563
615
|
</div>
|
|
564
|
-
`);continue}if(Array.isArray(
|
|
616
|
+
`);continue}if(Array.isArray(x)&&x.length)m.push(`
|
|
565
617
|
<div class="inspector-property inspector-property-text">
|
|
566
|
-
<label class="inspector-property-label">${this.formatLabel(
|
|
618
|
+
<label class="inspector-property-label">${this.formatLabel(b)}</label>
|
|
567
619
|
<div class="inspector-input-group">
|
|
568
620
|
<select class="inspector-component-select inspector-input"
|
|
569
|
-
data-property-path="${
|
|
621
|
+
data-property-path="${y}"
|
|
570
622
|
data-object-id="${e}">
|
|
571
|
-
${
|
|
623
|
+
${x.map(E=>`<option value="${String(E)}" ${String(E)===String(v)?"selected":""}>${String(E)}</option>`).join("")}
|
|
572
624
|
</select>
|
|
573
625
|
</div>
|
|
574
626
|
</div>
|
|
575
|
-
`);else{let
|
|
627
|
+
`);else{let E=this.registry.renderProperty(e,b,v,y);E&&m.push(E)}}m.length&&a.push(`
|
|
576
628
|
<div class="inspector-property inspector-property-object">
|
|
577
629
|
<div class="inspector-object-header">Props</div>
|
|
578
630
|
<div class="inspector-object-body">
|
|
579
|
-
${
|
|
631
|
+
${m.join("")}
|
|
580
632
|
</div>
|
|
581
633
|
</div>
|
|
582
|
-
`);continue}let
|
|
634
|
+
`);continue}let h=this.registry.renderProperty(e,u,g,f);h&&a.push(h)}if(a.length===0)return"";let d=!/(^|\.)logic\.\d+$/.test(n)?`
|
|
635
|
+
<div class="inspector-array-actions">
|
|
636
|
+
<button class="inspector-button"
|
|
637
|
+
data-logic-add="true"
|
|
638
|
+
data-object-id="${e}"
|
|
639
|
+
data-property-path="${n}">
|
|
640
|
+
Add Logic
|
|
641
|
+
</button>
|
|
642
|
+
</div>
|
|
643
|
+
`:"";return`
|
|
583
644
|
<div class="inspector-property inspector-property-object">
|
|
584
645
|
<div class="inspector-object-header">${this.formatLabel(t)}</div>
|
|
585
646
|
<div class="inspector-object-body">
|
|
586
647
|
${a.join("")}
|
|
648
|
+
${d}
|
|
587
649
|
</div>
|
|
588
650
|
</div>
|
|
589
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
651
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ii=class{render(e,t,i,n,a){let o=i==null?"":String(i),s=Array.from(new Set(a.map(c=>String(c)))),l=o&&!s.includes(o)?[o,...s]:s;return`
|
|
590
652
|
<div class="inspector-property inspector-property-text">
|
|
591
653
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
592
654
|
<div class="inspector-input-group">
|
|
@@ -597,7 +659,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
597
659
|
</select>
|
|
598
660
|
</div>
|
|
599
661
|
</div>
|
|
600
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
662
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ni=class{render(e,t,i,n){let a=this.safeStringify(i);return`
|
|
601
663
|
<div class="inspector-property inspector-property-text">
|
|
602
664
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
603
665
|
<div class="inspector-input-group">
|
|
@@ -608,7 +670,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
608
670
|
rows="6">${a}</textarea>
|
|
609
671
|
</div>
|
|
610
672
|
</div>
|
|
611
|
-
`}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
673
|
+
`}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ai=class{render(e,t,i,n){let o=(Array.isArray(i)?i:[]).map((s,l)=>{let c=typeof(s==null?void 0:s.x)=="number"?s.x:0,p=typeof(s==null?void 0:s.y)=="number"?s.y:0;return`
|
|
612
674
|
<div class="inspector-row" style="gap:8px; align-items:center;">
|
|
613
675
|
<input type="number"
|
|
614
676
|
class="inspector-input"
|
|
@@ -641,7 +703,42 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
641
703
|
</div>
|
|
642
704
|
</div>
|
|
643
705
|
</div>
|
|
644
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var
|
|
706
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ri=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],s=["",...this.registry.getObjectIds()],l=a.map((c,p)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=s.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
|
|
707
|
+
<div class="inspector-row" style="gap:8px; align-items:center;">
|
|
708
|
+
<select class="inspector-select inspector-input"
|
|
709
|
+
data-property-path="${n}.${p}.templateId"
|
|
710
|
+
data-object-id="${e}">
|
|
711
|
+
${g}
|
|
712
|
+
</select>
|
|
713
|
+
<input type="number"
|
|
714
|
+
class="inspector-input"
|
|
715
|
+
style="width:72px;"
|
|
716
|
+
value="${u}"
|
|
717
|
+
placeholder="weight"
|
|
718
|
+
data-property-path="${n}.${p}.weight"
|
|
719
|
+
data-object-id="${e}" />
|
|
720
|
+
<button type="button"
|
|
721
|
+
class="inspector-btn inspector-btn-sm"
|
|
722
|
+
data-spawntemplates-remove="true"
|
|
723
|
+
data-object-id="${e}"
|
|
724
|
+
data-property-path="${n}"
|
|
725
|
+
data-index="${p}">Remove</button>
|
|
726
|
+
</div>
|
|
727
|
+
`}).join("");return`
|
|
728
|
+
<div class="inspector-property inspector-property-object">
|
|
729
|
+
<div class="inspector-object-header">${this.formatLabel(t)}</div>
|
|
730
|
+
<div class="inspector-object-body">
|
|
731
|
+
${l||'<div class="inspector-text-sm" style="opacity:0.7;">No templates.</div>'}
|
|
732
|
+
<div class="inspector-row" style="margin-top:8px;">
|
|
733
|
+
<button type="button"
|
|
734
|
+
class="inspector-btn inspector-btn-sm primary"
|
|
735
|
+
data-spawntemplates-add="true"
|
|
736
|
+
data-object-id="${e}"
|
|
737
|
+
data-property-path="${n}">Add Template</button>
|
|
738
|
+
</div>
|
|
739
|
+
</div>
|
|
740
|
+
</div>
|
|
741
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var oi=class{constructor(){this.typeDetector=new Wt,this.imageRenderer=new Kt,this.colorRenderer=new Xt,this.numberRenderer=new Jt,this.textRenderer=new Zt,this.booleanRenderer=new Qt,this.arrayRenderer=new ei(this),this.objectRenderer=new ti(this),this.selectRenderer=new ii,this.jsonRenderer=new ni,this.spawnPointsRenderer=new ai,this.spawnTemplatesRenderer=new ri(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=a instanceof Map?a.get(s):a==null?void 0:a[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(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,o)=>a.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),o=a==="logic"||a==="logic_id"||a==="logicid",s=a==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let f=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,f)}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},p=l[t];if(p&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,p);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&typeof i=="string"){let f=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...f])}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function co(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var si=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new oi,this.updateManager=new Ke,this.quickActions=new Ft;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
|
|
645
742
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
|
|
646
743
|
<div class="scene-panel-header" data-panel-handle>
|
|
647
744
|
<div class="panel-title">
|
|
@@ -719,7 +816,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
719
816
|
<button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
|
|
720
817
|
${this.motionSimpleMode?"Simple":"Advanced"}
|
|
721
818
|
</button>
|
|
722
|
-
`,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let h=f.split(".").filter(Boolean),m=a;for(let y of h)m=m==null?void 0:m[y];let
|
|
819
|
+
`,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let h=f.split(".").filter(Boolean),m=a;for(let y of h)m=m==null?void 0:m[y];let b=h[h.length-1],v=`${i}.${f}`;return this.rendererRegistry.renderProperty(e,b,m,v)};if(this.motionSimpleMode){let f=d("enabled");f&&n.push(f);let h=[],m=d("intro.enabled"),b=d("intro.type"),v=d("intro.duration"),y=d("intro.easing");m&&h.push(m),b&&h.push(b),v&&h.push(v),y&&h.push(y),h.length&&n.push(`
|
|
723
820
|
<div class="inspector-subsection">
|
|
724
821
|
<div class="inspector-subsection-title">Intro</div>
|
|
725
822
|
<div class="inspector-subsection-content">
|
|
@@ -728,14 +825,14 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
728
825
|
${h.join("")}
|
|
729
826
|
</div>
|
|
730
827
|
</div>
|
|
731
|
-
`);let x=d("pulse.enabled"),
|
|
828
|
+
`);let x=d("pulse.enabled"),E=d("swing.enabled"),M=d("continuousMove.enabled"),j=d("continuousRotate.enabled"),C=d("orbit.enabled"),_=[x,E,M,j,C].filter(Boolean).join("");_&&n.push(`
|
|
732
829
|
<div class="inspector-subsection">
|
|
733
830
|
<div class="inspector-subsection-title">Continuous</div>
|
|
734
831
|
<div class="inspector-subsection-content">
|
|
735
|
-
${
|
|
832
|
+
${_}
|
|
736
833
|
</div>
|
|
737
834
|
</div>
|
|
738
|
-
`)}else for(let f in a){let h=a[f],m=`${i}.${f}`,
|
|
835
|
+
`)}else for(let f in a){let h=a[f],m=`${i}.${f}`,b=this.rendererRegistry.renderProperty(e,f,h,m);b&&n.push(b)}return n.length===0?"":`
|
|
739
836
|
<div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
|
|
740
837
|
<div class="inspector-section-header" data-section-toggle="motion">
|
|
741
838
|
<span class="inspector-section-arrow">\u25BC</span>
|
|
@@ -748,17 +845,17 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
748
845
|
${n.join("")}
|
|
749
846
|
</div>
|
|
750
847
|
</div>
|
|
751
|
-
`}attachEventListeners(){var f,h,m,v;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=lo((b,y,x)=>{var w,E;this.updateManager.updateProperty(b,y,x),(E=(w=this.options)==null?void 0:w.onPropertyChange)==null||E.call(w,b,y,x)},300);e.forEach(b=>{let y=w=>{var M,j;let E=w.target,L=E.dataset.propertyPath,A=E.dataset.objectId;if(L&&A){let k=E.value;if(E.type==="checkbox")k=E.checked;else if(E.type==="number"){if(k=parseFloat(E.value),isNaN(k))return}else if(E.dataset.json==="true")try{k=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(A,L,k):(this.updateManager.updateProperty(A,L,k),(j=(M=this.options)==null?void 0:M.onPropertyChange)==null||j.call(M,A,L,k))}},x=b.dataset.propertyPath;x==="logic.id"||x!=null&&x.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",x),b.addEventListener("change",async w=>{var C;let E=w.target,L=E.dataset.propertyPath,A=E.dataset.objectId,M=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",M),!L||!A)return;await this.updateManager.updateProperty(A,L,M),console.log("[Inspector v1.0.0] Logic ID updated");let j=window,k=(C=j==null?void 0:j.__HANDLER_LOGIC_META)==null?void 0:C[M],S=this.getDefaultPropsForLogic(M,k);console.log("[Inspector v1.0.0] New logic default props:",S);let T=L.replace(".id",".props");await this.updateManager.updateProperty(A,T,S),console.log("[Inspector v1.0.0] Logic props updated to:",S),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(A)})):(b.addEventListener("change",y),(b.tagName==="INPUT"||b.tagName==="TEXTAREA")&&b.addEventListener("input",y))}),this.contentContainer.querySelectorAll("[data-action]").forEach(b=>{b.addEventListener("click",y=>{let x=y.target,w=x.dataset.action,E=x.dataset.path,L=x.dataset.object;w&&E&&L&&this.quickActions.handleAction(w,L,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(b=>{b.addEventListener("click",y=>{var E,L;let x=y.target,w=x.dataset.sectionToggle||((E=x.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(w){let A=(L=this.contentContainer)==null?void 0:L.querySelector(`[data-section="${w}"]`);A==null||A.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(b=>{b.addEventListener("click",async y=>{let w=y.currentTarget.dataset.motionPreset;!w||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,w)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(b=>{b.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let s=this.contentContainer.querySelector("[data-motion-simple-toggle]");s==null||s.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(b=>{b.addEventListener("click",async y=>{let x=y.target,w=x.dataset.objectId,E=x.dataset.propertyPath;if(!w||!E)return;let L=window.getEditableObjectConfig,A=L==null?void 0:L(w);if(!A)return;let M=this.updateManager.getNestedProperty(A,E),j=Array.isArray(M)?[...M]:[];j.push({x:0,y:0}),await this.updateManager.updateProperty(w,E,j),this.loadObject(w)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(b=>{b.addEventListener("click",async y=>{let x=y.target,w=x.dataset.objectId,E=x.dataset.propertyPath,L=Number(x.dataset.index||"-1");if(!w||!E||L<0)return;let A=window.getEditableObjectConfig,M=A==null?void 0:A(w);if(!M)return;let j=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(j))return;let k=j.filter((S,T)=>T!==L);await this.updateManager.updateProperty(w,E,k),this.loadObject(w)})});let p=(f=this.root)==null?void 0:f.querySelector("[data-inspector-advanced]");p==null||p.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let d=(h=this.root)==null?void 0:h.querySelector("[data-convert-toggle]");d==null||d.addEventListener("click",()=>{var y;let b=(y=this.root)==null?void 0:y.querySelector("[data-convert-menu]");b==null||b.classList.toggle("hidden")});let u=(m=this.contentContainer)==null?void 0:m.querySelector("[data-inspector-add-component-btn]"),g=(v=this.contentContainer)==null?void 0:v.querySelector("[data-inspector-component-select]");u==null||u.addEventListener("click",async()=>{let b=g.value;b&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,b)})}getMotionDefaults(){var i,n,a,o;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(o=(a=t.motion)==null?void 0:a.defaults)!=null?o:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:a},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(s=i.motion)!=null?s:n},o={...(l=a.intro)!=null?l:{}};a.enabled=!0,o.enabled=!0,a.intro=o,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,o=a==null?void 0:a.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 a,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(a=i.render)==null?void 0:a.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=`
|
|
848
|
+
`}attachEventListeners(){var x,E,M,j;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=co((C,_,I)=>{var T,w;this.updateManager.updateProperty(C,_,I),(w=(T=this.options)==null?void 0:T.onPropertyChange)==null||w.call(T,C,_,I)},300),i=C=>C?/(^|\.)logic(\.\d+)?\.id$/.test(C):!1;e.forEach(C=>{let _=T=>{var k,P;let w=T.target,A=w.dataset.propertyPath,S=w.dataset.objectId;if(A&&S){let R=w.value;if(w.type==="checkbox")R=w.checked;else if(w.type==="number"){if(R=parseFloat(w.value),isNaN(R))return}else if(w.dataset.json==="true")try{R=JSON.parse(w.value)}catch{return}w.type==="text"||w.type==="range"||w.tagName==="TEXTAREA"?t(S,A,R):(this.updateManager.updateProperty(S,A,R),(P=(k=this.options)==null?void 0:k.onPropertyChange)==null||P.call(k,S,A,R))}},I=C.dataset.propertyPath;i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),C.addEventListener("change",async T=>{var D;let w=T.target,A=w.dataset.propertyPath,S=w.dataset.objectId,k=w.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",k),!A||!S)return;await this.updateManager.updateProperty(S,A,k),console.log("[Inspector v1.0.0] Logic ID updated");let P=window,R=(D=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:D[k],L=this.getDefaultPropsForLogic(k,R);console.log("[Inspector v1.0.0] New logic default props:",L);let O=A.replace(/\.id$/,".props");await this.updateManager.updateProperty(S,O,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(S)})):(C.addEventListener("change",_),(C.tagName==="INPUT"||C.tagName==="TEXTAREA")&&C.addEventListener("input",_))}),this.contentContainer.querySelectorAll("[data-action]").forEach(C=>{C.addEventListener("click",_=>{let I=_.target,T=I.dataset.action,w=I.dataset.path,A=I.dataset.object;T&&w&&A&&this.quickActions.handleAction(T,A,w)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(C=>{C.addEventListener("click",_=>{var w,A;let I=_.target,T=I.dataset.sectionToggle||((w=I.closest("[data-section-toggle]"))==null?void 0:w.getAttribute("data-section-toggle"));if(T){let S=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${T}"]`);S==null||S.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(C=>{C.addEventListener("click",async _=>{let T=_.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(C=>{C.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(C=>{C.addEventListener("click",async _=>{let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath;if(!T||!w)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(T);if(!S)return;let k=this.updateManager.getNestedProperty(S,w),P=Array.isArray(k)?[...k]:[];P.push({x:0,y:0}),await this.updateManager.updateProperty(T,w,P),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(C=>{C.addEventListener("click",async _=>{let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath,A=Number(I.dataset.index||"-1");if(!T||!w||A<0)return;let S=window.getEditableObjectConfig,k=S==null?void 0:S(T);if(!k)return;let P=this.updateManager.getNestedProperty(k,w);if(!Array.isArray(P))return;let R=P.filter((L,O)=>O!==A);await this.updateManager.updateProperty(T,w,R),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(C=>{C.addEventListener("click",async _=>{let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath;if(!T||!w)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(T);if(!S)return;let k=this.updateManager.getNestedProperty(S,w),P=Array.isArray(k)?[...k]:[];P.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,w,P),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(C=>{C.addEventListener("click",async _=>{var L;let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath,A=Number((L=I.dataset.index)!=null?L:-1);if(!T||!w||A<0)return;let S=window.getEditableObjectConfig,k=S==null?void 0:S(T);if(!k)return;let P=this.updateManager.getNestedProperty(k,w);if(!Array.isArray(P))return;let R=P.filter((O,D)=>D!==A);await this.updateManager.updateProperty(T,w,R),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(C=>{C.addEventListener("click",async _=>{var V;let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath;if(!T||!w)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(T);if(!S)return;let k=this.updateManager.getNestedProperty(S,w),P=Array.isArray(k)?[...k]:k!=null?[k]:[],R=this.getDefaultLogicId(),L=window,O=(V=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:V[R],D=this.getDefaultPropsForLogic(R,O);P.push({id:R,props:D}),await this.updateManager.updateProperty(T,w,P),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(C=>{C.addEventListener("click",async _=>{var L;let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath,A=Number((L=I.dataset.index)!=null?L:-1);if(!T||!w||A<0)return;let S=window.getEditableObjectConfig,k=S==null?void 0:S(T);if(!k)return;let P=this.updateManager.getNestedProperty(k,w);if(!Array.isArray(P))return;let R=P.filter((O,D)=>D!==A);await this.updateManager.updateProperty(T,w,R),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(C=>{C.addEventListener("click",async _=>{var H,F;let I=_.target,T=I.dataset.objectId,w=I.dataset.propertyPath,A=Number((H=I.dataset.index)!=null?H:-1);if(!T||!w||A<0)return;let S=window.getEditableObjectConfig,k=S==null?void 0:S(T);if(!k)return;let P=this.updateManager.getNestedProperty(k,w);if(!Array.isArray(P))return;let R=P[A];if(typeof R!="string")return;let L=window,O=(F=L==null?void 0:L.__HANDLER_LOGIC_META)==null?void 0:F[R],D=this.getDefaultPropsForLogic(R,O),V=[...P];V[A]={id:R,props:D},await this.updateManager.updateProperty(T,w,V),this.loadObject(T)})});let m=(x=this.root)==null?void 0:x.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(E=this.root)==null?void 0:E.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var _;let C=(_=this.root)==null?void 0:_.querySelector("[data-convert-menu]");C==null||C.classList.toggle("hidden")});let v=(M=this.contentContainer)==null?void 0:M.querySelector("[data-inspector-add-component-btn]"),y=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let C=y.value;C&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,C)})}getMotionDefaults(){var i,n,a,o;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(o=(a=t.motion)==null?void 0:a.defaults)!=null?o:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:a},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(s=i.motion)!=null?s:n},o={...(l=a.intro)!=null?l:{}};a.enabled=!0,o.enabled=!0,a.intro=o,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,o=a==null?void 0:a.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 a,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(a=i.render)==null?void 0:a.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=`
|
|
752
849
|
<div class="inspector-empty">
|
|
753
850
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
754
851
|
<span class="inspector-empty-text">${e}</span>
|
|
755
852
|
</div>
|
|
756
|
-
`)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215},Collectable:{targetId:"",collectRadius:50,particleEffect:"",autoDestroy:!0,collectSound:""},Spawner:{templateId:"",spawnPattern:"continuous",spawnRate:1e3,poolSize:20,positionSource:"spawner",targetId:"",targetOffset:{x:0,y:0},customPosition:{x:0,y:0},randomBounds:{x:[-100,100],y:[-100,100]},spawnPoints:[],spawnPointMode:"cycle",movementMode:"velocity",velocity:{x:0,y:-300},lifetime:2e3},Damageable:{hitTemplateId:"",hitRadius:50,hp:1,invulnMs:150,flashAlpha:.3,flashDurationMs:100,hitScale:1,hitScaleDurationMs:120,knockback:{x:0,y:0},hpLabelId:"",autoDestroy:!0,destroyEffect:"",destroySound:"",hitEvent:"",destroyEvent:"",hitPopupText:"",hitPopupColor:"#ffffff",hitPopupFontSize:20,hitPopupDurationMs:600,hitPopupOffset:{x:0,y:-20},hitPopupRise:30,hitPopupTemplateId:""}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",logic:"\u{1F3AE}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
853
|
+
`)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultLogicId(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],i=["SwerveMove","DragSnap","JoystickMove","DragToWin"],n=[...t,...i].map(a=>String(a)).filter(a=>a.trim().length>0);return n.length?n[0]:"SwerveMove"}catch{return"SwerveMove"}}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215},Collectable:{targetId:"",collectRadius:50,particleEffect:"",autoDestroy:!0,collectSound:""},Spawner:{templateId:"",spawnTemplates:[],spawnPattern:"continuous",spawnRate:1e3,poolSize:20,positionSource:"spawner",targetId:"",targetOffset:{x:0,y:0},customPosition:{x:0,y:0},randomBounds:{x:[-100,100],y:[-100,100]},spawnPoints:[],spawnPointMode:"cycle",movementMode:"velocity",velocity:{x:0,y:-300},lifetime:2e3},Damageable:{hitTemplateId:"",hitRadius:50,hp:1,invulnMs:150,flashAlpha:.3,flashDurationMs:100,hitScale:1,hitScaleDurationMs:120,knockback:{x:0,y:0},hpLabelId:"",autoDestroy:!0,destroyEffect:"",destroySound:"",hitEvent:"",destroyEvent:"",hitPopupText:"",hitPopupColor:"#ffffff",hitPopupFontSize:20,hitPopupDurationMs:600,hitPopupOffset:{x:0,y:-20},hitPopupRise:30,hitPopupTemplateId:""}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",logic:"\u{1F3AE}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
|
|
757
854
|
<div class="inspector-empty">
|
|
758
855
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
759
856
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
760
857
|
</div>
|
|
761
|
-
`)}};import*as
|
|
858
|
+
`)}};import*as nr from"jszip";function Qi(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Va(r){var n;let[e,t]=r.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 Ya(r){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=r})}async function li(r){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",r);let i=await fetch(r);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,r),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await Qi(n),o=await Ya(a),s=Va(a);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:a,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 Oe(r){var e,t;try{let i=await Qi(r),n=await Ya(i),a=Va(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function en(r){return Qi(r).then(e=>e).catch(()=>null)}function tn(r,e){var t;try{let[i,n]=r.split(","),a=i.match(/data:(.*?);base64/),o=(t=a==null?void 0:a[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 Xe(r,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=r}),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"),r;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),o=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(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(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),r}}function Wa(r,e){if(!r||!e)return"1:1";let t=r/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ae(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Q(r){return typeof r=="string"?r:void 0}function Ka(r){return r.toLowerCase().endsWith(".png")?r.slice(0,-4):r}function po(r){var i,n,a;let e=(i=Q(r.id))!=null?i:Q(r.name);if(e)return e;let t=(n=Q(r.file))!=null?n:Q(r.asset);return t?Ka((a=t.split("/").pop())!=null?a:t):void 0}function uo(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(Ae(e)){let o=(i=Q(e.file))!=null?i:Q(e.asset);return o?{id:(n=Q(e.id))!=null?n:r,file:o,role:(a=Q(e.role))!=null?a:t,dataUrl:Q(e.dataUrl),layout:e.layout}:null}return null}function nn(r,e){var t,i,n;if(!r)return[];if(Array.isArray(r)){let a=[];for(let o of r){if(typeof o=="string"){let s=Ka((t=o.split("/").pop())!=null?t:o);a.push({id:s,file:o,role:e});continue}if(Ae(o)){let s=po(o),l=(i=Q(o.file))!=null?i:Q(o.asset);if(!s||!l)continue;a.push({id:s,file:l,role:(n=Q(o.role))!=null?n:e,dataUrl:Q(o.dataUrl),layout:o.layout})}}return a}if(Ae(r)){let a=[];for(let[o,s]of Object.entries(r)){let l=uo(o,s,e);l&&a.push(l)}return a}return[]}function go(r){var e,t;return(t=(e=Q(r.brand_name))!=null?e:Q(r.brandName))!=null?t:Q(r.name)}function ho(r){if(Ae(r.brand_dna)&&Ae(r.brand_dna.colors))return r.brand_dna;if(Ae(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),Ae(r.fonts)&&(e.fonts=r.fonts),e}}function fo(r){var t;let e=new Map;for(let i of r){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 an(r,e={}){var o,s,l;let t=r.filter(Ae),i=(s=(o=t.map(go).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(ho).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...nn(c.layers,"visual element")),"assets"in c&&a.push(...nn(c.assets,"visual element")),Ae(c.endgame)&&"assets"in c.endgame&&a.push(...nn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:fo(a)}}import{GoogleGenAI as mo}from"@google/genai";async function ci(r,e,t=[],i={}){var n,a,o,s,l,c,p;try{if(!(r!=null&&r.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 v=t[b];if(!v.base64||!v.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(v.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!v.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${v.mimeType}`)}let d=new mo({apiKey:r}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,v)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${v+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=(a=(n=f.candidates)==null?void 0:n[0])==null?void 0:a.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 bo}from"@google/genai";async function Je(r,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new bo({apiKey:r}),a=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.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:a});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 Xa(r){let e=r.brandAssets.map(a=>{let o=`- ${a.id}: ${a.role}`;return a.layout&&(o+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),o}).join(`
|
|
762
859
|
`)||"None",t=r.brandDna?`Colors: ${JSON.stringify(r.brandDna.colors)}, Style: ${r.brandDna.style||"not specified"}`:"Not provided",i=r.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
|
|
763
860
|
`),n="";if(r.brandConfig){let a=r.brandConfig,o=[];a.splash&&o.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&o.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&o.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),o.length>0&&(n=`
|
|
764
861
|
BRAND CONTENT:
|
|
@@ -822,7 +919,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
|
|
|
822
919
|
}
|
|
823
920
|
]
|
|
824
921
|
}
|
|
825
|
-
`.trim()}function
|
|
922
|
+
`.trim()}function Ja(r){var n,a;let e=(n=r.brandDna)!=null&&n.colors?`Primary: ${r.brandDna.colors.primary}, Secondary: ${r.brandDna.colors.secondary||"N/A"}, Accent: ${r.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=r.brandDna)==null?void 0:a.style)||"modern gaming style",i=r.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
|
|
826
923
|
TASK: ${r.prompt}
|
|
827
924
|
|
|
828
925
|
BRAND STYLE:
|
|
@@ -843,7 +940,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
843
940
|
|
|
844
941
|
OUTPUT:
|
|
845
942
|
Generate the requested asset matching the brand style.${r.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
846
|
-
`.trim()}function
|
|
943
|
+
`.trim()}function Za(r){return r.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 Qa(r,e){return!(r.includes("background")&&(r.includes("_1")||r.includes("splash")||r.includes("endgame")||r.includes("main"))||e==="text"||e==="effects"&&r.includes("particle"))}async function er(r){var o,s;let e=Za(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=Xa(t),n=[];if(r.flatDesignDataUrl)try{let l=tr(r.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await ci(r.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 vo(a,r.gameObjects)}function vo(r,e){try{let t=r,i=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=r.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:r,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:r,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:r,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function rn(r,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let o=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,o.game_object);try{let s=await yo(r,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 yo(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let s=r.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=r.assetFiles.get(s.file);if(l){let c=await Oe(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let s=tr(r.flatDesignDataUrl);s&&t.push(s)}let i=Qa(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=Ja(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await Je(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Xe(o)||o}function tr(r){let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function ir(r,e){let t=r.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],r.assets=i;for(let n of i){let a=e.get(n.file);if(a){let o=await Oe(a);o&&(n.dataUrl=o.dataUrl)}}}var di=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`
|
|
847
944
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
848
945
|
<div class="scene-panel-header" data-panel-handle>
|
|
849
946
|
<div class="panel-title">
|
|
@@ -959,15 +1056,15 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
959
1056
|
</div>
|
|
960
1057
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
961
1058
|
</div>
|
|
962
|
-
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,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()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.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
|
|
1059
|
+
`}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,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()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.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]"),v=b==null?void 0:b.dataset.mappingItem;v&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(v),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),m.closest("[data-mapping-generate-one]")&&this.generateOne(v),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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(x=>x.game_object===v);y&&(m.matches("[data-mapping-action]")&&(y.action=String(m.value||"KEEP"),y.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(m.value||""),y.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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(x=>x.game_object===v);y&&(y.generation_prompt=String(m.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await nr.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 a=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"});a.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=a;try{this.normalizedManifest=an(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of a){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
|
|
963
1060
|
\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 a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let o=a.category||"misc";n[o]||(n[o]=[]),i.libraryAssets[o]||(i.libraryAssets[o]=[]),i.libraryAssets[o].some(l=>l.filename===a.filename)||(i.libraryAssets[o].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${o}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var a;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}
|
|
964
1061
|
`:l.brand_dna||l.colors?n+=`\u2705 Brand: ${o.name}
|
|
965
1062
|
`:n+=`\u2705 Loaded: ${o.name}
|
|
966
1063
|
`}catch{n+=`\u274C Error in ${o.name}
|
|
967
|
-
`}try{this.normalizedManifest=
|
|
1064
|
+
`}try{this.normalizedManifest=an(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
|
|
968
1065
|
\u{1F4E6} Normalized manifest: ${o} assets`,n+=`
|
|
969
1066
|
\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+=`
|
|
970
|
-
\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 a,o;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await
|
|
1067
|
+
\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 a,o;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Oe(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,a,o,s,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await ir(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await er(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 a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await rn(a,this.mappingResult,{onProgress:(o,s,l)=>{this.setStatus("apply",`Generating ${o}/${s}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var 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,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),o=n?`
|
|
971
1068
|
<div class="vision-raw-block">
|
|
972
1069
|
<div class="inspector-text-sm" style="white-space: pre-wrap;">
|
|
973
1070
|
\u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
|
|
@@ -977,7 +1074,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
977
1074
|
</div>
|
|
978
1075
|
`:"";e.innerHTML=`
|
|
979
1076
|
${o}
|
|
980
|
-
${this.mappingResult.mappings.map(l=>{var
|
|
1077
|
+
${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(v=>v.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=`
|
|
981
1078
|
<select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
|
|
982
1079
|
<option value="">Select brand asset\u2026</option>
|
|
983
1080
|
${a.replace(`value="${p}"`,`value="${p}" selected`)}
|
|
@@ -1029,8 +1126,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1029
1126
|
</div>
|
|
1030
1127
|
</div>
|
|
1031
1128
|
`}).join("")}
|
|
1032
|
-
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.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(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(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 a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,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=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.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
|
|
1033
|
-
`)}var
|
|
1129
|
+
`}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.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(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(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 a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,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=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.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 rn(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(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let o=n.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let o=e.toLowerCase(),s=l=>a.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||a[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=s=>{let l=Math.max(300,n+(s.clientX-i));this.root.style.width=`${l}px`},o=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",o)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",o)})}refresh(){}};function ar(r,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${r}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
1130
|
+
`)}var xo=["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"],wo=["cta_hint","cta_label_end"],rr=[{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"}],Eo=["brand.primary","brand.heading","brand.body","brand.warning"],pi=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`
|
|
1034
1131
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
1035
1132
|
<div class="scene-panel-header" data-panel-handle>
|
|
1036
1133
|
<div class="panel-title">
|
|
@@ -1098,7 +1195,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1098
1195
|
<path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
|
|
1099
1196
|
<path d="M5 14v4h14v-4h2v6H3v-6h2z" />
|
|
1100
1197
|
</svg>
|
|
1101
|
-
`;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),a.appendChild(o),a.appendChild(s),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",
|
|
1198
|
+
`;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),a.appendChild(o),a.appendChild(s),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",xo.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 a=document.createElement("span");a.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(a),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Eo.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 a=document.createElement("input");a.type="text",a.value=(o=e==null?void 0:e[t])!=null?o:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",wo.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 a=document.createElement("input");a.type="text",a.value=(o=this.readUiValue(e,t))!=null?o:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(s=this.textsContainer)==null||s.appendChild(i)}),rr.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.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(a),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 a=document.createElement("span");a.className="customize-key",a.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(a),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let o of n){if(a==null)return null;a=a[o]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),o=n;for(let s of a){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 a={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(a[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=rr.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:a,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 li(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(a=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(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 a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(a.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(a),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,a=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var 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=`
|
|
1102
1199
|
<div class="ai-modal-card">
|
|
1103
1200
|
<div class="ai-modal-header">
|
|
1104
1201
|
<div>
|
|
@@ -1169,7 +1266,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1169
1266
|
</div>
|
|
1170
1267
|
</div>
|
|
1171
1268
|
</div>
|
|
1172
|
-
`;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",v=>{v.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 v;return(v=this.aiReferenceInput)==null?void 0:v.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var b,y;let v=(y=(b=this.aiStrengthInput)==null?void 0:b.value)!=null?y:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=v)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var b,y;let v=(y=(b=this.aiBgToleranceInput)==null?void 0:b.value)!=null?y:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=v),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var b,y,x;let v=(x=(y=(b=this.aiReferenceInput)==null?void 0:b.files)==null?void 0:y[0])!=null?x:null;this.aiReferenceFile=v,this.aiReferenceName&&(this.aiReferenceName.textContent=v?`${v.name} (loaded)`:"Optional"),v&&this.setAiStatus(`Reference attached: ${v.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,v,b,y,x,w,E,L,A,M,j,k,S,T;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=(v=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?v:"",n=(y=(b=this.aiRemoveBgToggle)==null?void 0:b.checked)!=null?y:!1,a=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=((E=l==null?void 0:l.value)==null?void 0:E.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 C=null,_=(A=this.getSelectedAssetKey())!=null?A:"unknown",R=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let V=Qi(this.aiOutputDataUrl,"ai-output.png");if(V){let Y=await Te(V);Y&&(C={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(C||(C=await this.getImageDataFromAsset(c)),!C){this.setAiStatus("Unable to load the base image.");return}let z=[C.input],P=!1;if(this.aiReferenceFile){let V=await Te(this.aiReferenceFile);V?(z.push({base64:V.base64,mimeType:V.mimeType}),P=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let I=nr(i,{includeReference:P,includeMagenta:a,changeLevel:s}),$=(S=(k=this.aiReferenceFile)==null?void 0:k.name)!=null?S:"none";console.info("[AI] Final prompt:",I),console.info("[AI] Image sources:",{assetKey:_,base:R,reference:$});let Q=Ya(C.width,C.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await Ye(e,I,z,{aspectRatio:Q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((T=this.aiStatusEl)==null?void 0:T.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,o,s;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!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 a=((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(a&&o)console.log("[CustomizePanel] Applying AI output directly to object:",a,o),this.applyObjectPropertyValue(a,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 a,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(v){console.warn("[CustomizePanel] Setup-library endpoint not available:",v)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((s=h.dataset.assetKey)!=null?s:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let v=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof v=="function"&&b){let y=this.getFilenameFromPath(c.path);await v(g,y,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var 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 a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var 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=Qi(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let o=await Zi(a);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,a=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;a=d}}let o=await Zi(a);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(v){console.warn("[CustomizePanel] Setup-library not available:",v)}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 v=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof v=="function"&&b){let y=this.getFilenameFromPath(d.path);await v(f,y,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 a=this.resolveAssetUrls(t);if(a.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,a,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 a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1269
|
+
`;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(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 v,y;let b=(y=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?y:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?y:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var v,y,x;let b=(x=(y=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:y[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,v,y,x,E,M,j,C,_,I,T,w,A;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=(y=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?y:!1,a=n,o=n,s=Number((E=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((M=l==null?void 0:l.value)==null?void 0:M.trim())||((j=this.aiBaseValue)==null?void 0:j.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let S=null,k=(C=this.getSelectedAssetKey())!=null?C:"unknown",P=(_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let F=tn(this.aiOutputDataUrl,"ai-output.png");if(F){let W=await Oe(F);W&&(S={input:{base64:W.base64,mimeType:W.mimeType},dataUrl:W.dataUrl,width:W.width,height:W.height})}}if(S||(S=await this.getImageDataFromAsset(c)),!S){this.setAiStatus("Unable to load the base image.");return}let R=[S.input],L=!1;if(this.aiReferenceFile){let F=await Oe(this.aiReferenceFile);F?(R.push({base64:F.base64,mimeType:F.mimeType}),L=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let O=ar(i,{includeReference:L,includeMagenta:a,changeLevel:s}),D=(w=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?w:"none";console.info("[AI] Final prompt:",O),console.info("[AI] Image sources:",{assetKey:k,base:P,reference:D});let V=Wa(S.width,S.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Je(e,O,R,{aspectRatio:V,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(S){console.error("[CustomizePanel] AI Generate Error:",S),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((A=this.aiStatusEl)==null?void 0:A.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,o,s;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Xe(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&o)console.log("[CustomizePanel] Applying AI output directly to object:",a,o),this.applyObjectPropertyValue(a,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 a,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(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((s=h.dataset.assetKey)!=null?s:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(c.path);await b(g,y,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var 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 a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var 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=tn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let o=await en(a);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,a=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;a=d}}let o=await en(a);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,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(d.path);await b(f,y,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 a=this.resolveAssetUrls(t);if(a.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,a,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 a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1173
1270
|
<div class="asset-preview-card">
|
|
1174
1271
|
<div class="asset-preview-header">
|
|
1175
1272
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -1185,7 +1282,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1185
1282
|
<img class="asset-preview-ai-image" alt="AI output preview">
|
|
1186
1283
|
</div>
|
|
1187
1284
|
</div>
|
|
1188
|
-
`;let o=a.querySelector(".asset-preview-body"),s=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),p=a.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()}),a.addEventListener("click",d=>{d.target===a&&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(a),this.previewModal=a,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,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="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,a(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 a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a: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=a=>{var u,g;a.preventDefault();let o=a.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,a=URL.createObjectURL(e),o=await this.loadImage(a);try{URL.revokeObjectURL(a)}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,
|
|
1285
|
+
`;let o=a.querySelector(".asset-preview-body"),s=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),p=a.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()}),a.addEventListener("click",d=>{d.target===a&&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(a),this.previewModal=a,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,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="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,a(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 a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a: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=a=>{var u,g;a.preventDefault();let o=a.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,a=URL.createObjectURL(e),o=await this.loadImage(a);try{URL.revokeObjectURL(a)}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=`
|
|
1189
1286
|
<div class="asset-crop-card" style="width:${p}px;">
|
|
1190
1287
|
<div class="asset-crop-header">
|
|
1191
1288
|
<div>
|
|
@@ -1197,11 +1294,11 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1197
1294
|
<div class="asset-crop-body">
|
|
1198
1295
|
<div class="asset-crop-column">
|
|
1199
1296
|
<div class="asset-crop-label">Crop</div>
|
|
1200
|
-
<canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(
|
|
1297
|
+
<canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
|
|
1201
1298
|
</div>
|
|
1202
1299
|
<div class="asset-crop-column">
|
|
1203
1300
|
<div class="asset-crop-label">Compare</div>
|
|
1204
|
-
<canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(
|
|
1301
|
+
<canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
|
|
1205
1302
|
</div>
|
|
1206
1303
|
</div>
|
|
1207
1304
|
<div class="asset-crop-controls">
|
|
@@ -1215,7 +1312,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1215
1312
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
1216
1313
|
</div>
|
|
1217
1314
|
</div>
|
|
1218
|
-
`;let
|
|
1315
|
+
`;let v=c.querySelector(".asset-crop-canvas"),y=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),E=c.querySelector(".asset-crop-zoom-value"),M=c.querySelector(".asset-crop-close"),j=c.querySelector(".asset-crop-cancel"),C=c.querySelector(".asset-crop-apply"),_=c.querySelector(".asset-crop-reset");if(!v||!y||!x||!E){l(null);return}let I=v.getContext("2d"),T=y.getContext("2d");if(!I||!T){l(null);return}let w=o.naturalWidth,A=o.naturalHeight,S=Math.max(v.width/w,v.height/A),k=1,P=0,R=0,L=!1,O=0,D=0,V=0,H=0,F=()=>{let $=S*k,ie=Math.max(0,(w*$-v.width)/2),re=Math.max(0,(A*$-v.height)/2);P=Math.min(ie,Math.max(-ie,P)),R=Math.min(re,Math.max(-re,R))},W=()=>{let $=S*k;I.clearRect(0,0,v.width,v.height);let ie=v.width/2-w*$/2+P,re=v.height/2-A*$/2+R;if(I.drawImage(o,ie,re,w*$,A*$),T.clearRect(0,0,y.width,y.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let B=Math.max(y.width/s.naturalWidth,y.height/s.naturalHeight),Z=y.width/2-s.naturalWidth*B/2,Y=y.height/2-s.naturalHeight*B/2;T.drawImage(s,Z,Y,s.naturalWidth*B,s.naturalHeight*B)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,y.width,y.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,y.width-8,y.height-8);let pe=y.width/v.width*(S*k),oe=P*(y.width/v.width),fe=R*(y.height/v.height),Ee=y.width/2-w*pe/2+oe,Se=y.height/2-A*pe/2+fe;T.save(),T.globalAlpha=.7,T.drawImage(o,Ee,Se,w*pe,A*pe),T.restore()},J=()=>{P=0,R=0,F(),W()};x.addEventListener("input",()=>{k=Number(x.value),E.textContent=`${k.toFixed(2)}\xD7`,F(),W()}),v.addEventListener("pointerdown",$=>{L=!0,O=$.clientX,D=$.clientY,V=P,H=R,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{L&&(P=V+($.clientX-O),R=H+($.clientY-D),F(),W())}),v.addEventListener("pointerup",$=>{L=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{L=!1});let de=()=>{c.remove()},we=()=>{de(),l(null)},$e=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let ie=$.getContext("2d");if(!ie){de(),l(null);return}let re=k,oe=Math.max($.width/w,$.height/A)*re,fe=$.width/v.width,Ee=P*fe,Se=R*fe,B=$.width/2-w*oe/2+Ee,Z=$.height/2-A*oe/2+Se;ie.drawImage(o,B,Z,w*oe,A*oe);let Y=await new Promise(te=>{$.toBlob(Me=>te(Me),e.type||"image/png")});if(de(),!Y){l(null);return}l(new File([Y],e.name,{type:Y.type}))};M==null||M.addEventListener("click",we),j==null||j.addEventListener("click",we),_==null||_.addEventListener("click",J),C==null||C.addEventListener("click",()=>{$e()}),c.addEventListener("click",$=>{$.target===c&&we()}),document.body.appendChild(c),J()})}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 ui=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
1219
1316
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
1220
1317
|
<div class="scene-panel-header" data-panel-handle>
|
|
1221
1318
|
<div class="panel-title">
|
|
@@ -1281,10 +1378,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1281
1378
|
</div>
|
|
1282
1379
|
</div>
|
|
1283
1380
|
</div>
|
|
1284
|
-
`}initialize(e,t){var b,y,x,w,E,L,A,M,j,k,S,T,C,_,R,z;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var I;let P=window.getEditableEngineConfig;if(typeof P=="function"){let $=P();return(I=$==null?void 0:$.loading)!=null?I:{}}return{}})(),a=(b=this.root)==null?void 0:b.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{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((E=n.overlay_alpha)!=null?E:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var I,$;let P=Number(s.value);l&&(l.textContent=P.toFixed(2)),($=(I=this.options)==null?void 0:I.onUpdateLoading)==null||$.call(I,{overlay_alpha:P})}));let c=(L=this.root)==null?void 0:L.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{text:c.value})}));let p=(A=this.root)==null?void 0:A.querySelector("#loading-text-scale"),d=(M=this.root)==null?void 0:M.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 I,$;let P=Number(p.value);d&&(d.textContent=P.toFixed(2)),($=(I=this.options)==null?void 0:I.onUpdateLoading)==null||$.call(I,{text_scale:P})}));let u=(k=this.root)==null?void 0:k.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{enabled:u.checked})}));let g=(S=this.root)==null?void 0:S.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{blur_enabled:g.checked})}));let f=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength"),h=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");f&&(f.value=String((_=n.blur_strength)!=null?_:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var P,I;h&&(h.textContent=f.value),(I=(P=this.options)==null?void 0:P.onUpdateLoading)==null||I.call(P,{blur_strength:Number(f.value)})}));let m=(R=this.root)==null?void 0:R.querySelector("#loading-show-btn"),v=(z=this.root)==null?void 0:z.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||I.call(P)}),v==null||v.addEventListener("click",()=>{var P,I;(I=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||I.call(P)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as di}from"pixi.js";async function rr(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",s);let l=await di.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(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function or(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,o=typeof a=="function"?a():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 di.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 v=h.get(m);if(v){let b=((n=v.getDisplayObject)==null?void 0:n.call(v))||v.pixiObject||v;b!=null&&b.texture&&(b.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function sr(r,e,t,i){var n,a,o,s,l,c,p,d,u,g,f,h,m,v,b;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let y=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",y);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let E=await di.load(w);if(!E){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),le[y]=E,console.log("[LIBRARY] \u2705 Updated AssetTextures."+y);let L=window.CustomAssets;L!=null&&L[y]&&(L[y].texture=E,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+y));let A=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!A),A){let j=Array.from(((n=A.keys)==null?void 0:n.call(A))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",j);let k=A.get(y);if(console.log("[LIBRARY] gameObject for "+y+"?",!!k),k){let S=((a=k.getDisplayObject)==null?void 0:a.call(k))||k.pixiObject||k.pixi||k,T=(o=S==null?void 0:S.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",S),console.log("[LIBRARY] displayObject type:",T),console.log("[LIBRARY] has texture?",!!(S!=null&&S.texture)),S!=null&&S.texture)S.texture=E,console.log("[LIBRARY] \u2705 Applied to display object:",y);else if(T==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),_=S.parent,R=(l=(s=_==null?void 0:_.getChildIndex)==null?void 0:s.call(_,S))!=null?l:0,z={x:S.x,y:S.y},P={x:(p=(c=S.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=S.anchor)==null?void 0:d.y)!=null?u:.5},I={x:(f=(g=S.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=S.scale)==null?void 0:h.y)!=null?m:1},$=(v=S.alpha)!=null?v:1,Q=(b=S.visible)!=null?b:!0,B=new C(E);B.anchor.set(P.x,P.y),B.position.set(z.x,z.y),B.scale.set(I.x,I.y),B.alpha=$,B.visible=Q,_&&(_.removeChild(S),_.addChildAt(B,R),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(S!=null&&S.children){let C=S.children.find(_=>_.texture);C?(C.texture=E,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${i}/${t}`;lt({objectId:y,path:"render.asset.path",value:M}),console.log("[LIBRARY] \u2705 Staged config override for:",y,"path:",M)}catch(y){console.error("[LIBRARY] Error applying slot asset:",y)}}async function lr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await di.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}le[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(a);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:",a))}}lt({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}import{Graphics as gr,Point as Eo}from"pixi.js";import{Point as cr}from"pixi.js";var Le=()=>window.debugConfig||{},dr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),pr=()=>window.resolveScreenAnchorPoint||(()=>new cr),ur=()=>window.resolveScreenRatioPoint||(()=>new cr);function hr(r){pi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>ui(r))))}function fr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),ut(r)}function pi(r){return r.isDebugOpen}function ui(r){var a,o,s;if(!pi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>ui(r));let e=an(r);if(!e){pt(r,null),ut(r);return}let t=rn(r,e);if(!t){pt(r,null),ut(r);return}let i=new Eo;(a=t.getGlobalPosition)==null||a.call(t,i);let n=on(r,t);pt(r,{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}),r.highlightObject?dn(r,t):un(r),r.highlightAnchor&&n?pn(r,n):gn(r)}function an(r){var n;let e=r.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 rn(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function gt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function on(r,e){var o,s;let t=gt(r);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=sn(r);if(!n)return null;if(i.position_ratio!=null)return ur()(n.width,n.height,i.position_ratio);let a=(s=i.anchor)!=null?s:"center";return pr()(n.width,n.height,a)}function sn(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ln(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new gr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function cn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new gr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function dn(r,e){var n;let t=ln(r);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 pn(r,e){let t=cn(r);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 un(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function gn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function ut(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function pt(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function mr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function br(r,e,t){var o;let i=e.split("."),n=i.pop(),a=r;for(let s of i)a[s]=(o=a[s])!=null?o:{},a=a[s];a[n]=t}function hn(r){var i,n,a,o,s;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((s=(o=r.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function hi(r){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 vr(r){window.location.reload()}function fi(r){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 yr(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,o=typeof a=="function"?a(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),gi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),gi(r,o),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function gi(r,e){var d,u,g,f,h,m,v,b,y,x;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),o=r.container.querySelector("#config-anchor-y"),l=hn(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=(y=(v=e.transform)==null?void 0:v.anchor)!=null?y:(b=e.render)==null?void 0:b.anchor)!=null?x:{x:.5,y:.5},p=dr()(c);a&&(a.value=String(p.x)),o&&(o.value=String(p.y))}function xr(r){var l,c,p,d,u,g,f,h,m,v;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=r.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",o=(v=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?v:"0.5",s=`${e}:
|
|
1381
|
+
`}initialize(e,t){var v,y,x,E,M,j,C,_,I,T,w,A,S,k,P,R;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let L=window.getEditableEngineConfig;if(typeof L=="function"){let D=L();return(O=D==null?void 0:D.loading)!=null?O:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{type:a.value}),this.updateFieldVisibility(a.value)}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{background_color:o.value})}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((M=n.overlay_alpha)!=null?M:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var O,D;let L=Number(s.value);l&&(l.textContent=L.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:L})}));let c=(j=this.root)==null?void 0:j.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{text:c.value})}));let p=(C=this.root)==null?void 0:C.querySelector("#loading-text-scale"),d=(_=this.root)==null?void 0:_.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var O,D;let L=Number(p.value);d&&(d.textContent=L.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:L})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{enabled:u.checked})}));let g=(w=this.root)==null?void 0:w.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{blur_enabled:g.checked})}));let f=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength"),h=(S=this.root)==null?void 0:S.querySelector("#loading-blur-strength-value");f&&(f.value=String((k=n.blur_strength)!=null?k:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var L,O;h&&(h.textContent=f.value),(O=(L=this.options)==null?void 0:L.onUpdateLoading)==null||O.call(L,{blur_strength:Number(f.value)})}));let m=(P=this.root)==null?void 0:P.querySelector("#loading-show-btn"),b=(R=this.root)==null?void 0:R.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onShowLoadingScreen)==null||O.call(L)}),b==null||b.addEventListener("click",()=>{var L,O;(O=(L=this.options)==null?void 0:L.onHideLoadingScreen)==null||O.call(L)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as gi}from"pixi.js";async function or(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",s);let l=await gi.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)be[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(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function sr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,o=typeof a=="function"?a():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 gi.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)be[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 v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function lr(r,e,t,i){var n,a,o,s,l,c,p,d,u,g,f,h,m,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let y=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",y);let x=Date.now(),E=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",E);let M=await gi.load(E);if(!M){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),be[y]=M,console.log("[LIBRARY] \u2705 Updated AssetTextures."+y);let j=window.CustomAssets;j!=null&&j[y]&&(j[y].texture=M,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+y));let C=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!C),C){let I=Array.from(((n=C.keys)==null?void 0:n.call(C))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let T=C.get(y);if(console.log("[LIBRARY] gameObject for "+y+"?",!!T),T){let w=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,A=(o=w==null?void 0:w.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",w),console.log("[LIBRARY] displayObject type:",A),console.log("[LIBRARY] has texture?",!!(w!=null&&w.texture)),w!=null&&w.texture)w.texture=M,console.log("[LIBRARY] \u2705 Applied to display object:",y);else if(A==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:S}=await import("pixi.js"),k=w.parent,P=(l=(s=k==null?void 0:k.getChildIndex)==null?void 0:s.call(k,w))!=null?l:0,R={x:w.x,y:w.y},L={x:(p=(c=w.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=w.anchor)==null?void 0:d.y)!=null?u:.5},O={x:(f=(g=w.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=w.scale)==null?void 0:h.y)!=null?m:1},D=(b=w.alpha)!=null?b:1,V=(v=w.visible)!=null?v:!0,H=new S(M);H.anchor.set(L.x,L.y),H.position.set(R.x,R.y),H.scale.set(O.x,O.y),H.alpha=D,H.visible=V,k&&(k.removeChild(w),k.addChildAt(H,P),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=H),T.pixi&&(T.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(w!=null&&w.children){let S=w.children.find(k=>k.texture);S?(S.texture=M,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;ut({objectId:y,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",y,"path:",_)}catch(y){console.error("[LIBRARY] Error applying slot asset:",y)}}async function cr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await gi.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}be[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(a);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:",a))}}ut({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}import{Graphics as hr,Point as So}from"pixi.js";import{Point as dr}from"pixi.js";var Re=()=>window.debugConfig||{},pr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),ur=()=>window.resolveScreenAnchorPoint||(()=>new dr),gr=()=>window.resolveScreenRatioPoint||(()=>new dr);function fr(r){hi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r))))}function mr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),mt(r)}function hi(r){return r.isDebugOpen}function fi(r){var a,o,s;if(!hi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r));let e=on(r);if(!e){ft(r,null),mt(r);return}let t=sn(r,e);if(!t){ft(r,null),mt(r);return}let i=new So;(a=t.getGlobalPosition)==null||a.call(t,i);let n=ln(r,t);ft(r,{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}),r.highlightObject?un(r,t):hn(r),r.highlightAnchor&&n?gn(r,n):fn(r)}function on(r){var n;let e=r.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 sn(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function bt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function ln(r,e){var o,s;let t=bt(r);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=cn(r);if(!n)return null;if(i.position_ratio!=null)return gr()(n.width,n.height,i.position_ratio);let a=(s=i.anchor)!=null?s:"center";return ur()(n.width,n.height,a)}function cn(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function dn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new hr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function pn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new hr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function un(r,e){var n;let t=dn(r);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 gn(r,e){let t=pn(r);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 hn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function fn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function mt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function ft(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function br(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function vr(r,e,t){var o;let i=e.split("."),n=i.pop(),a=r;for(let s of i)a[s]=(o=a[s])!=null?o:{},a=a[s];a[n]=t}function mn(r){var i,n,a,o,s;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((s=(o=r.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function bi(r){let e=Re();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function yr(r){window.location.reload()}function vi(r){let e=JSON.stringify(Re(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function xr(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,o=typeof a=="function"?a(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),mi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),mi(r,o),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function mi(r,e){var d,u,g,f,h,m,b,v,y,x;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),o=r.container.querySelector("#config-anchor-y"),l=mn(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=(y=(b=e.transform)==null?void 0:b.anchor)!=null?y:(v=e.render)==null?void 0:v.anchor)!=null?x:{x:.5,y:.5},p=pr()(c);a&&(a.value=String(p.x)),o&&(o.value=String(p.y))}function wr(r){var l,c,p,d,u,g,f,h,m,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=r.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",o=(b=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",s=`${e}:
|
|
1285
1382
|
position: (${t}, ${i})
|
|
1286
1383
|
scale: ${n}
|
|
1287
|
-
anchor: (${a}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(b=>console.error("[DEBUG] Failed to copy config values:",b))}async function fn(r,e){var d,u,g,f,h,m,v,b,y,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),o=Number((b=(v=r.container.querySelector("#config-anchor-x"))==null?void 0:v.value)!=null?b:.5),s=Number((x=(y=r.container.querySelector("#config-anchor-y"))==null?void 0:y.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,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:a},{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=gt(r);hn(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 E=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);E?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,E)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function wr(r,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 a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!a,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function Er(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,fn(r,{silent:!0})},150))}var So=3e3;function ht(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,o=0,s=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let v=h.left-m.left,b=h.top-m.top;console.log("[DRAG] targetPosition:",{left:v,top:b}),r.style.left=`${v}px`,r.style.top=`${b}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++So),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function Sr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,o=0,s=0,l=0,c=!1,p=u=>{var b;if(!c)return;let g=u.clientX-s,f=u.clientY-l,h=Math.max(i,a+g),m=Math.max(n,o+f);r.style.width=`${h}px`,(b=r.closest(".preview-shell"))!=null&&b.classList.contains("layout-fixed")||(r.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=r.getBoundingClientRect();a=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function mn(r,e){var h,m,v,b;let t=(v=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?v:e.offsetParent;if(!t||(b=r.container)!=null&&b.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,o=Math.max(250,Math.floor(i.width-a*2)),s=Math.max(200,Math.floor(i.height-a*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(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(p,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function We(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(mn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),o={activeTab:r.activeTab};if(a)try{o={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function mi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),mn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function bn(r,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",mn(r,e),We(r))}function Ar(r){var n,a,o;if(!r.container)return;let e=r.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=r.toggleDebug)==null||s.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=r.toggleDebug)==null?void 0:s.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>hi(r)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>fi(r)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;r.activeTab=l,vn(r),We(r)})}),xn(r,e),yn(r,e)}function vn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function yn(r,e){ae(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ae(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ae(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ae(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ae(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ae(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ae(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ae(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ae(r,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("#",""),a=parseInt(n,16),o=Le();o.layout&&(o.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Cr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),ht(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{We(r),bn(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),ht(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{bn(r,i)},10)})),i&&a&&Sr(i,a);let o=r.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&ht(o,s,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&ht(l,c,r.debugOverlay),mi(r)}function xn(r,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(r,e,t,i,n){let a=e.querySelector(`#${t}`),o=e.querySelector(n);if(!a||!o)return;let s=mr(Le(),i);typeof s=="number"&&(a.value=String(s),o.textContent=String(s)),a.addEventListener("input",()=>{let l=Number(a.value);o.textContent=String(l),br(Le(),i,l)})}var bi=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=Ni(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let p of n){let d=p.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1384
|
+
anchor: (${a}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(v=>console.error("[DEBUG] Failed to copy config values:",v))}async function bn(r,e){var d,u,g,f,h,m,b,v,y,x,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),o=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),s=Number((x=(y=r.container.querySelector("#config-anchor-y"))==null?void 0:y.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,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:a},{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=bt(r);mn(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 M=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);M?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,M)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Er(r,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 a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!a,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function Sr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,bn(r,{silent:!0})},150))}var Ao=3e3;function vt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,o=0,s=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let b=h.left-m.left,v=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ao),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function Ar(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,o=0,s=0,l=0,c=!1,p=u=>{var v;if(!c)return;let g=u.clientX-s,f=u.clientY-l,h=Math.max(i,a+g),m=Math.max(n,o+f);r.style.width=`${h}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.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=r.getBoundingClientRect();a=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function vn(r,e){var h,m,b,v;let t=(b=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,o=Math.max(250,Math.floor(i.width-a*2)),s=Math.max(200,Math.floor(i.height-a*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(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(p,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Ze(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(vn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),o={activeTab:r.activeTab};if(a)try{o={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function yi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),vn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function yn(r,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",vn(r,e),Ze(r))}function Tr(r){var n,a,o;if(!r.container)return;let e=r.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=r.toggleDebug)==null||s.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=r.toggleDebug)==null?void 0:s.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>bi(r)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>vi(r)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;r.activeTab=l,xn(r),Ze(r)})}),En(r,e),wn(r,e)}function xn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function wn(r,e){ge(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ge(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ge(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ge(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ge(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ge(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ge(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ge(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ge(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Re();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),o=Re();o.layout&&(o.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Cr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),vt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ze(r),yn(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),vt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{yn(r,i)},10)})),i&&a&&Ar(i,a);let o=r.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&vt(o,s,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&vt(l,c,r.debugOverlay),yi(r)}function En(r,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 ge(r,e,t,i,n){let a=e.querySelector(`#${t}`),o=e.querySelector(n);if(!a||!o)return;let s=br(Re(),i);typeof s=="number"&&(a.value=String(s),o.textContent=String(s)),a.addEventListener("input",()=>{let l=Number(a.value);o.textContent=String(l),vr(Re(),i,l)})}var xi=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=$t(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let p of n){let d=p.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1288
1385
|
<div class="config-persistence-panel">
|
|
1289
1386
|
<!-- Status Footer (Always Visible) -->
|
|
1290
1387
|
<div class="persistence-status-footer">
|
|
@@ -1306,13 +1403,20 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1306
1403
|
</div>
|
|
1307
1404
|
</div>
|
|
1308
1405
|
|
|
1406
|
+
${t?`
|
|
1407
|
+
<div class="staging-banner">
|
|
1408
|
+
<span class="banner-icon">\u26A0\uFE0F</span>
|
|
1409
|
+
<span class="banner-text">You have staged changes (not saved).</span>
|
|
1410
|
+
</div>
|
|
1411
|
+
`:""}
|
|
1412
|
+
|
|
1309
1413
|
<div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
|
|
1310
1414
|
${t?`
|
|
1311
1415
|
<div class="status-box">
|
|
1312
1416
|
<span class="status-badge">UNAPPLIED</span>
|
|
1313
1417
|
<span class="status-text">${i} staging changes</span>
|
|
1314
1418
|
</div>
|
|
1315
|
-
<div class="status-action-hint">
|
|
1419
|
+
<div class="status-action-hint">Review below before applying to project</div>
|
|
1316
1420
|
`:`
|
|
1317
1421
|
<div class="status-box">
|
|
1318
1422
|
<span class="status-badge success">READY</span>
|
|
@@ -1326,18 +1430,18 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1326
1430
|
id="create-version-btn"
|
|
1327
1431
|
class="persistence-btn primary-action"
|
|
1328
1432
|
${t?"":"disabled"}
|
|
1329
|
-
title="
|
|
1433
|
+
title="Creates a new version snapshot with backup. Safe for production use."
|
|
1330
1434
|
>
|
|
1331
|
-
\u{1F4DD}
|
|
1435
|
+
\u{1F4DD} Save As New Version
|
|
1332
1436
|
</button>
|
|
1333
1437
|
|
|
1334
1438
|
<button
|
|
1335
1439
|
id="apply-current-btn"
|
|
1336
1440
|
class="persistence-btn secondary-action"
|
|
1337
1441
|
${t?"":"disabled"}
|
|
1338
|
-
title="
|
|
1442
|
+
title="${this.currentVersion?`Updates the currently active version: ${this.currentVersion}`:"Applies changes to Original configs"}"
|
|
1339
1443
|
>
|
|
1340
|
-
\u{1F4BE}
|
|
1444
|
+
\u{1F4BE} Apply to Current Source${this.currentVersion?` (${this.currentVersion})`:" (Original)"}
|
|
1341
1445
|
</button>
|
|
1342
1446
|
</div>
|
|
1343
1447
|
|
|
@@ -1412,36 +1516,34 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1412
1516
|
`}
|
|
1413
1517
|
|
|
1414
1518
|
<div class="persistence-footer">
|
|
1415
|
-
<div class="footer-row">
|
|
1416
|
-
<span class="footer-label">Last Applied:</span>
|
|
1417
|
-
<span class="footer-value">${s}</span>
|
|
1418
|
-
</div>
|
|
1419
1519
|
<div class="footer-secondary-actions">
|
|
1420
|
-
<button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"}>Reload State</button>
|
|
1421
|
-
<button id="reset-to-original-btn" class="footer-btn danger">Factory Reset (Pristine)</button>
|
|
1520
|
+
<button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"} title="Discard changes and reload last applied state">Reload State</button>
|
|
1521
|
+
<button id="reset-to-original-btn" class="footer-btn danger" title="Restore to original pristine configs from backup">Factory Reset (Pristine)</button>
|
|
1522
|
+
<button id="discard-all-overrides-btn" class="footer-btn" ${t?"":"disabled"} title="Discard all staged overrides">Discard All Overrides</button>
|
|
1422
1523
|
</div>
|
|
1423
1524
|
</div>
|
|
1424
1525
|
|
|
1425
1526
|
<div class="persistence-info">
|
|
1426
|
-
<p><strong>
|
|
1527
|
+
<p><strong>Apply Options:</strong></p>
|
|
1427
1528
|
<ul>
|
|
1428
|
-
<li><strong>
|
|
1429
|
-
<li><strong>Apply to Current
|
|
1430
|
-
<li><strong>Apply to BASE (Dev Only)</strong> - Directly edits base configs without versioning (use Git for safety)</li>
|
|
1529
|
+
<li><strong>Save As New Version</strong> - Creates a new version snapshot with backup (safe for production). Clears overrides after save.</li>
|
|
1530
|
+
<li><strong>Apply to Current Source</strong> - Writes to ${this.currentVersion?`version "${this.currentVersion}"`:"Original configs"}. Clears overrides after apply.</li>
|
|
1531
|
+
${this.isDevelopmentMode?"<li><strong>Apply to BASE (Dev Only)</strong> - Directly edits base configs without versioning (use Git for safety)</li>":""}
|
|
1431
1532
|
</ul>
|
|
1533
|
+
<p class="info-hint"><strong>Version Switching:</strong> Always clears overrides and reloads from selected Source.</p>
|
|
1432
1534
|
</div>
|
|
1433
1535
|
</div>
|
|
1434
|
-
`}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
|
|
1536
|
+
`}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 g;if(e.getAttribute("disabled")!==null)return;if(!$t().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
|
|
1435
1537
|
|
|
1436
1538
|
This will:
|
|
1437
1539
|
\u2022 Create a new version snapshot
|
|
1438
1540
|
\u2022 Include all current changes
|
|
1439
1541
|
\u2022 Clear staged overrides after save
|
|
1440
|
-
\u2022 Set the new version as active`))try{let
|
|
1542
|
+
\u2022 Set the new version as active`))try{let f=localStorage.getItem("handler_last_version_name")||"",m=((g=prompt("Version name (e.g. v1.2.0, test_2024):",f))!=null?g:"").trim();if(!m){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",m),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await da(m),Be(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(f){console.error("[ConfigPersistence] Create version failed:",f),alert(`\u274C Failed to create version: ${f.message}`),e.textContent="\u{1F4DD} SAVE AS NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(t.getAttribute("disabled")!==null)return;let d=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
|
|
1441
1543
|
|
|
1442
|
-
This will write all staged changes to ${
|
|
1544
|
+
This will write all staged changes to ${d}.
|
|
1443
1545
|
|
|
1444
|
-
After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let
|
|
1546
|
+
After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=Dt(),f={};for(let[b,v]of Object.entries(g.objects)){let y=v,x=b;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${b}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=x),f[`objects/${x}.json`]=y}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,v]of Object.entries(g.scenes)){let y=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${y}.json`]=v}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}Be(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",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
|
|
1445
1547
|
|
|
1446
1548
|
This will DIRECTLY MODIFY base configuration files.
|
|
1447
1549
|
|
|
@@ -1451,21 +1553,25 @@ This is ONLY for active development.
|
|
|
1451
1553
|
|
|
1452
1554
|
Make sure your project is under Git version control.
|
|
1453
1555
|
|
|
1454
|
-
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let
|
|
1556
|
+
Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let u=Dt(),g={};for(let[h,m]of Object.entries(u.objects)){let b=m,v=h;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=v),g[`objects/${v}.json`]=b}u.engine&&(u.engine.runtime&&(g["engine/engine.runtime.json"]=u.engine.runtime),u.engine.assets&&(g["engine/engine.assets.json"]=u.engine.assets),u.engine.splash&&(g["engine/engine.splash.json"]=u.engine.splash),u.engine.loading&&(g["engine/engine.loading.json"]=u.engine.loading),u.engine.start&&(g["engine/engine.start.json"]=u.engine.start),u.engine.tutorial&&(g["engine/engine.tutorial.json"]=u.engine.tutorial),u.engine.endgame&&(g["engine/engine.endgame.json"]=u.engine.endgame),!u.engine.runtime&&!u.engine.assets&&(g["engine/engine.json"]=u.engine));for(let[h,m]of Object.entries(u.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}Be(),this.showSuccessNotification(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Apply to base failed:",u),alert(`\u274C Apply to base failed: ${u.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 d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let u=d.dataset.removePath,g=d.dataset.removeId;ca(g||void 0,u)})});let o=this.container.querySelector("#clear-all-overrides"),s=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Be(),Gi(),this.refreshPanel())};o==null||o.addEventListener("click",l),s==null||s.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Gi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await pa()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
|
|
1455
1557
|
<div class="notify-icon">\u2705</div>
|
|
1456
1558
|
<div class="notify-content">
|
|
1457
1559
|
<strong>${i}</strong>
|
|
1458
1560
|
<span>Project files updated.</span>
|
|
1459
1561
|
</div>
|
|
1460
|
-
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){if(confirm(`Switch to version "${e||"original"}"?
|
|
1562
|
+
`,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,o;let t=$t();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
|
|
1563
|
+
|
|
1564
|
+
You have ${t.overrideCount} staged changes that will be discarded.
|
|
1461
1565
|
|
|
1462
|
-
|
|
1566
|
+
Options:
|
|
1567
|
+
OK = Discard staged overrides and switch
|
|
1568
|
+
Cancel = Stay on current version`)){let l=(n=this.container)==null?void 0:n.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}}else if(!confirm(`Switch to version "${e||"original"}"?`)){let l=(a=this.container)==null?void 0:a.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let s=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!s.ok){let l=await s.json();throw new Error(l.error||"Failed to switch version")}Be(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(s){alert(`\u274C Failed to switch version: ${s.message}`);let l=(o=this.container)==null?void 0:o.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
|
|
1463
1569
|
|
|
1464
1570
|
This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
|
|
1465
1571
|
|
|
1466
1572
|
This cannot be undone unless you have git commits or backups.
|
|
1467
1573
|
|
|
1468
|
-
Are you absolutely sure?`))try{let t=
|
|
1574
|
+
Are you absolutely sure?`))try{let t=Dt(),i={};for(let[a,o]of Object.entries(t.objects)){let s=o,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),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[a,o]of Object.entries(t.scenes)){let s=a.startsWith("scene.")?a:`scene.${a}`;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 a=await n.json();throw new Error(a.error||"Direct apply failed")}Be(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var wi=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 qt;this.sceneToolsPanel=new Vt;this.nudgePanel=new Yt;this.inspectorPanel=new si;this.libraryPanel=new ht;this.libraryPanelDocked=new ht;this.brandVisionPanel=new di;this.customizeSettingsPanel=new pi;this.configPersistencePanel=new xi;this.loadingScreenPanel=new ui}applyAssetChange(e,t){return or(this,e,t)}resetAsset(e){return sr(this,e)}applySlotAsset(e,t,i){return lr(this,e,t,i)}resetSlotAsset(e,t,i){return cr(this,e,t,i)}startObjectVisuals(){return fr(this)}stopObjectVisuals(){return mr(this)}shouldRunObjectVisuals(){return hi(this)}updateObjectVisuals(){return fi(this)}getSelectedInstanceId(){return on(this)}getDisplayObjectById(e){return sn(this,e)}getSelectedObjectConfig(){return bt(this)}getConfigAnchorWorldPoint(e){return ln(this,e)}getScreenSize(){return cn(this)}ensureBoundsGfx(){return dn(this)}ensureAnchorGfx(){return pn(this)}drawBounds(e){return un(this,e)}drawAnchor(e){return gn(this,e)}clearBounds(){return hn(this)}clearAnchor(){return fn(this)}clearObjectVisuals(){return mt(this)}updateObjectInfo(e){return ft(this,e)}resetDebugConfig(){return bi(this)}applyDebugConfig(){return yr(this)}exportDebugConfig(){return vi(this)}loadObjectConfig(e){return xr(this,e)}fillConfigViewer(e){return mi(this,e)}copyConfigValues(){return wr(this)}applyObjectConfig(e){return bn(this,e)}applyCustomizeSettings(e,t){return Er(this,e,t)}scheduleObjectAutoApply(){return Sr(this)}setupDebugEventListeners(){return Tr(this)}setupDebugInputListeners(e){return wn(this,e)}setupPanelLayout(){return Cr(this)}setupCollapsiblePanels(e){return En(this,e)}setupRangeInput(e,t,i,n){return ge(this,e,t,i,n)}updateWorkbenchTabs(){return xn(this)}saveWorkbenchState(){return Ze(this)}loadWorkbenchState(){return yi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let o=JSON.parse(a);o.activeTab&&(this.activeTab=o.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,o,s)=>this.applySlotAsset(a,o,s),onReset:(a,o,s)=>this.resetSlotAsset(a,o,s)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,o,s)=>this.applySlotAsset(a,o,s),onReset:(a,o,s)=>this.resetSlotAsset(a,o,s)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,o,s)=>{console.log("[Inspector] Property changed:",a,o,s)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,o)=>this.applyCustomizeSettings(a,o)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,o)=>this.nudgeSelectedObject(a,o),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,o)=>{var g,f,h,m,b,v;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=s.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,p=((h=l==null?void 0:l.y)!=null?h:0)+o,{applyConfigOverride:d}=await import("./ConfigOverride-JLWPHR4L.js");d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let y=window.__editableConfig,x=(v=(b=(m=y==null?void 0:y.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?v:s;await u(this.selectedObjectId,x)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,u,g,f,h;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let s=(u=(d=o.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,s+a),{applyConfigOverride:c}=await import("./ConfigOverride-JLWPHR4L.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:o;await p(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:a}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,o,s,l)=>{this.customizeSettingsPanel.openAiEditor(a,o,s,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var o,s;((o=a.detail)==null?void 0:o.action)!=="remove"&&((s=a.detail)==null?void 0:s.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,o,s)=>this.applySlotAsset(a,o,s),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let a=window.getActiveConfig;if(typeof a=="function"){let s=a();return((o=s==null?void 0:s.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(a,o)=>{let s=window.getEditableAssets;if(typeof s=="function"){let l=s();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,o)=>{this.libraryPanel.highlightSlot(a,o)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
|
|
1469
1575
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
1470
1576
|
<div class="debug-workbench" id="debug-workbench">
|
|
1471
1577
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -1512,7 +1618,7 @@ Are you absolutely sure?`))try{let t=zt(),i={};for(let[a,o]of Object.entries(t.o
|
|
|
1512
1618
|
${this.sceneToolsPanel.render()}
|
|
1513
1619
|
${this.nudgePanel.render()}
|
|
1514
1620
|
</div>
|
|
1515
|
-
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}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"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=a.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function
|
|
1621
|
+
`}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}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"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=a.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function To(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Co(r){var n;let[e,t]=r.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 Lo(r){return`
|
|
1516
1622
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
1517
1623
|
|
|
1518
1624
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -1529,9 +1635,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
|
|
|
1529
1635
|
${r?`
|
|
1530
1636
|
ADDITIONAL RULES/NOTES:
|
|
1531
1637
|
${r}`:""}
|
|
1532
|
-
`.trim()}function
|
|
1638
|
+
`.trim()}function Lr(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let o=await To(a),s=Co(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};r.push(l),n.push(l)}return n},getSources(){return r.slice()},async analyze(i,n,a){if(r.length===0)throw new Error("No screenshots to analyze.");let o=Lo(n),s=r.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await ci(i,o,s,{model:a}),c=e,p=[],d=l.split(`
|
|
1533
1639
|
`);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(`
|
|
1534
|
-
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
|
|
1640
|
+
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 Fe="handler_api_key_";var Qe=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Fe}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Fe}${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=`${Fe}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Fe}${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(Fe)){let n=i.substring(Fe.length),a=localStorage.getItem(i);if(a){let o=JSON.parse(a);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(Fe)&&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}}},Sn=()=>Qe.getKey("gemini"),An=(r,e)=>Qe.setKey("gemini",r,e),ko=()=>Qe.hasKey("gemini");window.ApiKeyStorage=Qe;window.getGeminiApiKey=Sn;window.setGeminiApiKey=An;window.hasGeminiApiKey=ko;var Cn=class{constructor(){this.modal=null;this.options=null;this.analyzer=Lr();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=`
|
|
1535
1641
|
<div class="ai-modal-card">
|
|
1536
1642
|
<div class="ai-modal-header">
|
|
1537
1643
|
<div class="ai-modal-actions">
|
|
@@ -1612,12 +1718,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
|
|
|
1612
1718
|
</div>
|
|
1613
1719
|
`,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 a=n.target;switch(a.dataset.action||((s=a.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 a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let o=a.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}
|
|
1614
1720
|
|
|
1615
|
-
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 a=this.getApiKey();if(!a){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
|
|
1721
|
+
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 a=this.getApiKey();if(!a){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 li(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 Je(a,this.currentPrompt,o,{aspectRatio:"1:1"}),l=await Xe(s);this.generatedImages.push(l||s),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.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)=>`
|
|
1616
1722
|
<div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
|
|
1617
1723
|
<img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
|
|
1618
1724
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
1619
1725
|
</div>
|
|
1620
|
-
`).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=
|
|
1726
|
+
`).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=Sn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return An(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}},Tn=null;window.__openAiEditor=function(r,e,t,i){Tn||(Tn=new Cn),Tn.open({objectId:r,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(r,i.path,n);else{let o=window.getEditableObjectConfig,s=o==null?void 0:o(r);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 Ln=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1621
1727
|
<div class="asset-preview-card">
|
|
1622
1728
|
<div class="asset-preview-header">
|
|
1623
1729
|
<div class="asset-preview-title">${n}</div>
|
|
@@ -1644,7 +1750,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1644
1750
|
<source src="${n}" type="audio/wav">
|
|
1645
1751
|
Your browser does not support the audio element.
|
|
1646
1752
|
</audio>
|
|
1647
|
-
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(r){new
|
|
1753
|
+
`;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(r){new Ln().open(r)};var kn=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
|
|
1648
1754
|
<div class="asset-crop-card">
|
|
1649
1755
|
<div class="asset-crop-header">
|
|
1650
1756
|
<div>
|
|
@@ -1695,7 +1801,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1695
1801
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
1696
1802
|
</div>
|
|
1697
1803
|
</div>
|
|
1698
|
-
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,o=Math.min(n,a),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(r){new Tn().open(r)};var Ln=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";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.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};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||Ki.id),this.debugPanel=new vi,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.updateDockState(),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,a;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||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,a+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
1804
|
+
`,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,o=Math.min(n,a),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(r){new kn().open(r)};var Pn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[We("playable-portrait"),We("iphone-14"),We("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.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=We(e.defaultDevice||Ji.id),this.debugPanel=new wi,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.updateDockState(),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,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=We(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,a+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
1699
1805
|
<div class="preview-toolbar">
|
|
1700
1806
|
<div class="preview-toolbar-left">
|
|
1701
1807
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -1704,7 +1810,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1704
1810
|
<div class="preview-toolbar-center">
|
|
1705
1811
|
<div class="device-selector-wrapper">
|
|
1706
1812
|
<select class="device-dropdown" id="device-select">
|
|
1707
|
-
${
|
|
1813
|
+
${Ga.map(i=>`
|
|
1708
1814
|
<optgroup label="${i.label}">
|
|
1709
1815
|
${i.devices.map(n=>`
|
|
1710
1816
|
<option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
|
|
@@ -1856,7 +1962,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1856
1962
|
</div>
|
|
1857
1963
|
|
|
1858
1964
|
</div>
|
|
1859
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,v,b,y,x;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",w=>{if(this.viewMode==="compare")return;let E=w.target.value;this.setDevice(E)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",w=>{let E=w.target.value;this.setTheme(E)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.viewToggle;E&&this.setViewMode(E)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.layoutToggle;E&&this.setLayoutMode(E)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(w=>{w.addEventListener("click",()=>{let E=w.dataset.dockTab;if(!E)return;l.forEach(A=>A.classList.remove("active")),w.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(A=>{let M=A.dataset.dockPanel;A.classList.toggle("active",M===E)})})}),(v=e.querySelector("#console-clear"))==null||v.addEventListener("click",()=>this.clearConsole()),(b=e.querySelector("#corner-zoom-in-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(.1)),(y=e.querySelector("#corner-zoom-out-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(-.1)),(x=e.querySelector("#corner-grab-btn"))==null||x.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=a/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('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let o=this.consoleMessages.filter(s=>s.type==="error").length;a.textContent=o>0?`${o}!`:"0",a.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=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]");!a||!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:a,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 a,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=(a=this.options).onDeviceChange)==null||o.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(a,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 a=t.canvas.width,o=t.canvas.height,s=Math.min(a/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(a-l)/2,d=(o-c)/2;n.clearRect(0,0,a,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 Lr(r={}){let e=new Ln(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as ko,Container as kr}from"pixi.js";var Po=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",kn=Po;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(kn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${kn}`))}}catch{}function Mo(r){var t,i,n,a,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);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(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let s=r.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__: ${kn}`);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 kr;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let o=await Di.load(e,n,i,a);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 ko(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 kr)){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 v of h)try{let b=await fetch(v);if(b.ok){s=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"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,a,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((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=Mo(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 Pn(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function Pr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function _o(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Mr(r,e){var l,c,p;if(!r||!e)return;let t=e.transform||{};_o(r,e);let i=t.position||{},n=t.offset||{},a=(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=r.position)!=null&&l.set?r.position.set(a,o):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=o)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let s=t.anchor;if(s&&((p=r.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"&&r.anchor.set(d.x,d.y)}}function _r(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=Pn(e),i=a=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?a.filter(c=>l[c]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>_r(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Pn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Pn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{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,a))!=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[a];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return a}}function Io(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,o,s;let n=r(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;(a=g==null?void 0:g[t])!=null&&a.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 v=m.children.find(b=>b==null?void 0:b.texture);v!=null&&v.texture&&(v.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=$i();Array.isArray(i)&&i.length&&(window.__editableConfig=t,jt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=$i();Array.isArray(i)&&i.length&&(window.__editableConfig=t,jt(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,o]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:o});if(t.assets)for(let[a,o]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:o}),typeof o=="string"&&e(a,o);if(t.splash)for(let[a,o]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:o});if(t.loading)for(let[a,o]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:o});if(t.start)for(let[a,o]of Object.entries(t.start))n.push({path:`start.${a}`,value:o});n.length&&jt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Mn(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let s=t.get(a),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(a):l&&l.destroy();let d=window.gameApp,u=await ke.create(a,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(Io(),window.applyEditableObjectConfig=(a,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(a,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,a);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=Pr(d);Mr(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(a,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(a,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(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=Pr(l);Mr(u,o)}let c=[a];i==null||i(a,o,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,_r(a))}};return n.rebuildIndexes(),n}import Oo from"lottie-web";Rn(Na);typeof window!="undefined"&&!window.lottie&&(window.lottie=Oo);var Xe=null,Ro=async()=>{if(!Xe){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);Xe=JSON.parse(i)}else Xe=JSON.parse(e);return Xe}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}Xe=await(await fetch("./handler.config.json")).json()}return Xe},jn,mt,Rr,Je,In,On;function kd(r){jn=r.initGame,mt=r.CustomAssets,Rr=r.updateScreenState,Je=r.globalResponsiveMultipliers,In=r.layout,On=r.clearResponsiveElements}var yi="web_embed",ft="https://example.com",Ir={profile_id:yi},Pe=null,ce=null,_n={width:0,height:0},jo=!0,Pd=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let r=await Ro();Ir={...r.ids||{},profile_id:yi},ft=r.destination_url||((p=(c=r.export_profiles)==null?void 0:c[yi])==null?void 0:p.destination_url)||ft,me.init({ids:Ir,profile:yi,destinationUrl:ft});let e=me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=Lr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Or()},onRefresh:Or});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var y,x,w,E,L,A,M,j,k,S,T;let h=window.gameApp,m=window.gameObjectManager,{width:v,height:b}=f.detail;if(_n.width=v,_n.height=b,Rr(v,b),!(!h||!h.renderer)){m&&s(h,m);try{h.renderer.resize(v,b);let C=h.view;C&&(C.style.width="100%",C.style.height="100%",C.style.display="block")}catch(C){console.warn("[SCREEN] Error resizing renderer:",C);return}if(t&&m&&In)try{let C=(y=window.__mainContainer)!=null?y:h.stage,_=(M=(A=(E=window.__tutorialLabel)!=null?E:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?A:(L=m.get("label_1"))==null?void 0:L.pixiObject)!=null?M:m.get("label_1"),R=m.get("background_1"),z=(T=(S=(k=window.__background)!=null?k:(j=R==null?void 0:R.getDisplayObject)==null?void 0:j.call(R))!=null?S:R==null?void 0:R.pixiObject)!=null?T:R;if(C){let P=C===h.stage;In({mainContainer:C,label:_,background:z,backgroundTexture:(z==null?void 0:z.texture)||null,app:h},t,0,_n,m,{skipMainContainerTransform:P})}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Dt("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Bi(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 Dt("scene.main"));let i=await jn(e,t,ft,ce);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=Mn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:mt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(Je.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),s(Pe,n);async function o(){try{let g=async b=>{let y=b.startsWith("/")?b:`/${b}`,x=await fetch(y,{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={},v={};for(let[b,y]of Object.entries(h)){let x=y==null?void 0:y.source;if(typeof x!="string")continue;let w=await g(x),E=w==null?void 0:w.elements;if(!Array.isArray(E))continue;let L=E.map(A=>A==null?void 0:A.instance_id).filter(A=>typeof A=="string");m[b]=L;for(let A of L)v[A]||(v[A]=b)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:v},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,f){if(jo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${Je.scale.toFixed(3)}`),g.stage){let m=function(v,b=0){if(!v||!v.children)return;let y=" ".repeat(b);v.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${y}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let E=x.scale.x||1,L=x.scale.y||1;x.__originalScale||(x.__originalScale={x:E,y:L},console.log(`${y}[RESPONSIVE] Stored original scale for child[${w}]: ${E.toFixed(3)}, ${L.toFixed(3)}`));let A=x.__originalScale.x*Je.scale,M=x.__originalScale.y*Je.scale;typeof x.scale.set=="function"?x.scale.set(A,M):(x.scale.x=A,x.scale.y=M),console.log(`${y}[RESPONSIVE] Child[${w}] scale: ${E.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,b+1)}else x&&console.log(`${y}[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){Je.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()},Or=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{On&&On()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=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,a&&(a.innerHTML="");try{typeof mt.resetScene=="function"&&mt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{Dt("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=Bi(s)),jn(a,s,ft).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Mn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:mt})}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"},zo=1.25,Do={fontFamily:"Inter, system-ui, sans-serif"};var zn=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=`
|
|
1965
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,v,y,x;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",E=>{if(this.viewMode==="compare")return;let M=E.target.value;this.setDevice(M)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",E=>{let M=E.target.value;this.setTheme(M)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let M=E.dataset.viewToggle;M&&this.setViewMode(M)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let M=E.dataset.layoutToggle;M&&this.setLayoutMode(M)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(E=>{E.addEventListener("click",()=>{let M=E.dataset.dockTab;if(!M)return;l.forEach(C=>C.classList.remove("active")),E.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(C=>{let _=C.dataset.dockPanel;C.classList.toggle("active",_===M)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(y=e.querySelector("#corner-zoom-out-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(-.1)),(x=e.querySelector("#corner-grab-btn"))==null||x.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=a/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('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let o=this.consoleMessages.filter(s=>s.type==="error").length;a.textContent=o>0?`${o}!`:"0",a.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=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]");!a||!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:a,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 a,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=(a=this.options).onDeviceChange)==null||o.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(a,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 a=t.canvas.width,o=t.canvas.height,s=Math.min(a/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(a-l)/2,d=(o-c)/2;n.clearRect(0,0,a,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 kr(r={}){let e=new Pn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as Po,Container as Pr}from"pixi.js";var Mo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Mn=Mo;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(Mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Mn}`))}}catch{}function _o(r){var t,i,n,a,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);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(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let s=r.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var je=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Mn}`);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 Pr;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let o=await Ni.load(e,n,i,a);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 Po(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 Pr)){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 v=await fetch(b);if(v.ok){s=await v.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,a,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((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=_o(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 _n(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function Mr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Io(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function _r(r,e){var l,c,p;if(!r||!e)return;let t=e.transform||{};Io(r,e);let i=t.position||{},n=t.offset||{},a=(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=r.position)!=null&&l.set?r.position.set(a,o):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=o)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let s=t.anchor;if(s&&((p=r.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"&&r.anchor.set(d.x,d.y)}}function Ir(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=_n(e),i=a=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?a.filter(c=>l[c]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Ir(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(_n((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return _n((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{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,a))!=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[a];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return a}}function Oo(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,o,s;let n=r(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;(a=g==null?void 0:g[t])!=null&&a.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(v=>v==null?void 0:v.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=Fi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,zt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Fi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,zt(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,o]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:o});if(t.assets)for(let[a,o]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:o}),typeof o=="string"&&e(a,o);if(t.splash)for(let[a,o]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:o});if(t.loading)for(let[a,o]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:o});if(t.start)for(let[a,o]of Object.entries(t.start))n.push({path:`start.${a}`,value:o});n.length&&zt(n,{silent:!0,persist:!0,emitEvent:!0})}}function In(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let s=t.get(a),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(a):l&&l.destroy();let d=window.gameApp,u=await je.create(a,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(Oo(),window.applyEditableObjectConfig=(a,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(a,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,a);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=Mr(d);_r(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(a,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(a,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(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=Mr(l);_r(u,o)}let c=[a];i==null||i(a,o,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Ir(a))}};return n.rebuildIndexes(),n}import Ro from"lottie-web";zn(Fa);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ro);var et=null,jo=async()=>{if(!et){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);et=JSON.parse(i)}else et=JSON.parse(e);return et}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}et=await(await fetch("./handler.config.json")).json()}return et},Dn,xt,jr,tt,Rn,jn;function _d(r){Dn=r.initGame,xt=r.CustomAssets,jr=r.updateScreenState,tt=r.globalResponsiveMultipliers,Rn=r.layout,jn=r.clearResponsiveElements}var Ei="web_embed",yt="https://example.com",Or={profile_id:Ei},ze=null,ve=null,On={width:0,height:0},zo=!0,Id=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let r=await jo();Or={...r.ids||{},profile_id:Ei},yt=r.destination_url||((p=(c=r.export_profiles)==null?void 0:c[Ei])==null?void 0:p.destination_url)||yt,Te.init({ids:Or,profile:Ei,destinationUrl:yt});let e=Te.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ve=kr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Rr()},onRefresh:Rr});let g=ve.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var y,x,E,M,j,C,_,I,T,w,A;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:v}=f.detail;if(On.width=b,On.height=v,jr(b,v),!(!h||!h.renderer)){m&&s(h,m);try{h.renderer.resize(b,v);let S=h.view;S&&(S.style.width="100%",S.style.height="100%",S.style.display="block")}catch(S){console.warn("[SCREEN] Error resizing renderer:",S);return}if(t&&m&&Rn)try{let S=(y=window.__mainContainer)!=null?y:h.stage,k=(_=(C=(M=window.__tutorialLabel)!=null?M:(E=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:E.call(x))!=null?C:(j=m.get("label_1"))==null?void 0:j.pixiObject)!=null?_:m.get("label_1"),P=m.get("background_1"),R=(A=(w=(T=window.__background)!=null?T:(I=P==null?void 0:P.getDisplayObject)==null?void 0:I.call(P))!=null?w:P==null?void 0:P.pixiObject)!=null?A:P;if(S){let L=S===h.stage;Rn({mainContainer:S,label:k,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:h},t,0,On,m,{skipMainContainerTransform:L})}}catch(S){console.warn("[SCREEN] Error in layout:",S)}}})}let t=await Ht("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Ui(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 Ht("scene.main"));let i=await Dn(e,t,yt,ve);ze=i.app;let n=i.gameObjectManager;window.gameApp=ze,window.gameObjectManager=n;try{window.__liveEditBridge=In({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:xt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ve&&ve.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(tt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),s(ze,n);async function o(){try{let g=async v=>{let y=v.startsWith("/")?v:`/${v}`,x=await fetch(y,{cache:"no-cache"});if(!x.ok)return null;let E=await x.text();try{return JSON.parse(E)}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[v,y]of Object.entries(h)){let x=y==null?void 0:y.source;if(typeof x!="string")continue;let E=await g(x),M=E==null?void 0:E.elements;if(!Array.isArray(M))continue;let j=M.map(C=>C==null?void 0:C.instance_id).filter(C=>typeof C=="string");m[v]=j;for(let C of j)b[C]||(b[C]=v)}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(zo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${tt.scale.toFixed(3)}`),g.stage){let m=function(b,v=0){if(!b||!b.children)return;let y=" ".repeat(v);b.children.forEach((x,E)=>{if(x&&x.zIndex===9999){console.log(`${y}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let M=x.scale.x||1,j=x.scale.y||1;x.__originalScale||(x.__originalScale={x:M,y:j},console.log(`${y}[RESPONSIVE] Stored original scale for child[${E}]: ${M.toFixed(3)}, ${j.toFixed(3)}`));let C=x.__originalScale.x*tt.scale,_=x.__originalScale.y*tt.scale;typeof x.scale.set=="function"?x.scale.set(C,_):(x.scale.x=C,x.scale.y=_),console.log(`${y}[RESPONSIVE] Child[${E}] scale: ${M.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,v+1)}else x&&console.log(`${y}[RESPONSIVE] Child[${E}] 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){tt.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,Te.start()},Rr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ve){ve.notifyGameDestroyed();try{jn&&jn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ve.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),ze){try{ze.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}ze=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof xt.resetScene=="function"&&xt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{Ht("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=Ui(s)),Dn(a,s,yt).then(l=>{ze=l.app,window.gameApp=ze,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=In({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:xt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ve&&ve.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Te.start()}catch{}})})},100)},1e3)}};var Ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Do=1.25,$o={fontFamily:"Inter, system-ui, sans-serif"};var $n=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=`
|
|
1860
1966
|
position: fixed;
|
|
1861
1967
|
inset: 0;
|
|
1862
1968
|
display: flex;
|
|
@@ -1865,7 +1971,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1865
1971
|
z-index: 50;
|
|
1866
1972
|
user-select: none;
|
|
1867
1973
|
overflow: hidden;
|
|
1868
|
-
background-color: ${
|
|
1974
|
+
background-color: ${Ce.background};
|
|
1869
1975
|
`;let t=document.createElement("div");t.style.cssText=`
|
|
1870
1976
|
position: relative;
|
|
1871
1977
|
width: 288px;
|
|
@@ -1895,12 +2001,12 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1895
2001
|
font-size: 12px;
|
|
1896
2002
|
font-weight: 900;
|
|
1897
2003
|
letter-spacing: 0.15em;
|
|
1898
|
-
color: ${
|
|
2004
|
+
color: ${Ce.ink};
|
|
1899
2005
|
`,o.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
|
|
1900
2006
|
font-size: 10px;
|
|
1901
2007
|
font-family: monospace;
|
|
1902
2008
|
font-weight: bold;
|
|
1903
|
-
color: ${
|
|
2009
|
+
color: ${Ce.primaryAccent};
|
|
1904
2010
|
`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(o),a.appendChild(this.progressText);let s=document.createElement("div");s.style.cssText=`
|
|
1905
2011
|
height: 4px;
|
|
1906
2012
|
width: 100%;
|
|
@@ -1915,7 +2021,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1915
2021
|
border-radius: 9999px;
|
|
1916
2022
|
position: relative;
|
|
1917
2023
|
width: ${this.currentProgress}%;
|
|
1918
|
-
background-color: ${
|
|
2024
|
+
background-color: ${Ce.primaryAccent};
|
|
1919
2025
|
`;let l=document.createElement("div");l.style.cssText=`
|
|
1920
2026
|
position: absolute;
|
|
1921
2027
|
inset: 0;
|
|
@@ -1954,7 +2060,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1954
2060
|
font-size: 24px;
|
|
1955
2061
|
letter-spacing: -0.05em;
|
|
1956
2062
|
animation: handlerMove 2.5s linear infinite;
|
|
1957
|
-
color: ${
|
|
2063
|
+
color: ${Ce.ink};
|
|
1958
2064
|
display: flex;
|
|
1959
2065
|
align-items: center;
|
|
1960
2066
|
justify-content: center;
|
|
@@ -1967,7 +2073,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1967
2073
|
letter-spacing: 0.3em;
|
|
1968
2074
|
opacity: 0.2;
|
|
1969
2075
|
text-transform: uppercase;
|
|
1970
|
-
color: ${
|
|
2076
|
+
color: ${Ce.ink};
|
|
1971
2077
|
`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`,e.appendChild(t),e.appendChild(this.authSeq),this.injectStyles(),e}injectStyles(){if(document.getElementById("handler-loading-screen-styles"))return;let e=document.createElement("style");e.id="handler-loading-screen-styles",e.textContent=`
|
|
1972
2078
|
/* Box Loading Styles */
|
|
1973
2079
|
.boxLoading {
|
|
@@ -1998,7 +2104,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
1998
2104
|
content: '';
|
|
1999
2105
|
width: 50px;
|
|
2000
2106
|
height: 50px;
|
|
2001
|
-
background: ${
|
|
2107
|
+
background: ${Ce.primaryAccent};
|
|
2002
2108
|
animation: animate 0.5s linear infinite;
|
|
2003
2109
|
position: absolute;
|
|
2004
2110
|
top: 0;
|
|
@@ -2055,7 +2161,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2055
2161
|
0%, 100% { opacity: 1; }
|
|
2056
2162
|
50% { opacity: 0.3; }
|
|
2057
2163
|
}
|
|
2058
|
-
`,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 Dn=wa.version,Ho=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);xa();var Nr={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"},Fr=Math.random().toString(36).slice(2),et=null,Ze={...Nr},Ur="web_embed",Nn={},vt,Hn=!1,bt=!1,xt=!1,Gr=!1,qn=1,wi=0,Ai=!1,ve=!1,Qe="",tt=Math.floor(window.innerWidth),it=Math.floor(window.innerHeight),Fn=tt>it,ye=!1,yt=!1,jr=!1,zr=!1,$n=!1,Ei=null,Re=null,Un=!1,Gn=!1,xi=new Map;function qr(){if(!Re)return null;let r=Date.now()-Re;return!Number.isFinite(r)||r<0?null:r}function Bn(r){if(Un)return;let e=qr();e!==null&&(Un=!0,O("session_time",{duration_ms:e,reason:r}))}function Dr(){if(et)return et;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),et=r,r}function Si(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Vr(r,e){return{event_name:r,ts:Date.now(),session_id:Fr,deployment_id:Ze.deployment_id,variant_id:Ze.variant_id,export_profile_id:Ze.profile_id,instance_id:Ze.instance_id||"default",env:Ur==="mraid"?"mraid":"web",attribution:vt,payload:e}}function O(r,e){let t=Si(r),i=Vr(t,e);Gi(i,!!Nn.analytics),$t(t,i),t!==r&&$t(r,i)}function wt(){Ei&&(Ei(tt,it),Ei=null)}function nt(r){qn=r,O("volume",r)}function at(r){r&&(Gr=!0),!xt&&(xt=!0,O("pause"),nt(0))}function Et(r){!r&&Gr||xt&&(xt=!1,O("resume"),nt(qn))}function Me(r,e){tt=Math.floor(r||window.innerWidth),it=Math.floor(e||window.innerHeight),Fn=tt>it,O("resize",{width:tt,height:it})}function $o(){if(Oa())try{let r=mraid.getMaxSize();Me(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Et():at()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();nt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&nt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ai=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ye=!0,O("boot"),O("view"),O("ready"),ve=!0,wt();else{let t=()=>{ye=!0,O("boot"),O("view"),O("ready"),ve=!0,wt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Bo(){if(Ra())try{let r=dapi.getScreenSize();Me(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Et():at()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(nt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>nt(t?1:0)),Ai=!0,dapi.isViewable())ye=!0,O("boot"),O("view"),O("ready"),ve=!0,wt();else{let t=()=>{ye=!0,O("boot"),O("view"),O("ready"),ve=!0,wt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Hr(){let r=()=>{ye||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ye=!0,O("boot"),O("view"),O("ready"),ve=!0,wt(),yt&&(yt=!1,de.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Et(),r()):at()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),Ai=!0}function No(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(jr=!0),!(jr&&e instanceof MouseEvent)&&(wi+=1,Gn||(Gn=!0,O("first_interaction",{count:wi})),O("interaction",wi))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function $r(r){var i,n,a,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(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ue())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(ja())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if($a())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ha())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(za()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||Qe||""):r&&window.open(r)}else Fe()?(u=window.install)==null||u.call(window):Da()?(g=window.openAppStore)==null||g.call(window):qi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function Fo(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="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),Ht("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(r==="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 Uo(){if(!Ue())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Br(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function Go(){Fe()&&(window.mintGameStart=()=>{Et(!0),Me()},window.mintGameClose=()=>{at(!0)})}function qo(){if(!Vi())return;let r=window.NUC;!r||!r.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,Qe)}),de.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(r={},e){var t;if(Ur=r.profile||"web_embed",Nn=r.consent||{},Ze={...Nr,...r.ids||{}},et=r.rootEl||et,vt=void 0,ga((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Re=null,Un=!1,Gn=!1,xi.clear(),Qe=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ei=e),O("init"),document.body.oncontextmenu=()=>!1,Dr(),Yo(et),Ba(),$o(),Bo(),!Ai){if(document.readyState==="complete")Hr();else if(!zr){zr=!0;let i=()=>{Hr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}No(),Fo(),Uo(),Go(),qo(),console.log(`%c @handler/playable-sdk %c v${Dn} `,"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;"),ye&&!ve&&(O("boot"),O("view"),O("ready"),yt&&(yt=!1,de.start()),ve=!0),ve=ye},getRoot(){return Dr()},get version(){return Dn},get maxWidth(){return tt},get maxHeight(){return it},get isLandscape(){return Fn},get isReady(){return ve},get isStarted(){return Hn},get isPaused(){return xt},get isFinished(){return bt},get volume(){return qn},get interactions(){return wi},on(r,e){Ht(Si(r),e)},off(r,e){Ui(Si(r),e)},start(){var r,e;if(!Hn){if(!ye){yt=!0;return}if(Hn=!0,Re||(Re=Date.now()),O("start"),Me(),Fe())at(),(r=window.gameReady)==null||r.call(window);else if(Ue()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Fn?"landscape":"portrait",buildID:Dn})}}},finish(){var r,e;bt||(bt=!0,O("complete"),Bn("complete"),Fe()?(r=window.gameEnd)==null||r.call(window):qi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ue()&&Br())},install(r){if(!bt){bt=!0,Ue()?(Br(),setTimeout(()=>de.install(r),300)):(O("complete"),setTimeout(()=>de.install(r),0));return}$n||($n=!0,setTimeout(()=>$n=!1,500),O("cta_click"),O("conversion"),Bn("cta"),$r(r||Qe))},emit(r,e){let t=Si(r);if(!Ho.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Vr(t,e);Gi(i,!!Nn.analytics),$t(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(r,e){O("cta_click",{url:r||Qe,manual:!0}),(e==null?void 0:e.open)!==!1&&$r(r||Qe)},ctaShow(r){O("cta_show",r)},ctaDismiss(r){O("cta_dismiss",r)},getGameTimeMs(){return qr()},endSession(r="manual"){Bn(r)},setAttribution(r){vt=r},abTest(r,e){if(!r)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(Vo(`${Fr}:${r}`))%e.length,i=e[t];return vt={...vt||{},experiment_id:r},Ze.variant_id=i,O("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Re||(Re=Date.now()),O("level_start",{level_id:r,...e})},levelComplete(r,e){O("level_complete",{level_id:r,...e})},levelFail(r,e){O("level_fail",{level_id:r,...e})},checkpoint(r,e){O("checkpoint",{checkpoint_id:r,...e})},reward(r,e){O("reward",{reward_id:r,...e})},tutorialStart(r,e){O("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){O("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){O("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&xi.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=xi.get(r);if(!i)return;xi.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){O("engagement",{action:"timer",key:r,duration_ms:n,...t});return}O(e,{key:r,duration_ms:n,...t})}},fps(r,e){O("fps",{value:r,...e})},memory(r,e){O("memory",{bytes:r,...e})},assetLoadStart(r,e){O("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){O("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){O("error",{code:r,message:e,...t})},retry(){var r,e,t;if(Fe())(r=window.gameRetry)==null||r.call(window);else if(Vi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}O("engagement",{action:"retry"})},pause(){at(!0)},resume(){Et(!0)},resize(r,e){Me(r,e)}},me=de;function Vo(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Yo(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2164
|
+
`,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 Hn=Ea.version,Ho=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);wa();var Fr={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"},Ur=Math.random().toString(36).slice(2),at=null,it={...Fr},Gr="web_embed",Un={},Et,Nn=!1,wt=!1,At=!1,qr=!1,Yn=1,Ai=0,Li=!1,Le=!1,nt="",rt=Math.floor(window.innerWidth),ot=Math.floor(window.innerHeight),Gn=rt>ot,ke=!1,St=!1,zr=!1,Dr=!1,Bn=!1,Ti=null,Ue=null,qn=!1,Vn=!1,Si=new Map;function Vr(){if(!Ue)return null;let r=Date.now()-Ue;return!Number.isFinite(r)||r<0?null:r}function Fn(r){if(qn)return;let e=Vr();e!==null&&(qn=!0,z("session_time",{duration_ms:e,reason:r}))}function $r(){if(at)return at;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),at=r,r}function Ci(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Yr(r,e){return{event_name:r,ts:Date.now(),session_id:Ur,deployment_id:it.deployment_id,variant_id:it.variant_id,export_profile_id:it.profile_id,instance_id:it.instance_id||"default",env:Gr==="mraid"?"mraid":"web",attribution:Et,payload:e}}function z(r,e){let t=Ci(r),i=Yr(t,e);Vi(i,!!Un.analytics),Bt(t,i),t!==r&&Bt(r,i)}function Tt(){Ti&&(Ti(rt,ot),Ti=null)}function st(r){Yn=r,z("volume",r)}function lt(r){r&&(qr=!0),!At&&(At=!0,z("pause"),st(0))}function Ct(r){!r&&qr||At&&(At=!1,z("resume"),st(Yn))}function De(r,e){rt=Math.floor(r||window.innerWidth),ot=Math.floor(e||window.innerHeight),Gn=rt>ot,z("resize",{width:rt,height:ot})}function No(){if(Ra())try{let r=mraid.getMaxSize();De(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ct():lt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();De(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();st(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&st(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Li=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Bo(){if(ja())try{let r=dapi.getScreenSize();De(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ct():lt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();De(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(st(e?1:0),dapi.addEventListener("audioVolumeChange",t=>st(t?1:0)),Li=!0,dapi.isViewable())ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Hr(){let r=()=>{ke||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt(),St&&(St=!1,ye.start()))};window.addEventListener("resize",()=>De()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ct(),r()):lt()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),Li=!0}function Fo(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(zr=!0),!(zr&&e instanceof MouseEvent)&&(Ai+=1,Vn||(Vn=!0,z("first_interaction",{count:Ai})),z("interaction",Ai))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function Nr(r){var i,n,a,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(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(za())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(Na())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ha())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Da()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||nt||""):r&&window.open(r)}else Ve()?(u=window.install)==null||u.call(window):$a()?(g=window.openAppStore)==null||g.call(window):Yi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function Uo(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;se("view",()=>e(t.mraid_viewable)),se("start",()=>e(t.game_viewable)),se("engagement",()=>e(t.engagement));let i=()=>e(t.complete);se("complete",i),Nt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),se("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;se("view",()=>e(t.Ad_Load_Start)),se("start",()=>e(t.Ad_Viewable)),se("engagement",()=>e(t.First_Engagement)),se("complete",()=>e(t.Gameplay_Complete)),se("cta_click",()=>e(t.DSP_Click)),se("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Go(){if(!Ye())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{ye.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Br(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function qo(){Ve()&&(window.mintGameStart=()=>{Ct(!0),De()},window.mintGameClose=()=>{lt(!0)})}function Vo(){if(!Wi())return;let r=window.NUC;!r||!r.trigger||(ye.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,nt)}),ye.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var ye={init(r={},e){var t;if(Gr=r.profile||"web_embed",Un=r.consent||{},it={...Fr,...r.ids||{}},at=r.rootEl||at,Et=void 0,ha((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Ue=null,qn=!1,Vn=!1,Si.clear(),nt=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ti=e),z("init"),document.body.oncontextmenu=()=>!1,$r(),Wo(at),Ba(),No(),Bo(),!Li){if(document.readyState==="complete")Hr();else if(!Dr){Dr=!0;let i=()=>{Hr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Fo(),Uo(),Go(),qo(),Vo(),console.log(`%c @handler/playable-sdk %c v${Hn} `,"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;"),ke&&!Le&&(z("boot"),z("view"),z("ready"),St&&(St=!1,ye.start()),Le=!0),Le=ke},getRoot(){return $r()},get version(){return Hn},get maxWidth(){return rt},get maxHeight(){return ot},get isLandscape(){return Gn},get isReady(){return Le},get isStarted(){return Nn},get isPaused(){return At},get isFinished(){return wt},get volume(){return Yn},get interactions(){return Ai},on(r,e){Nt(Ci(r),e)},off(r,e){qi(Ci(r),e)},start(){var r,e;if(!Nn){if(!ke){St=!0;return}if(Nn=!0,Ue||(Ue=Date.now()),z("start"),De(),Ve())lt(),(r=window.gameReady)==null||r.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Gn?"landscape":"portrait",buildID:Hn})}}},finish(){var r,e;wt||(wt=!0,z("complete"),Fn("complete"),Ve()?(r=window.gameEnd)==null||r.call(window):Yi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Br())},install(r){if(!wt){wt=!0,Ye()?(Br(),setTimeout(()=>ye.install(r),300)):(z("complete"),setTimeout(()=>ye.install(r),0));return}Bn||(Bn=!0,setTimeout(()=>Bn=!1,500),z("cta_click"),z("conversion"),Fn("cta"),Nr(r||nt))},emit(r,e){let t=Ci(r);if(!Ho.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Yr(t,e);Vi(i,!!Un.analytics),Bt(t,i)},gameStart(){ye.start()},gameEnd(){ye.finish()},ctaClick(r,e){z("cta_click",{url:r||nt,manual:!0}),(e==null?void 0:e.open)!==!1&&Nr(r||nt)},ctaShow(r){z("cta_show",r)},ctaDismiss(r){z("cta_dismiss",r)},getGameTimeMs(){return Vr()},endSession(r="manual"){Fn(r)},setAttribution(r){Et=r},abTest(r,e){if(!r)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(Yo(`${Ur}:${r}`))%e.length,i=e[t];return Et={...Et||{},experiment_id:r},it.variant_id=i,z("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Ue||(Ue=Date.now()),z("level_start",{level_id:r,...e})},levelComplete(r,e){z("level_complete",{level_id:r,...e})},levelFail(r,e){z("level_fail",{level_id:r,...e})},checkpoint(r,e){z("checkpoint",{checkpoint_id:r,...e})},reward(r,e){z("reward",{reward_id:r,...e})},tutorialStart(r,e){z("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){z("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){z("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&Si.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Si.get(r);if(!i)return;Si.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:r,duration_ms:n,...t});return}z(e,{key:r,duration_ms:n,...t})}},fps(r,e){z("fps",{value:r,...e})},memory(r,e){z("memory",{bytes:r,...e})},assetLoadStart(r,e){z("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){z("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){z("error",{code:r,message:e,...t})},retry(){var r,e,t;if(Ve())(r=window.gameRetry)==null||r.call(window);else if(Wi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}z("engagement",{action:"retry"})},pause(){lt(!0)},resume(){Ct(!0)},resize(r,e){De(r,e)}},Te=ye;function Yo(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Wo(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2059
2165
|
(function(){
|
|
2060
2166
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
2061
2167
|
function unlock(){
|
|
@@ -2071,7 +2177,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2071
2177
|
}
|
|
2072
2178
|
events.forEach(function(e){ document.addEventListener(e, unlock, false); });
|
|
2073
2179
|
})();
|
|
2074
|
-
`,r.appendChild(e)}async function Vn(r,e={}){let t=new Wo;await t.init({resizeTo:r,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:r.clientWidth,l=(u=o==null?void 0:o.height)!=null?u:r.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)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.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(";")),r.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(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Yn,Ticker as rt,ColorMatrixFilter as Ko}from"pixi.js";var Ci=class{constructor(e){var n,a;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=(a=e==null?void 0:e.rotation)!=null?a: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)}},Ti=class{constructor(e){var t,i,n,a;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=(a=e==null?void 0:e.tint)!=null?a: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}=Qr("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Li=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 Ci(n.transform),this.renderer=new Ti(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&&(rt.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,v,b;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,a=(h=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:h.type,o=(v=(m=this._config)==null?void 0:m.ui)==null?void 0:v.renderMode,s=(b=e==null?void 0:e.ui)==null?void 0:b.renderMode;if((n!==a||o!==s)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${o} to ${a}/${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,a,o,s;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.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 a,o,s;if(!((a=this.pixiObject)!=null&&a.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,a,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 Yn;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((o=e.shadow)!=null&&o.enabled){let u=e.shadow,g=new Yn;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 Yn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Ko,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,a=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=a+(t.startYOffset||0)),this._introTicker&&rt.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=v=>{var M,j,k,S,T,C;if(l+=v.deltaTime/60,l<n)return;let b=i>0?Math.min(1,(l-n)/i):1,y=1-Math.pow(1-b,3),x=this.renderer.alpha,w=this.transform.scale*(((j=(M=this._config)==null?void 0:M.effects)==null?void 0:j.scale_x)||1),E=this.transform.scale*(((S=(k=this._config)==null?void 0:k.effects)==null?void 0:S.scale_y)||1),L=this.transform.position.y,A=this.transform.position.x;if(this.pixiObject.alpha=((T=t.startAlpha)!=null?T:0)+(x-((C=t.startAlpha)!=null?C:0))*y,t.startScale!==void 0){let _=t.startScale+(1-t.startScale)*y;this.pixiObject.scale.set(w*_,E*_)}t.startYOffset!==void 0&&(this.pixiObject.y=L+t.startYOffset+(L-(L+t.startYOffset))*y),b>=1&&(rt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=A,this.pixiObject.y=L,this.pixiObject.scale.set(w,E))};this._introTicker=c,rt.shared.add(c)}applyMotion(){var n,a,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(),(a=e.pulse)!=null&&a.enabled||(o=e.swing)!=null&&o.enabled){let s=0,l=c=>{var h,m,v,b,y,x,w,E,L,A,M;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*(((b=(v=this._config)==null?void 0:v.effects)==null?void 0:b.scale_y)||1),g=this.transform.position.x,f=this.transform.position.y;if((y=e.pulse)!=null&&y.enabled){let j=(x=e.pulse.intensity)!=null?x:.1,k=(w=e.pulse.speed)!=null?w:1,T=1+Math.sin(s*k)*j;(E=this.pixiObject.scale)!=null&&E.set?this.pixiObject.scale.set(d*T,u*T):this.pixiObject.scale&&(this.pixiObject.scale.x=d*T,this.pixiObject.scale.y=u*T)}if((L=e.swing)!=null&&L.enabled){let j=(A=e.swing.amplitude)!=null?A:10,k=(M=e.swing.speed)!=null?M:1,S=Math.sin(s*k)*j;e.swing.axis==="vertical"?this.pixiObject.y=f+S:e.swing.axis==="both"?(this.pixiObject.x=g+S,this.pixiObject.y=f+S):this.pixiObject.x=g+S}};rt.shared.add(l),this._tickerCleanup=()=>{var c,p,d,u,g;if(rt.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)}},St=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 Li(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,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`),a.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 ki={"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 Xo(r){let e=ki[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function Jo(r){var t;let e=ki[r];return e&&(t=e.weight)!=null?t:"400"}function Zo(r,e){ki[r]=e}function Qo(){return Object.keys(ki)}var ot=null;function es(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!ot),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),ot||(typeof window!="undefined"&&window.lottie?(ot=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(r=>r.toLowerCase().includes("lottie")):"no window"),ot=null)),ot}function ts(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function is(r){try{let e=new XMLHttpRequest;return e.open("GET",ts(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Yr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function Rn(r){ot=r}function ns(r,e,t,i){var E,L,A,M,j,k,S,T,C,_,R,z,P,I,$,Q,B,V,Y;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((E=n.effects)==null?void 0:E.lottie)||{},o=n.transform||{},s=n.render||{};if(a.enabled===!1||s.visible===!1)return null;let l=i==null?void 0:i[r],c=Yr(l);if(!c){let X=(A=(L=n.render)==null?void 0:L.asset)==null?void 0:A.path;if(typeof X=="string"&&X.toLowerCase().endsWith(".json")){let we=is(X);if(c=Yr(we),c)try{i[r]=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: ${r}`,{kind:X}),null}let p=es();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let d=(M=a.width)!=null?M:300,u=(j=a.height)!=null?j:300,g=(k=o.scale)!=null?k:1,f=((T=(S=o.position)==null?void 0:S.x)!=null?T:0)+((_=(C=o.offset)==null?void 0:C.x)!=null?_:0),h=((z=(R=o.position)==null?void 0:R.y)!=null?z:0)+((I=(P=o.offset)==null?void 0:P.y)!=null?I:0),m=($=o.rotation)!=null?$:0,v=(Q=s.z_index)!=null?Q:100,b=(B=s.alpha)!=null?B:1,y=document.createElement("div");y.style.cssText=`
|
|
2180
|
+
`,r.appendChild(e)}async function Wn(r,e={}){let t=new Ko;await t.init({resizeTo:r,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:r.clientWidth,l=(u=o==null?void 0:o.height)!=null?u:r.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)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.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(";")),r.appendChild(n),Te.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(s=>s.pause())}),Te.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(s=>{s.currentTime>0&&!s.ended&&s.play().catch(()=>{})})}),Te.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(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Kn,Ticker as ct,ColorMatrixFilter as Xo}from"pixi.js";var ki=class{constructor(e){var n,a;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=(a=e==null?void 0:e.rotation)!=null?a: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)}},Pi=class{constructor(e){var t,i,n,a;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=(a=e==null?void 0:e.tint)!=null?a: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}=eo("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Mi=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 ki(n.transform),this.renderer=new Pi(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&&(ct.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,v;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,a=(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=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||o!==s)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${o} to ${a}/${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,a,o,s;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.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 a,o,s;if(!((a=this.pixiObject)!=null&&a.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,a,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 Kn;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((o=e.shadow)!=null&&o.enabled){let u=e.shadow,g=new Kn;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 Kn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Xo,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,a=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=a+(t.startYOffset||0)),this._introTicker&&ct.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,T,w,A,S;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,y=1-Math.pow(1-v,3),x=this.renderer.alpha,E=this.transform.scale*(((I=(_=this._config)==null?void 0:_.effects)==null?void 0:I.scale_x)||1),M=this.transform.scale*(((w=(T=this._config)==null?void 0:T.effects)==null?void 0:w.scale_y)||1),j=this.transform.position.y,C=this.transform.position.x;if(this.pixiObject.alpha=((A=t.startAlpha)!=null?A:0)+(x-((S=t.startAlpha)!=null?S:0))*y,t.startScale!==void 0){let k=t.startScale+(1-t.startScale)*y;this.pixiObject.scale.set(E*k,M*k)}t.startYOffset!==void 0&&(this.pixiObject.y=j+t.startYOffset+(j-(j+t.startYOffset))*y),v>=1&&(ct.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=C,this.pixiObject.y=j,this.pixiObject.scale.set(E,M))};this._introTicker=c,ct.shared.add(c)}applyMotion(){var d,u,g,f,h,m;let e=(d=this._config)==null?void 0:d.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((f=e.continuousMove)==null?void 0:f.enabled)||((h=e.continuousRotate)==null?void 0:h.enabled)||((m=e.orbit)==null?void 0:m.enabled)))return;let a=0,o=0,s=0,l=0,c=1/60,p=b=>{var T,w,A,S,k,P,R,L,O,D,V,H,F,W,J,de,we,$e,$,ie,re,pe,oe,fe,Ee,Se;let v=((T=b.deltaTime)!=null?T:1)*c;a+=b.deltaTime*.05;let y=this.transform.scale,x=y*(((A=(w=this._config)==null?void 0:w.effects)==null?void 0:A.scale_x)||1),E=y*(((k=(S=this._config)==null?void 0:S.effects)==null?void 0:k.scale_y)||1),M=this.transform.position.x,j=this.transform.position.y,C=this.transform.rotation,_=0,I=0;if((P=e.swing)!=null&&P.enabled){let B=(R=e.swing.amplitude)!=null?R:10,Z=(L=e.swing.speed)!=null?L:1,Y=Math.sin(a*Z)*B;e.swing.axis==="vertical"?I+=Y:e.swing.axis==="both"?(_+=Y,I+=Y):_+=Y}if((O=e.continuousMove)!=null&&O.enabled){let B=(D=e.continuousMove.axis)!=null?D:"x",Z=Math.max(0,(V=e.continuousMove.speed)!=null?V:50),Y=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,te=Math.max(0,(F=e.continuousMove.lifetime)!=null?F:0);o+=v;let Me=te>0?Math.min(o,te):o,He=Z*Y*Me;(B==="x"||B==="both")&&(_+=He),(B==="y"||B==="both")&&(I+=He)}if((W=e.orbit)!=null&&W.enabled){let B=Math.max(0,(J=e.orbit.radius)!=null?J:50),Z=Math.max(0,(de=e.orbit.speed)!=null?de:45),Y=Math.sign((we=e.orbit.direction)!=null?we:1)||1,te=Z*Math.PI/180;l+=te*Y*v;let Me=($e=e.orbit.pivotOffsetX)!=null?$e:0,He=($=e.orbit.pivotOffsetY)!=null?$:0;_+=Me+B*Math.cos(l),I+=He+B*Math.sin(l)}if(this.pixiObject.x=M+_,this.pixiObject.y=j+I,(ie=e.pulse)!=null&&ie.enabled){let B=(re=e.pulse.intensity)!=null?re:.1,Z=(pe=e.pulse.speed)!=null?pe:1,te=1+Math.sin(a*Z)*B;(oe=this.pixiObject.scale)!=null&&oe.set?this.pixiObject.scale.set(x*te,E*te):this.pixiObject.scale&&(this.pixiObject.scale.x=x*te,this.pixiObject.scale.y=E*te)}if((fe=e.continuousRotate)!=null&&fe.enabled){let B=Math.max(0,(Ee=e.continuousRotate.speed)!=null?Ee:90),Z=Math.sign((Se=e.continuousRotate.direction)!=null?Se:1)||1,Y=B*Math.PI/180;s+=Y*Z*v,this.pixiObject.rotation=C+s}};ct.shared.add(p),this._tickerCleanup=()=>{var b,v,y,x,E;if(ct.shared.remove(p),this.pixiObject){let M=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),j=this.transform.scale*(((x=(y=this._config)==null?void 0:y.effects)==null?void 0:x.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(E=this.pixiObject.scale)!=null&&E.set?this.pixiObject.scale.set(M,j):this.pixiObject.scale&&(this.pixiObject.scale.x=M,this.pixiObject.scale.y=j)}}}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)}},Lt=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 Mi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,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`),a.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 _i={"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 Jo(r){let e=_i[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function Zo(r){var t;let e=_i[r];return e&&(t=e.weight)!=null?t:"400"}function Qo(r,e){_i[r]=e}function es(){return Object.keys(_i)}var dt=null;function ts(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!dt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),dt||(typeof window!="undefined"&&window.lottie?(dt=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(r=>r.toLowerCase().includes("lottie")):"no window"),dt=null)),dt}function is(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function ns(r){try{let e=new XMLHttpRequest;return e.open("GET",is(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Wr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function zn(r){dt=r}function as(r,e,t,i){var M,j,C,_,I,T,w,A,S,k,P,R,L,O,D,V,H,F,W;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((M=n.effects)==null?void 0:M.lottie)||{},o=n.transform||{},s=n.render||{};if(a.enabled===!1||s.visible===!1)return null;let l=i==null?void 0:i[r],c=Wr(l);if(!c){let J=(C=(j=n.render)==null?void 0:j.asset)==null?void 0:C.path;if(typeof J=="string"&&J.toLowerCase().endsWith(".json")){let de=ns(J);if(c=Wr(de),c)try{i[r]=c}catch{}}}if(!c){let J=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:J}),null}let p=ts();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let d=(_=a.width)!=null?_:300,u=(I=a.height)!=null?I:300,g=(T=o.scale)!=null?T:1,f=((A=(w=o.position)==null?void 0:w.x)!=null?A:0)+((k=(S=o.offset)==null?void 0:S.x)!=null?k:0),h=((R=(P=o.position)==null?void 0:P.y)!=null?R:0)+((O=(L=o.offset)==null?void 0:L.y)!=null?O:0),m=(D=o.rotation)!=null?D:0,b=(V=s.z_index)!=null?V:100,v=(H=s.alpha)!=null?H:1,y=document.createElement("div");y.style.cssText=`
|
|
2075
2181
|
position: absolute;
|
|
2076
2182
|
top: calc(50% + ${h}px);
|
|
2077
2183
|
left: calc(50% + ${f}px);
|
|
@@ -2079,6 +2185,6 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2079
2185
|
width: ${d}px;
|
|
2080
2186
|
height: ${u}px;
|
|
2081
2187
|
pointer-events: none;
|
|
2082
|
-
z-index: ${
|
|
2083
|
-
opacity: ${
|
|
2084
|
-
`,e.appendChild(y);let x;try{x=p.loadAnimation({container:y,renderer:a.renderer||"svg",loop:(V=a.loop)!=null?V:!1,autoplay:(Y=a.autoplay)!=null?Y:!0,animationData:c})}catch(X){return y.parentNode&&y.parentNode.removeChild(y),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,X),null}a.speed!==void 0&&x.setSpeed(a.speed);let w=()=>{x.destroy(),y.parentNode&&y.parentNode.removeChild(y)};return a.loop||x.addEventListener("complete",w),{animation:x,cleanup:w}}var Wn=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 Vn(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 St(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 At=class{setContext(e){this.context=e}};var Ct=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 Wr from"pixi.js";var as=Wr;typeof window!="undefined"&&(window.__basePixi=Wr);import{Sprite as rs,Text as os,TextStyle as ss,Texture as Kr}from"pixi.js";var Xr=r=>r*Math.PI/180;function ls(r,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 ss({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}),a=new os({text:t.text,style:n});return a.label=r,a}function cs(r){var p,d,u,g,f,h,m,v,b,y;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:o}=r,s={},l={},c={};t.sortableChildren=!0;for(let[x,w]of i.objects.entries()){if(o!=null&&o.has(x)||a&&!a.has(x)||(w==null?void 0:w.enabled)===!1)continue;let E=(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,A=!!(E&&L==="image"),M=!!((f=w==null?void 0:w.ui)!=null&&f.text),j=M?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,k;if(j==="png"&&A?k="png":j==="text"&&M?k="text":A?k="png":M?k="text":k="skip",k!=="skip"){if(k==="text"){let S=ls(x,w);if(!S)continue;let T=w.render;S.alpha=typeof(T==null?void 0:T.alpha)=="number"?T.alpha:1,S.visible=(T==null?void 0:T.visible)!==!1,S.zIndex=typeof(T==null?void 0:T.z_index)=="number"?T.z_index:0,T!=null&&T.anchor&&typeof T.anchor.x=="number"&&typeof T.anchor.y=="number"?S.anchor.set(T.anchor.x,T.anchor.y):S.anchor.set(.5,.5);let C=w.transform,_=(C==null?void 0:C.position)||(C==null?void 0:C.offset);_&&S.position.set((m=_.x)!=null?m:0,(v=_.y)!=null?v:0);let R=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;S.scale.set(R,R);let z=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;S.rotation=Xr(z),S.parent||t.addChild(S);try{n.create(x,S)}catch{}s[x]=S,c[x]=S}else if(k==="png"){let S=le[x]||(typeof Kr!="undefined"?Kr.EMPTY:void 0),T=new rs(S);T.label=x;let C=w.render;T.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,T.visible=(C==null?void 0:C.visible)!==!1,T.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"&&T.anchor.set(C.anchor.x,C.anchor.y);let _=w.transform,R=(_==null?void 0:_.position)||(_==null?void 0:_.offset);R&&T.position.set((b=R.x)!=null?b:0,(y=R.y)!=null?y:0);let z=typeof(_==null?void 0:_.scale)=="number"?_.scale:1;T.scale.set(z,z);let P=typeof(_==null?void 0:_.rotation)=="number"?_.rotation:0;T.rotation=Xr(P),T.parent||t.addChild(T);try{n.create(x,T)}catch{}s[x]=T,l[x]=T}}}return t.parent||e.addChild(t),{objects:s,sprites:l,texts:c}}var Kn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Ct}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var s;let o=this.registry.get(a);if(!o){console.warn("[Assets] No config found for object:",a);return}try{let l=await ke.create(a,o,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await ke.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Jr=new Kn,ds=new Proxy(Jr,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function ps(r,e){Jr.init(r,e)}var Xn=class extends At{async init(){Hi(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 us,Point as gs}from"pixi.js";var xe={width:400,height:600,designWidth:400,scaleFactor:1},Mi={scale:1,position:1},_i=[];function hs(r,e,t,i,n,a,o){_i.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,o,!1)}function fs(){_i.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(r,xe.width,xe.height,i,n,!0,!1)})}function ms(){_i.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Jn(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),xe.width=r,xe.height=e,xe.scaleFactor=Math.min(r/xe.designWidth,1.15),Mi.scale=xe.scaleFactor,Mi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Mi.scale.toFixed(3)}`),fs()}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 bs(r,e,t){let i=U[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function vs(){return U}var ys={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 Pi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function st(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Pi(r[0],e.x),y:Pi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Pi(i.x,e.x),y:Pi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=ys[i])!=null?t:e}return e}function Lt(r,e,t,i={}){var g,f,h,m,v,b;let n=st(t),a=(g=i.inset)!=null?g:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((h=a.left)!=null?h:0)+o.x,l=((m=a.right)!=null?m:0)+o.x,c=((v=a.top)!=null?v:0)+o.y,p=((b=a.bottom)!=null?b:0)+o.y,d=Math.max(0,r-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function kt(r,e,t,i={}){var h,m,v,b,y,x;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},o=((v=n.left)!=null?v:0)+a.x,s=((b=n.right)!=null?b:0)+a.x,l=((y=n.top)!=null?y:0)+a.y,c=((x=n.bottom)!=null?x:0)+a.y,p=Math.max(0,r-o-s),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:o+p*g,y:l+d*f}}function Zn(r,e,t,i={}){var p,d,u;if(!r)return;let n=i.positionRatio?kt(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Lt(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(p=i.offset)!=null?p:{x:0,y:0},o=n.x+a.x,s=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),re(r,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(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,Jn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Jn(window.innerWidth,window.innerHeight),window.updateDebugConfig=bs,window.getDebugConfig=vs,window.copyConfig=Ms,window.applyConfig=Tt,window.applyConfigForRatio=_s,window.positionAtBottom=Zr,window.positionAtTop=Es,window.positionAtCenter=Ss,window.positionAtLeft=As,window.positionAtRight=Cs,window.positionAtBottomLeft=Ts,window.positionAtBottomRight=Ls,window.positionAtTopLeft=ks,window.positionAtTopRight=Ps,window.applyPositionContract=ws,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 Ii(r,e,t=0){return r*e+t}function Oi(r,e,t=0){return r*(1-e)+t}function Ri(r,e,t=0){return r*e+t}function ji(r,e,t=0){return r*(1-e)+t}function ie(r,e=0){return r/2+e}function xs(r,e){return r*e}function ws(r,e,t,i){var o,s,l,c,p,d,u,g,f,h,m,v,b,y,x,w,E,L,A,M;let n=0,a=0;switch(i.type){case"top":n=ie(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),a=Ii(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),a=Oi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ri(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=ie(t,(v=(m=i.offset)==null?void 0:m.y)!=null?v:0);break;case"right":n=ji(e,i.percent,(y=(b=i.offset)==null?void 0:b.x)!=null?y:0),a=ie(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":n=ie(e,(L=(E=i.offset)==null?void 0:E.x)!=null?L:0),a=ie(t,(M=(A=i.offset)==null?void 0:A.y)!=null?M:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function Zr(r,e,t,i=.2,n=1,a=!0,o=!1){let s=xs(t,i),l=Oi(t,i/2);re(r,ie(e),l);let c=a?n*xe.scaleFactor:n;pe(r,c),o&&!_i.find(p=>p.element===r)&&hs(r,Zr,e,t,i,n,a)}function Es(r,e,t,i=.1,n=1){re(r,ie(e),Ii(t,i)),pe(r,n)}function Ss(r,e,t,i=0,n=0,a=1){re(r,ie(e,i),ie(t,n)),pe(r,a)}function As(r,e,t,i=.1,n=1){re(r,Ri(e,i),ie(t)),pe(r,n)}function Cs(r,e,t,i=.1,n=1){re(r,ji(e,i),ie(t)),pe(r,n)}function Ts(r,e,t,i=.05,n=.05,a=1){re(r,Ri(e,n),Oi(t,i)),pe(r,a)}function Ls(r,e,t,i=.05,n=.05,a=1){re(r,ji(e,n),Oi(t,i)),pe(r,a)}function ks(r,e,t,i=.05,n=.05,a=1){re(r,Ri(e,n),Ii(t,i)),pe(r,a)}function Ps(r,e,t,i=.05,n=.05,a=1){re(r,ji(e,n),Ii(t,i)),pe(r,a)}function re(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function pe(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var je={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 Ms(r){return r&&je[r]?JSON.parse(JSON.stringify(je[r])):JSON.parse(JSON.stringify(U))}function Tt(r){Object.keys(r).forEach(e=>{let t=e;U[t]&&r[t]&&Object.assign(U[t],r[t])}),console.log("Config applied:",r)}function _s(r,e){let t=r/e;t>1.6?(Tt(je.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Tt(je.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Tt(je.square),console.log("Applied SQUARE config for ratio:",t)):(Tt(je.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=je,r.resolveAnchorVec2=r.resolveAnchorVec2||st,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||Lt,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||kt}var Z=null;function Is(r,e,t,i,n,a={}){var z,P,I,$,Q,B,V,Y,X,we,ze,Pt,D,oe,ue,Ee,ge,_e,De,He,he,$e,Se,Mt,_t,Qn,ea,ta,ia,na,aa,ra,oa,sa;let o=(z=a.enableDebugLogs)!=null?z:!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:",a));let{mainContainer:s,label:l,background:c,backgroundTexture:p,app:d}=r;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,v=e.engine.runtime||{},b=v.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:",v),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",b));let y=b.design_width_portrait||400,x=f/y;x=Math.min(x,1.15);let w=x*((P=U.engine.scale)!=null?P:1),E=(I=a.skipMainContainerTransform)!=null?I:!1;!E&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(w):(s.scale.x=w,s.scale.y=w));let L=($=b.main_container_anchor)!=null?$:"center",A=(Q=b.main_container_position_ratio)!=null?Q:{x:.5,y:.5},M=(B=b.main_container_offset)!=null?B:{x:0,y:0},j=b.main_container_position_ratio?kt(u,g,A):Lt(u,g,L),k=j.x+M.x+U.layout.position_offset.x,S=j.y+M.y+U.layout.position_offset.y;if(!E&&s&&s.position&&(typeof s.position.set=="function"?s.position.set(k,S):(s.position.x=k,s.position.y=S)),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 H=(Y=n.get)==null?void 0:Y.call(n,J),se=((X=H==null?void 0:H.getDisplayObject)==null?void 0:X.call(H))||(H==null?void 0:H.pixiObject)||H;if(!se||se.parent!==s)continue;let It=N.position_ratio!=null?kt(u,g,N.position_ratio):Lt(u,g,(we=N.anchor)!=null?we:"center"),Ot=s.toLocal(new gs(It.x,It.y)),Rt=(ze=N.position)!=null?ze:{x:0,y:0},Ie=Ot.x+Rt.x,zi=Ot.y+Rt.y;typeof(H==null?void 0:H.setPosition)=="function"?H.setPosition(Ie,zi):(re(se,Ie,zi),(Pt=H==null?void 0:H.transform)!=null&&Pt.position&&(H.transform.position.x=Ie,H.transform.position.y=zi))}let T=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,_=((T==null?void 0:T.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 us,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,Ae=(g-4)*K,H=(u-N)/2,se=(g-Ae)/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:Ae,offsetX:H,offsetY:se}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+H,y:2+se,width:N,height:Ae})),Z.rect(2+H,2+se,N,Ae).stroke({width:U.layout.debug_rect_thickness,color:U.layout.debug_rect_color})}else Z&&(Z.destroy(),Z=null);let R=((D=r.label)==null?void 0:D.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&R){let J=(ue=(oe=R==null?void 0:R.transform)==null?void 0:oe.anchor)!=null?ue:"center",K=(Ee=R==null?void 0:R.transform)==null?void 0:Ee.position_ratio,N=((ge=R==null?void 0:R.transform)==null?void 0:ge.offset)||{x:0,y:0};Zn(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=(De=(_e=R==null?void 0:R.transform)==null?void 0:_e.scale)!=null?De: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=(($e=(he=v.background)==null?void 0:he.alpha)!=null?$e:.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},Ae=((Mt=(Se=v.background)==null?void 0:Se.offset_y)!=null?Mt:0)+U.engine.background_offset_y,H=(_t=K.anchor)!=null?_t:"center",se=K.position_ratio;if(o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:N,bgRuntimeOffsetY:Ae,bgScreenAnchor:H,bgPositionRatio:se,baseWidth:u,baseHeight:g,finalScale:w}),Zn(c,u,g,{anchor:H,positionRatio:se,offset:{x:N.x*w,y:N.y*w+Ae},renderAnchor:st(H)}),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:(ea=c.scale)==null?void 0:ea.y,anchorX:(ta=c.anchor)==null?void 0:ta.x,anchorY:(ia=c.anchor)==null?void 0:ia.y,pivotX:(na=c.pivot)==null?void 0:na.x,pivotY:(aa=c.pivot)==null?void 0:aa.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 It=Math.max(f/p.width,h/p.height),Ot=(oa=(ra=v.background)==null?void 0:ra.scale_multiplier)!=null?oa:1.05,Rt=(sa=K.scale)!=null?sa:1,Ie=It*Ot*U.engine.background_scale*Rt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Ie):(c.scale.x=Ie,c.scale.y=Ie))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function Os(r){var s,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,o=((l=(s=n.engine)==null?void 0:s.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=o.tutorial_delay_ms)!=null?c:1500)}export{Na as a,Vn as b,Ci as c,Ti as d,Li as e,St as f,Xo as g,Jo as h,Zo as i,Qo as j,Rn as k,ns as l,ke as m,Wn as n,At as o,Ct as p,as as q,cs as r,ds as s,ps as t,Xn as u,Mi as v,ms as w,Jn as x,st as y,Lt as z,kt as A,Zn as B,Is as C,Os as D,Fa as E,Ua as F,Ki as G,Ge as H,Vs as I,vi as J,Ln as K,Lr as L,Mn as M,kd as N,Pd as O,be as P,zo as Q,Do as R,zn as S,de as T,me as U};
|
|
2188
|
+
z-index: ${b};
|
|
2189
|
+
opacity: ${v};
|
|
2190
|
+
`,e.appendChild(y);let x;try{x=p.loadAnimation({container:y,renderer:a.renderer||"svg",loop:(F=a.loop)!=null?F:!1,autoplay:(W=a.autoplay)!=null?W:!0,animationData:c})}catch(J){return y.parentNode&&y.parentNode.removeChild(y),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,J),null}a.speed!==void 0&&x.setSpeed(a.speed);let E=()=>{x.destroy(),y.parentNode&&y.parentNode.removeChild(y)};return a.loop||x.addEventListener("complete",E),{animation:x,cleanup:E}}var Xn=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 Wn(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 Lt(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 kt=class{setContext(e){this.context=e}};var Pt=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 Kr from"pixi.js";var rs=Kr;typeof window!="undefined"&&(window.__basePixi=Kr);import{Sprite as os,Text as ss,TextStyle as ls,Texture as Xr}from"pixi.js";var Jr=r=>r*Math.PI/180;function cs(r,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 ls({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}),a=new ss({text:t.text,style:n});return a.label=r,a}function ds(r){var p,d,u,g,f,h,m,b,v,y;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:o}=r,s={},l={},c={};t.sortableChildren=!0;for(let[x,E]of i.objects.entries()){if(o!=null&&o.has(x)||a&&!a.has(x)||(E==null?void 0:E.enabled)===!1)continue;let M=(d=(p=E==null?void 0:E.render)==null?void 0:p.asset)==null?void 0:d.path,j=(g=(u=E==null?void 0:E.render)==null?void 0:u.asset)==null?void 0:g.type,C=!!(M&&j==="image"),_=!!((f=E==null?void 0:E.ui)!=null&&f.text),I=_?(h=E==null?void 0:E.ui)==null?void 0:h.renderMode:void 0,T;if(I==="png"&&C?T="png":I==="text"&&_?T="text":C?T="png":_?T="text":T="skip",T!=="skip"){if(T==="text"){let w=cs(x,E);if(!w)continue;let A=E.render;w.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,w.visible=(A==null?void 0:A.visible)!==!1,w.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"?w.anchor.set(A.anchor.x,A.anchor.y):w.anchor.set(.5,.5);let S=E.transform,k=(S==null?void 0:S.position)||(S==null?void 0:S.offset);k&&w.position.set((m=k.x)!=null?m:0,(b=k.y)!=null?b:0);let P=typeof(S==null?void 0:S.scale)=="number"?S.scale:1;w.scale.set(P,P);let R=typeof(S==null?void 0:S.rotation)=="number"?S.rotation:0;w.rotation=Jr(R),w.parent||t.addChild(w);try{n.create(x,w)}catch{}s[x]=w,c[x]=w}else if(T==="png"){let w=be[x]||(typeof Xr!="undefined"?Xr.EMPTY:void 0),A=new os(w);A.label=x;let S=E.render;A.alpha=typeof(S==null?void 0:S.alpha)=="number"?S.alpha:1,A.visible=(S==null?void 0:S.visible)!==!1,A.zIndex=typeof(S==null?void 0:S.z_index)=="number"?S.z_index:0,S!=null&&S.anchor&&typeof S.anchor.x=="number"&&typeof S.anchor.y=="number"&&A.anchor.set(S.anchor.x,S.anchor.y);let k=E.transform,P=(k==null?void 0:k.position)||(k==null?void 0:k.offset);P&&A.position.set((v=P.x)!=null?v:0,(y=P.y)!=null?y:0);let R=typeof(k==null?void 0:k.scale)=="number"?k.scale:1;A.scale.set(R,R);let L=typeof(k==null?void 0:k.rotation)=="number"?k.rotation:0;A.rotation=Jr(L),A.parent||t.addChild(A);try{n.create(x,A)}catch{}s[x]=A,l[x]=A}}}return t.parent||e.addChild(t),{objects:s,sprites:l,texts:c}}var Jn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Pt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var s;let o=this.registry.get(a);if(!o){console.warn("[Assets] No config found for object:",a);return}try{let l=await je.create(a,o,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await je.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Zr=new Jn,ps=new Proxy(Zr,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function us(r,e){Zr.init(r,e)}var Zn=class extends kt{async init(){Bi(this.context.config,this.context.app),await be.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as gs,Point as hs}from"pixi.js";var Pe={width:400,height:600,designWidth:400,scaleFactor:1},Oi={scale:1,position:1},Ri=[];function fs(r,e,t,i,n,a,o){Ri.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,o,!1)}function ms(){Ri.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Pe.scaleFactor;t(r,Pe.width,Pe.height,i,n,!0,!1)})}function bs(){Ri.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Qn(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),Pe.width=r,Pe.height=e,Pe.scaleFactor=Math.min(r/Pe.designWidth,1.15),Oi.scale=Pe.scaleFactor,Oi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Oi.scale.toFixed(3)}`),ms()}var q={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 vs(r,e,t){let i=q[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function ys(){return q}var xs={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 Ii(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function pt(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Ii(r[0],e.x),y:Ii(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Ii(i.x,e.x),y:Ii(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=xs[i])!=null?t:e}return e}function _t(r,e,t,i={}){var g,f,h,m,b,v;let n=pt(t),a=(g=i.inset)!=null?g:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((h=a.left)!=null?h:0)+o.x,l=((m=a.right)!=null?m:0)+o.x,c=((b=a.top)!=null?b:0)+o.y,p=((v=a.bottom)!=null?v:0)+o.y,d=Math.max(0,r-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function It(r,e,t,i={}){var h,m,b,v,y,x;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},o=((b=n.left)!=null?b:0)+a.x,s=((v=n.right)!=null?v:0)+a.x,l=((y=n.top)!=null?y:0)+a.y,c=((x=n.bottom)!=null?x:0)+a.y,p=Math.max(0,r-o-s),d=Math.max(0,e-l-c),u=pt(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 ea(r,e,t,i={}){var p,d,u;if(!r)return;let n=i.positionRatio?It(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):_t(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(p=i.offset)!=null?p:{x:0,y:0},o=n.x+a.x,s=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),he(r,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)&&xe(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,Qn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Qn(window.innerWidth,window.innerHeight),window.updateDebugConfig=vs,window.getDebugConfig=ys,window.copyConfig=_s,window.applyConfig=Mt,window.applyConfigForRatio=Is,window.positionAtBottom=Qr,window.positionAtTop=Ss,window.positionAtCenter=As,window.positionAtLeft=Ts,window.positionAtRight=Cs,window.positionAtBottomLeft=Ls,window.positionAtBottomRight=ks,window.positionAtTopLeft=Ps,window.positionAtTopRight=Ms,window.applyPositionContract=Es,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 ji(r,e,t=0){return r*e+t}function zi(r,e,t=0){return r*(1-e)+t}function Di(r,e,t=0){return r*e+t}function $i(r,e,t=0){return r*(1-e)+t}function ce(r,e=0){return r/2+e}function ws(r,e){return r*e}function Es(r,e,t,i){var o,s,l,c,p,d,u,g,f,h,m,b,v,y,x,E,M,j,C,_;let n=0,a=0;switch(i.type){case"top":n=ce(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),a=ji(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ce(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),a=zi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Di(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=ce(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=$i(e,i.percent,(y=(v=i.offset)==null?void 0:v.x)!=null?y:0),a=ce(t,(E=(x=i.offset)==null?void 0:x.y)!=null?E:0);break;case"center":n=ce(e,(j=(M=i.offset)==null?void 0:M.x)!=null?j:0),a=ce(t,(_=(C=i.offset)==null?void 0:C.y)!=null?_:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function Qr(r,e,t,i=.2,n=1,a=!0,o=!1){let s=ws(t,i),l=zi(t,i/2);he(r,ce(e),l);let c=a?n*Pe.scaleFactor:n;xe(r,c),o&&!Ri.find(p=>p.element===r)&&fs(r,Qr,e,t,i,n,a)}function Ss(r,e,t,i=.1,n=1){he(r,ce(e),ji(t,i)),xe(r,n)}function As(r,e,t,i=0,n=0,a=1){he(r,ce(e,i),ce(t,n)),xe(r,a)}function Ts(r,e,t,i=.1,n=1){he(r,Di(e,i),ce(t)),xe(r,n)}function Cs(r,e,t,i=.1,n=1){he(r,$i(e,i),ce(t)),xe(r,n)}function Ls(r,e,t,i=.05,n=.05,a=1){he(r,Di(e,n),zi(t,i)),xe(r,a)}function ks(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),zi(t,i)),xe(r,a)}function Ps(r,e,t,i=.05,n=.05,a=1){he(r,Di(e,n),ji(t,i)),xe(r,a)}function Ms(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),ji(t,i)),xe(r,a)}function he(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function xe(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var Ge={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 _s(r){return r&&Ge[r]?JSON.parse(JSON.stringify(Ge[r])):JSON.parse(JSON.stringify(q))}function Mt(r){Object.keys(r).forEach(e=>{let t=e;q[t]&&r[t]&&Object.assign(q[t],r[t])}),console.log("Config applied:",r)}function Is(r,e){let t=r/e;t>1.6?(Mt(Ge.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Mt(Ge.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Mt(Ge.square),console.log("Applied SQUARE config for ratio:",t)):(Mt(Ge.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=Ge,r.resolveAnchorVec2=r.resolveAnchorVec2||pt,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||_t,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||It}var ae=null;function Os(r,e,t,i,n,a={}){var R,L,O,D,V,H,F,W,J,de,we,$e,$,ie,re,pe,oe,fe,Ee,Se,B,Z,Y,te,Me,He,ta,ia,na,aa,ra,oa,sa,la;let o=(R=a.enableDebugLogs)!=null?R:!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:",a));let{mainContainer:s,label:l,background:c,backgroundTexture:p,app:d}=r;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*q.layout.screen_scale_x,h=g*q.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},v=b.layout||{};o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:q.layout.screen_scale_x,screen_scale_y:q.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:",v));let y=v.design_width_portrait||400,x=f/y;x=Math.min(x,1.15);let E=x*((L=q.engine.scale)!=null?L:1),M=(O=a.skipMainContainerTransform)!=null?O:!1;!M&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(E):(s.scale.x=E,s.scale.y=E));let j=(D=v.main_container_anchor)!=null?D:"center",C=(V=v.main_container_position_ratio)!=null?V:{x:.5,y:.5},_=(H=v.main_container_offset)!=null?H:{x:0,y:0},I=v.main_container_position_ratio?It(u,g,C):_t(u,g,j),T=I.x+_.x+q.layout.position_offset.x,w=I.y+_.y+q.layout.position_offset.y;if(!M&&s&&s.position&&(typeof s.position.set=="function"?s.position.set(T,w):(s.position.x=T,s.position.y=w)),n&&(s!=null&&s.toLocal))for(let[ne,ee]of e.objects.entries()){let U=ee==null?void 0:ee.transform;if(!U||((F=U.position_mode)!=null?F:"static")!=="static")continue;let N=(W=n.get)==null?void 0:W.call(n,ne),me=((J=N==null?void 0:N.getDisplayObject)==null?void 0:J.call(N))||(N==null?void 0:N.pixiObject)||N;if(!me||me.parent!==s)continue;let Ot=U.position_ratio!=null?It(u,g,U.position_ratio):_t(u,g,(de=U.anchor)!=null?de:"center"),Rt=s.toLocal(new hs(Ot.x,Ot.y)),jt=(we=U.position)!=null?we:{x:0,y:0},Ne=Rt.x+jt.x,Hi=Rt.y+jt.y;typeof(N==null?void 0:N.setPosition)=="function"?N.setPosition(Ne,Hi):(he(me,Ne,Hi),($e=N==null?void 0:N.transform)!=null&&$e.position&&(N.transform.position.x=Ne,N.transform.position.y=Hi))}let A=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,k=((A==null?void 0:A.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(q.layout.debug_rect_visible&&k){(!ae||ae.parent!==d.stage)&&(ae==null||ae.destroy(),ae=new gs,ae.zIndex=9999,d.stage.addChild(ae)),ae.clear();let ne=q.layout.debug_rect_scale_x,ee=q.layout.debug_rect_scale_y,U=(u-4)*ne,_e=(g-4)*ee,N=(u-U)/2,me=(g-_e)/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:U,rectH:_e,offsetX:N,offsetY:me}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+N,y:2+me,width:U,height:_e})),ae.rect(2+N,2+me,U,_e).stroke({width:q.layout.debug_rect_thickness,color:q.layout.debug_rect_color})}else ae&&(ae.destroy(),ae=null);let P=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&P){let ne=(re=(ie=P==null?void 0:P.transform)==null?void 0:ie.anchor)!=null?re:"center",ee=(pe=P==null?void 0:P.transform)==null?void 0:pe.position_ratio,U=((oe=P==null?void 0:P.transform)==null?void 0:oe.offset)||{x:0,y:0};ea(l,u,g,{anchor:ne,positionRatio:ee,offset:{x:U.x*E,y:U.y*E},renderAnchor:pt(ne)})}if(l&&l.alpha>0){let ne=1+Math.sin(t*q.engine.label_pulse_speed)*q.engine.label_pulse_intensity,ee=(Ee=(fe=P==null?void 0:P.transform)==null?void 0:fe.scale)!=null?Ee:1,U=ne*E*ee;l.scale&&(typeof l.scale.set=="function"?l.scale.set(U):(l.scale.x=U,l.scale.y=U))}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:",(Se=c.constructor)==null?void 0:Se.name)),c.alpha=((Z=(B=b.background)==null?void 0:B.alpha)!=null?Z:.98)*q.engine.background_alpha,o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let ne=e.objects.get("background_1");o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",ne);let ee=(ne==null?void 0:ne.transform)||{};o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ee);let U=ee.offset||{x:0,y:0},_e=((te=(Y=b.background)==null?void 0:Y.offset_y)!=null?te:0)+q.engine.background_offset_y,N=(Me=ee.anchor)!=null?Me:"center",me=ee.position_ratio;if(o&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:U,bgRuntimeOffsetY:_e,bgScreenAnchor:N,bgPositionRatio:me,baseWidth:u,baseHeight:g,finalScale:E}),ea(c,u,g,{anchor:N,positionRatio:me,offset:{x:U.x*E,y:U.y*E+_e},renderAnchor:pt(N)}),o&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(He=c.scale)==null?void 0:He.x,scaleY:(ta=c.scale)==null?void 0:ta.y,anchorX:(ia=c.anchor)==null?void 0:ia.x,anchorY:(na=c.anchor)==null?void 0:na.y,pivotX:(aa=c.pivot)==null?void 0:aa.x,pivotY:(ra=c.pivot)==null?void 0:ra.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 Ot=Math.max(f/p.width,h/p.height),Rt=(sa=(oa=b.background)==null?void 0:oa.scale_multiplier)!=null?sa:1.05,jt=(la=ee.scale)!=null?la:1,Ne=Ot*Rt*q.engine.background_scale*jt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Ne):(c.scale.x=Ne,c.scale.y=Ne))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function Rs(r){var s,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,o=((l=(s=n.engine)==null?void 0:s.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=o.tutorial_delay_ms)!=null?c:1500)}export{Fa as a,Wn as b,ki as c,Pi as d,Mi as e,Lt as f,Jo as g,Zo as h,Qo as i,es as j,zn as k,as as l,je as m,Xn as n,kt as o,Pt as p,rs as q,ds as r,ps as s,us as t,Zn as u,Oi as v,bs as w,Qn as x,pt as y,_t as z,It as A,ea as B,Os as C,Rs as D,Ua as E,Ga as F,Ji as G,We as H,Ys as I,wi as J,Pn as K,kr as L,In as M,_d as N,Id as O,Ce as P,Do as Q,$o as R,$n as S,ye as T,Te as U};
|