handler-playable-sdk 1.0.77 → 1.0.78
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-HYNBTANV.js → chunk-23YL7UA4.js} +113 -113
- 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/add-logic.mjs +1 -1
- package/dist/cli/student-helper/add-object.mjs +1 -1
- package/dist/cli/student-helper/arg-parsing.mjs +1 -1
- package/dist/cli/student-helper/asset-registry.mjs +1 -1
- package/dist/cli/student-helper/bullet-system.mjs +1 -1
- package/dist/cli/student-helper/collectable-system.mjs +1 -1
- package/dist/cli/student-helper/constants.mjs +1 -1
- package/dist/cli/student-helper/drag-snap-couples.mjs +1 -1
- package/dist/cli/student-helper/endgame-screen.mjs +1 -1
- package/dist/cli/student-helper/fs-io.mjs +1 -1
- package/dist/cli/student-helper/logic-defaults.mjs +1 -1
- package/dist/cli/student-helper/print-help.mjs +1 -1
- package/dist/cli/student-helper/prompts.mjs +1 -1
- package/dist/cli/student-helper/scratch-card.mjs +1 -1
- package/dist/cli/student-helper/screen-utils.mjs +1 -1
- package/dist/cli/student-helper/snippets.mjs +1 -1
- package/dist/cli/student-helper/start-screen.mjs +1 -1
- package/dist/cli/student-helper/swerve-collect.mjs +1 -1
- package/dist/cli/student-helper/tap-destroy.mjs +1 -1
- package/dist/cli/student-helper/template-packs.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 +49 -49
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +8 -8
- package/dist/pixi/index.js +1 -1
- package/dist/three/index.cjs +1 -1
- package/dist/three/index.js +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}from"./chunk-PW2FGMCO.js";import{c as Ge,d as Wt,e as Ze,g as Fa,h as nn,j as Ba,k as Ua,n as an,o as Kt,p as st,q as Ga,r as sn,s as qa}from"./chunk-HVKF2KYL.js";import{a as Hr}from"./chunk-JXBG6UFL.js";import{Application as al}from"pixi.js";var qe={};function Jt(r,e,t=!1){qe[r]||(qe[r]=[]),qe[r].push({fn:e,once:t})}function rn(r,e){if(qe[r]){if(!e){delete qe[r];return}qe[r]=qe[r].filter(t=>t.fn!==e)}}function Zt(r,...e){let t=qe[r];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(r,i.fn)}function he(r,e){Jt(r,e,!0)}var te=null,be=[],rt=null;function Wa(r){te=r,be=[],rt!==null&&(clearTimeout(rt),rt=null)}function Ka(){var r,e,t;return{endpoint:(te==null?void 0:te.endpoint)||"",transport:(te==null?void 0:te.transport)||"beacon",batchSize:(r=te==null?void 0:te.batchSize)!=null?r:10,flushIntervalMs:(e=te==null?void 0:te.flushIntervalMs)!=null?e:300,maxQueue:(t=te==null?void 0:te.maxQueue)!=null?t:200,debug:!!(te!=null&&te.debug)}}async function Va(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 on(r,e){let t=Ka();if(e&&t.endpoint){if(be.push(r),be.length>t.maxQueue&&(be=be.slice(be.length-t.maxQueue)),be.length>=t.batchSize){Ya();return}rt===null&&(rt=window.setTimeout(()=>{rt=null,Ya()},t.flushIntervalMs))}}async function Ya(){let r=Ka();if(!r.endpoint||be.length===0)return;let e=be.splice(0,r.batchSize);await Va(r.endpoint,{events:e},r.transport,r.debug),be.length>0&&await Va(r.endpoint,{events:be.splice(0,r.batchSize)},r.transport,r.debug)}function Xa(r){return Math.max(0,Math.min(1,r))}function Nr(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 Tt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Fr(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function Ja(r,e,t){try{r[e]=t}catch{}}function Br(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 Za(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 Qa(r,e){let t=Br(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 es(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=d=>{var p;r.add(d);let u=(p=e.get(d.target))!=null?p:new Set;u.add(d),e.set(d.target,u),i()},a=d=>{r.delete(d);let u=e.get(d.target);u&&(u.delete(d),u.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var u,p;let d=Tt();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Xa(m),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let L=m-y;f=Xa(L)}let v=g.ease(f);g.yoyo&&y%2===1&&(v=1-v);for(let L of g.props)Ja(g.target,L.key,L.from+(L.to-L.from)*v);g.scaleFrom&&g.scaleTo&&Za(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(u=g.onUpdate)==null||u.call(g)}catch{}if(m>=b){s(g);try{(p=g.onComplete)==null||p.call(g)}catch{}}}},l=(d,u,p)=>{var L;let g=Math.max(0,(typeof u.duration=="number"?u.duration:.5)*1e3),h=Math.max(0,(typeof u.delay=="number"?u.delay:0)*1e3+((L=p==null?void 0:p.delayMsOverride)!=null?L:0)),m=Nr(u.ease),f=typeof u.repeat=="number"?Math.max(0,u.repeat|0):0,b=u.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let j of Object.keys(u)){if(y.has(j))continue;let _=u[j];typeof _=="number"&&v.push({key:j,from:Fr(d,j),to:_})}let S=Qa(d,u);return{target:d,startMs:Tt(),delayMs:h,durationMs:g,ease:m,props:v,scaleFrom:S.from,scaleTo:S.to,repeat:f,yoyo:b,onUpdate:typeof u.onUpdate=="function"?u.onUpdate:void 0,onComplete:typeof u.onComplete=="function"?u.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,u){let p=l(d,u);return n(p),{kill:()=>s(p),pause:()=>{p.paused||(p.paused=!0,p.pauseAtMs=Tt())},resume:()=>{var m;if(!p.paused)return;let g=(m=p.pauseAtMs)!=null?m:Tt(),h=Tt()-g;p.startMs+=h,p.paused=!1,p.pauseAtMs=null},isActive:()=>!p.killed&&!p.paused}},fromTo(d,u,p){return c.set(d,u),c.to(d,p)},set(d,u){if(!d||!u)return;for(let g of Object.keys(u)){let h=u[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Ja(d,g,h)}let p=Qa(d,u);p.to&&Za(d,p.to)},killTweensOf(d){let u=e.get(d);if(u)for(let p of Array.from(u))s(p)},timeline(d={}){let u=[],p=0,g=!1,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?p+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):p},f=y=>{u.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);p=Math.max(p,y.atMs+v)},b={to(y,v,S){return f({kind:"to",target:y,vars:v,atMs:m(S)}),b},fromTo(y,v,S,L){return f({kind:"fromTo",target:y,vars:S,from:v,atMs:m(L)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let S of u)S.kind==="fromTo"&&c.set(S.target,(y=S.from)!=null?y:{}),h.push(c.to(S.target,{...S.vars,delay:S.atMs/1e3+((v=S.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function ts(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=es()}catch{}}var is={name:"handler-playable-sdk",version:"1.0.77",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs dist/cli/student-helper/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var me=0,Gr=me++,ns=me++,as=me++,ss=me++,rs=me++,os=me++,ls=me++,cs=me++,ds=me++,ps=me++,us=me++,gs=me++,W=Gr;function hs(){return W===ns}function ms(){return W===as}function fs(){return W===ss}function bs(){return W===rs}function ot(){return W===os}function lt(){return W===ls}function ys(){return W===cs}function vs(){return W===ds}function ws(){return W===ps}function ln(){return W===us}function cn(){return W===gs}function xs(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),W=ns;return}catch{}else if(r==="dapi")try{dapi.isReady(),W=as;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(W=ss)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(W=rs)}catch{}else if(e==="mintegral")window.gameReady&&(W=os);else if(e==="tapjoy")window.TJ_API&&(W=ls);else if(e==="tiktok")window.openAppStore&&(W=cs);else if(e==="smadex")try{window.smxTracking&&(W=ds)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(W=ps)}catch{}else e==="vungle"?W=us:(r==="nucleo"||e==="nucleo")&&(W=gs)}import dn from"lottie-web";var Ss=dn;typeof window!="undefined"&&(window.lottie=dn,window.__baseLottie=dn);function ie(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var jl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:ie(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:ie(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:ie(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:ie(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:ie(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:ie(360,780)}],_l=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:ie(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:ie(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:ie(412,915)}],Ol=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:ie(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:ie(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:ie(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:ie(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:ie(800,1280)}],pn=[{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:ie(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:ie(768,1024),mraidScale:.7}];var Es=[...pn],Cs=[{category:"playable",label:"Playable Ad",devices:pn}],un=pn[0];function ct(r){return Es.find(e=>e.id===r)||un}function Rl(r){return Es.filter(e=>e.category===r)}var Ae=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}if(Ge({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform."))console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e),n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))});else{let u=window.applyEditableObjectConfig;if(typeof u=="function"){let p=window.__editableConfig,g=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await u(e,g),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 gn(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 s=n.result,o=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 u=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(u!=null&&u.success)){alert(`Upload failed: ${(u==null?void 0:u.error)||"Unknown error"}`);return}let p=window.addAssetToRegistry;typeof p=="function"&&p(o,`${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(u.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Qt=class{constructor(){this.updateManager=new Ae}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 s=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.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:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let u=window.reRenderAssetLibrary;typeof u=="function"&&u()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(a=o==null?void 0:o.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 s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");gn({objectId:e,category:a,onApply:async o=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(o),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(o);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,o);let u=window.__debugContext;(h=(g=u==null?void 0:u.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,o);let p=window.__highlightLibrarySlot;typeof p=="function"&&setTimeout(()=>{p(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}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),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of 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 s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var qr=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Vr=["environment","ui","character","system","backgrounds"],Yr=["bg","world","ui"],As={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}}},ei=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{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}from"./chunk-PW2FGMCO.js";import{c as Ge,d as Wt,e as Ze,g as Fa,h as nn,j as Ba,k as Ua,n as an,o as Kt,p as rt,q as Ga,r as rn,s as qa}from"./chunk-HVKF2KYL.js";import{a as Hs}from"./chunk-JXBG6UFL.js";import{Application as al}from"pixi.js";var qe={};function Jt(s,e,t=!1){qe[s]||(qe[s]=[]),qe[s].push({fn:e,once:t})}function sn(s,e){if(qe[s]){if(!e){delete qe[s];return}qe[s]=qe[s].filter(t=>t.fn!==e)}}function Zt(s,...e){let t=qe[s];if(t)for(let i of[...t])i.fn(...e),i.once&&sn(s,i.fn)}function he(s,e){Jt(s,e,!0)}var te=null,be=[],st=null;function Wa(s){te=s,be=[],st!==null&&(clearTimeout(st),st=null)}function Ka(){var s,e,t;return{endpoint:(te==null?void 0:te.endpoint)||"",transport:(te==null?void 0:te.transport)||"beacon",batchSize:(s=te==null?void 0:te.batchSize)!=null?s:10,flushIntervalMs:(e=te==null?void 0:te.flushIntervalMs)!=null?e:300,maxQueue:(t=te==null?void 0:te.maxQueue)!=null?t:200,debug:!!(te!=null&&te.debug)}}async function Va(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,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(s,{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 on(s,e){let t=Ka();if(e&&t.endpoint){if(be.push(s),be.length>t.maxQueue&&(be=be.slice(be.length-t.maxQueue)),be.length>=t.batchSize){Ya();return}st===null&&(st=window.setTimeout(()=>{st=null,Ya()},t.flushIntervalMs))}}async function Ya(){let s=Ka();if(!s.endpoint||be.length===0)return;let e=be.splice(0,s.batchSize);await Va(s.endpoint,{events:e},s.transport,s.debug),be.length>0&&await Va(s.endpoint,{events:be.splice(0,s.batchSize)},s.transport,s.debug)}function Xa(s){return Math.max(0,Math.min(1,s))}function Ns(s){let e=String(s!=null?s:"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 Tt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Fs(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function Ja(s,e,t){try{s[e]=t}catch{}}function Bs(s){let e=s==null?void 0:s.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 Za(s,e){let t=s==null?void 0:s.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 Qa(s,e){let t=Bs(s);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 er(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var p;s.add(d);let u=(p=e.get(d.target))!=null?p:new Set;u.add(d),e.set(d.target,u),i()},a=d=>{s.delete(d);let u=e.get(d.target);u&&(u.delete(d),u.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var u,p;let d=Tt();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Xa(m),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let L=m-y;f=Xa(L)}let v=g.ease(f);g.yoyo&&y%2===1&&(v=1-v);for(let L of g.props)Ja(g.target,L.key,L.from+(L.to-L.from)*v);g.scaleFrom&&g.scaleTo&&Za(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(u=g.onUpdate)==null||u.call(g)}catch{}if(m>=b){r(g);try{(p=g.onComplete)==null||p.call(g)}catch{}}}},l=(d,u,p)=>{var L;let g=Math.max(0,(typeof u.duration=="number"?u.duration:.5)*1e3),h=Math.max(0,(typeof u.delay=="number"?u.delay:0)*1e3+((L=p==null?void 0:p.delayMsOverride)!=null?L:0)),m=Ns(u.ease),f=typeof u.repeat=="number"?Math.max(0,u.repeat|0):0,b=u.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let j of Object.keys(u)){if(y.has(j))continue;let _=u[j];typeof _=="number"&&v.push({key:j,from:Fs(d,j),to:_})}let S=Qa(d,u);return{target:d,startMs:Tt(),delayMs:h,durationMs:g,ease:m,props:v,scaleFrom:S.from,scaleTo:S.to,repeat:f,yoyo:b,onUpdate:typeof u.onUpdate=="function"?u.onUpdate:void 0,onComplete:typeof u.onComplete=="function"?u.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,u){let p=l(d,u);return n(p),{kill:()=>r(p),pause:()=>{p.paused||(p.paused=!0,p.pauseAtMs=Tt())},resume:()=>{var m;if(!p.paused)return;let g=(m=p.pauseAtMs)!=null?m:Tt(),h=Tt()-g;p.startMs+=h,p.paused=!1,p.pauseAtMs=null},isActive:()=>!p.killed&&!p.paused}},fromTo(d,u,p){return c.set(d,u),c.to(d,p)},set(d,u){if(!d||!u)return;for(let g of Object.keys(u)){let h=u[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Ja(d,g,h)}let p=Qa(d,u);p.to&&Za(d,p.to)},killTweensOf(d){let u=e.get(d);if(u)for(let p of Array.from(u))r(p)},timeline(d={}){let u=[],p=0,g=!1,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?p+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):p},f=y=>{u.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);p=Math.max(p,y.atMs+v)},b={to(y,v,S){return f({kind:"to",target:y,vars:v,atMs:m(S)}),b},fromTo(y,v,S,L){return f({kind:"fromTo",target:y,vars:S,from:v,atMs:m(L)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let S of u)S.kind==="fromTo"&&c.set(S.target,(y=S.from)!=null?y:{}),h.push(c.to(S.target,{...S.vars,delay:S.atMs/1e3+((v=S.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function tr(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=er()}catch{}}var ir={name:"handler-playable-sdk",version:"1.0.78",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web --external jszip && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs dist/cli/student-helper/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var me=0,Gs=me++,nr=me++,ar=me++,rr=me++,sr=me++,or=me++,lr=me++,cr=me++,dr=me++,pr=me++,ur=me++,gr=me++,W=Gs;function hr(){return W===nr}function mr(){return W===ar}function fr(){return W===rr}function br(){return W===sr}function ot(){return W===or}function lt(){return W===lr}function yr(){return W===cr}function vr(){return W===dr}function wr(){return W===pr}function ln(){return W===ur}function cn(){return W===gr}function xr(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),W=nr;return}catch{}else if(s==="dapi")try{dapi.isReady(),W=ar;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(W=rr)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(W=sr)}catch{}else if(e==="mintegral")window.gameReady&&(W=or);else if(e==="tapjoy")window.TJ_API&&(W=lr);else if(e==="tiktok")window.openAppStore&&(W=cr);else if(e==="smadex")try{window.smxTracking&&(W=dr)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(W=pr)}catch{}else e==="vungle"?W=ur:(s==="nucleo"||e==="nucleo")&&(W=gr)}import dn from"lottie-web";var Sr=dn;typeof window!="undefined"&&(window.lottie=dn,window.__baseLottie=dn);function ie(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var jl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:ie(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:ie(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:ie(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:ie(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:ie(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:ie(360,780)}],_l=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:ie(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:ie(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:ie(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:ie(412,915)}],Ol=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:ie(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:ie(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:ie(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:ie(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:ie(800,1280)}],pn=[{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:ie(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:ie(768,1024),mraidScale:.7}];var Er=[...pn],Cr=[{category:"playable",label:"Playable Ad",devices:pn}],un=pn[0];function ct(s){return Er.find(e=>e.id===s)||un}function Rl(s){return Er.filter(e=>e.category===s)}var Ae=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}if(Ge({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform."))console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e),n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))});else{let u=window.applyEditableObjectConfig;if(typeof u=="function"){let p=window.__editableConfig,g=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await u(e,g),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 gn(s){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 r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let u=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(u!=null&&u.success)){alert(`Upload failed: ${(u==null?void 0:u.error)||"Unknown error"}`);return}let p=window.addAssetToRegistry;typeof p=="function"&&p(o,`${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 s.onApply(u.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Qt=class{constructor(){this.updateManager=new Ae}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 r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);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 r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.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:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let u=window.reRenderAssetLibrary;typeof u=="function"&&u()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.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 r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");gn({objectId:e,category:a,onApply:async o=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(o),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(o);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,o);let u=window.__debugContext;(h=(g=u==null?void 0:u.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,o);let p=window.__highlightLibrarySlot;typeof p=="function"&&setTimeout(()=>{p(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}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),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.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 r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var qs=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Vs=["environment","ui","character","system","backgrounds"],Ys=["bg","world","ui"],Ar={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}}},ei=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{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}
|
|
|
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
|
+
${Vs.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" required>
|
|
59
|
-
${
|
|
59
|
+
${qs.map(e=>`<option value="${e.value}">${e.label}</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
|
+
${Ys.map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
66
66
|
</select>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
@@ -225,7 +225,7 @@ import{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}
|
|
|
225
225
|
<label class="wizard-label">Logic Component</label>
|
|
226
226
|
<select class="wizard-select" data-field="logicId">
|
|
227
227
|
<option value="">None</option>
|
|
228
|
-
${Object.keys(
|
|
228
|
+
${Object.keys(Ar).map(e=>`<option value="${e}">${e}</option>`).join("")}
|
|
229
229
|
</select>
|
|
230
230
|
</div>
|
|
231
231
|
<div class="wizard-field-group">
|
|
@@ -252,14 +252,14 @@ import{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}
|
|
|
252
252
|
<div class="wizard-type-icon">${t}</div>
|
|
253
253
|
<div class="wizard-type-name">${i}</div>
|
|
254
254
|
</button>
|
|
255
|
-
`}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";gn({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={"top-left":[0,0],"top-center":[.5,0],"top-right":[1,0],"left-center":[0,.5],center:[.5,.5],"right-center":[1,.5],"bottom-left":[0,1],"bottom-center":[.5,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=
|
|
255
|
+
`}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";gn({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={"top-left":[0,0],"top-center":[.5,0],"top-right":[1,0],"left-center":[0,.5],center:[.5,.5],"right-center":[1,.5],"bottom-left":[0,1],"bottom-center":[.5,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=Ar[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`
|
|
256
256
|
<div class="wizard-step-indicator">
|
|
257
257
|
<span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
|
|
258
258
|
<span class="wizard-step-label">Step ${a}</span>
|
|
259
259
|
</div>
|
|
260
|
-
`});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,o=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=o?"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
|
|
261
|
-
`)):(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),forceSync:!0}}buildObjectConfig(e){if(!this.state)return{};let t=this.state.category||"environment",i={identity:{id:e,category:t},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:this.state.anchorPreset==="custom"?{x:this.state.anchorX,y:this.state.anchorY}:this.state.anchorPreset,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")&&(i.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(i.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"},i.render.tint=null),this.state.objectType==="graphics"&&(i.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(i.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(i.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),i}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
|
|
262
|
-
`))||(a==null?void 0:a.error)||"Failed to create object.";alert(
|
|
260
|
+
`});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,o=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=o?"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 r=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!r:typeof r!="undefined"&&(n.value=String(r))}),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(`
|
|
261
|
+
`)):(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),forceSync:!0}}buildObjectConfig(e){if(!this.state)return{};let t=this.state.category||"environment",i={identity:{id:e,category:t},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:this.state.anchorPreset==="custom"?{x:this.state.anchorX,y:this.state.anchorY}:this.state.anchorPreset,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")&&(i.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(i.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"},i.render.tint=null),this.state.objectType==="graphics"&&(i.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(i.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(i.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),i}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 r=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
|
|
262
|
+
`))||(a==null?void 0:a.error)||"Failed to create object.";alert(r);return}await this.syncScreens(),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)}`)}}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[AddObjectWizard] Failed to sync screens:",e)}}};var ti=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=`
|
|
263
263
|
<div class="context-menu-item" data-action="duplicate">Duplicate</div>
|
|
264
264
|
<div class="context-menu-item" data-action="rename">Rename</div>
|
|
265
265
|
<div class="context-menu-item" data-action="move">Move to Screen</div>
|
|
@@ -268,11 +268,11 @@ import{a as Yt,c as en,d as Ce,e as tn}from"./chunk-I5OOVR5U.js";import{i as Xt}
|
|
|
268
268
|
<div class="context-menu-item" data-action="inspect">Open in Inspector</div>
|
|
269
269
|
<div class="context-menu-separator"></div>
|
|
270
270
|
<div class="context-menu-item danger" data-action="delete">Delete</div>
|
|
271
|
-
`,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,
|
|
271
|
+
`,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,r=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),r>0&&(this.menu.style.top=`${i-r-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let i=e.target.dataset.action;i&&(e.stopPropagation(),this.handleAction(i))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}handleAction(e){var t,i;switch(e){case"duplicate":this.handleDuplicate();break;case"rename":this.handleRename();break;case"move":this.handleMove();break;case"copy":this.handleCopyConfig();break;case"inspect":this.handleOpenInspector();break;case"delete":(i=(t=this.options).onDeleteRequest)==null||i.call(t,this.options.objectId),this.close();break}}async handleDuplicate(){var n,a,r,o,l;let e=`${this.options.objectId}_copy`,t=window.prompt("New instance ID",e);if(!t)return;if(!this.isInstanceIdUnique(t)){alert(`Instance ID "${t}" already exists.`);return}let i=window.confirm(`Share config with original?
|
|
272
272
|
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})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let u=((n=d==null?void 0:d.errors)==null?void 0:n.join(`
|
|
273
|
-
`))||(d==null?void 0:d.error)||"Duplicate failed.";alert(u);return}(
|
|
274
|
-
`))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(
|
|
275
|
-
`))||(o==null?void 0:o.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(
|
|
273
|
+
`))||(d==null?void 0:d.error)||"Duplicate failed.";alert(u);return}(r=(a=this.options).onRefresh)==null||r.call(a),(l=(o=this.options).onSelect)==null||l.call(o,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,r;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 o=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 o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
|
|
274
|
+
`))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(r=(a=this.options).onSelect)==null||r.call(a,e),this.close()}catch(o){alert(`Rename failed: ${o instanceof Error?o.message:String(o)}`)}}}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){if(this.options.onMoveRequest){this.options.onMoveRequest(this.options.objectId,t),this.close();return}try{let r=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})}),o=await r.json().catch(()=>({}));if(!r.ok||(o==null?void 0:o.success)===!1){let l=((i=o==null?void 0:o.errors)==null?void 0:i.join(`
|
|
275
|
+
`))||(o==null?void 0:o.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(r){alert(`Move failed: ${r instanceof Error?r.message:String(r)}`)}}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let r=window.__editableObjectConfigs;r&&typeof r.get=="function"&&(t=(n=r.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 kt=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ii=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.targetScreen="gameplay";this.view="root";this.templateQuery="";this.templateGroup=null;this.options=e}getTargetScreenStorageKey(){return`handler_preview_add_menu_target_screen::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}async open(e){await this.loadTemplates(),this.loadTargetScreen(),this.view="root",this.templateQuery="",this.templateGroup=null,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)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=this.renderMenuHtml(),this.menu=e,this.updateTargetScreenUI()}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,r=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),r>0&&(this.menu.style.top=`${i-r-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t==null?void 0:t.closest("[data-action]");if(!i||i.classList.contains("disabled"))return;let n=i.dataset.action;if(!n)return;if(e.preventDefault(),e.stopPropagation(),n==="set-screen"){let d=i.dataset.screenId;if(!d||!kt.some(u=>u.value===d))return;this.setTargetScreen(d);return}if(n==="open-view"){let d=(i.dataset.view||"").trim();(d==="templates"||d==="templates-group"||d==="screens"||d==="systems"||d==="root")&&this.setView(d);return}if(n==="back"){this.setView("root");return}if(n==="open-template-group"){let d=(i.dataset.templateGroup||"").trim();if(!d)return;this.templateGroup=d,this.setView("templates-group");return}if(n==="template-pack"){let d=(i.dataset.templatePack||"").trim();(d==="ui"||d==="screen")&&this.handleInstallTemplatePack(d);return}let a=i.dataset.objectType,r=i.dataset.systemType,o=i.dataset.templateId,l=i.dataset.screenId,c=l!=null?l:this.targetScreen;n==="object"&&a?this.handleCreateObject(a,c):n==="system"&&r?this.handleCreateSystem(r,c):n==="template"&&o&&this.handleCreateFromTemplate(o,c)}),this.menu.addEventListener("input",e=>{if(!this.menu)return;let t=e.target,i=t&&t instanceof HTMLInputElement?t:null;i&&i.classList.contains("context-menu-search")&&(this.templateQuery=i.value||"",this.updateMenuContents({preserveTemplateSearchFocus:!0}))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,u;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
|
|
276
276
|
<div class="add-menu-modal">
|
|
277
277
|
<div class="add-menu-modal-header">
|
|
278
278
|
<div class="add-menu-modal-title">${this.escapeHtml(e)}</div>
|
|
@@ -289,8 +289,8 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
289
289
|
<button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
|
|
290
290
|
</div>
|
|
291
291
|
</div>
|
|
292
|
-
`;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!kt.some(h=>h.value===g)){alert("Please select a valid screen.");return}n(),t(g)},
|
|
293
|
-
`))||(a==null?void 0:a.error)||"Failed to install templates.";alert(
|
|
292
|
+
`;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!kt.some(h=>h.value===g)){alert("Please select a valid screen.");return}n(),t(g)},r=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",p=>{p.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(d=i.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",r),(u=i.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",r),i.addEventListener("click",p=>{p.target===i&&r()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",p=>{p.key==="Enter"?(p.preventDefault(),a()):p.key==="Escape"&&(p.preventDefault(),r())}),document.body.appendChild(i),l.focus()})}loadTargetScreen(){try{let t=(window.localStorage.getItem(this.getTargetScreenStorageKey())||"").trim();kt.some(i=>i.value===t)?this.targetScreen=t:this.targetScreen="gameplay"}catch{this.targetScreen="gameplay"}}setTargetScreen(e){this.targetScreen=e;try{window.localStorage.setItem(this.getTargetScreenStorageKey(),e)}catch{}this.updateTargetScreenUI()}updateTargetScreenUI(){let e=this.menu;if(!e)return;Array.from(e.querySelectorAll(".context-menu-screen-chip[data-screen-id]")).forEach(i=>{let n=i.dataset.screenId;i.classList.toggle("active",n===this.targetScreen)})}setView(e){var t;if(this.view=e,e!=="templates-group"&&(this.templateGroup=null),this.updateMenuContents(),e==="templates"||e==="templates-group"){let i=(t=this.menu)==null?void 0:t.querySelector(".context-menu-search");i&&i.focus()}}updateMenuContents(e){if(!this.menu)return;let t=!!(e!=null&&e.preserveTemplateSearchFocus)&&document.activeElement===this.menu.querySelector(".context-menu-search");if(this.menu.innerHTML=this.renderMenuHtml(),this.updateTargetScreenUI(),t){let i=this.menu.querySelector(".context-menu-search");i==null||i.focus(),i&&(i.selectionStart=i.selectionEnd=i.value.length)}}renderMenuHtml(){return this.view==="templates"?this.renderTemplatesView():this.view==="templates-group"?this.renderTemplatesGroupView():this.view==="screens"?this.renderScreensView():this.view==="systems"?this.renderSystemsView():this.renderRootView()}getPackTemplateIds(e){return e==="ui"?["template.ui.rotating_logo","template.ui.floating_cta_badge","template.ui.bottom_cta_button","template.ui.hand_pointer","template.ui.title_banner","template.ui.instruction_text","template.ui.score_hud"]:["template.screen.rotating_coin","template.screen.rotating_gem","template.screen.tap_destroy_target","template.screen.draggable_piece","template.screen.snap_slot","template.screen.collectable_coin","template.screen.player_swerve","template.screen.enemy_damageable"]}getMissingPackTemplateIds(e){let t=new Set(this.templates.map(i=>String(i.id||"").toLowerCase()));return this.getPackTemplateIds(e).filter(i=>!t.has(i.toLowerCase()))}async handleInstallTemplatePack(e){var t;try{let n=await fetch(e==="ui"?"/api/templates/ui":"/api/templates/screen",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let r=((t=a==null?void 0:a.errors)==null?void 0:t.join(`
|
|
293
|
+
`))||(a==null?void 0:a.error)||"Failed to install templates.";alert(r);return}await this.loadTemplates(),this.updateMenuContents()}catch(i){alert(`Failed to install templates: ${i instanceof Error?i.message:String(i)}`)}}renderRootView(){let e=this.templates.length;return`
|
|
294
294
|
${this.renderTargetScreenSection()}
|
|
295
295
|
<div class="context-menu-section-title">Objects</div>
|
|
296
296
|
<div class="context-menu-item" data-action="object" data-object-type="sprite">\u{1F5BC}\uFE0F Sprite</div>
|
|
@@ -307,7 +307,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
307
307
|
<div class="context-menu-section-title">Templates</div>
|
|
308
308
|
<input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
|
|
309
309
|
${o||'<div class="context-menu-item disabled">No matches</div>'}
|
|
310
|
-
`}let n=i.map(
|
|
310
|
+
`}let n=i.map(r=>{var d,u;let o=(u=(d=t.get(r))==null?void 0:d.length)!=null?u:0,l=r==="UI Templates"||r==="Screen Templates";return o<=0&&!l?`<div class="context-menu-item disabled">${this.escapeHtml(r)} <span class="context-menu-subtle">0</span></div>`:`<div class="${o>0,"context-menu-item context-menu-submenu"}" data-action="open-template-group" data-template-group="${this.escapeHtml(r)}">${this.escapeHtml(r)} <span class="context-menu-subtle">${o}</span></div>`}).join(""),a=this.templates.length>0?"":'<div class="context-menu-item disabled">No templates available</div>';return`
|
|
311
311
|
<div class="context-menu-item context-menu-back" data-action="back">\u2190 Back</div>
|
|
312
312
|
<div class="context-menu-section-title">Templates</div>
|
|
313
313
|
<input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
|
|
@@ -345,7 +345,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
345
345
|
`).join("")}
|
|
346
346
|
</div>
|
|
347
347
|
<div class="context-menu-separator"></div>
|
|
348
|
-
`}groupTemplates(e){let t=new Map,i=(n,a)=>{var o;let
|
|
348
|
+
`}groupTemplates(e){let t=new Map,i=(n,a)=>{var o;let r=(o=t.get(n))!=null?o:[];r.push(a),t.set(n,r)};return e.forEach(n=>{let a=(n.id||"").toLowerCase();return a.startsWith("template.ui.")||a.startsWith("template.start.")||a.startsWith("template.endgame.")?i("UI Templates",n):a.startsWith("template.screen.")?i("Screen Templates",n):a.includes(".template")?i("Gameplay Templates",n):a.startsWith("effects.")||a.includes("effect")?i("Effects",n):i("Other",n)}),t}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var d,u,p;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
|
|
349
349
|
<div class="add-menu-modal">
|
|
350
350
|
<div class="add-menu-modal-header">
|
|
351
351
|
<div class="add-menu-modal-title">${this.escapeHtml(t)}</div>
|
|
@@ -361,7 +361,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
361
361
|
<button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
|
|
362
362
|
</div>
|
|
363
363
|
</div>
|
|
364
|
-
`;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},
|
|
364
|
+
`;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{let h=n.querySelector("#name-input").value.trim(),m=this.sanitizeInstanceId(h);if(!m){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(m)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",r),(u=n.querySelector('[data-action="cancel"]'))==null||u.addEventListener("click",o),(p=n.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),r()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var f,b,y;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",r=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),o=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
|
|
365
365
|
<div class="add-menu-modal add-menu-modal-wide">
|
|
366
366
|
<div class="add-menu-modal-header">
|
|
367
367
|
<div class="add-menu-modal-title">
|
|
@@ -450,7 +450,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
450
450
|
|
|
451
451
|
<div class="add-menu-modal-row">
|
|
452
452
|
<label class="add-menu-modal-label">Spawn Points / Area (JSON)</label>
|
|
453
|
-
<textarea class="add-menu-modal-textarea" id="spawner-spawn-points" rows="3">${this.escapeHtml(
|
|
453
|
+
<textarea class="add-menu-modal-textarea" id="spawner-spawn-points" rows="3">${this.escapeHtml(r)}</textarea>
|
|
454
454
|
<div class="add-menu-modal-hint">Used when source is "Fixed Points" or "Random Area".</div>
|
|
455
455
|
</div>
|
|
456
456
|
</div>
|
|
@@ -491,10 +491,10 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
491
491
|
<button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create Spawner</button>
|
|
492
492
|
</div>
|
|
493
493
|
</div>
|
|
494
|
-
`;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),u=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(v=>{v.addEventListener("click",()=>{var L;let S=v.dataset.tab;d.forEach(j=>j.classList.remove("active")),u.forEach(j=>j.classList.remove("active")),v.classList.add("active"),(L=t.querySelector(`[data-tab-content="${S}"]`))==null||L.classList.add("active")})});let p=v=>{let S=v.trim();if(!S)return null;try{return JSON.parse(S)}catch{return null}},g=()=>{var B;let v=t.querySelector("#spawner-instance-id").value.trim(),S=t.querySelector("#spawner-template-id").value.trim(),L=t.querySelector("#spawner-spawn-templates").value,j=t.querySelector("#spawner-position-source").value.trim(),_=t.querySelector("#spawner-point-mode").value.trim(),E=t.querySelector("#spawner-spawn-points").value,M=t.querySelector("#spawner-pattern").value.trim(),I=Number(t.querySelector("#spawner-rate").value.trim()),k=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,C=t.querySelector("#spawner-movement").value.trim(),w=Number(t.querySelector("#spawner-vel-x").value.trim()),x=Number(t.querySelector("#spawner-vel-y").value.trim()),O=t.querySelector("#spawner-velocity-range").value,P=p(L),R=Array.isArray(P)&&P.length?P:null,z=typeof((B=R==null?void 0:R[0])==null?void 0:B.templateId)=="string"?String(R[0].templateId):S;if(!v){alert("Instance ID is required.");return}if(!z){alert("Template ID is required.");return}let F={templateId:z,spawnPattern:M,spawnRate:Number.isFinite(I)?I:650,poolSize:Number.isFinite(k)?k:18,returnOnInvisible:A,positionSource:j,spawnPointMode:_,movementMode:C,lifetime:Number.isFinite(T)?T:5e3};R&&(F.spawnTemplates=R);let G=p(E);Array.isArray(G)&&(F.spawnPoints=G),Number.isFinite(w)&&Number.isFinite(x)&&(F.velocity={x:w,y:x});let H=p(O);H&&typeof H=="object"&&(F.velocityRange=H),c(),e({templateId:z,instanceId:v,spawnerProps:F})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",v=>v.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",v=>{v.target===t&&h()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:"center",position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let
|
|
495
|
-
`))||(p==null?void 0:p.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-V7DLPL5I.js");g(
|
|
496
|
-
`))||(d==null?void 0:d.error)||"Failed to create from template.";alert(u);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,
|
|
497
|
-
`))||(x==null?void 0:x.error)||"Failed to create collectable system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(
|
|
494
|
+
`;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),u=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(v=>{v.addEventListener("click",()=>{var L;let S=v.dataset.tab;d.forEach(j=>j.classList.remove("active")),u.forEach(j=>j.classList.remove("active")),v.classList.add("active"),(L=t.querySelector(`[data-tab-content="${S}"]`))==null||L.classList.add("active")})});let p=v=>{let S=v.trim();if(!S)return null;try{return JSON.parse(S)}catch{return null}},g=()=>{var B;let v=t.querySelector("#spawner-instance-id").value.trim(),S=t.querySelector("#spawner-template-id").value.trim(),L=t.querySelector("#spawner-spawn-templates").value,j=t.querySelector("#spawner-position-source").value.trim(),_=t.querySelector("#spawner-point-mode").value.trim(),E=t.querySelector("#spawner-spawn-points").value,M=t.querySelector("#spawner-pattern").value.trim(),I=Number(t.querySelector("#spawner-rate").value.trim()),k=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,C=t.querySelector("#spawner-movement").value.trim(),w=Number(t.querySelector("#spawner-vel-x").value.trim()),x=Number(t.querySelector("#spawner-vel-y").value.trim()),O=t.querySelector("#spawner-velocity-range").value,P=p(L),R=Array.isArray(P)&&P.length?P:null,z=typeof((B=R==null?void 0:R[0])==null?void 0:B.templateId)=="string"?String(R[0].templateId):S;if(!v){alert("Instance ID is required.");return}if(!z){alert("Template ID is required.");return}let F={templateId:z,spawnPattern:M,spawnRate:Number.isFinite(I)?I:650,poolSize:Number.isFinite(k)?k:18,returnOnInvisible:A,positionSource:j,spawnPointMode:_,movementMode:C,lifetime:Number.isFinite(T)?T:5e3};R&&(F.spawnTemplates=R);let G=p(E);Array.isArray(G)&&(F.spawnPoints=G),Number.isFinite(w)&&Number.isFinite(x)&&(F.velocity={x:w,y:x});let H=p(O);H&&typeof H=="object"&&(F.velocityRange=H),c(),e({templateId:z,instanceId:v,spawnerProps:F})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",v=>v.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",v=>{v.target===t&&h()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:"center",position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let u=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o,forceSync:!0})}),p=await u.json().catch(()=>({}));if(!u.ok||(p==null?void 0:p.success)===!1){let h=((l=p==null?void 0:p.errors)==null?void 0:l.join(`
|
|
495
|
+
`))||(p==null?void 0:p.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-V7DLPL5I.js");g(r,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(u){alert(`Failed to create object: ${u instanceof Error?u.message:String(u)}`)}}async handleCreateFromTemplate(e,t){var r,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i,forceSync:!0})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let u=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
|
|
496
|
+
`))||(d==null?void 0:d.error)||"Failed to create from template.";alert(u);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M,I,k,T,A,C;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let w=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await w.json().catch(()=>({}));if(!w.ok||(x==null?void 0:x.success)===!1){let O=((n=x==null?void 0:x.errors)==null?void 0:n.join(`
|
|
497
|
+
`))||(x==null?void 0:x.error)||"Failed to create collectable system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(w){alert(`Failed to create collectable system: ${w instanceof Error?w.message:String(w)}`)}if(e==="drag-snap-couples")try{let w=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await w.json().catch(()=>({}));if(!w.ok||(x==null?void 0:x.success)===!1){let O=((o=x==null?void 0:x.errors)==null?void 0:o.join(`
|
|
498
498
|
`))||(x==null?void 0:x.error)||"Failed to create drag-snap system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(w){alert(`Failed to create drag-snap system: ${w instanceof Error?w.message:String(w)}`)}if(e==="swerve-collect")try{let w=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await w.json().catch(()=>({}));if(!w.ok||(x==null?void 0:x.success)===!1){let O=((d=x==null?void 0:x.errors)==null?void 0:d.join(`
|
|
499
499
|
`))||(x==null?void 0:x.error)||"Failed to create swerve collect system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(p=(u=this.options).onRefresh)==null||p.call(u)}catch(w){alert(`Failed to create swerve collect system: ${w instanceof Error?w.message:String(w)}`)}if(e==="tap-destroy")try{let w=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await w.json().catch(()=>({}));if(!w.ok||(x==null?void 0:x.success)===!1){let O=((g=x==null?void 0:x.errors)==null?void 0:g.join(`
|
|
500
500
|
`))||(x==null?void 0:x.error)||"Failed to create tap destroy system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(w){alert(`Failed to create tap destroy system: ${w instanceof Error?w.message:String(w)}`)}if(e==="scratch-card")try{let w=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await w.json().catch(()=>({}));if(!w.ok||(x==null?void 0:x.success)===!1){let O=((f=x==null?void 0:x.errors)==null?void 0:f.join(`
|
|
@@ -537,13 +537,13 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
537
537
|
</div>
|
|
538
538
|
<div class="panel-resize-handle-v" data-panel-resize-v></div>
|
|
539
539
|
</div>
|
|
540
|
-
`}initialize(e,t){var a,
|
|
540
|
+
`}initialize(e,t){var a,r,o,l,c,d,u,p;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=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects()),this.loadCollapsedGroups(),(l=this.listContainer)==null||l.addEventListener("click",g=>{var S;let h=g.target,m=h==null?void 0:h.closest("[data-collapse-key]");if(m){let L=m.dataset.collapseKey||"";if(!L)return;let j=(S=this.listContainer)==null?void 0:S.querySelector(`[data-collapse-content="${L}"]`),_=this.isCollapsed(L);j&&(j.style.display=_?"":"none"),m.textContent=_?"\u25BE":"\u25B8",this.setCollapsed(L,!_),g.preventDefault(),g.stopPropagation();return}let f=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(f){let L=f.dataset.objectId;if(!L)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(L);return}let b=h==null?void 0:h.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;g.preventDefault(),g.stopPropagation();let y=b.dataset.systemBundleAction,v=b.dataset.systemBundleId;if(!(!y||!v)){if(y==="toggle-visibility"){this.toggleSystemBundleVisibility(v);return}y==="delete"&&this.deleteSystemBundle(v)}});let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",g=>{g.stopPropagation();let h=i.getBoundingClientRect();this.openAddObjectMenu({x:h.left,y:h.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){try{let g=window.localStorage.getItem(this.getScreenFilterStorageKey());g&&(this.screenFilter=g)}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{}try{let g=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof g=="function"&&g().catch(()=>{})}catch{}n.addEventListener("change",()=>{let g=n.value||"all";this.screenFilter=g;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{}try{let h=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof h=="function"&&h().catch(()=>{})}catch{}this.refreshObjects()})}(u=this.root)==null||u.addEventListener("click",g=>{let h=g.target;if(!h||h.closest("[data-context-menu]"))return;if(h.tagName==="INPUT"&&h.classList.contains("scene-object-checkbox")){let S=h.dataset.objectId;if(!S)return;g.stopPropagation(),this.toggleBatchSelect(S);return}let m=h.closest(".scene-object-item[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;let b=g.ctrlKey||g.metaKey;g.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,f):b?this.toggleBatchSelect(f):this.select(f)}),(p=this.listContainer)==null||p.addEventListener("contextmenu",g=>{var S;let h=g.target,m=h==null?void 0:h.closest("[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;g.preventDefault();let b=window.getEditableObjectConfig,y=typeof b=="function"?b(f):null;if(!y){let L=window.__editableObjectConfigs;L&&typeof L.get=="function"&&(y=(S=L.get(f))!=null?S:null)}let v=this.inferScreen(f,y);this.showContextMenu(f,v,g.clientX,g.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let u=d.dataset.objectId,p=u?this.selectedIds.has(u):!1,g=u===this.selectedId;d.classList.toggle("selected",p),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=p)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let u=window.getEditableObjectConfig,p=typeof u=="function"?u(d):null;if(!p){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(p=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,p),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=p==null?void 0:p.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectListAll,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"&&typeof t!="function"){this.scheduleRetry();return}let n=typeof t=="function"?t():e();if(!Array.isArray(n)||n.length===0){let g=window.__editableObjectConfigs;g&&typeof g.keys=="function"&&(n=Array.from(g.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),r=["loading","start","gameplay","tutorial","endgame"],o={loading:{templates:[],systems:[],objects:[],bundles:new Map},start:{templates:[],systems:[],objects:[],bundles:new Map},gameplay:{templates:[],systems:[],objects:[],bundles:new Map},tutorial:{templates:[],systems:[],objects:[],bundles:new Map},endgame:{templates:[],systems:[],objects:[],bundles:new Map}};this.systemBundles=new Map;let l=g=>{var f,b,y,v,S;let h=(v=(y=(b=(f=window.__editableConfig)==null?void 0:f.objects)==null?void 0:b.get)==null?void 0:y.call(b,g))!=null?v:null;if(h)return h;let m=window.__editableObjectConfigs;return m&&typeof m.get=="function"&&(S=m.get(g))!=null?S:null};n.forEach(g=>{var C,w,x,O,P,R,z;let h=l(g),m=(((C=h==null?void 0:h.identity)==null?void 0:C.category)||"scene").toString(),f=(((w=h==null?void 0:h.identity)==null?void 0:w.id)||g).toString(),b=m.toLowerCase(),y=f.toLowerCase(),v=b.includes("ui")||y.startsWith("ui")||y.includes("label"),S=b==="system",L=((x=h==null?void 0:h.identity)==null?void 0:x.is_template)===!0||y.includes(".template")||g.toLowerCase().includes(".template"),j=typeof((O=h==null?void 0:h.identity)==null?void 0:O.system_group)=="string"?h.identity.system_group:null,_=typeof((P=h==null?void 0:h.identity)==null?void 0:P.system_label)=="string"?h.identity.system_label:j?this.formatDisplayName(j):null,E=this.formatDisplayName(f||g),M=((R=h==null?void 0:h.render)==null?void 0:R.visible)===!1||(h==null?void 0:h.enabled)===!1,I=this.getObjectType(h),k={id:g,label:E,category:m,isUi:v,isTemplate:L,isUnused:M,objectType:I,systemGroupId:j,systemLabel:_},T=this.inferScreen(k.id,h);if(!(this.screenFilter!=="all"&&T!==this.screenFilter||!(!a||k.id.toLowerCase().includes(a)||k.label.toLowerCase().includes(a)))){if(j){let F=this.getSystemBundleKey(T,j),G=_!=null?_:j,H=o[T],B=H.bundles.get(F);B?(B.entries.push(k),B.objectIds.push(g)):H.bundles.set(F,{key:F,label:G,objectIds:[g],entries:[k]});let $=(z=this.systemBundles.get(F))!=null?z:{label:G,objectIds:[]};$.label=G,$.objectIds.push(g),this.systemBundles.set(F,$);return}if(L){o[T].templates.push(k);return}S?o[T].systems.push(k):o[T].objects.push(k)}});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=this.screenFilter==="all"?r:[this.screenFilter],u=d.map(g=>this.renderScreenGroup(g,c[g],o[g])).join("");this.listContainer.innerHTML=u,this.objectEntries=[];for(let g of d){let h=o[g];this.objectEntries.push(...h.templates),h.bundles.forEach(m=>this.objectEntries.push(...m.entries)),this.objectEntries.push(...h.systems),this.objectEntries.push(...h.objects)}for(let g of d){let h=o[g];if(!h.systems.length)continue;let m=this.listContainer.querySelector(`[data-delete-system-group="${g}"]`);m==null||m.addEventListener("click",f=>{f.stopPropagation(),this.deleteSystemGroup(h.systems)})}this.updateSelectionUI()}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),r=a?"Show all objects in this system":"Hide all objects in this system",o=a?"is-hidden":"",l=n.map(g=>this.renderEntryItem(g)).join(""),c=this.escapeHtml(e),d=this.getCollapseKey(`system:${e}`),u=this.isCollapsed(d);return`
|
|
541
541
|
<div class="scene-object-group scene-object-group-bundle" data-system-bundle="${c}">
|
|
542
542
|
<div class="scene-object-group-title">
|
|
543
543
|
<button class="scene-object-group-toggle" type="button" data-collapse-key="${d}">${u?"\u25B8":"\u25BE"}</button>
|
|
544
544
|
<span>${this.escapeHtml(t)} <span class="scene-object-count">${i.length}</span></span>
|
|
545
545
|
<div class="scene-object-group-actions">
|
|
546
|
-
<button class="scene-object-group-action scene-object-group-visibility ${o}" data-system-bundle-action="toggle-visibility" data-system-bundle-id="${c}" type="button" title="${
|
|
546
|
+
<button class="scene-object-group-action scene-object-group-visibility ${o}" data-system-bundle-action="toggle-visibility" data-system-bundle-id="${c}" type="button" title="${r}">\u{1F441}\uFE0F</button>
|
|
547
547
|
<button class="scene-object-group-delete" data-system-bundle-action="delete" data-system-bundle-id="${c}" type="button" title="Delete this system">\u{1F5D1}\uFE0F</button>
|
|
548
548
|
</div>
|
|
549
549
|
</div>
|
|
@@ -551,10 +551,10 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
551
551
|
${l}
|
|
552
552
|
</div>
|
|
553
553
|
</div>
|
|
554
|
-
`}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(i=(l=u.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",
|
|
554
|
+
`}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(i=(l=u.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",r=((d=i==null?void 0:i.render)==null?void 0:d.visible)===!1;return`
|
|
555
555
|
<div class="scene-object-item-wrapper">
|
|
556
556
|
<input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(e.id)?"checked":""} data-object-id="${e.id}">
|
|
557
|
-
${this.renderVisibilityButton(e.id,
|
|
557
|
+
${this.renderVisibilityButton(e.id,r)}
|
|
558
558
|
<button class="scene-object-item ${e.isUnused?"unused":""}" data-object-id="${e.id}">
|
|
559
559
|
<span class="scene-object-label">${e.label}</span>
|
|
560
560
|
${n?`<span class="scene-object-text-preview">${n}</span>`:""}
|
|
@@ -562,7 +562,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
562
562
|
<span class="scene-object-badge ${e.isUi?"ui":"scene"}">${e.category}</span>
|
|
563
563
|
</button>
|
|
564
564
|
</div>
|
|
565
|
-
`}escapeHtml(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var
|
|
565
|
+
`}escapeHtml(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var r,o,l;let a=(o=(r=t==null?void 0:t.get)==null?void 0:r.call(t,n))!=null?o:null;return((l=a==null?void 0:a.render)==null?void 0:l.visible)===!1})}toggleSystemBundleVisibility(e){var o;let t=this.systemBundles.get(e);if(!t)return;let i=t.objectIds||[];if(!i.length)return;let n=(o=window.__editableConfig)==null?void 0:o.objects;if(!n||typeof n.get!="function")return;let r=this.isBundleAllHidden(i);i.forEach(l=>{let c=n.get(l);c&&(c.render||(c.render={}),c.render.visible=r)});try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}this.refreshObjects()}async deleteSystemBundle(e){let t=this.systemBundles.get(e);if(!t)return;let i=t.label||e,n=Array.from(new Set(t.objectIds||[]));!n.length||!window.confirm(`Delete system "${i}" (${n.length} object${n.length!==1?"s":""})? This removes them from the screen configuration.`)||await this.deleteMultipleObjects(n)}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 o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[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(),r=`${e} ${a}`.toLowerCase();return r.includes("loading")?"loading":r.includes("start")?"start":r.includes("tutorial")?"tutorial":r.includes("endgame")||r.includes("end_card")||r.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,r,o,l,c,d,u;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":((o=(r=e.render)==null?void 0:r.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width||(u=e.effects)!=null&&u.width?"graphics":"container":"container"}renderEntriesList(e){return e.length?e.map(t=>this.renderEntryItem(t)).join(""):""}renderCollapsibleGroup(e){var a;let t=this.isCollapsed(e.key),i=t?"\u25B8":"\u25BE",n=e.actionsHtml?`<div class="scene-object-group-actions">${e.actionsHtml}</div>`:"";return`
|
|
566
566
|
<div class="scene-object-group ${(a=e.className)!=null?a:""}">
|
|
567
567
|
<div class="scene-object-group-title">
|
|
568
568
|
<button class="scene-object-group-toggle" type="button" data-collapse-key="${e.key}">${i}</button>
|
|
@@ -573,17 +573,17 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
|
|
|
573
573
|
${e.content}
|
|
574
574
|
</div>
|
|
575
575
|
</div>
|
|
576
|
-
`}renderScreenGroup(e,t,i){let n=this.getCollapseKey(`screen:${e}`),a=[];if(i.templates.length){let o=this.getCollapseKey(`screen:${e}:templates`);a.push(this.renderCollapsibleGroup({key:o,title:"Templates",count:i.templates.length,content:this.renderEntriesList(i.templates),className:"scene-object-group-sub"}))}if(i.bundles.size||i.systems.length){let o=this.getCollapseKey(`screen:${e}:systems`),l=Array.from(i.bundles.values()).sort((u,p)=>u.label.localeCompare(p.label)).map(u=>this.renderSystemBundle(u.key,u.label,u.objectIds,u.entries)).join(""),c=i.systems.length?this.renderEntriesList(i.systems):"",d=i.systems.length?`<button class="scene-object-group-delete" data-delete-system-group="${e}" type="button" title="Delete all system objects">\u{1F5D1}\uFE0F</button>`:"";a.push(this.renderCollapsibleGroup({key:o,title:"Systems",count:i.bundles.size+i.systems.length,content:`${l}${c}`,className:"scene-object-group-system",actionsHtml:d}))}if(i.objects.length){let o=this.getCollapseKey(`screen:${e}:objects`);a.push(this.renderCollapsibleGroup({key:o,title:"Objects",count:i.objects.length,content:this.renderEntriesList(i.objects),className:"scene-object-group"}))}let
|
|
576
|
+
`}renderScreenGroup(e,t,i){let n=this.getCollapseKey(`screen:${e}`),a=[];if(i.templates.length){let o=this.getCollapseKey(`screen:${e}:templates`);a.push(this.renderCollapsibleGroup({key:o,title:"Templates",count:i.templates.length,content:this.renderEntriesList(i.templates),className:"scene-object-group-sub"}))}if(i.bundles.size||i.systems.length){let o=this.getCollapseKey(`screen:${e}:systems`),l=Array.from(i.bundles.values()).sort((u,p)=>u.label.localeCompare(p.label)).map(u=>this.renderSystemBundle(u.key,u.label,u.objectIds,u.entries)).join(""),c=i.systems.length?this.renderEntriesList(i.systems):"",d=i.systems.length?`<button class="scene-object-group-delete" data-delete-system-group="${e}" type="button" title="Delete all system objects">\u{1F5D1}\uFE0F</button>`:"";a.push(this.renderCollapsibleGroup({key:o,title:"Systems",count:i.bundles.size+i.systems.length,content:`${l}${c}`,className:"scene-object-group-system",actionsHtml:d}))}if(i.objects.length){let o=this.getCollapseKey(`screen:${e}:objects`);a.push(this.renderCollapsibleGroup({key:o,title:"Objects",count:i.objects.length,content:this.renderEntriesList(i.objects),className:"scene-object-group"}))}let r=a.join("");return r?this.renderCollapsibleGroup({key:n,title:t,count:i.templates.length+i.systems.length+i.objects.length+i.bundles.size,content:r,className:"scene-object-group-screen"}):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var r,o,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(r=this.options)==null||r.onSelect(this.selectedId),(l=(o=this.options)==null?void 0:o.onMultiSelect)==null||l.call(o,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===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 openAddObjectMenu(e){try{await new ii({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new ei().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,this.selectedIds.has(e)||this.select(e);try{new ti({objectId:e,screenId:t,onSelect:r=>{r&&this.select(r)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:r=>this.deleteObject(r),onMoveRequest:(r,o)=>this.moveObject(r,o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var a;let t=this.getSelectedIds(),i=t.length>1&&t.includes(e),n=this.getActiveScreenForSync();if(i){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let o=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,screenId:n,forceSync:!0})}),l=await o.json().catch(()=>null);if(!o.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
|
|
577
577
|
`))||(l==null?void 0:l.error)||"Delete failed.";alert(c);return}l!=null&&l.failedDeletions&&l.failedDeletions.length>0&&alert(`Warning: Some files could not be deleted:
|
|
578
578
|
${l.failedDeletions.join(`
|
|
579
|
-
`)}`),l!=null&&l.deletedFiles&&l.deletedFiles.length>0&&console.log(`[SceneObjectsPanel] Successfully deleted files: ${l.deletedFiles.join(", ")}`),await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(o){alert(`Delete failed: ${o instanceof Error?o.message:String(o)}`)}}}async deleteMultipleObjects(e){var
|
|
579
|
+
`)}`),l!=null&&l.deletedFiles&&l.deletedFiles.length>0&&console.log(`[SceneObjectsPanel] Successfully deleted files: ${l.deletedFiles.join(", ")}`),await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(o){alert(`Delete failed: ${o instanceof Error?o.message:String(o)}`)}}}async deleteMultipleObjects(e){var r;let t=0,i=0,n=[],a=this.getActiveScreenForSync();for(let o of e)try{let l=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:o,skipSync:!0,screenId:a,forceSync:!0})}),c=await l.json().catch(()=>null);if(l.ok&&(c==null?void 0:c.success)!==!1)t++,this.selectedIds.delete(o);else{i++;let d=((r=c==null?void 0:c.errors)==null?void 0:r.join(`
|
|
580
580
|
`))||(c==null?void 0:c.error)||"Delete failed.";n.push(`${o}: ${d}`)}}catch(l){i++,n.push(`${o}: ${l instanceof Error?l.message:String(l)}`)}if(i>0){let o=n.length>0?n.join(`
|
|
581
581
|
`):`${i} object(s) failed to delete.`;alert(`Deleted ${t} object(s). Errors:
|
|
582
|
-
${o}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var c;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(d=>d.id),a=0,
|
|
583
|
-
`))||(p==null?void 0:p.error)||"Delete failed.";o.push(`${d}: ${g}`)}}catch(u){
|
|
584
|
-
`):`${
|
|
585
|
-
${d}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var a;let i=this.getSelectedIds();if(i.length>1&&i.includes(e))await this.moveMultipleObjects(i,t);else{let
|
|
586
|
-
`))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}}async moveMultipleObjects(e,t){var
|
|
582
|
+
${o}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var c;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(d=>d.id),a=0,r=0,o=[],l=this.getActiveScreenForSync();for(let d of n)try{let u=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:d,screenId:l,forceSync:!0})}),p=await u.json().catch(()=>null);if(u.ok&&(p==null?void 0:p.success)!==!1)a++;else{r++;let g=((c=p==null?void 0:p.errors)==null?void 0:c.join(`
|
|
583
|
+
`))||(p==null?void 0:p.error)||"Delete failed.";o.push(`${d}: ${g}`)}}catch(u){r++,o.push(`${d}: ${u instanceof Error?u.message:String(u)}`)}if(r>0){let d=o.length>0?o.join(`
|
|
584
|
+
`):`${r} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
|
|
585
|
+
${d}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var a;let i=this.getSelectedIds();if(i.length>1&&i.includes(e))await this.moveMultipleObjects(i,t);else{let r=this.inferScreen(e,null);if(t===r)return;try{let o=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,fromScreenId:r,toScreenId:t})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
|
|
586
|
+
`))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}}async moveMultipleObjects(e,t){var r;let i=0,n=0,a=[];for(let o of e){let l=this.inferScreen(o,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:o,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let u=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
|
|
587
587
|
`))||(d==null?void 0:d.error)||"Move failed.";a.push(`${o}: ${u}`)}}catch(c){n++,a.push(`${o}: ${c instanceof Error?c.message:String(c)}`)}}if(n>0){let o=a.length>0?a.join(`
|
|
588
588
|
`):`${n} object(s) failed to move.`;alert(`Moved ${i} object(s). Errors:
|
|
589
589
|
${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenForSync();await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}getActiveScreenForSync(){let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:this.screenFilter!=="all"?this.screenFilter:"gameplay"}};var ai=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}render(){return`
|
|
@@ -661,7 +661,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
661
661
|
</div>
|
|
662
662
|
</div>
|
|
663
663
|
</div>
|
|
664
|
-
`}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 E;this.isCollapsed=!this.isCollapsed,(E=this.root)==null||E.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(E,M)=>{var k;let I=(k=this.root)==null?void 0:k.querySelector(`[data-status="${E}"]`);I&&I.classList.toggle("active",M)},
|
|
664
|
+
`}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 E;this.isCollapsed=!this.isCollapsed,(E=this.root)==null||E.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(E,M)=>{var k;let I=(k=this.root)==null?void 0:k.querySelector(`[data-status="${E}"]`);I&&I.classList.toggle("active",M)},r=this.root.querySelector("#debug-highlight-object");r==null||r.addEventListener("change",()=>{var E;(E=this.options)==null||E.onHighlightObject(!!r.checked),a("bounds",r.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var E;(E=this.options)==null||E.onHighlightAnchor(!!o.checked),a("anchor",o.checked),window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:o.checked}}));try{localStorage.setItem(this.getSceneStorageKey("highlight_anchor"),o.checked?"true":"false")}catch{}});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),u=this.root.querySelector("#scene-grid-alpha"),p=this.root.querySelector("#scene-grid-alpha-value"),g=this.root.querySelector("#scene-play-mode"),h=this.root.querySelector("[data-grid-toggle-btn]"),m=this.root.querySelector("[data-play-toggle-btn]"),f=()=>{if(!u)return .25;let E=Number(u.value),M=Number.isFinite(E)?Math.min(1,Math.max(0,E)):.25;return u.value=String(M),p&&(p.textContent=`${Math.round(M*100)}%`),M},b=(E,M,I)=>{var T,A;let k=I!==void 0?I:f();(A=(T=this.options)==null?void 0:T.onGridToggle)==null||A.call(T,E,M,k),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:E,gap:M,alpha:k}}))},y=E=>{var I,k;let M=f();(k=(I=this.options)==null?void 0:I.onGridGapChange)==null||k.call(I,E),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:E,alpha:M}}))},v=E=>{var M,I;(I=(M=this.options)==null?void 0:M.onGridAlphaChange)==null||I.call(M,E),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:L(),alpha:E}}))},S=E=>{var M,I;(I=(M=this.options)==null?void 0:M.onPlayModeChange)==null||I.call(M,E),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:E}}))},L=()=>{if(!d)return 50;let E=Number(d.value),M=Number.isFinite(E)?Math.min(200,Math.max(4,E)):50;return d.value=String(M),M},j=E=>{c&&(c.checked=E),d&&(d.disabled=!E),u&&(u.disabled=!E),h==null||h.classList.toggle("active",E)},_=E=>{g&&(g.checked=E),m==null||m.classList.toggle("active",E)};try{let E=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),M=localStorage.getItem(this.getSceneStorageKey("grid_gap")),I=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),k=localStorage.getItem(this.getSceneStorageKey("highlight_anchor")),T=E?E==="true":!1;j(T),d&&(d.value=M||"50",d.disabled=!T),u&&(u.value=I||"0.25",u.disabled=!T,f()),o&&(o.checked=k==="true",a("anchor",o.checked));let A=!0;_(A),g&&(g.disabled=!0),m&&(m.disabled=!0);try{localStorage.setItem(this.getSceneStorageKey("play_mode"),A?"true":"false")}catch{}b(T,L(),f()),S(A),o&&window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:o.checked}}))}catch{}c==null||c.addEventListener("change",()=>{let E=L(),M=f();d&&(d.disabled=!c.checked),u&&(u.disabled=!c.checked),h==null||h.classList.toggle("active",c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(E)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(M))}catch{}b(c.checked,E,M)}),d==null||d.addEventListener("input",()=>{let E=L(),M=f();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(E)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(M))}catch{}y(E)}),u==null||u.addEventListener("input",()=>{let E=f(),M=L();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(M))}catch{}v(E)}),g==null||g.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),g.checked?"true":"false")}catch{}m==null||m.classList.toggle("active",g.checked),S(g.checked)}),h==null||h.addEventListener("click",()=>{c&&(c.checked=!c.checked,c.dispatchEvent(new Event("change")))}),m==null||m.addEventListener("click",()=>{g&&(g.checked=!g.checked,g.dispatchEvent(new Event("change")))})}updateInfo(e){}};var ri=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
665
665
|
<div class="nudge-panel hidden" data-panel="nudge-panel">
|
|
666
666
|
<div class="nudge-panel-header" data-panel-handle>
|
|
667
667
|
<span class="nudge-panel-title">Nudge Controls</span>
|
|
@@ -718,7 +718,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
718
718
|
</div>
|
|
719
719
|
</div>
|
|
720
720
|
</div>
|
|
721
|
-
`}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,d,u;let
|
|
721
|
+
`}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,d,u;let r=a.dataset.nudge,o=this.getNudgeStep();switch(r){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(u=this.options)==null||u.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let o=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}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 Pt=class{constructor(){this.root=null;this.slotsContainer=null;this.assetsContainer=null;this.assetSearchInput=null;this.slotSearchInput=null;this.options=null;this.registry=null;this.selectedSlotId=null;this.cachedAssets={};this.pendingAssetFetches={};this.cacheBust=0;this.missingPreviewPaths=new Set;this.slotSearchDebounce=null;this.assetSearchDebounce=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]:[]},r=Array.isArray(i.slots)?i.slots:[];if(r.length>0&&a.slots.length>0)for(let c of a.slots){let d=r.find(u=>(u==null?void 0:u.slotId)&&u.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let u=new Set((a.libraryAssets[c]||[]).map(p=>p==null?void 0:p.filename));for(let p of d){let g=p==null?void 0:p.filename;!g||u.has(g)||(a.libraryAssets[c].unshift(p),u.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`
|
|
722
722
|
<div class="scene-panel library-panel panel-accent-purple" data-panel="library">
|
|
723
723
|
<div class="scene-panel-header" data-panel-handle>
|
|
724
724
|
<div class="panel-title">
|
|
@@ -746,7 +746,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
746
746
|
</div>
|
|
747
747
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
748
748
|
</div>
|
|
749
|
-
`}initialize(e,t){var a,s,o,l,c,d,u,p;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(s=this.root)==null?void 0:s.querySelector("[data-library-assets]"),this.assetSearchInput=(o=this.root)==null?void 0:o.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(u=this.assetSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderAssets()),(p=this.slotSearchInput)==null||p.addEventListener("input",()=>this.scheduleRenderSlots()),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){var i,n;let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)&&a.slots.length>0){this.registry=a,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.missingPreviewPaths.clear(),this.selectedSlotId&&this.registry.slots.some(o=>o.slotId===this.selectedSlotId)||(this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null),this.renderSlots(),this.renderAssets();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(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let s=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(s.length===0)continue;let o=document.createElement("div");o.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),o.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of s){let u=this.createSlotElement(d,t);c.appendChild(u)}o.appendChild(c),this.slotsContainer.appendChild(o)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var m,f;let i=this.selectedSlotId===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 s=document.createElement("div");if(s.className="slot-current",(m=e.currentAsset)==null?void 0:m.toLowerCase().endsWith(".json")){let b=document.createElement("div");b.className="slot-thumbnail slot-thumbnail-json",b.textContent="\u{1F3AC}",b.title="Lottie/JSON Animation",s.appendChild(b)}else{let b=document.createElement("img"),y=this.resolveSlotPreviewPaths(e),v=y.primary,S=(f=y.fallback)!=null?f:null;if(!v)b.style.display="none";else if(this.missingPreviewPaths.has(v.key)&&(!S||this.missingPreviewPaths.has(S.key)))b.style.display="none";else{b.src=v.src(t),b.alt=e.displayName,b.className="slot-thumbnail",b.loading="lazy";let L=!1;b.onerror=()=>{if(L){b.onerror=null,b.style.display="none";return}if(this.missingPreviewPaths.add(v.key),S&&!this.missingPreviewPaths.has(S.key)){L=!0,b.src=S.src(t);return}S&&this.missingPreviewPaths.add(S.key),b.style.display="none"}}s.appendChild(b)}a.appendChild(s);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let u=document.createElement("div");u.className="slot-actions";let p=document.createElement("button");p.className="slot-ai-edit",p.title="Edit with AI",p.textContent="\u2728 AI",p.addEventListener("click",async b=>{b.stopPropagation(),await this.handleAIEdit(e)}),u.appendChild(p);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async b=>{b.stopPropagation(),await this.handleUpload(e)}),u.appendChild(g);let h=document.createElement("button");return h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async b=>{b.stopPropagation(),await this.handleReset(e)}),u.appendChild(h),a.appendChild(u),a.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),n.appendChild(a),n}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),s=!1,o=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let m=document.createElement("div");m.className="library-empty",m.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(m),o=!0;continue}let u=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(u.length===0)continue;let p=document.createElement("div");p.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),p.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of u){let f=document.createElement("div");f.className="library-item",i&&i.currentAsset===m.filename&&i.libraryFolder===c&&f.classList.add("selected");let b=document.createElement("img"),y=this.resolveLibraryAssetPath(c,m.filename);this.missingPreviewPaths.has(y.key)?b.style.display="none":b.src=y.src(e),b.alt=m.displayName,b.className="library-thumbnail",b.loading="lazy",b.onerror=()=>{this.missingPreviewPaths.add(y.key),b.style.opacity="0.3"},f.appendChild(b);let v=document.createElement("div");v.className="library-label",v.textContent=m.displayName,f.appendChild(v),f.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,m.filename,c)}),h.appendChild(f),s=!0}p.appendChild(h),this.assetsContainer.appendChild(p)}if(!s&&!o){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let s=new Map;for(let o of n)s.set(o.filename,o);for(let o of a)s.has(o.filename)||s.set(o.filename,o);return this.cachedAssets[e]=Array.from(s.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=s.exec(n))!==null;){let l=o[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,i){var n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let a=window.__wizardAssetPicker;if(a!=null&&a.onPick){let l=`raw/library/${i||e.libraryFolder||e.category}/${t}`;a.onPick(l),window.__wizardAssetPicker=null;return}let s=i||e.libraryFolder||e.category;await((n=this.options)==null?void 0:n.onApply(e.objectId,t,s)),e.currentAsset=t,e.libraryFolder=s,this.renderSlots(),this.renderAssets()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}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(),this.renderAssets()}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(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}scheduleRenderSlots(){this.slotSearchDebounce&&window.clearTimeout(this.slotSearchDebounce),this.slotSearchDebounce=window.setTimeout(()=>{this.slotSearchDebounce=null,this.renderSlots()},150)}scheduleRenderAssets(){this.assetSearchDebounce&&window.clearTimeout(this.assetSearchDebounce),this.assetSearchDebounce=window.setTimeout(()=>{this.assetSearchDebounce=null,this.renderAssets()},150)}resolveSlotPreviewPaths(e){let t=(e.currentAsset||"").trim();if(!t)return{primary:null,fallback:null};let i=t.replace(/^\/+/,""),n=null,a=null;return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:e.libraryFolder?(n=`raw/library/${e.libraryFolder}/${i}`,a=`raw/${i}`):n=`raw/${i}`,{primary:n?{key:n,src:l=>`/${n}?t=${l}`}:null,fallback:a?{key:a,src:l=>`/${a}?t=${l}`}:null}}resolveLibraryAssetPath(e,t){let i=t.replace(/^\/+/,""),n="";return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:n=`raw/library/${e}/${i}`,{key:n,src:a=>`/${n}?t=${a}`}}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 o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(p){console.warn("[Library] Setup-library not available:",p)}await this.handleApply(e,`${o}.png`,e.category),e.currentAsset=`${o}.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:",d.error),alert(`Upload failed: ${d.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.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.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 ri=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 oi=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
|
|
749
|
+
`}initialize(e,t){var a,r,o,l,c,d,u,p;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-assets]"),this.assetSearchInput=(o=this.root)==null?void 0:o.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(u=this.assetSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderAssets()),(p=this.slotSearchInput)==null||p.addEventListener("input",()=>this.scheduleRenderSlots()),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){var i,n;let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)&&a.slots.length>0){this.registry=a,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.missingPreviewPaths.clear(),this.selectedSlotId&&this.registry.slots.some(o=>o.slotId===this.selectedSlotId)||(this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null),this.renderSlots(),this.renderAssets();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(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let r=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(r.length===0)continue;let o=document.createElement("div");o.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),o.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of r){let u=this.createSlotElement(d,t);c.appendChild(u)}o.appendChild(c),this.slotsContainer.appendChild(o)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var m,f;let i=this.selectedSlotId===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 r=document.createElement("div");if(r.className="slot-current",(m=e.currentAsset)==null?void 0:m.toLowerCase().endsWith(".json")){let b=document.createElement("div");b.className="slot-thumbnail slot-thumbnail-json",b.textContent="\u{1F3AC}",b.title="Lottie/JSON Animation",r.appendChild(b)}else{let b=document.createElement("img"),y=this.resolveSlotPreviewPaths(e),v=y.primary,S=(f=y.fallback)!=null?f:null;if(!v)b.style.display="none";else if(this.missingPreviewPaths.has(v.key)&&(!S||this.missingPreviewPaths.has(S.key)))b.style.display="none";else{b.src=v.src(t),b.alt=e.displayName,b.className="slot-thumbnail",b.loading="lazy";let L=!1;b.onerror=()=>{if(L){b.onerror=null,b.style.display="none";return}if(this.missingPreviewPaths.add(v.key),S&&!this.missingPreviewPaths.has(S.key)){L=!0,b.src=S.src(t);return}S&&this.missingPreviewPaths.add(S.key),b.style.display="none"}}r.appendChild(b)}a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let u=document.createElement("div");u.className="slot-actions";let p=document.createElement("button");p.className="slot-ai-edit",p.title="Edit with AI",p.textContent="\u2728 AI",p.addEventListener("click",async b=>{b.stopPropagation(),await this.handleAIEdit(e)}),u.appendChild(p);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async b=>{b.stopPropagation(),await this.handleUpload(e)}),u.appendChild(g);let h=document.createElement("button");return h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async b=>{b.stopPropagation(),await this.handleReset(e)}),u.appendChild(h),a.appendChild(u),a.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),n.appendChild(a),n}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),r=!1,o=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let m=document.createElement("div");m.className="library-empty",m.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(m),o=!0;continue}let u=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(u.length===0)continue;let p=document.createElement("div");p.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),p.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of u){let f=document.createElement("div");f.className="library-item",i&&i.currentAsset===m.filename&&i.libraryFolder===c&&f.classList.add("selected");let b=document.createElement("img"),y=this.resolveLibraryAssetPath(c,m.filename);this.missingPreviewPaths.has(y.key)?b.style.display="none":b.src=y.src(e),b.alt=m.displayName,b.className="library-thumbnail",b.loading="lazy",b.onerror=()=>{this.missingPreviewPaths.add(y.key),b.style.opacity="0.3"},f.appendChild(b);let v=document.createElement("div");v.className="library-label",v.textContent=m.displayName,f.appendChild(v),f.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,m.filename,c)}),h.appendChild(f),r=!0}p.appendChild(h),this.assetsContainer.appendChild(p)}if(!r&&!o){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let r=new Map;for(let o of n)r.set(o.filename,o);for(let o of a)r.has(o.filename)||r.set(o.filename,o);return this.cachedAssets[e]=Array.from(r.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.exec(n))!==null;){let l=o[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,i){var n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let a=window.__wizardAssetPicker;if(a!=null&&a.onPick){let l=`raw/library/${i||e.libraryFolder||e.category}/${t}`;a.onPick(l),window.__wizardAssetPicker=null;return}let r=i||e.libraryFolder||e.category;await((n=this.options)==null?void 0:n.onApply(e.objectId,t,r)),e.currentAsset=t,e.libraryFolder=r,this.renderSlots(),this.renderAssets()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}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(),this.renderAssets()}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(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}scheduleRenderSlots(){this.slotSearchDebounce&&window.clearTimeout(this.slotSearchDebounce),this.slotSearchDebounce=window.setTimeout(()=>{this.slotSearchDebounce=null,this.renderSlots()},150)}scheduleRenderAssets(){this.assetSearchDebounce&&window.clearTimeout(this.assetSearchDebounce),this.assetSearchDebounce=window.setTimeout(()=>{this.assetSearchDebounce=null,this.renderAssets()},150)}resolveSlotPreviewPaths(e){let t=(e.currentAsset||"").trim();if(!t)return{primary:null,fallback:null};let i=t.replace(/^\/+/,""),n=null,a=null;return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:e.libraryFolder?(n=`raw/library/${e.libraryFolder}/${i}`,a=`raw/${i}`):n=`raw/${i}`,{primary:n?{key:n,src:l=>`/${n}?t=${l}`}:null,fallback:a?{key:a,src:l=>`/${a}?t=${l}`}:null}}resolveLibraryAssetPath(e,t){let i=t.replace(/^\/+/,""),n="";return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:n=`raw/library/${e}/${i}`,{key:n,src:a=>`/${n}?t=${a}`}}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 o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(p){console.warn("[Library] Setup-library not available:",p)}await this.handleApply(e,`${o}.png`,e.category),e.currentAsset=`${o}.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:",d.error),alert(`Upload failed: ${d.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.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var r;let a=(r=this.slotsContainer)==null?void 0:r.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 si=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 oi=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
|
|
750
750
|
<div class="inspector-property" data-property-type="image">
|
|
751
751
|
<div class="inspector-property-header">
|
|
752
752
|
<label class="inspector-label">${a}</label>
|
|
@@ -757,9 +757,9 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
757
757
|
<button class="debug-btn debug-btn-sm" data-action="reset" data-path="${n}" data-object="${e}" title="Reset">\u21BA</button>
|
|
758
758
|
</div>
|
|
759
759
|
</div>
|
|
760
|
-
${
|
|
760
|
+
${r?`
|
|
761
761
|
<div class="inspector-image-preview">
|
|
762
|
-
<img src="${
|
|
762
|
+
<img src="${r}" alt="${a}" class="inspector-thumbnail" />
|
|
763
763
|
</div>
|
|
764
764
|
`:`
|
|
765
765
|
<div class="inspector-image-preview inspector-image-empty">
|
|
@@ -816,7 +816,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
816
816
|
<span>${this.formatLabel(t)}</span>
|
|
817
817
|
</label>
|
|
818
818
|
</div>
|
|
819
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ui=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let
|
|
819
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ui=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let r=this.registry,o=Array.isArray(i)?i:[],l=o.map((d,u)=>{let p=`${n}.${u}`,g=`
|
|
820
820
|
<button class="inspector-button inspector-button-small"
|
|
821
821
|
data-logic-remove="true"
|
|
822
822
|
data-object-id="${e}"
|
|
@@ -824,7 +824,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
824
824
|
data-index="${u}">
|
|
825
825
|
Remove
|
|
826
826
|
</button>
|
|
827
|
-
`;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=
|
|
827
|
+
`;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=r.renderProperty(e,"logic",d,p);return`
|
|
828
828
|
<div class="inspector-array-item inspector-logic-item">
|
|
829
829
|
<div class="inspector-array-item-header">
|
|
830
830
|
<span>Logic ${u+1}</span>
|
|
@@ -873,7 +873,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
873
873
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
874
874
|
<div class="inspector-array-empty">Empty array</div>
|
|
875
875
|
</div>
|
|
876
|
-
`;let a=i.map((
|
|
876
|
+
`;let a=i.map((r,o)=>typeof r=="string"?`<div class="inspector-array-item">\u2022 ${r}</div>`:typeof r=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(r)}</div>`:`<div class="inspector-array-item">\u2022 ${String(r)}</div>`).join("");return`
|
|
877
877
|
<div class="inspector-property inspector-property-array">
|
|
878
878
|
<label class="inspector-property-label">${this.formatLabel(t)} (${i.length} items)</label>
|
|
879
879
|
<div class="inspector-array-list">
|
|
@@ -894,7 +894,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
894
894
|
${a.join("")}
|
|
895
895
|
</div>
|
|
896
896
|
</div>
|
|
897
|
-
`}renderLogic(e,t,i,n){let a=[],
|
|
897
|
+
`}renderLogic(e,t,i,n){let a=[],r=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={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"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let p=window,g=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],m=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(m)).sort((f,b)=>f.localeCompare(b))})(),c=r&&!l.includes(r)?[r,...l]:l;a.push(`
|
|
898
898
|
<div class="inspector-property inspector-property-text">
|
|
899
899
|
<label class="inspector-property-label">Id</label>
|
|
900
900
|
<div class="inspector-input-group">
|
|
@@ -902,8 +902,8 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
902
902
|
data-property-path="${n}.id"
|
|
903
903
|
data-object-id="${e}"
|
|
904
904
|
data-logic-id-selector="true">
|
|
905
|
-
<option value="" ${
|
|
906
|
-
${c.map(p=>`<option value="${p}" ${p===
|
|
905
|
+
<option value="" ${r?"":"selected"}>None</option>
|
|
906
|
+
${c.map(p=>`<option value="${p}" ${p===r?"selected":""}>${p}</option>`).join("")}
|
|
907
907
|
</select>
|
|
908
908
|
</div>
|
|
909
909
|
</div>
|
|
@@ -955,14 +955,14 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
955
955
|
${u}
|
|
956
956
|
</div>
|
|
957
957
|
</div>
|
|
958
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var hi=class{render(e,t,i,n,a){let
|
|
958
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var hi=class{render(e,t,i,n,a){let r=i==null?"":String(i),o=Array.from(new Set(a.map(c=>String(c)))),l=r&&!o.includes(r)?[r,...o]:o;return`
|
|
959
959
|
<div class="inspector-property inspector-property-text">
|
|
960
960
|
<label class="inspector-property-label">${this.formatLabel(t)}</label>
|
|
961
961
|
<div class="inspector-input-group">
|
|
962
962
|
<select class="inspector-component-select inspector-input"
|
|
963
963
|
data-property-path="${n}"
|
|
964
964
|
data-object-id="${e}">
|
|
965
|
-
${l.map(c=>`<option value="${c}" ${c===
|
|
965
|
+
${l.map(c=>`<option value="${c}" ${c===r?"selected":""}>${c}</option>`).join("")}
|
|
966
966
|
</select>
|
|
967
967
|
</div>
|
|
968
968
|
</div>
|
|
@@ -977,7 +977,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
977
977
|
rows="6">${a}</textarea>
|
|
978
978
|
</div>
|
|
979
979
|
</div>
|
|
980
|
-
`}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 fi=class{render(e,t,i,n){let
|
|
980
|
+
`}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 fi=class{render(e,t,i,n){let r=(Array.isArray(i)?i:[]).map((o,l)=>{let c=typeof(o==null?void 0:o.x)=="number"?o.x:0,d=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
|
|
981
981
|
<div class="inspector-row" style="gap:8px; align-items:center;">
|
|
982
982
|
<input type="number"
|
|
983
983
|
class="inspector-input"
|
|
@@ -1000,7 +1000,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
1000
1000
|
<div class="inspector-property inspector-property-object">
|
|
1001
1001
|
<div class="inspector-object-header">${this.formatLabel(t)}</div>
|
|
1002
1002
|
<div class="inspector-object-body">
|
|
1003
|
-
${
|
|
1003
|
+
${r||'<div class="inspector-text-sm" style="opacity:0.7;">No spawn points.</div>'}
|
|
1004
1004
|
<div class="inspector-row" style="margin-top:8px;">
|
|
1005
1005
|
<button type="button"
|
|
1006
1006
|
class="inspector-btn inspector-btn-sm primary"
|
|
@@ -1045,7 +1045,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
|
|
|
1045
1045
|
</div>
|
|
1046
1046
|
</div>
|
|
1047
1047
|
</div>
|
|
1048
|
-
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};import{Graphics as Wr}from"pixi.js";var _e={width:400,height:600,designWidth:400,scaleFactor:1},vi={scale:1,position:1},wi=[];function Kr(r,e,t,i,n,a,s){wi.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function Xr(){wi.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*_e.scaleFactor;t(r,_e.width,_e.height,i,n,!0,!1)})}function Jr(){wi.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function hn(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),_e.width=r,_e.height=e,_e.scaleFactor=Math.min(r/_e.designWidth,1.15),vi.scale=_e.scaleFactor,vi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${vi.scale.toFixed(3)}`),Xr()}var K={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 Zr(r,e,t){let i=K[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function Qr(){return K}var eo={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 yi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function Oe(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:yi(r[0],e.x),y:yi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:yi(i.x,e.x),y:yi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=eo[i])!=null?t:e}return e}function Re(r,e,t,i={}){var g,h,m,f,b,y;let n=Oe(t),a=(g=i.inset)!=null?g:{},s=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+s.x,l=((f=a.right)!=null?f:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((y=a.bottom)!=null?y:0)+s.y,u=Math.max(0,r-o-l),p=Math.max(0,e-c-d);return{x:o+u*n.x,y:c+p*n.y}}function ze(r,e,t,i={}){var m,f,b,y,v,S;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((S=n.bottom)!=null?S:0)+a.y,d=Math.max(0,r-s-o),u=Math.max(0,e-l-c),p=Oe(t,{x:.5,y:.5}),g=Math.min(Math.max(p.x,0),1),h=Math.min(Math.max(p.y,0),1);return{x:s+d*g,y:l+u*h}}function mn(r,e,t,i={}){var d,u,p;if(!r)return;let n=i.positionRatio?ze(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Re(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),ye(r,s,o);let l=(u=i.scale)!=null?u:1,c=(p=i.scaleMultiplier)!=null?p:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Le(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,hn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),hn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Zr,window.getDebugConfig=Qr,window.copyConfig=uo,window.applyConfig=Mt,window.applyConfigForRatio=go,window.positionAtBottom=Ts,window.positionAtTop=no,window.positionAtCenter=ao,window.positionAtLeft=so,window.positionAtRight=ro,window.positionAtBottomLeft=oo,window.positionAtBottomRight=lo,window.positionAtTopLeft=co,window.positionAtTopRight=po,window.applyPositionContract=io,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 xi(r,e,t=0){return r*e+t}function Si(r,e,t=0){return r*(1-e)+t}function Ei(r,e,t=0){return r*e+t}function Ci(r,e,t=0){return r*(1-e)+t}function fe(r,e=0){return r/2+e}function to(r,e){return r*e}function io(r,e,t,i){var s,o,l,c,d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M;let n=0,a=0;switch(i.type){case"top":n=fe(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=xi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=fe(e,(u=(d=i.offset)==null?void 0:d.x)!=null?u:0),a=Si(t,i.percent,(g=(p=i.offset)==null?void 0:p.y)!=null?g:0);break;case"left":n=Ei(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=fe(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Ci(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=fe(t,(L=(S=i.offset)==null?void 0:S.y)!=null?L:0);break;case"center":n=fe(e,(_=(j=i.offset)==null?void 0:j.x)!=null?_:0),a=fe(t,(M=(E=i.offset)==null?void 0:E.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 Ts(r,e,t,i=.2,n=1,a=!0,s=!1){let o=to(t,i),l=Si(t,i/2);ye(r,fe(e),l);let c=a?n*_e.scaleFactor:n;Le(r,c),s&&!wi.find(d=>d.element===r)&&Kr(r,Ts,e,t,i,n,a)}function no(r,e,t,i=.1,n=1){ye(r,fe(e),xi(t,i)),Le(r,n)}function ao(r,e,t,i=0,n=0,a=1){ye(r,fe(e,i),fe(t,n)),Le(r,a)}function so(r,e,t,i=.1,n=1){ye(r,Ei(e,i),fe(t)),Le(r,n)}function ro(r,e,t,i=.1,n=1){ye(r,Ci(e,i),fe(t)),Le(r,n)}function oo(r,e,t,i=.05,n=.05,a=1){ye(r,Ei(e,n),Si(t,i)),Le(r,a)}function lo(r,e,t,i=.05,n=.05,a=1){ye(r,Ci(e,n),Si(t,i)),Le(r,a)}function co(r,e,t,i=.05,n=.05,a=1){ye(r,Ei(e,n),xi(t,i)),Le(r,a)}function po(r,e,t,i=.05,n=.05,a=1){ye(r,Ci(e,n),xi(t,i)),Le(r,a)}function ye(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 Le(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 Qe={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 uo(r){return r&&Qe[r]?JSON.parse(JSON.stringify(Qe[r])):JSON.parse(JSON.stringify(K))}function Mt(r){Object.keys(r).forEach(e=>{let t=e;K[t]&&r[t]&&Object.assign(K[t],r[t])}),console.log("Config applied:",r)}function go(r,e){let t=r/e;t>1.6?(Mt(Qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Mt(Qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Mt(Qe.square),console.log("Applied SQUARE config for ratio:",t)):(Mt(Qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=Qe,r.resolveAnchorVec2=r.resolveAnchorVec2||Oe,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||Re,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||ze}var ue=null,Ls=new Map;function ho(r,e,t,i,n,a={}){var F,G,H,B,$,U,X,se,N,ee,Z,ae,ge,xe,Me,Ie,V,re,Q,ce,Ue,Xe,ha,ma,fa,ba,ya,va,wa,xa,Sa,Ea,Ca,Aa,La,Ta,ka,Pa,Ma,Ia,ja,_a,Oa,Ra,za,Da,$a,Ha,Na;let s=(F=a.enableDebugLogs)!=null?F:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:u}=r;if(!u||!u.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:u.renderer.width,height:u.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:u.screen.width,height:u.screen.height}));let p=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:p,baseHeight:g});let h=p*K.layout.screen_scale_x,m=g*K.layout.screen_scale_y,f=p/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:K.layout.screen_scale_x,screen_scale_y:K.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=m>h,S=(G=y.design_width_portrait)!=null?G:v?400:600,L=(H=y.design_height_portrait)!=null?H:v?600:400,j=Math.min(h/S,m/L);j=Math.min(j,1.15);let _=j*((B=K.engine.scale)!=null?B:1),E=($=a.skipMainContainerTransform)!=null?$:!1;!E&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(_):(o.scale.x=_,o.scale.y=_));let M=(U=y.main_container_anchor)!=null?U:"center",I=(X=y.main_container_position_ratio)!=null?X:{x:.5,y:.5},k=(se=y.main_container_offset)!=null?se:{x:0,y:0},T=y.main_container_position_ratio?ze(p,g,I):Re(p,g,M),A=T.x+k.x+K.layout.position_offset.x,C=T.y+k.y+K.layout.position_offset.y;if(!E&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(A,C):(o.position.x=A,o.position.y=C)),n&&(o!=null&&o.toLocal)){let le=g>p,pe=(N=y.design_width_portrait)!=null?N:le?320:480,ne=(ee=y.design_height_portrait)!=null?ee:le?480:320;for(let[Se,Ee]of e.objects.entries()){let de=Ee==null?void 0:Ee.transform;if(!de||((Z=de.position_mode)!=null?Z:"static")!=="static")continue;let q=(ae=n.get)==null?void 0:ae.call(n,Se),At=((ge=q==null?void 0:q.getDisplayObject)==null?void 0:ge.call(q))||(q==null?void 0:q.pixiObject)||q;if(!At||At.parent!==o)continue;let je=(xe=de.anchor)!=null?xe:"bottom-left";je==="bottom-left"&&de.anchor==null&&console.log("[DEBUG FALLBACK] LayoutManager transform.anchor \u2192 bottom-left");let nt=de.position_ratio!=null?ze(pe,ne,de.position_ratio):Re(pe,ne,je),at=(Me=de.position)!=null?Me:{x:0,y:0},Lt=nt.x-pe/2+at.x,Je=nt.y-ne/2+at.y;typeof(q==null?void 0:q.setPosition)=="function"?q.setPosition(Lt,Je):(ye(At,Lt,Je),(Ie=q==null?void 0:q.transform)!=null&&Ie.position&&(q.transform.position.x=Lt,q.transform.position.y=Je))}}let w=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,O=((w==null?void 0:w.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(K.layout.debug_rect_visible&&O){(!ue||ue.parent!==u.stage)&&(ue==null||ue.destroy(),ue=new Wr,ue.zIndex=9999,u.stage.addChild(ue)),ue.clear();let le=K.layout.debug_rect_scale_x,pe=K.layout.debug_rect_scale_y,ne=(p-4)*le,Se=(g-4)*pe,Ee=(p-ne)/2,de=(g-Se)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:p,baseHeight:g,rectW:ne,rectH:Se,offsetX:Ee,offsetY:de}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+Ee,y:2+de,width:ne,height:Se})),ue.rect(2+Ee,2+de,ne,Se).stroke({width:K.layout.debug_rect_thickness,color:K.layout.debug_rect_color})}else ue&&(ue.destroy(),ue=null);let P=((V=r.label)==null?void 0:V.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&P){let le=(Q=(re=P==null?void 0:P.transform)==null?void 0:re.anchor)!=null?Q:"center",pe=(ce=P==null?void 0:P.transform)==null?void 0:ce.position_ratio,ne=((Ue=P==null?void 0:P.transform)==null?void 0:Ue.offset)||{x:0,y:0};mn(l,p,g,{anchor:le,positionRatio:pe,offset:{x:ne.x*_,y:ne.y*_},renderAnchor:Oe(le)})}if(l&&l.alpha>0){let le=1+Math.sin(t*K.engine.label_pulse_speed)*K.engine.label_pulse_intensity,pe=(ha=(Xe=P==null?void 0:P.transform)==null?void 0:Xe.scale)!=null?ha:1,ne=le*_*pe;l.scale&&(typeof l.scale.set=="function"?l.scale.set(ne):(l.scale.x=ne,l.scale.y=ne))}s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING =====");let R=c?e.objects.get("background_1"):null,z=!!R&&(c==null?void 0:c.parent)===o;if(c&&!z){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(ma=c.constructor)==null?void 0:ma.name)),c.alpha=((ba=(fa=b.background)==null?void 0:fa.alpha)!=null?ba:.98)*K.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha),s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",R);let le=(R==null?void 0:R.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",le);let pe=le.offset||{x:0,y:0},ne=((va=(ya=b.background)==null?void 0:ya.offset_y)!=null?va:0)+K.engine.background_offset_y,Se=(wa=le.anchor)!=null?wa:"center",Ee=le.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:pe,bgRuntimeOffsetY:ne,bgScreenAnchor:Se,bgPositionRatio:Ee,baseWidth:p,baseHeight:g,finalScale:_}),mn(c,p,g,{anchor:Se,positionRatio:Ee,offset:{x:pe.x*_,y:pe.y*_+ne},renderAnchor:Oe(Se)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(xa=c.scale)==null?void 0:xa.x,scaleY:(Sa=c.scale)==null?void 0:Sa.y,anchorX:(Ea=c.anchor)==null?void 0:Ea.x,anchorY:(Ca=c.anchor)==null?void 0:Ca.y,pivotX:(Aa=c.pivot)==null?void 0:Aa.x,pivotY:(La=c.pivot)==null?void 0:La.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let nt=Math.max(h/d.width,m/d.height),at=(ka=(Ta=b.background)==null?void 0:Ta.scale_multiplier)!=null?ka:1.05,Lt=(Pa=le.scale)!=null?Pa:1,Je=nt*at*K.engine.background_scale*Lt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Je):(c.scale.x=Je,c.scale.y=Je))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}));let de=`${p}x${g}`,Y=Ls.get(de),q={x:Number((Ma=c.x)!=null?Ma:0),y:Number((Ia=c.y)!=null?Ia:0),scaleX:Number((_a=(ja=c.scale)==null?void 0:ja.x)!=null?_a:1),scaleY:Number((Ra=(Oa=c.scale)==null?void 0:Oa.y)!=null?Ra:1),rotation:Number.isFinite(c.rotation)?c.rotation:void 0,anchorX:Number.isFinite((za=c.anchor)==null?void 0:za.x)?c.anchor.x:void 0,anchorY:Number.isFinite((Da=c.anchor)==null?void 0:Da.y)?c.anchor.y:void 0,pivotX:Number.isFinite(($a=c.pivot)==null?void 0:$a.x)?c.pivot.x:void 0,pivotY:Number.isFinite((Ha=c.pivot)==null?void 0:Ha.y)?c.pivot.y:void 0},At=Number.isFinite(q.x)&&Number.isFinite(q.y)&&Number.isFinite(q.scaleX)&&Number.isFinite(q.scaleY),je=q;if(Y){let nt=Math.hypot(q.x-Y.x,q.y-Y.y),at=Math.max(p,g)*.5;(!At||nt>at)&&((Na=c.position)!=null&&Na.set?c.position.set(Y.x,Y.y):(c.x=Y.x,c.y=Y.y),c.scale&&(typeof c.scale.set=="function"?c.scale.set(Y.scaleX,Y.scaleY):(c.scale.x=Y.scaleX,c.scale.y=Y.scaleY)),Number.isFinite(Y.rotation)&&typeof c.rotation=="number"&&(c.rotation=Y.rotation),c.anchor&&Number.isFinite(Y.anchorX)&&Number.isFinite(Y.anchorY)&&c.anchor.set(Y.anchorX,Y.anchorY),c.pivot&&Number.isFinite(Y.pivotX)&&Number.isFinite(Y.pivotY)&&c.pivot.set(Y.pivotX,Y.pivotY),je=Y)}Number.isFinite(je.x)&&Number.isFinite(je.y)&&Number.isFinite(je.scaleX)&&Number.isFinite(je.scaleY)&&Ls.set(de,je)}}var Ai=class{constructor(){this.typeDetector=new ri,this.imageRenderer=new oi,this.colorRenderer=new li,this.numberRenderer=new ci,this.textRenderer=new di,this.booleanRenderer=new pi,this.arrayRenderer=new ui(this),this.objectRenderer=new gi(this),this.selectRenderer=new hi,this.jsonRenderer=new mi,this.spawnPointsRenderer=new fi,this.spawnTemplatesRenderer=new bi(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 s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let p=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return p.length?p: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,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return s?`
|
|
1048
|
+
`}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};import{Graphics as Ws}from"pixi.js";var _e={width:400,height:600,designWidth:400,scaleFactor:1},vi={scale:1,position:1},wi=[];function Ks(s,e,t,i,n,a,r){wi.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Xs(){wi.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*_e.scaleFactor;t(s,_e.width,_e.height,i,n,!0,!1)})}function Js(){wi.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function hn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),_e.width=s,_e.height=e,_e.scaleFactor=Math.min(s/_e.designWidth,1.15),vi.scale=_e.scaleFactor,vi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${vi.scale.toFixed(3)}`),Xs()}var K={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 Zs(s,e,t){let i=K[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Qs(){return K}var eo={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 yi(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function Oe(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:yi(s[0],e.x),y:yi(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:yi(i.x,e.x),y:yi(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=eo[i])!=null?t:e}return e}function Re(s,e,t,i={}){var g,h,m,f,b,y;let n=Oe(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+r.x,l=((f=a.right)!=null?f:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((y=a.bottom)!=null?y:0)+r.y,u=Math.max(0,s-o-l),p=Math.max(0,e-c-d);return{x:o+u*n.x,y:c+p*n.y}}function ze(s,e,t,i={}){var m,f,b,y,v,S;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},r=((b=n.left)!=null?b:0)+a.x,o=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((S=n.bottom)!=null?S:0)+a.y,d=Math.max(0,s-r-o),u=Math.max(0,e-l-c),p=Oe(t,{x:.5,y:.5}),g=Math.min(Math.max(p.x,0),1),h=Math.min(Math.max(p.y,0),1);return{x:r+d*g,y:l+u*h}}function mn(s,e,t,i={}){var d,u,p;if(!s)return;let n=i.positionRatio?ze(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Re(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},r=n.x+a.x,o=n.y+a.y;s.anchor&&i.renderAnchor&&s.anchor.set(i.renderAnchor.x,i.renderAnchor.y),ye(s,r,o);let l=(u=i.scale)!=null?u:1,c=(p=i.scaleMultiplier)!=null?p:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Le(s,l*c)}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,hn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),hn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Zs,window.getDebugConfig=Qs,window.copyConfig=uo,window.applyConfig=Mt,window.applyConfigForRatio=go,window.positionAtBottom=Tr,window.positionAtTop=no,window.positionAtCenter=ao,window.positionAtLeft=ro,window.positionAtRight=so,window.positionAtBottomLeft=oo,window.positionAtBottomRight=lo,window.positionAtTopLeft=co,window.positionAtTopRight=po,window.applyPositionContract=io,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 xi(s,e,t=0){return s*e+t}function Si(s,e,t=0){return s*(1-e)+t}function Ei(s,e,t=0){return s*e+t}function Ci(s,e,t=0){return s*(1-e)+t}function fe(s,e=0){return s/2+e}function to(s,e){return s*e}function io(s,e,t,i){var r,o,l,c,d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M;let n=0,a=0;switch(i.type){case"top":n=fe(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=xi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=fe(e,(u=(d=i.offset)==null?void 0:d.x)!=null?u:0),a=Si(t,i.percent,(g=(p=i.offset)==null?void 0:p.y)!=null?g:0);break;case"left":n=Ei(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=fe(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Ci(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=fe(t,(L=(S=i.offset)==null?void 0:S.y)!=null?L:0);break;case"center":n=fe(e,(_=(j=i.offset)==null?void 0:j.x)!=null?_:0),a=fe(t,(M=(E=i.offset)==null?void 0:E.y)!=null?M:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Tr(s,e,t,i=.2,n=1,a=!0,r=!1){let o=to(t,i),l=Si(t,i/2);ye(s,fe(e),l);let c=a?n*_e.scaleFactor:n;Le(s,c),r&&!wi.find(d=>d.element===s)&&Ks(s,Tr,e,t,i,n,a)}function no(s,e,t,i=.1,n=1){ye(s,fe(e),xi(t,i)),Le(s,n)}function ao(s,e,t,i=0,n=0,a=1){ye(s,fe(e,i),fe(t,n)),Le(s,a)}function ro(s,e,t,i=.1,n=1){ye(s,Ei(e,i),fe(t)),Le(s,n)}function so(s,e,t,i=.1,n=1){ye(s,Ci(e,i),fe(t)),Le(s,n)}function oo(s,e,t,i=.05,n=.05,a=1){ye(s,Ei(e,n),Si(t,i)),Le(s,a)}function lo(s,e,t,i=.05,n=.05,a=1){ye(s,Ci(e,n),Si(t,i)),Le(s,a)}function co(s,e,t,i=.05,n=.05,a=1){ye(s,Ei(e,n),xi(t,i)),Le(s,a)}function po(s,e,t,i=.05,n=.05,a=1){ye(s,Ci(e,n),xi(t,i)),Le(s,a)}function ye(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function Le(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Qe={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 uo(s){return s&&Qe[s]?JSON.parse(JSON.stringify(Qe[s])):JSON.parse(JSON.stringify(K))}function Mt(s){Object.keys(s).forEach(e=>{let t=e;K[t]&&s[t]&&Object.assign(K[t],s[t])}),console.log("Config applied:",s)}function go(s,e){let t=s/e;t>1.6?(Mt(Qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Mt(Qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Mt(Qe.square),console.log("Applied SQUARE config for ratio:",t)):(Mt(Qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Qe,s.resolveAnchorVec2=s.resolveAnchorVec2||Oe,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Re,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||ze}var ue=null,Lr=new Map;function ho(s,e,t,i,n,a={}){var F,G,H,B,$,U,X,re,N,ee,Z,ae,ge,xe,Me,Ie,V,se,Q,ce,Ue,Xe,ha,ma,fa,ba,ya,va,wa,xa,Sa,Ea,Ca,Aa,La,Ta,ka,Pa,Ma,Ia,ja,_a,Oa,Ra,za,Da,$a,Ha,Na;let r=(F=a.enableDebugLogs)!=null?F:!1;r&&(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:o,label:l,background:c,backgroundTexture:d,app:u}=s;if(!u||!u.renderer){r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:u.renderer.width,height:u.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:u.screen.width,height:u.screen.height}));let p=i.width,g=i.height;r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:p,baseHeight:g});let h=p*K.layout.screen_scale_x,m=g*K.layout.screen_scale_y,f=p/2,b=e.engine.runtime||{},y=b.layout||{};r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:K.layout.screen_scale_x,screen_scale_y:K.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=m>h,S=(G=y.design_width_portrait)!=null?G:v?400:600,L=(H=y.design_height_portrait)!=null?H:v?600:400,j=Math.min(h/S,m/L);j=Math.min(j,1.15);let _=j*((B=K.engine.scale)!=null?B:1),E=($=a.skipMainContainerTransform)!=null?$:!1;!E&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(_):(o.scale.x=_,o.scale.y=_));let M=(U=y.main_container_anchor)!=null?U:"center",I=(X=y.main_container_position_ratio)!=null?X:{x:.5,y:.5},k=(re=y.main_container_offset)!=null?re:{x:0,y:0},T=y.main_container_position_ratio?ze(p,g,I):Re(p,g,M),A=T.x+k.x+K.layout.position_offset.x,C=T.y+k.y+K.layout.position_offset.y;if(!E&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(A,C):(o.position.x=A,o.position.y=C)),n&&(o!=null&&o.toLocal)){let le=g>p,pe=(N=y.design_width_portrait)!=null?N:le?320:480,ne=(ee=y.design_height_portrait)!=null?ee:le?480:320;for(let[Se,Ee]of e.objects.entries()){let de=Ee==null?void 0:Ee.transform;if(!de||((Z=de.position_mode)!=null?Z:"static")!=="static")continue;let q=(ae=n.get)==null?void 0:ae.call(n,Se),At=((ge=q==null?void 0:q.getDisplayObject)==null?void 0:ge.call(q))||(q==null?void 0:q.pixiObject)||q;if(!At||At.parent!==o)continue;let je=(xe=de.anchor)!=null?xe:"bottom-left";je==="bottom-left"&&de.anchor==null&&console.log("[DEBUG FALLBACK] LayoutManager transform.anchor \u2192 bottom-left");let nt=de.position_ratio!=null?ze(pe,ne,de.position_ratio):Re(pe,ne,je),at=(Me=de.position)!=null?Me:{x:0,y:0},Lt=nt.x-pe/2+at.x,Je=nt.y-ne/2+at.y;typeof(q==null?void 0:q.setPosition)=="function"?q.setPosition(Lt,Je):(ye(At,Lt,Je),(Ie=q==null?void 0:q.transform)!=null&&Ie.position&&(q.transform.position.x=Lt,q.transform.position.y=Je))}}let w=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,O=((w==null?void 0:w.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(K.layout.debug_rect_visible&&O){(!ue||ue.parent!==u.stage)&&(ue==null||ue.destroy(),ue=new Ws,ue.zIndex=9999,u.stage.addChild(ue)),ue.clear();let le=K.layout.debug_rect_scale_x,pe=K.layout.debug_rect_scale_y,ne=(p-4)*le,Se=(g-4)*pe,Ee=(p-ne)/2,de=(g-Se)/2;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:p,baseHeight:g,rectW:ne,rectH:Se,offsetX:Ee,offsetY:de}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+Ee,y:2+de,width:ne,height:Se})),ue.rect(2+Ee,2+de,ne,Se).stroke({width:K.layout.debug_rect_thickness,color:K.layout.debug_rect_color})}else ue&&(ue.destroy(),ue=null);let P=((V=s.label)==null?void 0:V.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&P){let le=(Q=(se=P==null?void 0:P.transform)==null?void 0:se.anchor)!=null?Q:"center",pe=(ce=P==null?void 0:P.transform)==null?void 0:ce.position_ratio,ne=((Ue=P==null?void 0:P.transform)==null?void 0:Ue.offset)||{x:0,y:0};mn(l,p,g,{anchor:le,positionRatio:pe,offset:{x:ne.x*_,y:ne.y*_},renderAnchor:Oe(le)})}if(l&&l.alpha>0){let le=1+Math.sin(t*K.engine.label_pulse_speed)*K.engine.label_pulse_intensity,pe=(ha=(Xe=P==null?void 0:P.transform)==null?void 0:Xe.scale)!=null?ha:1,ne=le*_*pe;l.scale&&(typeof l.scale.set=="function"?l.scale.set(ne):(l.scale.x=ne,l.scale.y=ne))}r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING =====");let R=c?e.objects.get("background_1"):null,z=!!R&&(c==null?void 0:c.parent)===o;if(c&&!z){r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(ma=c.constructor)==null?void 0:ma.name)),c.alpha=((ba=(fa=b.background)==null?void 0:fa.alpha)!=null?ba:.98)*K.engine.background_alpha,r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha),r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",R);let le=(R==null?void 0:R.transform)||{};r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",le);let pe=le.offset||{x:0,y:0},ne=((va=(ya=b.background)==null?void 0:ya.offset_y)!=null?va:0)+K.engine.background_offset_y,Se=(wa=le.anchor)!=null?wa:"center",Ee=le.position_ratio;if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:pe,bgRuntimeOffsetY:ne,bgScreenAnchor:Se,bgPositionRatio:Ee,baseWidth:p,baseHeight:g,finalScale:_}),mn(c,p,g,{anchor:Se,positionRatio:Ee,offset:{x:pe.x*_,y:pe.y*_+ne},renderAnchor:Oe(Se)}),r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(xa=c.scale)==null?void 0:xa.x,scaleY:(Sa=c.scale)==null?void 0:Sa.y,anchorX:(Ea=c.anchor)==null?void 0:Ea.x,anchorY:(Ca=c.anchor)==null?void 0:Ca.y,pivotX:(Aa=c.pivot)==null?void 0:Aa.x,pivotY:(La=c.pivot)==null?void 0:La.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let nt=Math.max(h/d.width,m/d.height),at=(ka=(Ta=b.background)==null?void 0:Ta.scale_multiplier)!=null?ka:1.05,Lt=(Pa=le.scale)!=null?Pa:1,Je=nt*at*K.engine.background_scale*Lt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Je):(c.scale.x=Je,c.scale.y=Je))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}));let de=`${p}x${g}`,Y=Lr.get(de),q={x:Number((Ma=c.x)!=null?Ma:0),y:Number((Ia=c.y)!=null?Ia:0),scaleX:Number((_a=(ja=c.scale)==null?void 0:ja.x)!=null?_a:1),scaleY:Number((Ra=(Oa=c.scale)==null?void 0:Oa.y)!=null?Ra:1),rotation:Number.isFinite(c.rotation)?c.rotation:void 0,anchorX:Number.isFinite((za=c.anchor)==null?void 0:za.x)?c.anchor.x:void 0,anchorY:Number.isFinite((Da=c.anchor)==null?void 0:Da.y)?c.anchor.y:void 0,pivotX:Number.isFinite(($a=c.pivot)==null?void 0:$a.x)?c.pivot.x:void 0,pivotY:Number.isFinite((Ha=c.pivot)==null?void 0:Ha.y)?c.pivot.y:void 0},At=Number.isFinite(q.x)&&Number.isFinite(q.y)&&Number.isFinite(q.scaleX)&&Number.isFinite(q.scaleY),je=q;if(Y){let nt=Math.hypot(q.x-Y.x,q.y-Y.y),at=Math.max(p,g)*.5;(!At||nt>at)&&((Na=c.position)!=null&&Na.set?c.position.set(Y.x,Y.y):(c.x=Y.x,c.y=Y.y),c.scale&&(typeof c.scale.set=="function"?c.scale.set(Y.scaleX,Y.scaleY):(c.scale.x=Y.scaleX,c.scale.y=Y.scaleY)),Number.isFinite(Y.rotation)&&typeof c.rotation=="number"&&(c.rotation=Y.rotation),c.anchor&&Number.isFinite(Y.anchorX)&&Number.isFinite(Y.anchorY)&&c.anchor.set(Y.anchorX,Y.anchorY),c.pivot&&Number.isFinite(Y.pivotX)&&Number.isFinite(Y.pivotY)&&c.pivot.set(Y.pivotX,Y.pivotY),je=Y)}Number.isFinite(je.x)&&Number.isFinite(je.y)&&Number.isFinite(je.scaleX)&&Number.isFinite(je.scaleY)&&Lr.set(de,je)}}var Ai=class{constructor(){this.typeDetector=new si,this.imageRenderer=new oi,this.colorRenderer=new li,this.numberRenderer=new ci,this.textRenderer=new di,this.booleanRenderer=new pi,this.arrayRenderer=new ui(this),this.objectRenderer=new gi(this),this.selectRenderer=new hi,this.jsonRenderer=new mi,this.spawnPointsRenderer=new fi,this.spawnTemplatesRenderer=new bi(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 r=String(e||"").split(".").filter(Boolean);if(r.length<2)return null;let o=r[0],l=r.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let p=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return p.length?p: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,r)=>a.localeCompare(r))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),r=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((r||o)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return r?`
|
|
1049
1049
|
${m}
|
|
1050
1050
|
<div class="inspector-array-actions">
|
|
1051
1051
|
<button class="inspector-button"
|
|
@@ -1055,7 +1055,7 @@ ${m}
|
|
|
1055
1055
|
Add Logic
|
|
1056
1056
|
</button>
|
|
1057
1057
|
</div>
|
|
1058
|
-
`:m}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"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","left-center","right-center","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let u=c[t];if(u&&(n.includes("transform")||n.includes("render"))){let h;if(typeof i=="string")h=i;else if(i==null)h="center";else{let f=Oe(i);h=u.find(y=>{let v=Oe(y);return Math.abs(v.x-f.x)<.001&&Math.abs(v.y-f.y)<.001})||"custom"}let m=[...u];return h==="custom"&&!m.includes("custom")&&m.push("custom"),this.selectRenderer.render(e,t,h,n,m)}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")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function mo(
|
|
1058
|
+
`:m}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"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","left-center","right-center","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let u=c[t];if(u&&(n.includes("transform")||n.includes("render"))){let h;if(typeof i=="string")h=i;else if(i==null)h="center";else{let f=Oe(i);h=u.find(y=>{let v=Oe(y);return Math.abs(v.x-f.x)<.001&&Math.abs(v.y-f.y)<.001})||"custom"}let m=[...u];return h==="custom"&&!m.includes("custom")&&m.push("custom"),this.selectRenderer.render(e,t,h,n,m)}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")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function mo(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Li=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 Ai,this.updateManager=new Ae,this.quickActions=new Qt;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`
|
|
1059
1059
|
<div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
|
|
1060
1060
|
<div class="scene-panel-header" data-panel-handle>
|
|
1061
1061
|
<div class="panel-title">
|
|
@@ -1076,22 +1076,22 @@ ${m}
|
|
|
1076
1076
|
</div>
|
|
1077
1077
|
</div>
|
|
1078
1078
|
</div>
|
|
1079
|
-
`}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,
|
|
1079
|
+
`}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,r=n.category||"unknown";i.push(`
|
|
1080
1080
|
<div class="inspector-header">
|
|
1081
1081
|
<div class="inspector-header-info">
|
|
1082
1082
|
<div class="inspector-object-name">${a}</div>
|
|
1083
|
-
<div class="inspector-object-category">${
|
|
1083
|
+
<div class="inspector-object-category">${r}</div>
|
|
1084
1084
|
</div>
|
|
1085
1085
|
${this.renderConversionButtons(e,t)}
|
|
1086
1086
|
</div>
|
|
1087
|
-
`);let o=["transform","ui","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners(),this.expandMotionOnNextRender=!1}renderConversionButtons(e,t){var o,l,c,d;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let
|
|
1087
|
+
`);let o=["transform","ui","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners(),this.expandMotionOnNextRender=!1}renderConversionButtons(e,t){var o,l,c,d;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let r=(d=t.ui)!=null&&d.text?"ui.text":"render.asset.path";return`
|
|
1088
1088
|
<div class="inspector-quick-actions">
|
|
1089
1089
|
<button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
|
|
1090
1090
|
\u2728 Convert to PNG
|
|
1091
1091
|
</button>
|
|
1092
1092
|
<div class="inspector-convert-menu hidden" data-convert-menu>
|
|
1093
1093
|
<button class="debug-btn debug-btn-sm" data-action="library" data-path="render.asset.path" data-object="${e}">\u{1F3A8} Library</button>
|
|
1094
|
-
<button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${
|
|
1094
|
+
<button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${r}" data-object="${e}">\u2728 AI</button>
|
|
1095
1095
|
<button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
|
|
1096
1096
|
</div>
|
|
1097
1097
|
</div>
|
|
@@ -1105,7 +1105,7 @@ ${m}
|
|
|
1105
1105
|
<button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
|
|
1106
1106
|
</div>
|
|
1107
1107
|
</div>
|
|
1108
|
-
`}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],
|
|
1108
|
+
`}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],r=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&r.includes(c))continue;let d=i[c],u=`${n}.${c}`,p=this.rendererRegistry.renderProperty(e,c,d,u);p&&a.push(p)}return a.length===0?"":`
|
|
1109
1109
|
<div class="inspector-section ${t==="transform"?"":"collapsed"}" data-section="${t}">
|
|
1110
1110
|
<div class="inspector-section-header" data-section-toggle="${t}">
|
|
1111
1111
|
<span class="inspector-section-arrow">\u25BC</span>
|
|
@@ -1127,7 +1127,7 @@ ${m}
|
|
|
1127
1127
|
${n}
|
|
1128
1128
|
</div>
|
|
1129
1129
|
</div>
|
|
1130
|
-
`:""}applyMotionDefaults(e,t){if(!t||typeof t!="object")return e!=null?e:{};let i={...e!=null?e:{}};for(let n of Object.keys(t)){let a=t[n],
|
|
1130
|
+
`:""}applyMotionDefaults(e,t){if(!t||typeof t!="object")return e!=null?e:{};let i={...e!=null?e:{}};for(let n of Object.keys(t)){let a=t[n],r=i[n];a!=null&&typeof a=="object"&&!Array.isArray(a)?i[n]=this.applyMotionDefaults(r,a):r===void 0&&(i[n]=a)}return i}renderMotionSection(e,t,i){var h;let n=[],a=this.getMotionDefaults(),r=this.applyMotionDefaults(t!=null?t:{},a!=null?a:{}),o=(h=r.intro)!=null?h:{},l=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",c=`
|
|
1131
1131
|
<div class="inspector-motion-presets">
|
|
1132
1132
|
<span class="inspector-subsection-title">Intro Motions</span>
|
|
1133
1133
|
<div class="inspector-motion-buttons">
|
|
@@ -1144,7 +1144,7 @@ ${m}
|
|
|
1144
1144
|
<button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
|
|
1145
1145
|
${this.motionSimpleMode?"Simple":"Advanced"}
|
|
1146
1146
|
</button>
|
|
1147
|
-
`,u='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',p=m=>{let f=m.split(".").filter(Boolean),b=
|
|
1147
|
+
`,u='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',p=m=>{let f=m.split(".").filter(Boolean),b=r;for(let S of f)b=b==null?void 0:b[S];let y=f[f.length-1],v=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,y,b,v)};if(this.motionSimpleMode){let m=p("enabled");m&&n.push(m);let f=[],b=p("intro.enabled"),y=p("intro.type"),v=p("intro.duration"),S=p("intro.easing");b&&f.push(b),y&&f.push(y),v&&f.push(v),S&&f.push(S),f.length&&n.push(`
|
|
1148
1148
|
<div class="inspector-subsection">
|
|
1149
1149
|
<div class="inspector-subsection-title">Intro</div>
|
|
1150
1150
|
<div class="inspector-subsection-content">
|
|
@@ -1164,7 +1164,7 @@ ${m}
|
|
|
1164
1164
|
${T}
|
|
1165
1165
|
</div>
|
|
1166
1166
|
</div>
|
|
1167
|
-
`)}}else for(let m in
|
|
1167
|
+
`)}}else for(let m in r){let f=r[m],b=`${i}.${m}`,y=this.rendererRegistry.renderProperty(e,m,f,b);y&&n.push(y)}return n.length===0?"":`
|
|
1168
1168
|
<div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
|
|
1169
1169
|
<div class="inspector-section-header" data-section-toggle="motion">
|
|
1170
1170
|
<span class="inspector-section-arrow">\u25BC</span>
|
|
@@ -1177,7 +1177,7 @@ ${m}
|
|
|
1177
1177
|
${n.join("")}
|
|
1178
1178
|
</div>
|
|
1179
1179
|
</div>
|
|
1180
|
-
`}attachEventListeners(){var S,L,j,_;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=mo((E,M,I)=>{var k,T;this.updateManager.updateProperty(E,M,I),(T=(k=this.options)==null?void 0:k.onPropertyChange)==null||T.call(k,E,M,I)},300),i=E=>E?/(^|\.)logic(\.\d+)?\.id$/.test(E):!1;e.forEach(E=>{let M=T=>{var x,O;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId;if(C&&w){let P=A.value;if(A.type==="checkbox")P=A.checked;else if(A.type==="number"){if(P=parseFloat(A.value),isNaN(P))return}else if(A.dataset.json==="true")try{P=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(w,C,P):(this.updateManager.updateProperty(w,C,P),(O=(x=this.options)==null?void 0:x.onPropertyChange)==null||O.call(x,w,C,P))}},I=E.dataset.propertyPath;I&&(I.includes("transform.anchor")||I.includes("render.anchor"))&&E.tagName==="SELECT"?E.addEventListener("change",async T=>{var O,P;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId,x=A.value;!C||!w||x!=="custom"&&(await this.updateManager.updateProperty(w,C,x),(P=(O=this.options)==null?void 0:O.onPropertyChange)==null||P.call(O,w,C,x))}):i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),E.addEventListener("change",async T=>{var F;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId,x=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!C||!w)return;await this.updateManager.updateProperty(w,C,x),console.log("[Inspector v1.0.0] Logic ID updated");let O=window,P=(F=O==null?void 0:O.__HANDLER_LOGIC_META)==null?void 0:F[x],R=this.getDefaultPropsForLogic(x,P);console.log("[Inspector v1.0.0] New logic default props:",R);let z=C.replace(/\.id$/,".props");await this.updateManager.updateProperty(w,z,R),console.log("[Inspector v1.0.0] Logic props updated to:",R),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(w)})):(E.addEventListener("change",M),(E.tagName==="INPUT"||E.tagName==="TEXTAREA")&&E.addEventListener("input",M))}),this.contentContainer.querySelectorAll("[data-action]").forEach(E=>{E.addEventListener("click",M=>{let I=M.target,k=I.dataset.action,T=I.dataset.path,A=I.dataset.object;k&&T&&A&&this.quickActions.handleAction(k,A,T)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(E=>{E.addEventListener("click",M=>{var T,A;let I=M.target,k=I.dataset.sectionToggle||((T=I.closest("[data-section-toggle]"))==null?void 0:T.getAttribute("data-section-toggle"));if(k){let C=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${k}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(E=>{E.addEventListener("click",async M=>{let k=M.currentTarget.dataset.motionPreset;!k||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,k)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(E=>{E.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(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x=Array.isArray(w)?[...w]:[];x.push({x:0,y:0}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number(I.dataset.index||"-1");if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((P,R)=>R!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x=Array.isArray(w)?[...w]:[];x.push({templateId:"",weight:1}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(E=>{E.addEventListener("click",async M=>{var P;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((P=I.dataset.index)!=null?P:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((R,z)=>z!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(E=>{E.addEventListener("click",async M=>{var F;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x;Array.isArray(w)?x=[...w]:w!=null?typeof w=="string"?x=[{id:w,props:{}}]:typeof w=="object"?x=[w]:x=[]:x=[];let O=this.getDefaultLogicId(),P=window,R=(F=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:F[O],z=this.getDefaultPropsForLogic(O,R);x.push({id:O,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:k,path:T,current:w,next:x}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(E=>{E.addEventListener("click",async M=>{var P;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((P=I.dataset.index)!=null?P:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((R,z)=>z!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(E=>{E.addEventListener("click",async M=>{var G,H;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((G=I.dataset.index)!=null?G:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x[A];if(typeof O!="string")return;let P=window,R=(H=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:H[O],z=this.getDefaultPropsForLogic(O,R),F=[...x];F[A]={id:O,props:z},await this.updateManager.updateProperty(k,T,F),this.loadObject(k)})});let f=(S=this.root)==null?void 0:S.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(L=this.root)==null?void 0:L.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var M;let E=(M=this.root)==null?void 0:M.querySelector("[data-convert-menu]");E==null||E.classList.toggle("hidden")});let y=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-add-component-btn]"),v=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let E=v.value;E&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,E)})}getMotionDefaults(){var i,n,a,s;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"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{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(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,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,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.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,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.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=`
|
|
1180
|
+
`}attachEventListeners(){var S,L,j,_;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=mo((E,M,I)=>{var k,T;this.updateManager.updateProperty(E,M,I),(T=(k=this.options)==null?void 0:k.onPropertyChange)==null||T.call(k,E,M,I)},300),i=E=>E?/(^|\.)logic(\.\d+)?\.id$/.test(E):!1;e.forEach(E=>{let M=T=>{var x,O;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId;if(C&&w){let P=A.value;if(A.type==="checkbox")P=A.checked;else if(A.type==="number"){if(P=parseFloat(A.value),isNaN(P))return}else if(A.dataset.json==="true")try{P=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(w,C,P):(this.updateManager.updateProperty(w,C,P),(O=(x=this.options)==null?void 0:x.onPropertyChange)==null||O.call(x,w,C,P))}},I=E.dataset.propertyPath;I&&(I.includes("transform.anchor")||I.includes("render.anchor"))&&E.tagName==="SELECT"?E.addEventListener("change",async T=>{var O,P;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId,x=A.value;!C||!w||x!=="custom"&&(await this.updateManager.updateProperty(w,C,x),(P=(O=this.options)==null?void 0:O.onPropertyChange)==null||P.call(O,w,C,x))}):i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),E.addEventListener("change",async T=>{var F;let A=T.target,C=A.dataset.propertyPath,w=A.dataset.objectId,x=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!C||!w)return;await this.updateManager.updateProperty(w,C,x),console.log("[Inspector v1.0.0] Logic ID updated");let O=window,P=(F=O==null?void 0:O.__HANDLER_LOGIC_META)==null?void 0:F[x],R=this.getDefaultPropsForLogic(x,P);console.log("[Inspector v1.0.0] New logic default props:",R);let z=C.replace(/\.id$/,".props");await this.updateManager.updateProperty(w,z,R),console.log("[Inspector v1.0.0] Logic props updated to:",R),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(w)})):(E.addEventListener("change",M),(E.tagName==="INPUT"||E.tagName==="TEXTAREA")&&E.addEventListener("input",M))}),this.contentContainer.querySelectorAll("[data-action]").forEach(E=>{E.addEventListener("click",M=>{let I=M.target,k=I.dataset.action,T=I.dataset.path,A=I.dataset.object;k&&T&&A&&this.quickActions.handleAction(k,A,T)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(E=>{E.addEventListener("click",M=>{var T,A;let I=M.target,k=I.dataset.sectionToggle||((T=I.closest("[data-section-toggle]"))==null?void 0:T.getAttribute("data-section-toggle"));if(k){let C=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${k}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(E=>{E.addEventListener("click",async M=>{let k=M.currentTarget.dataset.motionPreset;!k||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,k)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(E=>{E.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(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x=Array.isArray(w)?[...w]:[];x.push({x:0,y:0}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number(I.dataset.index||"-1");if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((P,R)=>R!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(E=>{E.addEventListener("click",async M=>{let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x=Array.isArray(w)?[...w]:[];x.push({templateId:"",weight:1}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(E=>{E.addEventListener("click",async M=>{var P;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((P=I.dataset.index)!=null?P:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((R,z)=>z!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(E=>{E.addEventListener("click",async M=>{var F;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath;if(!k||!T)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(k);if(!C)return;let w=this.updateManager.getNestedProperty(C,T),x;Array.isArray(w)?x=[...w]:w!=null?typeof w=="string"?x=[{id:w,props:{}}]:typeof w=="object"?x=[w]:x=[]:x=[];let O=this.getDefaultLogicId(),P=window,R=(F=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:F[O],z=this.getDefaultPropsForLogic(O,R);x.push({id:O,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:k,path:T,current:w,next:x}),await this.updateManager.updateProperty(k,T,x),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(E=>{E.addEventListener("click",async M=>{var P;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((P=I.dataset.index)!=null?P:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x.filter((R,z)=>z!==A);await this.updateManager.updateProperty(k,T,O),this.loadObject(k)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(E=>{E.addEventListener("click",async M=>{var G,H;let I=M.target,k=I.dataset.objectId,T=I.dataset.propertyPath,A=Number((G=I.dataset.index)!=null?G:-1);if(!k||!T||A<0)return;let C=window.getEditableObjectConfig,w=C==null?void 0:C(k);if(!w)return;let x=this.updateManager.getNestedProperty(w,T);if(!Array.isArray(x))return;let O=x[A];if(typeof O!="string")return;let P=window,R=(H=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:H[O],z=this.getDefaultPropsForLogic(O,R),F=[...x];F[A]={id:O,props:z},await this.updateManager.updateProperty(k,T,F),this.loadObject(k)})});let f=(S=this.root)==null?void 0:S.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(L=this.root)==null?void 0:L.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var M;let E=(M=this.root)==null?void 0:M.querySelector("[data-convert-menu]");E==null||E.classList.toggle("hidden")});let y=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-add-component-btn]"),v=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let E=v.value;E&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,E)})}getMotionDefaults(){var i,n,a,r;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"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{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(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,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,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.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,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.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=`
|
|
1181
1181
|
<div class="inspector-empty">
|
|
1182
1182
|
<span class="inspector-empty-icon">\u26A0\uFE0F</span>
|
|
1183
1183
|
<span class="inspector-empty-text">${e}</span>
|
|
@@ -1187,17 +1187,17 @@ ${m}
|
|
|
1187
1187
|
<span class="inspector-empty-icon">\u{1F3AF}</span>
|
|
1188
1188
|
<span class="inspector-empty-text">Select an object to inspect</span>
|
|
1189
1189
|
</div>
|
|
1190
|
-
`)}};function fn(
|
|
1191
|
-
`)||"None",t=
|
|
1192
|
-
`),n="";if(
|
|
1190
|
+
`)}};function fn(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function kr(s){var n;let[e,t]=s.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 Pr(s){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=s})}async function Ti(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await fn(n),r=await Pr(a),o=kr(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Ve(s){var e,t;try{let i=await fn(s),n=await Pr(i),a=kr(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 bn(s){return fn(s).then(e=>e).catch(()=>null)}function yn(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function dt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((u,p)=>{let g=new Image;g.onload=()=>u(g),g.onerror=()=>p(new Error("Failed to load image")),g.src=s}),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"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=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(u=>({r:r[u.offset],g:r[u.offset+1],b:r[u.offset+2]})),c=0;for(let u=0;u<r.length;u+=4){let p=r[u],g=r[u+1],h=r[u+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(p-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(r[u+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),s}}function vn(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function De(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function oe(s){return typeof s=="string"?s:void 0}function Mr(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function fo(s){var i,n,a;let e=(i=oe(s.id))!=null?i:oe(s.name);if(e)return e;let t=(n=oe(s.file))!=null?n:oe(s.asset);return t?Mr((a=t.split("/").pop())!=null?a:t):void 0}function bo(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(De(e)){let r=(i=oe(e.file))!=null?i:oe(e.asset);return r?{id:(n=oe(e.id))!=null?n:s,file:r,role:(a=oe(e.role))!=null?a:t,dataUrl:oe(e.dataUrl),layout:e.layout}:null}return null}function wn(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=Mr((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(De(r)){let o=fo(r),l=(i=oe(r.file))!=null?i:oe(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=oe(r.role))!=null?n:e,dataUrl:oe(r.dataUrl),layout:r.layout})}}return a}if(De(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=bo(r,o,e);l&&a.push(l)}return a}return[]}function yo(s){var e,t;return(t=(e=oe(s.brand_name))!=null?e:oe(s.brandName))!=null?t:oe(s.name)}function vo(s){if(De(s.brand_dna)&&De(s.brand_dna.colors))return s.brand_dna;if(De(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),De(s.fonts)&&(e.fonts=s.fonts),e}}function wo(s){var t;let e=new Map;for(let i of s){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 Ir(s,e={}){var r,o,l;let t=s.filter(De),i=(o=(r=t.map(yo).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(vo).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...wn(c.layers,"visual element")),"assets"in c&&a.push(...wn(c.assets,"visual element")),De(c.endgame)&&"assets"in c.endgame&&a.push(...wn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:wo(a)}}import{GoogleGenAI as xo}from"@google/genai";async function ki(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let u=new xo({apiKey:s}),p="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await u.models.generateContent({model:p,contents:g}),m="",f=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(u){throw console.error("[Gemini] API error:",u),(o=u.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=u.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=u.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=u.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):u}}import{GoogleGenAI as So}from"@google/genai";async function pt(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new So({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.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 jr(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [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}]`),r}).join(`
|
|
1191
|
+
`)||"None",t=s.brandDna?`Colors: ${JSON.stringify(s.brandDna.colors)}, Style: ${s.brandDna.style||"not specified"}`:"Not provided",i=s.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
|
|
1192
|
+
`),n="";if(s.brandConfig){let a=s.brandConfig,r=[];a.splash&&r.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&r.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&r.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),r.length>0&&(n=`
|
|
1193
1193
|
BRAND CONTENT:
|
|
1194
|
-
${
|
|
1194
|
+
${r.join(`
|
|
1195
1195
|
`)}
|
|
1196
1196
|
`)}return`
|
|
1197
1197
|
You are analyzing a brand's visual design for use in a playable ad game.
|
|
1198
1198
|
|
|
1199
1199
|
GAME CONTEXT:
|
|
1200
|
-
${
|
|
1200
|
+
${s.gamePrompt||"Simple game"}
|
|
1201
1201
|
|
|
1202
1202
|
GAME OBJECTS (need assets):
|
|
1203
1203
|
${i}
|
|
@@ -1251,28 +1251,28 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
|
|
|
1251
1251
|
}
|
|
1252
1252
|
]
|
|
1253
1253
|
}
|
|
1254
|
-
`.trim()}function
|
|
1255
|
-
TASK: ${
|
|
1254
|
+
`.trim()}function _r(s){var n,a;let e=(n=s.brandDna)!=null&&n.colors?`Primary: ${s.brandDna.colors.primary}, Secondary: ${s.brandDna.colors.secondary||"N/A"}, Accent: ${s.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=s.brandDna)==null?void 0:a.style)||"modern gaming style",i=s.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
|
|
1255
|
+
TASK: ${s.prompt}
|
|
1256
1256
|
|
|
1257
1257
|
BRAND STYLE:
|
|
1258
1258
|
- Colors: ${e}
|
|
1259
1259
|
- Style: ${t}
|
|
1260
1260
|
|
|
1261
1261
|
CHANGE_STRENGTH: 8/10
|
|
1262
|
-
REFERENCE: ${
|
|
1262
|
+
REFERENCE: ${s.hasReference?"provided (use as style guide for colors and aesthetics)":"none"}
|
|
1263
1263
|
${i}
|
|
1264
1264
|
|
|
1265
1265
|
OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
1266
1266
|
- Do NOT add extra text unless specifically requested
|
|
1267
|
-
- Preserve aspect ratio${
|
|
1267
|
+
- Preserve aspect ratio${s.aspectRatio?` (target: ${s.aspectRatio})`:""}
|
|
1268
1268
|
- Keep padding under 5% of asset size
|
|
1269
1269
|
- No drop shadows unless explicitly requested
|
|
1270
|
-
- No gradients on the background (solid ${
|
|
1270
|
+
- No gradients on the background (solid ${s.needsTransparency?"magenta":"colors"} only)
|
|
1271
1271
|
- Center the subject in frame
|
|
1272
1272
|
|
|
1273
1273
|
OUTPUT:
|
|
1274
|
-
Generate the requested asset matching the brand style.${
|
|
1275
|
-
`.trim()}function Os(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 Rs(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 zs(r){var s,o;let e=Os(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=js(t),n=[];if(r.flatDesignDataUrl)try{let l=Ds(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 ki(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),(s=l.message)!=null&&s.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."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Eo(a,r.gameObjects)}function Eo(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 xn(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 s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let o=await Co(r,s);s.output_dataUrl=o,s.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,o),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Co(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let o=r.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=r.assetFiles.get(o.file);if(l){let c=await Ve(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let o=Ds(r.flatDesignDataUrl);o&&t.push(o)}let i=Rs(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=_s(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await pt(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await dt(s)||s}function Ds(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 $s(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 s=await Ve(a);s&&(n.dataUrl=s.dataUrl)}}}function Hs(r){var t,i;let e=new Map;if(!r)return console.warn("[CanvaZip] No position data provided"),e;if(typeof r=="string")try{r=JSON.parse(r)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(r!=null&&r.layers&&Array.isArray(r.layers)){console.log(`[CanvaZip] Parsing ${r.layers.length} layers from position data`);for(let n of r.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let s=n.layout,o={x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0},l=typeof s.scaleX=="number"?s.scaleX:1,c=typeof s.scaleY=="number"?s.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let u=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:o,scale:d,rotation:u}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:o,scale:d,rotation:u})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",r);if(e.size===0&&typeof r=="object"&&!Array.isArray(r)){for(let[n,a]of Object.entries(r))if(a&&typeof a=="object"&&"layout"in a){let s=a.layout,o={x:0,y:0},l=1,c=0;if(s.position&&typeof s.position=="object"?o={x:s.position.x||0,y:s.position.y||0}:(typeof s.x=="number"||typeof s.y=="number")&&(o={x:s.x||0,y:s.y||0}),typeof s.scale=="number")l=s.scale;else if(typeof s.scaleX=="number"||typeof s.scaleY=="number"){let d=(t=s.scaleX)!=null?t:1,u=(i=s.scaleY)!=null?i:1;l=(d+u)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:o,scale:l,rotation:c})}}return e}function Ns(r,e){if(!r)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",r),null;if(e.has(r))return console.log(`[CanvaZip] Exact match found for ${r}`),e.get(r);let t=r.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${r} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let s=n.toLowerCase();if(s===i||s.includes(i)||i.includes(s))return console.log(`[CanvaZip] Partial match found for ${r} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${r}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Ao(r){return r.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Fs(){let r=window.getEditableAssets;if(typeof r!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=r();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||Ao(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as It}from"pixi.js";async function Us(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await It.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(p=>{let g=e.replace(/s$/,"");return p.startsWith(g)||p.includes(g)});for(let p of d)Ce[p]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+p),(i=c[p])!=null&&i.texture&&(c[p].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+p+".texture"));let u=window.gameObjectManager;if(u)for(let p of d){let g=u.get(p);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",p))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Gs(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let u=await It.load(d);if(!u){console.error("[LIBRARY] Failed to load default texture:",d);return}let p=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(p||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Ce[f]=u,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=p[f])!=null&&i.texture&&(p[f].texture=u,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=u,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Pi(r,e,t,i){var n,a,s,o,l,c,d,u,p,g,h,m,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let S=Vs(v),L=Date.now(),j=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",j);let _=await It.load(j);if(!_){console.error("[LIBRARY] Failed to load texture:",j);return}console.log("[LIBRARY] \u2705 Texture loaded"),Ce[v]=_,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let E=window.CustomAssets;E!=null&&E[v]&&(E[v].texture=_,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let M=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!M),M){let k=Array.from(((n=M.keys)==null?void 0:n.call(M))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",k);let T=M.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,C=(s=A==null?void 0:A.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",C),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=_,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(C==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:w}=await import("pixi.js"),x=A.parent,O=(l=(o=x==null?void 0:x.getChildIndex)==null?void 0:o.call(x,A))!=null?l:0,P={x:A.x,y:A.y},R={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(p=(u=A.anchor)==null?void 0:u.y)!=null?p:.5},z={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=A.scale)==null?void 0:m.y)!=null?f:1},F=(b=A.alpha)!=null?b:1,G=(y=A.visible)!=null?y:!0,H=new w(_);H.anchor.set(R.x,R.y),H.position.set(P.x,P.y),H.scale.set(z.x,z.y),H.alpha=F,H.visible=G,x&&(x.removeChild(A),x.addChildAt(H,O),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(A!=null&&A.children){let w=A.children.find(x=>x.texture);w?(w.texture=_,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let I=`raw/library/${i}/${t}`;Ys(v,I,_,S),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:v,texture:_,assetPath:I}})),Ge({objectId:v,path:"render.asset.path",value:I}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",I)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function qs(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,s=Vs(a),o=Date.now(),l=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await It.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Ce[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let u=window.gameObjectManager;if(u){let p=u.get(a);if(p){let g=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ys(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Ge({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)}}function Vs(r){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(r):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function Ys(r,e,t,i){if(e){try{let n=`${r}:${e}`;Yt.set(n,t)}catch{}if(i&&i!==e)try{let n=Yt.store;n!=null&&n.delete&&n.delete(`${r}:${i}`)}catch{}Bs(e,t),i&&i!==e&&Bs(i,null)}}function Bs(r,e){if(!r)return;let t=It.cache;if(!t)return;let i=r.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var Mi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
|
|
1274
|
+
Generate the requested asset matching the brand style.${s.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
1275
|
+
`.trim()}function Or(s){return s.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 Rr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function zr(s){var r,o;let e=Or(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=jr(t),n=[];if(s.flatDesignDataUrl)try{let l=Dr(s.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 ki(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.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."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Eo(a,s.gameObjects)}function Eo(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,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:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function xn(s,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 r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await Co(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Co(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await Ve(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=Dr(s.flatDesignDataUrl);o&&t.push(o)}let i=Rr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=_r(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await pt(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await dt(r)||r}function Dr(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function $r(s,e){let t=s.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=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await Ve(a);r&&(n.dataUrl=r.dataUrl)}}}function Hr(s){var t,i;let e=new Map;if(!s)return console.warn("[CanvaZip] No position data provided"),e;if(typeof s=="string")try{s=JSON.parse(s)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(s!=null&&s.layers&&Array.isArray(s.layers)){console.log(`[CanvaZip] Parsing ${s.layers.length} layers from position data`);for(let n of s.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let r=n.layout,o={x:typeof r.x=="number"?r.x:0,y:typeof r.y=="number"?r.y:0},l=typeof r.scaleX=="number"?r.scaleX:1,c=typeof r.scaleY=="number"?r.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let u=typeof r.rotation=="number"?r.rotation:0;e.set(a,{position:o,scale:d,rotation:u}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:o,scale:d,rotation:u})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",s);if(e.size===0&&typeof s=="object"&&!Array.isArray(s)){for(let[n,a]of Object.entries(s))if(a&&typeof a=="object"&&"layout"in a){let r=a.layout,o={x:0,y:0},l=1,c=0;if(r.position&&typeof r.position=="object"?o={x:r.position.x||0,y:r.position.y||0}:(typeof r.x=="number"||typeof r.y=="number")&&(o={x:r.x||0,y:r.y||0}),typeof r.scale=="number")l=r.scale;else if(typeof r.scaleX=="number"||typeof r.scaleY=="number"){let d=(t=r.scaleX)!=null?t:1,u=(i=r.scaleY)!=null?i:1;l=(d+u)/2}typeof r.rotation=="number"&&(c=r.rotation),e.set(n,{position:o,scale:l,rotation:c})}}return e}function Nr(s,e){if(!s)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",s),null;if(e.has(s))return console.log(`[CanvaZip] Exact match found for ${s}`),e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${s} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let r=n.toLowerCase();if(r===i||r.includes(i)||i.includes(r))return console.log(`[CanvaZip] Partial match found for ${s} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${s}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Ao(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Fr(){let s=window.getEditableAssets;if(typeof s!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=s();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||Ao(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as It}from"pixi.js";async function Ur(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await It.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(p=>{let g=e.replace(/s$/,"");return p.startsWith(g)||p.includes(g)});for(let p of d)Ce[p]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+p),(i=c[p])!=null&&i.texture&&(c[p].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+p+".texture"));let u=window.gameObjectManager;if(u)for(let p of d){let g=u.get(p);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",p))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Gr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let u=await It.load(d);if(!u){console.error("[LIBRARY] Failed to load default texture:",d);return}let p=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(p||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Ce[f]=u,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=p[f])!=null&&i.texture&&(p[f].texture=u,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=u,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Pi(s,e,t,i){var n,a,r,o,l,c,d,u,p,g,h,m,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let S=Vr(v),L=Date.now(),j=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",j);let _=await It.load(j);if(!_){console.error("[LIBRARY] Failed to load texture:",j);return}console.log("[LIBRARY] \u2705 Texture loaded"),Ce[v]=_,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let E=window.CustomAssets;E!=null&&E[v]&&(E[v].texture=_,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let M=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!M),M){let k=Array.from(((n=M.keys)==null?void 0:n.call(M))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",k);let T=M.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,C=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",C),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=_,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(C==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:w}=await import("pixi.js"),x=A.parent,O=(l=(o=x==null?void 0:x.getChildIndex)==null?void 0:o.call(x,A))!=null?l:0,P={x:A.x,y:A.y},R={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(p=(u=A.anchor)==null?void 0:u.y)!=null?p:.5},z={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=A.scale)==null?void 0:m.y)!=null?f:1},F=(b=A.alpha)!=null?b:1,G=(y=A.visible)!=null?y:!0,H=new w(_);H.anchor.set(R.x,R.y),H.position.set(P.x,P.y),H.scale.set(z.x,z.y),H.alpha=F,H.visible=G,x&&(x.removeChild(A),x.addChildAt(H,O),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(A!=null&&A.children){let w=A.children.find(x=>x.texture);w?(w.texture=_,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let I=`raw/library/${i}/${t}`;Yr(v,I,_,S),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:v,texture:_,assetPath:I}})),Ge({objectId:v,path:"render.asset.path",value:I}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",I)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function qr(s,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,r=Vr(a),o=Date.now(),l=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await It.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Ce[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let u=window.gameObjectManager;if(u){let p=u.get(a);if(p){let g=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Yr(a,t,c,r),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Ge({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)}}function Vr(s){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(s):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function Yr(s,e,t,i){if(e){try{let n=`${s}:${e}`;Yt.set(n,t)}catch{}if(i&&i!==e)try{let n=Yt.store;n!=null&&n.delete&&n.delete(`${s}:${i}`)}catch{}Br(e,t),i&&i!==e&&Br(i,null)}}function Br(s,e){if(!s)return;let t=It.cache;if(!t)return;let i=s.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var Mi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
|
|
1276
1276
|
<div class="canva-wizard-overlay" data-canva-wizard>
|
|
1277
1277
|
<div class="canva-wizard-modal">
|
|
1278
1278
|
<div class="canva-wizard-header">
|
|
@@ -1310,7 +1310,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1310
1310
|
</div>
|
|
1311
1311
|
</div>
|
|
1312
1312
|
</div>
|
|
1313
|
-
`}renderAssetCard(e,t){let n=e.position&&e.scale?`x: ${e.position.x.toFixed(0)}, y: ${e.position.y.toFixed(0)}, scale: ${e.scale.toFixed(2)}`:"No position data",a=e.action==="add"||e.action==="replace"?"active":"",
|
|
1313
|
+
`}renderAssetCard(e,t){let n=e.position&&e.scale?`x: ${e.position.x.toFixed(0)}, y: ${e.position.y.toFixed(0)}, scale: ${e.scale.toFixed(2)}`:"No position data",a=e.action==="add"||e.action==="replace"?"active":"",r=e.action==="replace"?this.renderReplaceDropdown(e,t):"",o=e.action==="add"?this.renderAddToSceneFields(e,t):"";return`
|
|
1314
1314
|
<div class="canva-asset-card ${a}" data-asset-index="${t}">
|
|
1315
1315
|
<div class="canva-asset-preview">
|
|
1316
1316
|
<img src="${e.dataUrl}" alt="${e.filename}" />
|
|
@@ -1348,7 +1348,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1348
1348
|
</button>
|
|
1349
1349
|
</div>
|
|
1350
1350
|
${o}
|
|
1351
|
-
${
|
|
1351
|
+
${r}
|
|
1352
1352
|
</div>
|
|
1353
1353
|
`}renderAddToSceneFields(e,t){return`
|
|
1354
1354
|
<div class="canva-asset-add-scene" data-asset-add-scene="${t}">
|
|
@@ -1378,8 +1378,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1378
1378
|
${this.replaceableObjects.map(i=>`<option value="${i.id}" ${e.targetObjectId===i.id?"selected":""}>${i.name}</option>`).join("")}
|
|
1379
1379
|
</select>
|
|
1380
1380
|
</div>
|
|
1381
|
-
`}initialize(e,t,i,n){this.options=n,this.positionMap=
|
|
1382
|
-
`))||(n==null?void 0:n.error)||"Batch create failed.";throw new Error(
|
|
1381
|
+
`}initialize(e,t,i,n){this.options=n,this.positionMap=Hr(i),this.replaceableObjects=Fr(),this.assets=t.map(a=>{let r=Nr(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:r==null?void 0:r.position,scale:r==null?void 0:r.scale,rotation:r==null?void 0:r.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-action")||"0"),l=r.getAttribute("data-action");this.handleAction(o,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-category")||"0"),l=r.value;this.assets[o]&&(this.assets[o].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-target")||"0"),l=r.value;this.assets[o]&&(this.assets[o].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-screen")||"0"),l=r.value;this.assets[o]&&(this.assets[o].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-type")||"0"),l=r.value;this.assets[o]&&(this.assets[o].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,r;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let o=this.assets[e],l=this.renderAssetCard(o,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",u=>{let p=u.target,g=parseInt(p.getAttribute("data-asset-action")||"0"),h=p.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].category=p)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=p)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].screen=p)}),(r=c.querySelector("[data-asset-type]"))==null||r.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].objectType=p)}))}}async applyAll(){if(!this.options)return;for(let i of this.assets)i.action||(i.action="skip");this.processedCount=0,this.updateProgress();let e=[],t=[];for(let i=0;i<this.assets.length;i++){let n=this.assets[i];try{let a=await this.saveAssetToLibrary(n);n.libraryPath=a,n.action==="add"?e.push(n):n.action==="replace"&&n.targetObjectId&&t.push({asset:n,targetId:n.targetObjectId}),this.processedCount++,this.updateProgress()}catch(a){console.error(`[CanvaZip] Failed to save ${n.filename} to library:`,a)}}if(e.length>0)try{await this.batchAddToScene(e)}catch(i){console.error("[CanvaZip] Batch add to scene failed:",i)}if(t.length>0)for(let{asset:i,targetId:n}of t)try{await this.replaceObject(i,n)}catch(a){console.error(`[CanvaZip] Replace failed for ${n}:`,a)}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),this.options.onComplete&&this.options.onComplete(this.assets),this.close()}async batchAddToScene(e){var a;let t=e.map(r=>{let o=r.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),l=`json.${o}`,c={identity:{id:l,category:r.category||"environment"},transform:{position:r.position||{x:0,y:0},offset:{x:0,y:0},scale:.3,rotation:r.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:r.libraryPath}},instance_id:o,object_config:l};return{screenId:r.screen,instanceId:o,objectConfigId:l,layer:r.objectType==="ui-image"?"ui":"world",config:c}}),i=await fetch("/api/objects/batch-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objects:t})}),n=await i.json().catch(()=>({}));if(!i.ok||(n==null?void 0:n.success)===!1){let r=((a=n==null?void 0:n.errors)==null?void 0:a.join(`
|
|
1382
|
+
`))||(n==null?void 0:n.error)||"Batch create failed.";throw new Error(r)}try{let{trackObjectCreation:r}=await import("./ConfigOverride-V7DLPL5I.js");for(let o of t)r(o.instanceId,o.screenId,o.config)}catch(r){console.warn("[CanvaZip] Failed to track batch creation in history:",r)}console.log(`[CanvaZip] \u2705 Batch added ${e.length} objects to scene`)}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN,t=await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error((i==null?void 0:i.error)||"Failed to sync screens")}}catch(e){console.warn("[CanvaZip] Screen sync failed:",e)}}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await Pi(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(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":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var Ii=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.wizardProcessedAssets=new Set;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`
|
|
1383
1383
|
<div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
|
|
1384
1384
|
<div class="scene-panel-header" data-panel-handle>
|
|
1385
1385
|
<div class="panel-title">
|
|
@@ -1494,15 +1494,15 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1494
1494
|
</div>
|
|
1495
1495
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
1496
1496
|
</div>
|
|
1497
|
-
`}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,
|
|
1497
|
+
`}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,r,o,l,c,d,u,p,g;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()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.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)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(u=this.root.querySelector("[data-vision-flat-input]"))==null||u.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(p=this.root.querySelector("[data-vision-generate-all]"))==null||p.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.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 f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;b&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(b),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),m.closest("[data-mapping-generate-one]")&&this.generateOne(b),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);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 f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);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 l;let t=null;if(typeof window!="undefined"&&window.JSZip)t=window.JSZip,console.log("[BrandVision] \u2705 Found window.JSZip");else try{let c=await import("jszip");t=c.default||c,console.log("[BrandVision] \u2705 Loaded JSZip via dynamic import")}catch(c){throw new Error(`JSZip is not properly imported. Make sure jszip is loaded globally (window.JSZip) or available as a module: ${(c==null?void 0:c.message)||"Unknown error"}`)}if(!t||typeof t.loadAsync!="function")throw new Error("JSZip is not properly imported - loadAsync method not found");let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let u=c.toLowerCase();u.endsWith(".json")?n.push({name:c,content:null}):u.startsWith("assets/")&&u.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let r=[];for(let c of a)try{let d=await c.file.async("uint8array"),u=new Blob([d],{type:"image/png"}),p=c.name.split("/").pop()||c.name;console.log(`Processing ${p}, uint8array length: ${d.length}, blob size: ${u.size}`);let g;try{g=await this.blobToDataUrl(u)}catch(h){console.warn(`FileReader failed for ${p}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,g.substring(0,100));continue}r.push({filename:p,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let o=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c.content,console.log(`[BrandVision] Found position data file: ${c.name}`,{hasContent:!!o,isString:typeof o=="string",isObject:typeof o=="object",hasLayers:o!=null&&o.layers?o.layers.length:0});break}}if(o||console.warn("[BrandVision] No positionnormalizedpack.json found in ZIP. Available JSON files:",n.map(c=>c.name)),r.length>0){await this.showCanvaZipWizard(r,o),this.setStatus("zip",`\u2705 Wizard completed - ${r.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new Mi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}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 r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].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 ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let l=await o.text(),c=JSON.parse(l);this.uploadedJsons.set(o.name,c),c.layers?n+=`\u2705 Layers: ${o.name}
|
|
1498
1498
|
`:c.brand_dna||c.colors?n+=`\u2705 Brand: ${o.name}
|
|
1499
1499
|
`:n+=`\u2705 Loaded: ${o.name}
|
|
1500
1500
|
`}catch{n+=`\u274C Error in ${o.name}
|
|
1501
|
-
`}try{this.normalizedManifest=
|
|
1501
|
+
`}try{this.normalizedManifest=Ir(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
|
|
1502
1502
|
\u{1F4E6} Normalized manifest: ${o} assets`,n+=`
|
|
1503
1503
|
\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+=`
|
|
1504
1504
|
\u274C Failed to normalize manifest`}t.value="";let a=n.trim();this.uploadedJsons.size>0?this.setStatus("manifest",`${a}
|
|
1505
|
-
\u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let o=0;o<i.length;o++)console.log(`[BrandVision] File ${o}: ${i[o].name}, type: ${i[o].type}, size: ${i[o].size}`);let n=[];for(let o of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${o.name}, type: ${o.type}`),!o.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${o.name}`),this.assetFiles.set(o.name,o);continue}try{let l=await this.fileToDataUrl(o);n.push({filename:o.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${o.name} to data URL (length: ${l.length})`)}catch(l){console.error(`[BrandVision] Failed to process ${o.name}:`,l),this.assetFiles.set(o.name,o)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,
|
|
1505
|
+
\u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let o=0;o<i.length;o++)console.log(`[BrandVision] File ${o}: ${i[o].name}, type: ${i[o].type}, size: ${i[o].size}`);let n=[];for(let o of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${o.name}, type: ${o.type}`),!o.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${o.name}`),this.assetFiles.set(o.name,o);continue}try{let l=await this.fileToDataUrl(o);n.push({filename:o.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${o.name} to data URL (length: ${l.length})`)}catch(l){console.error(`[BrandVision] Failed to process ${o.name}:`,l),this.assetFiles.set(o.name,o)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,r=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${r}`),a&&r){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let o=null;console.log("[BrandVision] Checking uploaded JSONs for position data:",Array.from(this.uploadedJsons.keys()));for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(console.log(`[BrandVision] Checking JSON: ${l} (lowercase: ${d})`),d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c,console.log("[BrandVision] \u2705 Found position data in:",l,{hasContent:!!o,isString:typeof o=="string",isObject:typeof o=="object",hasLayers:o!=null&&o.layers?o.layers.length:0,contentPreview:typeof o=="object"?JSON.stringify(o).substring(0,200):String(o).substring(0,200)});break}}o||console.warn("[BrandVision] \u26A0\uFE0F No position data found. Uploaded JSON files:",Array.from(this.uploadedJsons.keys())),console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,o),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Ve(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",`\u{1F3A8} ${i.name}`);let o=(r=this.root)==null?void 0:r.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,r,o,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 $r(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},u=await zr(d);this.mappingResult=u.mappingResult,this.analysisRawResponse=u.rawResponse,this.analysisParsedOk=u.parsed,this.analysisParseError=(r=u.parseError)!=null?r:null,this.renderMappings(),u.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${u.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),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 xn(a,this.mappingResult,{onProgress:(r,o,l)=>{this.setStatus("apply",`Generating ${r}/${o}: ${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 o;let e=(o=this.root)==null?void 0:o.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(""),r=n?`
|
|
1506
1506
|
<div class="vision-raw-block">
|
|
1507
1507
|
<div class="inspector-text-sm" style="white-space: pre-wrap;">
|
|
1508
1508
|
\u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
|
|
@@ -1511,7 +1511,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1511
1511
|
<textarea class="inspector-input vision-raw-textarea" readonly>${this.analysisRawResponse||""}</textarea>
|
|
1512
1512
|
</div>
|
|
1513
1513
|
`:"";e.innerHTML=`
|
|
1514
|
-
${
|
|
1514
|
+
${r}
|
|
1515
1515
|
${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",u=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===d),p=(u==null?void 0:u.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?p:"",m=!!h,f=`
|
|
1516
1516
|
<select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
|
|
1517
1517
|
<option value="">Select brand asset\u2026</option>
|
|
@@ -1564,8 +1564,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1564
1564
|
</div>
|
|
1565
1565
|
</div>
|
|
1566
1566
|
`}).join("")}
|
|
1567
|
-
`}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
|
|
1568
|
-
`)}var Lo=["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"],To=["cta_hint","cta_label_end"],
|
|
1567
|
+
`}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 r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),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(r=>r.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(r=>r.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,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.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 o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await xn(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.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 r=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(!(r!=null&&r.success)||!(r!=null&&r.path))return console.error("[BrandVision] Save to library failed:",(r==null?void 0:r.error)||r),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(r.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 r=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(r!=null&&r.category)return String(r.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let r=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return r.includes("bg")||r.includes("background")?o("background")||a[0]:(r.includes("cta")||r.includes("button")||r.includes("ui")||r.includes("logo"))&&o("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=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},r=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",r)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",r)})}refresh(){}};function Wr(s,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${s}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
|
|
1568
|
+
`)}var Lo=["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"],To=["cta_hint","cta_label_end"],Kr=[{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"}],ko=["brand.primary","brand.heading","brand.body","brand.warning"],ji=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`
|
|
1569
1569
|
<div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
|
|
1570
1570
|
<div class="scene-panel-header" data-panel-handle>
|
|
1571
1571
|
<div class="panel-title">
|
|
@@ -1623,7 +1623,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1623
1623
|
</div>
|
|
1624
1624
|
<div class="panel-resize-handle" data-panel-resize></div>
|
|
1625
1625
|
</div>
|
|
1626
|
-
`}initialize(e,t){var n,a,
|
|
1626
|
+
`}initialize(e,t){var n,a,r,o,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-fonts]"),this.textsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let r=t(a);r&&(r.ui||(r.ui={}),r.ui.renderMode=e?"png":"text",e&&(r.render||(r.render={}),r.render.asset||(r.render.asset={type:"image",path:""}),r.render.asset.type="image"),i(a,r))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,r,o,l,c;let e=this.getEngineSnapshot();if(!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((o=(r=e.runtime)==null?void 0:r.ui)!=null?o:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var p;let a=document.createElement("div");a.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=i;let o=document.createElement("input");o.type="text",o.value=n!=null?n:"",o.className="customize-input",o.dataset.assetKey=i,o.addEventListener("input",()=>{this.handleAssetValueChange(i,o)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
|
|
1627
1627
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
|
1628
1628
|
<path d="M12 5c5.2 0 9.2 3.7 10 6.8-.8 3.1-4.8 6.8-10 6.8S2.8 14.9 2 11.8C2.8 8.7 6.8 5 12 5z" />
|
|
1629
1629
|
<circle cx="12" cy="12" r="3.2" />
|
|
@@ -1633,7 +1633,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1633
1633
|
<path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
|
|
1634
1634
|
<path d="M5 14v4h14v-4h2v6H3v-6h2z" />
|
|
1635
1635
|
</svg>
|
|
1636
|
-
`;let u=document.createElement("input");u.type="file",u.accept="image/*,audio/*,application/json",u.className="customize-file",u.addEventListener("change",()=>{var h;let g=(h=u.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>u.click()),l.appendChild(c),l.appendChild(d),l.appendChild(u),a.appendChild(
|
|
1636
|
+
`;let u=document.createElement("input");u.type="file",u.accept="image/*,audio/*,application/json",u.className="customize-file",u.addEventListener("change",()=>{var h;let g=(h=u.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>u.click()),l.appendChild(c),l.appendChild(d),l.appendChild(u),a.appendChild(r),a.appendChild(o),a.appendChild(l),(p=this.assetsContainer)==null||p.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Lo.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let p={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];p&&(i=(c=this.getObjectPropertyValue(p.objectId,p.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 r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",ko.forEach(t=>{var r,o;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=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",To.forEach(t=>{var r,o;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=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),Kr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(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 o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}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("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r: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(o=>{let l=o;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(o=>{let l=o,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(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=Kr.find(u=>u.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.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:r}},{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 Ti(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,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.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=(r=i==null?void 0:i.dataUrl)!=null?r: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 r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),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 r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!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 o,l,c,d,u,p,g,h,m,f;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=`
|
|
1637
1637
|
<div class="ai-modal-card">
|
|
1638
1638
|
<div class="ai-modal-header">
|
|
1639
1639
|
<div>
|
|
@@ -1704,7 +1704,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1704
1704
|
</div>
|
|
1705
1705
|
</div>
|
|
1706
1706
|
</div>
|
|
1707
|
-
`;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]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(u=this.aiReferenceInput)==null||u.addEventListener("change",()=>{var y,v,S;let b=(S=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?S:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(p=this.aiGenerateBtn)==null||p.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.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 d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M,I,k,T,A;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(p=(u=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:u.trim())!=null?p:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,s=n,o=Number((L=(S=this.aiStrengthInput)==null?void 0:S.value)!=null?L:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((j=l==null?void 0:l.value)==null?void 0:j.trim())||((_=this.aiBaseValue)==null?void 0:_.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let C=null,w=null,x=(E=this.getSelectedAssetKey())!=null?E:"unknown",O=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let B=yn(this.aiOutputDataUrl,"ai-output.png");if(B){let $=await Ve(B);$&&(C={input:{base64:$.base64,mimeType:$.mimeType},dataUrl:$.dataUrl,width:$.width,height:$.height})}}!C&&c&&(C=await this.getImageDataFromAsset(c));let P=[];C&&P.push(C.input);let R=!1;if(this.aiReferenceFile){let B=await Ve(this.aiReferenceFile);B?(w={input:{base64:B.base64,mimeType:B.mimeType},dataUrl:B.dataUrl,width:B.width,height:B.height},P.push(w.input),R=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=Ws(i,{includeReference:R,includeMagenta:a,changeLevel:o}),F=(T=(k=this.aiReferenceFile)==null?void 0:k.name)!=null?T:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:x,base:O,reference:F});let G=C?vn(C.width,C.height):w?vn(w.width,w.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await pt(e,z,P,{aspectRatio:G,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),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,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await dt(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||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(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 u=window.refreshAssetLibrary;typeof u=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await u());let p=window.__wizardAssetPicker;if(p!=null&&p.onPick){p.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||""),h=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(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 s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let 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(s=>s.currentAsset===e||s.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 o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=yn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await bn(a);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let u=await this.showManualCropModal(e,d,n);if(!u)return;a=u}}let s=await bn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let u=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(u.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",u.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(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=u.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(u.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(u.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,m,u.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",u.error),alert(`Failed to save uploaded file: ${u.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),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 s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
|
|
1707
|
+
`;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]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(u=this.aiReferenceInput)==null||u.addEventListener("change",()=>{var y,v,S;let b=(S=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?S:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(p=this.aiGenerateBtn)==null||p.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.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 d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M,I,k,T,A;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(p=(u=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:u.trim())!=null?p:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,r=n,o=Number((L=(S=this.aiStrengthInput)==null?void 0:S.value)!=null?L:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((j=l==null?void 0:l.value)==null?void 0:j.trim())||((_=this.aiBaseValue)==null?void 0:_.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let C=null,w=null,x=(E=this.getSelectedAssetKey())!=null?E:"unknown",O=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let B=yn(this.aiOutputDataUrl,"ai-output.png");if(B){let $=await Ve(B);$&&(C={input:{base64:$.base64,mimeType:$.mimeType},dataUrl:$.dataUrl,width:$.width,height:$.height})}}!C&&c&&(C=await this.getImageDataFromAsset(c));let P=[];C&&P.push(C.input);let R=!1;if(this.aiReferenceFile){let B=await Ve(this.aiReferenceFile);B?(w={input:{base64:B.base64,mimeType:B.mimeType},dataUrl:B.dataUrl,width:B.width,height:B.height},P.push(w.input),R=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=Wr(i,{includeReference:R,includeMagenta:a,changeLevel:o}),F=(T=(k=this.aiReferenceFile)==null?void 0:k.name)!=null?T:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:x,base:O,reference:F});let G=C?vn(C.width,C.height):w?vn(w.width,w.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await pt(e,z,P,{aspectRatio:G,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),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,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await dt(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||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,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,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(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 u=window.refreshAssetLibrary;typeof u=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await u());let p=window.__wizardAssetPicker;if(p!=null&&p.onPick){p.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||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(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 r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let 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(r=>r.currentAsset===e||r.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 o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=yn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await bn(a);r&&this.setAiOutput(r)}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 d=await this.getImageDimensions(n);if(d){let u=await this.showManualCropModal(e,d,n);if(!u)return;a=u}}let r=await bn(a);if(!r){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 u=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(u.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",u.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(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=u.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(u.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(u.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,m,u.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",u.error),alert(`Failed to save uploaded file: ${u.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),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 r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}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=`
|
|
1708
1708
|
<div class="asset-preview-card">
|
|
1709
1709
|
<div class="asset-preview-header">
|
|
1710
1710
|
<div class="asset-preview-title">${e}</div>
|
|
@@ -1720,7 +1720,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1720
1720
|
<img class="asset-preview-ai-image" alt="AI output preview">
|
|
1721
1721
|
</div>
|
|
1722
1722
|
</div>
|
|
1723
|
-
`;let
|
|
1723
|
+
`;let r=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(o==null||o.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",u=>{u.target===a&&this.closePreviewModal()}),r)if(n==="image"){let u=document.createElement("img");this.loadWithFallback(u,i),r.appendChild(u)}else if(n==="audio"){let u=document.createElement("audio");u.controls=!0,this.loadWithFallback(u,i),r.appendChild(u)}else if(n==="json"){let u=document.createElement("pre");this.fetchWithFallback(i).then(p=>{u.textContent=p!=null?p:"Unable to load JSON."}),r.appendChild(u)}else{let u=document.createElement("a");u.href=i[0],u.target="_blank",u.rel="noreferrer",u.textContent="Open asset",r.appendChild(u)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,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 r=n(e);if(!r)return;let o=JSON.parse(JSON.stringify(r)),l=t.split("."),c=o;for(let d=0;d<l.length-1;d++){let u=l[d];c[u]=c[u]||{},c=c[u]}c[l[l.length-1]]=i,a(e,o)}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 p,g;a.preventDefault();let r=a.clientX,o=(g=(p=this.root)==null?void 0:p.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let m=h.clientX-r,f=Math.min(c,Math.max(l,o+m));this.root&&(this.root.style.width=`${f}px`)},u=()=>{var m,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u);let h=(f=(m=this.root)==null?void 0:m.getBoundingClientRect().width)!=null?f:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)};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),r=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(r!=null&&r.naturalWidth)||!(r!=null&&r.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),m=Math.min(520,window.innerHeight-240),f=h,b=f/n;b>m&&(b=m,f=b*n),c.innerHTML=`
|
|
1724
1724
|
<div class="asset-crop-card" style="width:${d}px;">
|
|
1725
1725
|
<div class="asset-crop-header">
|
|
1726
1726
|
<div>
|
|
@@ -1750,7 +1750,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1750
1750
|
<button class="asset-crop-apply" type="button">Apply Crop</button>
|
|
1751
1751
|
</div>
|
|
1752
1752
|
</div>
|
|
1753
|
-
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),S=c.querySelector(".asset-crop-zoom"),L=c.querySelector(".asset-crop-zoom-value"),j=c.querySelector(".asset-crop-close"),_=c.querySelector(".asset-crop-cancel"),E=c.querySelector(".asset-crop-apply"),M=c.querySelector(".asset-crop-reset");if(!y||!v||!S||!L){l(null);return}let I=y.getContext("2d"),k=v.getContext("2d");if(!I||!k){l(null);return}let T=
|
|
1753
|
+
`;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),S=c.querySelector(".asset-crop-zoom"),L=c.querySelector(".asset-crop-zoom-value"),j=c.querySelector(".asset-crop-close"),_=c.querySelector(".asset-crop-cancel"),E=c.querySelector(".asset-crop-apply"),M=c.querySelector(".asset-crop-reset");if(!y||!v||!S||!L){l(null);return}let I=y.getContext("2d"),k=v.getContext("2d");if(!I||!k){l(null);return}let T=r.naturalWidth,A=r.naturalHeight,C=Math.max(y.width/T,y.height/A),w=1,x=0,O=0,P=!1,R=0,z=0,F=0,G=0,H=()=>{let N=C*w,ee=Math.max(0,(T*N-y.width)/2),Z=Math.max(0,(A*N-y.height)/2);x=Math.min(ee,Math.max(-ee,x)),O=Math.min(Z,Math.max(-Z,O))},B=()=>{let N=C*w;I.clearRect(0,0,y.width,y.height);let ee=y.width/2-T*N/2+x,Z=y.height/2-A*N/2+O;if(I.drawImage(r,ee,Z,T*N,A*N),k.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let V=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),se=v.width/2-o.naturalWidth*V/2,Q=v.height/2-o.naturalHeight*V/2;k.drawImage(o,se,Q,o.naturalWidth*V,o.naturalHeight*V)}else k.fillStyle="rgba(255, 255, 255, 0.04)",k.fillRect(0,0,v.width,v.height),k.strokeStyle="rgba(255, 255, 255, 0.08)",k.strokeRect(4,4,v.width-8,v.height-8);let ae=v.width/y.width*(C*w),ge=x*(v.width/y.width),xe=O*(v.height/y.height),Me=v.width/2-T*ae/2+ge,Ie=v.height/2-A*ae/2+xe;k.save(),k.globalAlpha=.7,k.drawImage(r,Me,Ie,T*ae,A*ae),k.restore()},$=()=>{x=0,O=0,H(),B()};S.addEventListener("input",()=>{w=Number(S.value),L.textContent=`${w.toFixed(2)}\xD7`,H(),B()}),y.addEventListener("pointerdown",N=>{P=!0,R=N.clientX,z=N.clientY,F=x,G=O,y.setPointerCapture(N.pointerId)}),y.addEventListener("pointermove",N=>{P&&(x=F+(N.clientX-R),O=G+(N.clientY-z),H(),B())}),y.addEventListener("pointerup",N=>{P=!1,y.releasePointerCapture(N.pointerId)}),y.addEventListener("pointerleave",()=>{P=!1});let U=()=>{c.remove()},X=()=>{U(),l(null)},re=async()=>{let N=document.createElement("canvas");N.width=t.width,N.height=t.height;let ee=N.getContext("2d");if(!ee){U(),l(null);return}let Z=w,ge=Math.max(N.width/T,N.height/A)*Z,xe=N.width/y.width,Me=x*xe,Ie=O*xe,V=N.width/2-T*ge/2+Me,se=N.height/2-A*ge/2+Ie;ee.drawImage(r,V,se,T*ge,A*ge);let Q=await new Promise(ce=>{N.toBlob(Ue=>ce(Ue),e.type||"image/png")});if(U(),!Q){l(null);return}l(new File([Q],e.name,{type:Q.type}))};j==null||j.addEventListener("click",X),_==null||_.addEventListener("click",X),M==null||M.addEventListener("click",$),E==null||E.addEventListener("click",()=>{re()}),c.addEventListener("click",N=>{N.target===c&&X()}),document.body.appendChild(c),$()})}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 _i=class{constructor(){this.root=null;this.options=null}render(){return`
|
|
1754
1754
|
<div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
|
|
1755
1755
|
<div class="scene-panel-header" data-panel-handle>
|
|
1756
1756
|
<div class="panel-title">
|
|
@@ -1816,10 +1816,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
|
|
|
1816
1816
|
</div>
|
|
1817
1817
|
</div>
|
|
1818
1818
|
</div>
|
|
1819
|
-
`}initialize(e,t){var y,v,S,L,j,_,E,M,I,k,T,A,C,w,x,O;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let P=window.getEditableEngineConfig;if(typeof P=="function"){let z=P();return(R=z==null?void 0:z.loading)!=null?R:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{background_color:s.value})}));let o=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha"),l=(L=this.root)==null?void 0:L.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((j=n.overlay_alpha)!=null?j:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:P})}));let c=(_=this.root)==null?void 0:_.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{text:c.value})}));let d=(E=this.root)==null?void 0:E.querySelector("#loading-text-scale"),u=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");d&&(d.value=String((I=n.text_scale)!=null?I:.6),u&&(u.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let P=Number(d.value);u&&(u.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:P})}));let p=(k=this.root)==null?void 0:k.querySelector("#loading-enabled");p&&(p.checked=n.enabled!==!1,p.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{enabled:p.checked})}));let g=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_enabled:g.checked})}));let h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((w=n.blur_strength)!=null?w:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,R;m&&(m.textContent=h.value),(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_strength:Number(h.value)})}));let f=(x=this.root)==null?void 0:x.querySelector("#loading-show-btn"),b=(O=this.root)==null?void 0:O.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||R.call(P)}),b==null||b.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||R.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{Graphics as er,Point as Po}from"pixi.js";import{Point as Xs}from"pixi.js";var Ye=()=>window.debugConfig||{},Js=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),Zs=()=>window.resolveScreenAnchorPoint||(()=>new Xs),Qs=()=>window.resolveScreenRatioPoint||(()=>new Xs);function tr(r){Oi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>Ri(r))))}function ir(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),_t(r)}function Oi(r){return r.isDebugOpen}function Ri(r){var a,s,o;if(!Oi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>Ri(r));let e=Sn(r);if(!e){jt(r,null),_t(r);return}let t=En(r,e);if(!t){jt(r,null),_t(r);return}let i=new Po;(a=t.getGlobalPosition)==null||a.call(t,i);let n=Cn(r,t);jt(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?kn(r,t):Mn(r),r.highlightAnchor&&n?Pn(r,n):In(r)}function Sn(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 En(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 Ot(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Cn(r,e){var s,o;let t=Ot(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=An(r);if(!n)return null;if(i.position_ratio!=null)return Qs()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"bottom-center";return a==="bottom-center"&&i.anchor==null&&console.log("[DEBUG FALLBACK] objectVisuals transform.anchor \u2192 bottom-center"),Zs()(n.width,n.height,a)}function An(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 er,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function Tn(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 er,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function kn(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=Tn(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 Mn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function In(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function _t(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function jt(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function nr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function ar(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function jn(r){var i,n,a,s,o;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=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Di(r){let e=Ye();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 sr(r){window.location.reload()}function $i(r){let e=JSON.stringify(Ye(),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 rr(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),u=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!u)return;let p=await l(u.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,p),zi(r,p),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),zi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function zi(r,e){var p,g,h,m,f,b,y,v,S,L;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-preset"),s=r.container.querySelector("#config-anchor-x"),o=r.container.querySelector("#config-anchor-y"),c=jn(e)?(p=e.transform)==null?void 0:p.offset:(g=e.transform)==null?void 0:g.position;t&&(t.value=String((h=c==null?void 0:c.x)!=null?h:0)),i&&(i.value=String((m=c==null?void 0:c.y)!=null?m:0)),n&&(n.value=String((b=(f=e.transform)==null?void 0:f.scale)!=null?b:1));let d=(L=(S=(y=e.transform)==null?void 0:y.anchor)!=null?S:(v=e.render)==null?void 0:v.anchor)!=null?L:"center";if(a){typeof d=="string"?a.value=d:a.value="custom";let j=r.container.querySelectorAll(".anchor-custom-field"),_=a.value==="custom";j.forEach(E=>E.style.display=_?"block":"none")}let u=Js()(d);s&&(s.value=String(u.x)),o&&(o.value=String(u.y))}function or(r){var l,c,d,u,p,g,h,m,f,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=(u=(d=r.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?u:"0",n=(g=(p=r.container.querySelector("#config-scale"))==null?void 0:p.value)!=null?g:"1",a=(m=(h=r.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",s=(b=(f=r.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
|
|
1819
|
+
`}initialize(e,t){var y,v,S,L,j,_,E,M,I,k,T,A,C,w,x,O;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let P=window.getEditableEngineConfig;if(typeof P=="function"){let z=P();return(R=z==null?void 0:z.loading)!=null?R:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{background_color:r.value})}));let o=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha"),l=(L=this.root)==null?void 0:L.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((j=n.overlay_alpha)!=null?j:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:P})}));let c=(_=this.root)==null?void 0:_.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{text:c.value})}));let d=(E=this.root)==null?void 0:E.querySelector("#loading-text-scale"),u=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");d&&(d.value=String((I=n.text_scale)!=null?I:.6),u&&(u.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let P=Number(d.value);u&&(u.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:P})}));let p=(k=this.root)==null?void 0:k.querySelector("#loading-enabled");p&&(p.checked=n.enabled!==!1,p.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{enabled:p.checked})}));let g=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_enabled:g.checked})}));let h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((w=n.blur_strength)!=null?w:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,R;m&&(m.textContent=h.value),(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_strength:Number(h.value)})}));let f=(x=this.root)==null?void 0:x.querySelector("#loading-show-btn"),b=(O=this.root)==null?void 0:O.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||R.call(P)}),b==null||b.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||R.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{Graphics as es,Point as Po}from"pixi.js";import{Point as Xr}from"pixi.js";var Ye=()=>window.debugConfig||{},Jr=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),Zr=()=>window.resolveScreenAnchorPoint||(()=>new Xr),Qr=()=>window.resolveScreenRatioPoint||(()=>new Xr);function ts(s){Oi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Ri(s))))}function is(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),_t(s)}function Oi(s){return s.isDebugOpen}function Ri(s){var a,r,o;if(!Oi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Ri(s));let e=Sn(s);if(!e){jt(s,null),_t(s);return}let t=En(s,e);if(!t){jt(s,null),_t(s);return}let i=new Po;(a=t.getGlobalPosition)==null||a.call(t,i);let n=Cn(s,t);jt(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?kn(s,t):Mn(s),s.highlightAnchor&&n?Pn(s,n):In(s)}function Sn(s){var n;let e=s.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 En(s,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 Ot(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Cn(s,e){var r,o;let t=Ot(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=An(s);if(!n)return null;if(i.position_ratio!=null)return Qr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"bottom-center";return a==="bottom-center"&&i.anchor==null&&console.log("[DEBUG FALLBACK] objectVisuals transform.anchor \u2192 bottom-center"),Zr()(n.width,n.height,a)}function An(s){var a;let e=(a=s.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(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new es,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function Tn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new es,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function kn(s,e){var n;let t=Ln(s);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(s,e){let t=Tn(s);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 Mn(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function In(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function _t(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function jt(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function ns(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function as(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function jn(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Di(s){let e=Ye();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 rs(s){window.location.reload()}function $i(s){let e=JSON.stringify(Ye(),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 ss(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),u=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!u)return;let p=await l(u.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,p),zi(s,p),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),zi(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function zi(s,e){var p,g,h,m,f,b,y,v,S,L;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-preset"),r=s.container.querySelector("#config-anchor-x"),o=s.container.querySelector("#config-anchor-y"),c=jn(e)?(p=e.transform)==null?void 0:p.offset:(g=e.transform)==null?void 0:g.position;t&&(t.value=String((h=c==null?void 0:c.x)!=null?h:0)),i&&(i.value=String((m=c==null?void 0:c.y)!=null?m:0)),n&&(n.value=String((b=(f=e.transform)==null?void 0:f.scale)!=null?b:1));let d=(L=(S=(y=e.transform)==null?void 0:y.anchor)!=null?S:(v=e.render)==null?void 0:v.anchor)!=null?L:"center";if(a){typeof d=="string"?a.value=d:a.value="custom";let j=s.container.querySelectorAll(".anchor-custom-field"),_=a.value==="custom";j.forEach(E=>E.style.display=_?"block":"none")}let u=Jr()(d);r&&(r.value=String(u.x)),o&&(o.value=String(u.y))}function os(s){var l,c,d,u,p,g,h,m,f,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(u=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?u:"0",n=(g=(p=s.container.querySelector("#config-scale"))==null?void 0:p.value)!=null?g:"1",a=(m=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",r=(b=(f=s.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
|
|
1820
1820
|
position: (${t}, ${i})
|
|
1821
1821
|
scale: ${n}
|
|
1822
|
-
anchor: (${a}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function _n(r,e){var p,g,h,m,f,b,y,v,S,L,j,_;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((g=(p=r.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?g:0),n=Number((m=(h=r.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?m:0),a=Number((b=(f=r.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?b:1),s=(v=(y=r.container.querySelector("#config-anchor-preset"))==null?void 0:y.value)!=null?v:"center",o=Number((L=(S=r.container.querySelector("#config-anchor-x"))==null?void 0:S.value)!=null?L:.5),l=Number((_=(j=r.container.querySelector("#config-anchor-y"))==null?void 0:j.value)!=null?_:.5),c=s==="custom"?{x:o,y:l}:s;console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchor:c});let{applyConfigOverride:d}=await import("./ConfigOverride-V7DLPL5I.js");d({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.anchor",value:c},{silent:e==null?void 0:e.silent});let u=Ot(r);jn(u)&&d({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0})}async function lr(r,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.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(([d,u])=>{var p;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(p=h[f])!=null?p:{},h=h[f]}h[g[g.length-1]]=u}else c[d]=u}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function cr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,_n(r,{silent:!0})},150))}var Mo=3e3;function et(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,d=0,u=g=>{if(!n)return;let h=i.getBoundingClientRect();r.style.left=`${g.clientX-h.left-c}px`,r.style.top=`${g.clientY-h.top-d}px`},p=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=r.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,y=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),r.style.left=`${b}px`,r.style.top=`${y}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Mo),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",u),window.addEventListener("pointerup",p)})}function Hi(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,d=p=>{var y;if(!c)return;let g=p.clientX-o,h=p.clientY-l,m=Math.max(i,a+g),f=Math.max(n,s+h);r.style.width=`${m}px`,(y=r.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(r.style.height=`${f}px`),t==null||t(m,f)},u=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;p.preventDefault(),p.stopPropagation();let g=r.getBoundingClientRect();a=g.width,s=g.height,o=p.clientX,l=p.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function On(r,e){var m,f,b,y;let t=(b=(f=(m=r.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=r.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,u=Math.max(a,i.width-l.width-a),p=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),u),h=Math.min(Math.max(d,a),p);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ut(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(On(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));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 Ni(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 s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(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"),On(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Rn(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",On(r,e),ut(r))}function dr(r){var n,a,s;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 o;console.log("[PREVIEW] Debug toggle clicked"),(o=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Di(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>$i(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,zn(r),ut(r)})}),$n(r,e),Dn(r,e)}function zn(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 Dn(r,e){ve(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ve(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ve(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ve(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ve(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ve(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ve(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ve(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ve(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=Ye();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),s=Ye();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function pr(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"),et(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ut(r),Rn(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"),et(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Rn(r,i)},10)})),i&&a&&Hi(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&et(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&et(l,c,r.debugOverlay),Ni(r)}function $n(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 ve(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=nr(Ye(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),ar(Ye(),i,l)})}var Fi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}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=st(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let u=d.objectId||"Engine";a[u]||(a[u]=[]),a[u].push(d)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1822
|
+
anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function _n(s,e){var p,g,h,m,f,b,y,v,S,L,j,_;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((g=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?g:0),n=Number((m=(h=s.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?m:0),a=Number((b=(f=s.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?b:1),r=(v=(y=s.container.querySelector("#config-anchor-preset"))==null?void 0:y.value)!=null?v:"center",o=Number((L=(S=s.container.querySelector("#config-anchor-x"))==null?void 0:S.value)!=null?L:.5),l=Number((_=(j=s.container.querySelector("#config-anchor-y"))==null?void 0:j.value)!=null?_:.5),c=r==="custom"?{x:o,y:l}:r;console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchor:c});let{applyConfigOverride:d}=await import("./ConfigOverride-V7DLPL5I.js");d({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.anchor",value:c},{silent:e==null?void 0:e.silent});let u=Ot(s);jn(u)&&d({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0})}async function ls(s,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.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(([d,u])=>{var p;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(p=h[f])!=null?p:{},h=h[f]}h[g[g.length-1]]=u}else c[d]=u}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function cs(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,_n(s,{silent:!0})},150))}var Mo=3e3;function et(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,u=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},p=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=s.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,y=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),s.style.left=`${b}px`,s.style.top=`${y}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++Mo),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",u),window.addEventListener("pointerup",p)})}function Hi(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=p=>{var y;if(!c)return;let g=p.clientX-o,h=p.clientY-l,m=Math.max(i,a+g),f=Math.max(n,r+h);s.style.width=`${m}px`,(y=s.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(s.style.height=`${f}px`),t==null||t(m,f)},u=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;p.preventDefault(),p.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=p.clientX,l=p.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function On(s,e){var m,f,b,y;let t=(b=(f=(m=s.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=s.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,u=Math.max(a,i.width-l.width-a),p=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),u),h=Math.min(Math.max(d,a),p);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ut(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(On(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.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 Ni(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(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"),On(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Rn(s,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",On(s,e),ut(s))}function ds(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Di(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>$i(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,zn(s),ut(s)})}),$n(s,e),Dn(s,e)}function zn(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Dn(s,e){ve(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ve(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ve(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ve(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ve(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ve(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ve(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ve(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ve(s,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=Ye();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),r=Ye();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function ps(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.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"),et(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ut(s),Rn(s,e)},10)}));let i=s.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"),et(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Rn(s,i)},10)})),i&&a&&Hi(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&et(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&et(l,c,s.debugOverlay),Ni(s)}function $n(s,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 ve(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=ns(Ye(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),as(Ye(),i,l)})}var Fi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}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=rt(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let u=d.objectId||"Engine";a[u]||(a[u]=[]),a[u].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
|
|
1823
1823
|
<div class="config-persistence-panel">
|
|
1824
1824
|
<!-- Status Footer (Always Visible) -->
|
|
1825
1825
|
<div class="persistence-status-footer">
|
|
@@ -1983,7 +1983,7 @@ This will delete generated config JSON files in configs/objects that are not ref
|
|
|
1983
1983
|
|
|
1984
1984
|
It will NOT touch library/base configs.
|
|
1985
1985
|
|
|
1986
|
-
Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!
|
|
1986
|
+
Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!rt().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
|
|
1987
1987
|
|
|
1988
1988
|
This will:
|
|
1989
1989
|
\u2022 Create a new version snapshot
|
|
@@ -2003,25 +2003,25 @@ This is ONLY for active development.
|
|
|
2003
2003
|
|
|
2004
2004
|
Make sure your project is under Git version control.
|
|
2005
2005
|
|
|
2006
|
-
Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Kt(),h={};for(let[f,b]of Object.entries(g.objects)){let y=b,v=f;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${f}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=v),h[`objects/${v}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let y=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${y}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}Ze(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async p=>{let h=p.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(p=>{p.addEventListener("click",()=>{let g=p.dataset.removePath,h=p.dataset.removeId;Fa(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Ze(),
|
|
2006
|
+
Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Kt(),h={};for(let[f,b]of Object.entries(g.objects)){let y=b,v=f;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${f}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=v),h[`objects/${v}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let y=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${y}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}Ze(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async p=>{let h=p.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(p=>{p.addEventListener("click",()=>{let g=p.dataset.removePath,h=p.dataset.removeId;Fa(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Ze(),rn(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&rn()});let u=this.container.querySelector("#reset-to-original-btn");u==null||u.addEventListener("click",async()=>{await qa()})}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=`
|
|
2007
2007
|
<div class="notify-icon">\u2705</div>
|
|
2008
2008
|
<div class="notify-content">
|
|
2009
2009
|
<strong>${i}</strong>
|
|
2010
2010
|
<span>Project files updated.</span>
|
|
2011
2011
|
</div>
|
|
2012
|
-
`,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,
|
|
2012
|
+
`,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,r;let t=rt();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
|
|
2013
2013
|
|
|
2014
2014
|
You have ${t.overrideCount} staged changes that will be discarded.
|
|
2015
2015
|
|
|
2016
2016
|
Options:
|
|
2017
2017
|
OK = Discard staged overrides and switch
|
|
2018
|
-
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 o=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!o.ok){let l=await o.json();throw new Error(l.error||"Failed to switch version")}Ze(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(
|
|
2018
|
+
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 o=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!o.ok){let l=await o.json();throw new Error(l.error||"Failed to switch version")}Ze(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(r=this.container)==null?void 0:r.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
|
|
2019
2019
|
|
|
2020
2020
|
This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
|
|
2021
2021
|
|
|
2022
2022
|
This cannot be undone unless you have git commits or backups.
|
|
2023
2023
|
|
|
2024
|
-
Are you absolutely sure?`))try{let t=Kt(),i={};for(let[a,
|
|
2024
|
+
Are you absolutely sure?`))try{let t=Kt(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}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,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}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")}Ze(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Bi=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 ni;this.sceneToolsPanel=new ai;this.nudgePanel=new ri;this.inspectorPanel=new Li;this.libraryPanel=new Pt;this.libraryPanelDocked=new Pt;this.brandVisionPanel=new Ii;this.customizeSettingsPanel=new ji;this.configPersistencePanel=new Fi;this.loadingScreenPanel=new _i}applyAssetChange(e,t){return Ur(this,e,t)}resetAsset(e){return Gr(this,e)}applySlotAsset(e,t,i){return Pi(this,e,t,i)}resetSlotAsset(e,t,i){return qr(this,e,t,i)}startObjectVisuals(){return ts(this)}stopObjectVisuals(){return is(this)}shouldRunObjectVisuals(){return Oi(this)}updateObjectVisuals(){return Ri(this)}getSelectedInstanceId(){return Sn(this)}getDisplayObjectById(e){return En(this,e)}getSelectedObjectConfig(){return Ot(this)}getConfigAnchorWorldPoint(e){return Cn(this,e)}getScreenSize(){return An(this)}ensureBoundsGfx(){return Ln(this)}ensureAnchorGfx(){return Tn(this)}drawBounds(e){return kn(this,e)}drawAnchor(e){return Pn(this,e)}clearBounds(){return Mn(this)}clearAnchor(){return In(this)}clearObjectVisuals(){return _t(this)}updateObjectInfo(e){return jt(this,e)}resetDebugConfig(){return Di(this)}applyDebugConfig(){return rs(this)}exportDebugConfig(){return $i(this)}loadObjectConfig(e){return ss(this,e)}fillConfigViewer(e){return zi(this,e)}copyConfigValues(){return os(this)}applyObjectConfig(e){return _n(this,e)}applyCustomizeSettings(e,t){return ls(this,e,t)}scheduleObjectAutoApply(){return cs(this)}setupDebugEventListeners(){return ds(this)}setupDebugInputListeners(e){return Dn(this,e)}setupPanelLayout(){return ps(this)}setupCollapsiblePanels(e){return $n(this,e)}setupRangeInput(e,t,i,n){return ve(this,e,t,i,n)}updateWorkbenchTabs(){return zn(this)}saveWorkbenchState(){return ut(this)}loadWorkbenchState(){return Ni(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 r=JSON.parse(a);r.activeTab&&(this.activeTab=r.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,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),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,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var p,g,h;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(p=o.transform)==null?void 0:p.position,c=((g=l==null?void 0:l.x)!=null?g:0)+a,d=((h=l==null?void 0:l.y)!=null?h:0)+r,{applyConfigOverride:u}=await import("./ConfigOverride-V7DLPL5I.js");u({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0}),window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,u;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(d=r.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-V7DLPL5I.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0}),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 r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,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 r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>Promise.all([this.libraryPanel.refresh(),this.libraryPanelDocked.refresh()]),window.reRenderAssetLibrary=()=>{this.libraryPanel.reRender(),this.libraryPanelDocked.reRender()},window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r),this.libraryPanelDocked.highlightSlot(a,r)}}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`
|
|
2025
2025
|
<div class="debug-overlay hidden" id="debug-overlay">
|
|
2026
2026
|
<div class="debug-workbench" id="debug-workbench">
|
|
2027
2027
|
<div class="workbench-header" id="workbench-handle">
|
|
@@ -2068,7 +2068,7 @@ Are you absolutely sure?`))try{let t=Kt(),i={};for(let[a,s]of Object.entries(t.o
|
|
|
2068
2068
|
${this.sceneToolsPanel.render()}
|
|
2069
2069
|
${this.nudgePanel.render()}
|
|
2070
2070
|
</div>
|
|
2071
|
-
`}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(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let u=this.container.querySelector("#config-pos-x"),p=this.container.querySelector("#config-pos-y");if(u&&p){let g=Number((o=u.value)!=null?o:0),h=Number((l=p.value)!=null?l:0),m=g+e*n,f=h+t*n;u.value=String(m),p.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let
|
|
2071
|
+
`}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(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let u=this.container.querySelector("#config-pos-x"),p=this.container.querySelector("#config-pos-y");if(u&&p){let g=Number((o=u.value)!=null?o:0),h=Number((l=p.value)!=null?l:0),m=g+e*n,f=h+t*n;u.value=String(m),p.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new Ae;for(let u of i){let p=a(u);if(!p)continue;let g=((d=p.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await r.updateProperty(u,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function Io(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function jo(s){var n;let[e,t]=s.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 _o(s){return`
|
|
2072
2072
|
Analyze these screenshots of a brand or game and extract its "Brand DNA".
|
|
2073
2073
|
|
|
2074
2074
|
Provide a concise summary (2-3 sentences) covering:
|
|
@@ -2082,12 +2082,12 @@ FORMAT:
|
|
|
2082
2082
|
Summary: [Your summary here]
|
|
2083
2083
|
Palette: [#RRGGBB, #RRGGBB, ...]
|
|
2084
2084
|
|
|
2085
|
-
${
|
|
2085
|
+
${s?`
|
|
2086
2086
|
ADDITIONAL RULES/NOTES:
|
|
2087
|
-
${
|
|
2088
|
-
`.trim()}function
|
|
2087
|
+
${s}`:""}
|
|
2088
|
+
`.trim()}function us(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await Io(a),o=jo(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=_o(n),o=s.map(p=>({base64:p.base64,mimeType:p.mimeType})),l=await ki(i,r,o,{model:a}),c=e,d=[],u=l.split(`
|
|
2089
2089
|
`);for(let p of u)if(p.toLowerCase().startsWith("summary:"))c=p.slice(8).trim();else if(p.toLowerCase().includes("palette:")){let g=p.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
|
|
2090
|
-
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var tt="handler_api_key_";var gt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${tt}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${tt}${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=`${tt}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${tt}${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(tt)){let n=i.substring(tt.length),a=localStorage.getItem(i);if(a){let
|
|
2090
|
+
Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var tt="handler_api_key_";var gt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${tt}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${tt}${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=`${tt}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${tt}${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(tt)){let n=i.substring(tt.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.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(tt)&&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}}},Hn=()=>gt.getKey("gemini"),Nn=(s,e)=>gt.setKey("gemini",s,e),Oo=()=>gt.hasKey("gemini");window.ApiKeyStorage=gt;window.getGeminiApiKey=Hn;window.setGeminiApiKey=Nn;window.hasGeminiApiKey=Oo;var Bn=class{constructor(){this.modal=null;this.options=null;this.analyzer=us();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=`
|
|
2091
2091
|
<div class="ai-modal-card">
|
|
2092
2092
|
<div class="ai-modal-header">
|
|
2093
2093
|
<div class="ai-modal-actions">
|
|
@@ -2166,14 +2166,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0
|
|
|
2166
2166
|
<button class="ai-btn primary" data-action="apply" disabled>Apply</button>
|
|
2167
2167
|
</div>
|
|
2168
2168
|
</div>
|
|
2169
|
-
`,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 o;let a=n.target;switch(a.dataset.action||((o=a.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let
|
|
2169
|
+
`,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 o;let a=n.target;switch(a.dataset.action||((o=a.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let r=a.closest(".ai-gallery-item"),o=parseInt(r.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var 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}
|
|
2170
2170
|
|
|
2171
|
-
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
|
|
2171
|
+
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 r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await Ti(this.options.currentValue);c&&(r=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await pt(a,this.currentPrompt,r,{aspectRatio:"1:1"}),l=await dt(o);this.generatedImages.push(l||o),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)=>`
|
|
2172
2172
|
<div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
|
|
2173
2173
|
<img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
|
|
2174
2174
|
<div class="ai-gallery-label">#${i+1}</div>
|
|
2175
2175
|
</div>
|
|
2176
|
-
`).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=Hn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Nn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},Fn=null;window.__openAiEditor=function(
|
|
2176
|
+
`).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=Hn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Nn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},Fn=null;window.__openAiEditor=function(s,e,t,i){Fn||(Fn=new Bn),Fn.open({objectId:s,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(s,i.path,n);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(s);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var Un=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=`
|
|
2177
2177
|
<div class="asset-preview-card">
|
|
2178
2178
|
<div class="asset-preview-header">
|
|
2179
2179
|
<div class="asset-preview-title">${n}</div>
|
|
@@ -2200,7 +2200,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2200
2200
|
<source src="${n}" type="audio/wav">
|
|
2201
2201
|
Your browser does not support the audio element.
|
|
2202
2202
|
</audio>
|
|
2203
|
-
`;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(
|
|
2203
|
+
`;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(s){new Un().open(s)};var Gn=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=`
|
|
2204
2204
|
<div class="asset-crop-card">
|
|
2205
2205
|
<div class="asset-crop-header">
|
|
2206
2206
|
<div>
|
|
@@ -2251,7 +2251,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2251
2251
|
<button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
|
|
2252
2252
|
</div>
|
|
2253
2253
|
</div>
|
|
2254
|
-
`,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(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,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,s=Math.min(n,a),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(r){new Gn().open(r)};import{Application as $o,Container as $e,Graphics as we,Point as J,Rectangle as hr,Text as Ho,TextStyle as No}from"pixi.js";import{Sprite as Ro,Container as gr}from"pixi.js";var zo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",qn=zo;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&&(qn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${qn}`))}}catch{}function Do(r){var t,i,n,a,s;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 o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Te=class{static async create(e,t,i){var l,c,d,u,p,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${qn}`);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 m=new gr;return this.applyTransform(m,t==null?void 0:t.transform,t),m}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 s=await en.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=s==null?void 0:s.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new Ro(s),console.log("[ObjectFactory] Created object:",o,"type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(p=s==null?void 0:s.constructor)==null?void 0:p.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof gr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,s,o;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((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Do(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Ui=class{constructor(e){this.app=null;this.camera=new $e;this.bgContainer=new $e;this.mainContainer=new $e;this.uiContainer=new $e;this.gizmoLayer=new $e;this.screenFrame=new we;this.gameFrame=new we;this.gridLayer=new we;this.spawnPointLayer=new $e;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new we;this.anchorVisualizationLayer=new we;this.moveHandle=new we;this.scaleHandle=new we;this.rotateHandle=new we;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!0;this.playModeInitialized=!1;this.layoutScale=1;this.updateManager=new Ae;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.playModeEnabled?this.schedulePostScreenSync({width:t,height:i}):this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let s=a.displayObject;if(s!=null&&s.texture)s.texture=n;else if(s!=null&&s.children){let c=s.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let o=this.getEditableObjectConfig(i);o&&(a.assetKey=this.getAssetKey(o))};this.handleLayoutApplied=e=>{var s;if(!this.isVisible)return;let t=(s=e==null?void 0:e.detail)!=null?s:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible||this.getPointerButton(e)!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new J(i.x,i.y),a=this.getPickCandidates(n);if(a.length===0){this.setSelected(null),this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let s=performance.now(),o=this.areSameIds(a,this.lastPickIds),l=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,c=s-this.lastPickTime<1200,d=o&&l&&c?(this.lastPickIndex+1)%a.length:0,u=a[d];this.lastPickIds=a,this.lastPickIndex=d,this.lastPickPoint=n,this.lastPickTime=s,this.setSelected(u)};this.handleGridSettings=e=>{var a,s,o;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(s=e==null?void 0:e.detail)==null?void 0:s.gap,n=(o=e==null?void 0:e.detail)==null?void 0:o.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handlePlayModeChange=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(!this.playModeInitialized&&(this.playModeInitialized=!0,!t)||t&&this.applyPlayModeState(!0))};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal()};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),Ge({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var n;if(!this.dragMode||!this.selectedId||!this.dragContainer||!this.dragStartPointer||!this.dragStartPos)return;let t=this.objectMap.get(this.selectedId);if(!(t!=null&&t.displayObject))return;let i=this.getPointerInContainer(e.clientX,e.clientY,this.dragContainer);if(i){if(this.dragMode==="move"){let a=i.x-this.dragStartPointer.x,s=i.y-this.dragStartPointer.y,o=this.dragStartPos.x+a,l=this.dragStartPos.y+s;t.displayObject.position.set(o,l),this.updateLiveConfigPosition(o,l)}if(this.dragMode==="scale"&&this.dragAnchorLocal){let s=Math.max(1,this.distance(i,this.dragAnchorLocal))/Math.max(1,this.dragStartDistance),o=Math.max(.01,this.dragStartScale*s);(n=t.displayObject.scale)!=null&&n.set?t.displayObject.scale.set(o,o):t.displayObject.scale&&(t.displayObject.scale.x=o,t.displayObject.scale.y=o),this.updateLiveConfigScale(o)}if(this.dragMode==="rotate"&&this.dragAnchorLocal){let a=Math.atan2(i.y-this.dragAnchorLocal.y,i.x-this.dragAnchorLocal.x),s=this.dragStartRotation+(a-this.dragStartAngle);t.displayObject.rotation=s,this.updateLiveConfigRotation(s)}this.updateGizmos()}};this.onDragEnd=()=>{this.dragMode&&(this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd))};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new J(this.app.renderer.width/2,this.app.renderer.height/2),s=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let o=this.camera.toGlobal(s);this.camera.position.set(this.camera.position.x+(a.x-o.x),this.camera.position.y+(a.y-o.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new $o,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.bgContainer.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.bgContainer),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.bgContainer.zIndex=-5e3,this.bgContainer.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.anchorVisualizationLayer),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.anchorVisualizationLayer.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),this.applyPlayModeState(!0),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.addEventListener("scene-editor:play-mode",this.handlePlayModeChange),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t)),this.applyEditControls()}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let s=a.displayObject;if(!s||s.visible===!1)continue;let o=(i=s.getBounds)==null?void 0:i.call(s);if(!o||o.width<=0||o.height<=0||e.x<o.x||e.x>o.x+o.width||e.y<o.y||e.y>o.y+o.height)continue;let l=s.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof s.zIndex=="number"?s.zIndex:0,u=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(s):0,p=c*1e6+d*1e3+u;t.push({id:n,order:p})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let n=Number(t);Number.isFinite(n)&&n>2&&(this.gridGap=n)}if(i!==null){let n=Number(i);Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n)}}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}applyPlayModeState(e){var t;this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),this.applyEditControls(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})}applyEditControls(){this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static"}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&this.playModeEnabled&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,s,o,l,c,d,u;let e=window.gameApp;if(e!=null&&e.renderer){let p=e.renderer.screen,g=Number((a=p==null?void 0:p.width)!=null?a:0),h=Number((s=p==null?void 0:p.height)!=null?s:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let m=Number((o=e.renderer.resolution)!=null?o:1)||1,f=Number((l=e.renderer.width)!=null?l:0)/m,b=Number((c=e.renderer.height)!=null?c:0)/m;if(Number.isFinite(f)&&f>0&&Number.isFinite(b)&&b>0)return{width:f,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((u=t==null?void 0:t.dataset)==null?void 0:u.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var a,s,o,l,c,d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M,I,k,T,A,C,w,x,O,P,R,z,F,G;let e=window.__screenManager;if(e){let H=["gameplay","start","tutorial","endgame","loading"];for(let B of H){let $=(a=e.get)==null?void 0:a.call(e,B);if($!=null&&$.visible){let U=(s=$.getContentLayer)==null?void 0:s.call($);if(U){let X=(o=$.x)!=null?o:0,se=(l=$.y)!=null?l:0,N=(c=U.x)!=null?c:0,ee=(d=U.y)!=null?d:0,Z=(p=(u=U.scale)==null?void 0:u.x)!=null?p:1,ae=(h=(g=U.scale)==null?void 0:g.y)!=null?h:Z;return console.log("[SceneEditor] getRuntimeLayoutReference: using visible screen contentLayer",{screenId:B,contentLayerScale:{x:Z,y:ae},position:{x:X+N,y:se+ee}}),{scale:{x:Z,y:ae},position:{x:X+N,y:se+ee},pivot:U.pivot?{x:U.pivot.x,y:U.pivot.y}:void 0}}}}for(let B of H){let $=(m=e.get)==null?void 0:m.call(e,B);if($){if(!$.visible&&typeof $.updateLayout=="function"){let X=window.gameApp;if((f=X==null?void 0:X.renderer)!=null&&f.screen){let se=X.renderer.screen.width,N=X.renderer.screen.height;se>0&&N>0&&$.updateLayout(se,N)}}let U=(b=$.getContentLayer)==null?void 0:b.call($);if(U){let X=(y=$.x)!=null?y:0,se=(v=$.y)!=null?v:0,N=(S=U.x)!=null?S:0,ee=(L=U.y)!=null?L:0,Z=(_=(j=U.scale)==null?void 0:j.x)!=null?_:1,ae=(M=(E=U.scale)==null?void 0:E.y)!=null?M:Z;return console.log("[SceneEditor] getRuntimeLayoutReference: using any screen contentLayer",{screenId:B,visible:$.visible,contentLayerScale:{x:Z,y:ae},position:{x:X+N,y:se+ee}}),{scale:{x:Z,y:ae},position:{x:X+N,y:se+ee},pivot:U.pivot?{x:U.pivot.x,y:U.pivot.y}:void 0}}}}}let t=window.__mainContainer;if(t){let H=(k=(I=t.scale)==null?void 0:I.x)!=null?k:1,B=(A=(T=t.scale)==null?void 0:T.y)!=null?A:H;return console.log("[SceneEditor] getRuntimeLayoutReference: using __mainContainer",{scale:{x:H,y:B},position:{x:(C=t.position)==null?void 0:C.x,y:(w=t.position)==null?void 0:w.y}}),t}let i=window.gameApp,n=(x=i==null?void 0:i.stage)!=null?x:null;if(n){let H=(P=(O=n.scale)==null?void 0:O.x)!=null?P:1,B=(z=(R=n.scale)==null?void 0:R.y)!=null?z:H;console.log("[SceneEditor] getRuntimeLayoutReference: using gameApp.stage (fallback)",{scale:{x:H,y:B},position:{x:(F=n.position)==null?void 0:F.x,y:(G=n.position)==null?void 0:G.y}})}else console.log("[SceneEditor] getRuntimeLayoutReference: no reference found");return n}getRuntimeScale(){var i,n;let e=this.getRuntimeLayoutReference(),t=Number((n=(i=e==null?void 0:e.scale)==null?void 0:i.x)!=null?n:1);return Number.isFinite(t)&&t>0?t:Number.isFinite(this.layoutScale)&&this.layoutScale>0?this.layoutScale:1}getRuntimeParentContainer(e){var c,d,u,p,g;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((c=i==null?void 0:i.getDisplayObject)==null?void 0:c.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let s=window.__screenManager;if(s){let h=["gameplay","start","tutorial","endgame","loading"];for(let m of h){let f=(d=s.get)==null?void 0:d.call(s,m);if(!f)continue;let b=(p=(u=f.getBgLayer)==null?void 0:u.call(f))!=null?p:f.bgLayer;if(b&&(a===b||typeof b.contains=="function"&&b.contains(a)))return this.bgContainer}}let o=this.getRuntimeLayoutReference(),l=(g=window.gameApp)==null?void 0:g.stage;return o&&l&&o===l?this.mainContainer:o&&typeof o.contains=="function"&&o.contains(a)?this.mainContainer:a===o||a===l?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var s,o,l,c,d,u,p,g,h,m;if(!e)return console.log("[SceneEditor] applyRuntimeTransform: no reference"),!1;let t=1,i=1,n=Number((o=(s=e.position)==null?void 0:s.x)!=null?o:0),a=Number((c=(l=e.position)==null?void 0:l.y)!=null?c:0);if(!Number.isFinite(n)||!Number.isFinite(a))return console.log("[SceneEditor] applyRuntimeTransform: invalid position",{posX:n,posY:a}),!1;if(console.log("[SceneEditor] applyRuntimeTransform: applying (scale always 1)",{scale:{x:t,y:i},position:{x:n,y:a}}),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((d=this.mainContainer.pivot)!=null&&d.set)&&((u=this.uiContainer.pivot)!=null&&u.set)){let f=Number((g=(p=e.pivot)==null?void 0:p.x)!=null?g:0),b=Number((m=(h=e.pivot)==null?void 0:h.y)!=null?m:0);Number.isFinite(f)&&Number.isFinite(b)&&(this.mainContainer.pivot.set(f,b),this.uiContainer.pivot.set(f,b))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let s=this.getEditableObjectConfig(a);if(!s){this.removeObject(a);continue}await this.upsertObject(a,s)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),s=this.playModeEnabled?this.getRuntimeParentContainer(e):null,o=a?this.uiContainer:this.mainContainer,l=s!=null?s:o;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let d=await this.createDisplayObject(e,t);if(!d)return;l.addChild(d),this.objectMap.set(e,{id:e,displayObject:d,assetKey:i,isUi:a}),this.attachObjectInteraction(d,e)}let c=this.objectMap.get(e);c&&(c.displayObject.parent!==l&&l.addChild(c.displayObject),this.applyVisualConfig(c.displayObject,t),this.playModeEnabled||this.applyTransformFromConfig(e,c.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,u,p,g,h,m,f,b,y,v,S,L;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let _=await Te.create(e,t,this.app);if(_ instanceof $e)return _}}catch(j){console.warn("[SceneEditor] ObjectFactory failed for",e,j)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let j=this.getScreen(),_=(u=j==null?void 0:j.width)!=null?u:0,E=(p=j==null?void 0:j.height)!=null?p:0,M=new we,I=this.parseColor(n.background_color,0),k=typeof n.background_alpha=="number"?n.background_alpha:1;_>0&&E>0&&M.rect(0,0,_,E).fill({color:I,alpha:k});let T=new $e;return T.addChild(M),T}if(a){let j=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",_=new No({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:j,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new Ho({text:(y=i==null?void 0:i.text)!=null?y:"",style:_})}if((v=t==null?void 0:t.effects)!=null&&v.width||(S=t==null?void 0:t.effects)!=null&&S.height){let j=new we,_=typeof t.effects.width=="number"?t.effects.width:100,E=typeof t.effects.height=="number"?t.effects.height:100,M=(L=t.effects.fill_color)!=null?L:"#ffffff",I=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,k=Number.parseInt(String(M).replace("#",""),16);return j.rect(0,0,_,E).fill({color:Number.isFinite(k)?k:16777215,alpha:I}),j}return new $e}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new hr(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,s;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((s=t==null?void 0:t.identity)==null?void 0:s.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var a,s,o;if(!e)return;let i=(a=t==null?void 0:t.render)!=null?a:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n={x:.5,y:.5};if((s=e.anchor)!=null&&s.set)e.anchor.set(n.x,n.y);else if(e.pivot){let l=(o=e.getLocalBounds)==null?void 0:o.call(e);l&&e.pivot.set(l.width*n.x,l.height*n.y)}}applyTransformFromConfig(e,t,i){var _,E,M,I,k,T,A,C,w,x,O;if(!t)return;let n=this.getScreen();if(!(n!=null&&n.width)||!(n!=null&&n.height))return;let a=(_=i==null?void 0:i.transform)!=null?_:{},s=this.getPositioningAnchor(e,a),o=a==null?void 0:a.position_ratio,l=a==null?void 0:a.position,c=a==null?void 0:a.offset,d=Array.isArray(l)?Number((E=l[0])!=null?E:0):Number((M=l==null?void 0:l.x)!=null?M:0),u=Array.isArray(l)?Number((I=l[1])!=null?I:0):Number((k=l==null?void 0:l.y)!=null?k:0),p=Array.isArray(c)?Number((T=c[0])!=null?T:0):Number((A=c==null?void 0:c.x)!=null?A:0),g=Array.isArray(c)?Number((C=c[1])!=null?C:0):Number((w=c==null?void 0:c.y)!=null?w:0),h=(Number.isFinite(d)?d:0)+(Number.isFinite(p)?p:0),m=(Number.isFinite(u)?u:0)+(Number.isFinite(g)?g:0),f=o!=null?ze(n.width,n.height,o):Re(n.width,n.height,s),b=this.getRuntimeScale(),y=(f.x-n.width/2)/b+h,v=(f.y-n.height/2)/b+m;(x=t.position)!=null&&x.set?t.position.set(y,v):t.position&&(t.position.x=y,t.position.y=v);let L=(typeof(a==null?void 0:a.scale)=="number"?a.scale:1)*this.getRuntimeScale();(O=t.scale)!=null&&O.set?t.scale.set(L,L):t.scale&&(t.scale.x=L,t.scale.y=L);let j=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(j)}getAnchorLocalPoint(e,t=this.mainContainer){var d;let i=(d=this.getRuntimeScreenSize())!=null?d:this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n="top-right",a=this.getPositioningAnchor(this.selectedId,e!=null?e:{}),s=(e==null?void 0:e.position_ratio)!=null?ze(i.width,i.height,e.position_ratio):Re(i.width,i.height,a!=null?a:n);if(t===this.bgContainer)return new J(s.x,s.y);let o=this.getRuntimeScale(),l=(s.x-i.width/2)/o,c=(s.y-i.height/2)/o;return new J(l,c)}getPositioningAnchor(e,t){var i,n,a,s,o,l,c,d,u,p;if((t==null?void 0:t.anchor)!=null&&t.anchor!=="")return t.anchor;if(typeof window!="undefined"&&e){let g=window,h=g.__editableConfig,m=(n=(i=h==null?void 0:h.objects)==null?void 0:i.get)==null?void 0:n.call(i,e),f=(o=(a=m==null?void 0:m.transform)==null?void 0:a.anchor)!=null?o:(s=m==null?void 0:m.render)==null?void 0:s.anchor;if(f!=null&&f!=="")return f;let b=g.__editableConfigBaseline,y=(c=(l=b==null?void 0:b.objects)==null?void 0:l.get)==null?void 0:c.call(l,e),v=(p=(d=y==null?void 0:y.transform)==null?void 0:d.anchor)!=null?p:(u=y==null?void 0:y.render)==null?void 0:u.anchor;if(v!=null&&v!=="")return v}return"top-left"}updateLayout(e){var i,n,a,s,o,l,c,d,u;let t=e!=null?e:this.getScreen();if(!(!(t!=null&&t.width)||!(t!=null&&t.height))){if(console.log("[SceneEditor] updateLayout: called",{screen:{width:t.width,height:t.height},currentScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y}}),this.playModeEnabled){let p=this.getRuntimeLayoutReference();if(p){let g=Number((n=(i=p.position)==null?void 0:i.x)!=null?n:t.width/2),h=Number((s=(a=p.position)==null?void 0:a.y)!=null?s:t.height/2);this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h);let m=Number((l=(o=p.scale)==null?void 0:o.x)!=null?l:1);Number.isFinite(m)&&m>0&&(this.layoutScale=m)}this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1)}else this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.position.set(t.width/2,t.height/2),this.uiContainer.position.set(t.width/2,t.height/2),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.rotation=0,this.uiContainer.rotation=0,(c=this.mainContainer.pivot)!=null&&c.set&&this.mainContainer.pivot.set(0,0),(d=this.uiContainer.pivot)!=null&&d.set&&this.uiContainer.pivot.set(0,0);console.log("[SceneEditor] updateLayout: result",{finalScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y},position:{x:this.mainContainer.position.x,y:this.mainContainer.position.y}}),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(u=this.app)!=null&&u.stage&&(this.app.stage.hitArea=new hr(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new J(0,0)),n=this.camera.toLocal(new J(t.width,t.height)),a=Math.min(i.x,n.x),s=Math.max(i.x,n.x),o=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((s-a)/e),u=Math.ceil((l-o)/e),p=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(u/c)),h=Math.floor(a/p)*p,m=Math.floor(o/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=s;f+=p)this.gridLayer.moveTo(f,o),this.gridLayer.lineTo(f,l);for(let f=m;f<=l;f+=g)this.gridLayer.moveTo(a,f),this.gridLayer.lineTo(s,f);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){var o;let t=this.playModeEnabled?(o=e!=null?e:this.getScreen())!=null?o:this.getRuntimeScreenSize():e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=t.width,n=t.height,a=0,s=0;this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(a,s,i,n),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}syncFromGameObjectsInternal(){var i,n,a,s,o,l,c,d;if(!this.app||!this.isVisible)return;let e=window.gameObjectManager;if(!(e!=null&&e.get))return;let t=this.dragMode?this.selectedId:null;for(let[u,p]of this.objectMap.entries()){if(t&&u===t)continue;let g=e.get(u),h=((i=g==null?void 0:g.getDisplayObject)==null?void 0:i.call(g))||(g==null?void 0:g.pixiObject)||g;if(!h)continue;let m=(a=(n=p.displayObject)==null?void 0:n.parent)!=null?a:this.mainContainer,f=new J;if(typeof h.getGlobalPosition=="function"){h.getGlobalPosition(f);let L=m.toLocal(f,this.camera);p.displayObject.position.set(L.x,L.y)}else if(h.worldTransform){f.set(h.worldTransform.tx,h.worldTransform.ty);let L=m.toLocal(f,this.camera);p.displayObject.position.set(L.x,L.y)}let b=this.getWorldScale(h);if(b){let L=Number((o=(s=m.scale)==null?void 0:s.x)!=null?o:1)||1,j=Number((c=(l=m.scale)==null?void 0:l.y)!=null?c:1)||1,_=b.x/L,E=b.y/j;(d=p.displayObject.scale)!=null&&d.set?p.displayObject.scale.set(_,E):p.displayObject.scale&&(p.displayObject.scale.x=_,p.displayObject.scale.y=E)}let y=this.getWorldRotation(h);if(typeof y=="number"){let L=m?m.rotation:0;p.displayObject.rotation=y-L}let v=h.parent,S=typeof(v==null?void 0:v.getChildIndex)=="function"?v.getChildIndex(h):0;typeof h.zIndex=="number"?p.displayObject.zIndex=h.zIndex:Number.isFinite(S)&&(p.displayObject.zIndex=S)}this.updateGizmos()}getWorldScale(e){var a,s;let t=(s=e==null?void 0:e.worldTransform)!=null?s:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){var a;if(!this.app)return;let e=this.playModeEnabled?(a=this.getScreen())!=null?a:this.getRuntimeScreenSize():this.getScreen();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var m,f;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(f=(m=e.displayObject).getBounds)==null?void 0:f.call(m);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new J(t.x,t.y)),n=this.camera.toLocal(new J(t.x+t.width,t.y+t.height)),a=n.x-i.x,s=n.y-i.y,o=i.x+a/2,l=i.y+s/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,s),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=7,d={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(o,l,c).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(d),this.moveHandle.cursor="move";let u=i.x+a,p=i.y+s;this.scaleHandle.clear(),this.scaleHandle.rect(u-c,p-c,c*2,c*2).fill({color:3718648,alpha:.95}),this.scaleHandle.stroke(d),this.scaleHandle.cursor="nwse-resize";let g=o,h=i.y-c*2;this.rotateHandle.clear(),this.rotateHandle.circle(g,h,c).fill({color:16347926,alpha:.95}),this.rotateHandle.stroke(d),this.rotateHandle.cursor="crosshair"}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new we;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let s=this.toCameraFromMain(i);a.position.set(s.x,s.y),a.cursor="move",a.eventMode="static",a.on("pointerdown",o=>this.startSpawnPointDrag(n,o)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var s,o;return{x:Number((s=a==null?void 0:a.x)!=null?s:0),y:Number((o=a==null?void 0:a.y)!=null?o:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new J(e.x,e.y)),i=new J;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var o,l;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let s=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new J(s.x-a.x,s.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let s=this.getSpawnPoints(a);if(!s||!s[t])return;let o=s.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",o),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var c,d,u,p,g,h;if(!this.selectedId)return;let i=this.objectMap.get(this.selectedId);if(!(i!=null&&i.displayObject))return;let n=this.getEditableObjectConfig(this.selectedId);if(!n)return;let a=(c=n.transform)!=null?c:{},s=(d=i.displayObject.parent)!=null?d:this.mainContainer,o=this.getEventLocalPoint(t,s);if(!o)return;(u=t==null?void 0:t.stopPropagation)==null||u.call(t),(p=t==null?void 0:t.stopImmediatePropagation)==null||p.call(t);let l=this.getPositioningAnchor(this.selectedId,a);(a.anchor==null||a.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"transform.anchor",l),(((g=n==null?void 0:n.render)==null?void 0:g.anchor)==null||n.render.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"render.anchor",l),this.dragMode=e,this.dragContainer=s,this.dragStartPointer=new J(o.x,o.y),this.dragStartPos=new J(i.displayObject.position.x,i.displayObject.position.y),this.dragStartScale=typeof((h=i.displayObject.scale)==null?void 0:h.x)=="number"?i.displayObject.scale.x:1,this.dragStartRotation=typeof i.displayObject.rotation=="number"?i.displayObject.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(a,s),this.dragStartValue=this.getDragStartValue(e,a),this.dragAnchorLocal&&(this.dragStartAngle=Math.atan2(o.y-this.dragAnchorLocal.y,o.x-this.dragAnchorLocal.x),this.dragStartDistance=Math.max(1,this.distance(o,this.dragAnchorLocal))),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var y,v,S,L,j,_,E,M;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=(y=i.transform)!=null?y:{};i.transform||(i.transform=n);let a=(v=this.getRuntimeScreenSize())!=null?v:this.getScreen();if(!(a!=null&&a.width)||!(a!=null&&a.height))return;let s=this.objectMap.get(this.selectedId),o=((S=s==null?void 0:s.displayObject)==null?void 0:S.parent)===this.bgContainer,l=this.getPositioningAnchor(this.selectedId,n),c=(n==null?void 0:n.position_ratio)!=null?ze(a.width,a.height,n.position_ratio):Re(a.width,a.height,l),d=c.x,u=c.y;if(!o){let I=this.getRuntimeScale();d=(c.x-a.width/2)/I,u=(c.y-a.height/2)/I}let p=e-d,g=t-u,h=(L=n.offset)!=null?L:{x:0,y:0},m=Array.isArray(h)?Number((j=h[0])!=null?j:0):Number((_=h==null?void 0:h.x)!=null?_:0),f=Array.isArray(h)?Number((E=h[1])!=null?E:0):Number((M=h==null?void 0:h.y)!=null?M:0),b=this.buildPositionValue(n,{x:p-m,y:g-f});this.updateManager.updateProperty(this.selectedId,"transform.position",b,{refreshInspector:!0})}updateLiveConfigScale(e){var a;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(a=t.transform)!=null?a:{};t.transform||(t.transform=i);let n=Math.round(e*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.scale",n,{refreshInspector:!0})}updateLiveConfigRotation(e){var s;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(s=t.transform)!=null?s:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;if(Math.abs(n-a)>.01){let o=Math.round(n*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.rotation",o,{refreshInspector:!0})}}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Ge({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&(n(t,i),window.dispatchEvent(new CustomEvent("inspector:refresh")))}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let s=0;s<n.length-1;s+=1){let o=n[s];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new J(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),s=(i-a.left)*(this.app.renderer.width/a.width),o=(n-a.top)*(this.app.renderer.height/a.height);return new J(s,o)}getEventLocalPoint(e,t=this.mainContainer){var a,s;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new J(o.x,o.y)}let i=(s=e==null?void 0:e.global)!=null?s:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new J;return t.toLocal(new J(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),s=(t-n.top)*(this.app.renderer.height/n.height),o=new J;return i.toLocal(new J(a,s),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var Vn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[ct("playable-portrait"),ct("iphone-14"),ct("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.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;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=ct(e.defaultDevice||un.id),this.debugPanel=new Bi,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.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new Ui({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}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,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}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(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.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.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=ct(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),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(),this.updateSceneVisibility(),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=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},s=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",s),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,s=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let u=c.getBoundingClientRect().width,p=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=p?p.offsetWidth:i==="left"?350:300,m=u-g-200;return Math.max(200,m)},o=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,u=s(),p=Math.max(200,Math.min(u,a+d));e.style.width=`${p}px`;let g=this.container.querySelector(".preview-main");if(g){let m=i==="left"?`${p}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${m} minmax(${b}px, 1fr) ${f}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&et(this.scenePane,e,i!=null?i:this.previewContainer),t&&Hi(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let s=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=u=>{let p=u.clientX-s,g=Math.max(240,Math.min(l,o+p));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
2254
|
+
`,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(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,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,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new Gn().open(s)};import{Application as $o,Container as $e,Graphics as we,Point as J,Rectangle as hs,Text as Ho,TextStyle as No}from"pixi.js";import{Sprite as Ro,Container as gs}from"pixi.js";var zo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",qn=zo;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(qn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${qn}`))}}catch{}function Do(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);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(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var Te=class{static async create(e,t,i){var l,c,d,u,p,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${qn}`);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 m=new gs;return this.applyTransform(m,t==null?void 0:t.transform,t),m}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 r=await en.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ro(r),console.log("[ObjectFactory] Created object:",o,"type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(p=r==null?void 0:r.constructor)==null?void 0:p.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof gs)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;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((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Do(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Ui=class{constructor(e){this.app=null;this.camera=new $e;this.bgContainer=new $e;this.mainContainer=new $e;this.uiContainer=new $e;this.gizmoLayer=new $e;this.screenFrame=new we;this.gameFrame=new we;this.gridLayer=new we;this.spawnPointLayer=new $e;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new we;this.anchorVisualizationLayer=new we;this.moveHandle=new we;this.scaleHandle=new we;this.rotateHandle=new we;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!0;this.playModeInitialized=!1;this.layoutScale=1;this.updateManager=new Ae;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.playModeEnabled?this.schedulePostScreenSync({width:t,height:i}):this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let r=a.displayObject;if(r!=null&&r.texture)r.texture=n;else if(r!=null&&r.children){let c=r.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let o=this.getEditableObjectConfig(i);o&&(a.assetKey=this.getAssetKey(o))};this.handleLayoutApplied=e=>{var r;if(!this.isVisible)return;let t=(r=e==null?void 0:e.detail)!=null?r:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible||this.getPointerButton(e)!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new J(i.x,i.y),a=this.getPickCandidates(n);if(a.length===0){this.setSelected(null),this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let r=performance.now(),o=this.areSameIds(a,this.lastPickIds),l=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,c=r-this.lastPickTime<1200,d=o&&l&&c?(this.lastPickIndex+1)%a.length:0,u=a[d];this.lastPickIds=a,this.lastPickIndex=d,this.lastPickPoint=n,this.lastPickTime=r,this.setSelected(u)};this.handleGridSettings=e=>{var a,r,o;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(r=e==null?void 0:e.detail)==null?void 0:r.gap,n=(o=e==null?void 0:e.detail)==null?void 0:o.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handlePlayModeChange=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(!this.playModeInitialized&&(this.playModeInitialized=!0,!t)||t&&this.applyPlayModeState(!0))};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal()};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),Ge({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var n;if(!this.dragMode||!this.selectedId||!this.dragContainer||!this.dragStartPointer||!this.dragStartPos)return;let t=this.objectMap.get(this.selectedId);if(!(t!=null&&t.displayObject))return;let i=this.getPointerInContainer(e.clientX,e.clientY,this.dragContainer);if(i){if(this.dragMode==="move"){let a=i.x-this.dragStartPointer.x,r=i.y-this.dragStartPointer.y,o=this.dragStartPos.x+a,l=this.dragStartPos.y+r;t.displayObject.position.set(o,l),this.updateLiveConfigPosition(o,l)}if(this.dragMode==="scale"&&this.dragAnchorLocal){let r=Math.max(1,this.distance(i,this.dragAnchorLocal))/Math.max(1,this.dragStartDistance),o=Math.max(.01,this.dragStartScale*r);(n=t.displayObject.scale)!=null&&n.set?t.displayObject.scale.set(o,o):t.displayObject.scale&&(t.displayObject.scale.x=o,t.displayObject.scale.y=o),this.updateLiveConfigScale(o)}if(this.dragMode==="rotate"&&this.dragAnchorLocal){let a=Math.atan2(i.y-this.dragAnchorLocal.y,i.x-this.dragAnchorLocal.x),r=this.dragStartRotation+(a-this.dragStartAngle);t.displayObject.rotation=r,this.updateLiveConfigRotation(r)}this.updateGizmos()}};this.onDragEnd=()=>{this.dragMode&&(this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd))};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new J(this.app.renderer.width/2,this.app.renderer.height/2),r=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let o=this.camera.toGlobal(r);this.camera.position.set(this.camera.position.x+(a.x-o.x),this.camera.position.y+(a.y-o.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new $o,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.bgContainer.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.bgContainer),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.bgContainer.zIndex=-5e3,this.bgContainer.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.anchorVisualizationLayer),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.anchorVisualizationLayer.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),this.applyPlayModeState(!0),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.addEventListener("scene-editor:play-mode",this.handlePlayModeChange),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t)),this.applyEditControls()}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let r=a.displayObject;if(!r||r.visible===!1)continue;let o=(i=r.getBounds)==null?void 0:i.call(r);if(!o||o.width<=0||o.height<=0||e.x<o.x||e.x>o.x+o.width||e.y<o.y||e.y>o.y+o.height)continue;let l=r.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof r.zIndex=="number"?r.zIndex:0,u=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(r):0,p=c*1e6+d*1e3+u;t.push({id:n,order:p})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let n=Number(t);Number.isFinite(n)&&n>2&&(this.gridGap=n)}if(i!==null){let n=Number(i);Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n)}}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}applyPlayModeState(e){var t;this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),this.applyEditControls(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})}applyEditControls(){this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static"}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&this.playModeEnabled&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,r,o,l,c,d,u;let e=window.gameApp;if(e!=null&&e.renderer){let p=e.renderer.screen,g=Number((a=p==null?void 0:p.width)!=null?a:0),h=Number((r=p==null?void 0:p.height)!=null?r:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let m=Number((o=e.renderer.resolution)!=null?o:1)||1,f=Number((l=e.renderer.width)!=null?l:0)/m,b=Number((c=e.renderer.height)!=null?c:0)/m;if(Number.isFinite(f)&&f>0&&Number.isFinite(b)&&b>0)return{width:f,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((u=t==null?void 0:t.dataset)==null?void 0:u.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var a,r,o,l,c,d,u,p,g,h,m,f,b,y,v,S,L,j,_,E,M,I,k,T,A,C,w,x,O,P,R,z,F,G;let e=window.__screenManager;if(e){let H=["gameplay","start","tutorial","endgame","loading"];for(let B of H){let $=(a=e.get)==null?void 0:a.call(e,B);if($!=null&&$.visible){let U=(r=$.getContentLayer)==null?void 0:r.call($);if(U){let X=(o=$.x)!=null?o:0,re=(l=$.y)!=null?l:0,N=(c=U.x)!=null?c:0,ee=(d=U.y)!=null?d:0,Z=(p=(u=U.scale)==null?void 0:u.x)!=null?p:1,ae=(h=(g=U.scale)==null?void 0:g.y)!=null?h:Z;return console.log("[SceneEditor] getRuntimeLayoutReference: using visible screen contentLayer",{screenId:B,contentLayerScale:{x:Z,y:ae},position:{x:X+N,y:re+ee}}),{scale:{x:Z,y:ae},position:{x:X+N,y:re+ee},pivot:U.pivot?{x:U.pivot.x,y:U.pivot.y}:void 0}}}}for(let B of H){let $=(m=e.get)==null?void 0:m.call(e,B);if($){if(!$.visible&&typeof $.updateLayout=="function"){let X=window.gameApp;if((f=X==null?void 0:X.renderer)!=null&&f.screen){let re=X.renderer.screen.width,N=X.renderer.screen.height;re>0&&N>0&&$.updateLayout(re,N)}}let U=(b=$.getContentLayer)==null?void 0:b.call($);if(U){let X=(y=$.x)!=null?y:0,re=(v=$.y)!=null?v:0,N=(S=U.x)!=null?S:0,ee=(L=U.y)!=null?L:0,Z=(_=(j=U.scale)==null?void 0:j.x)!=null?_:1,ae=(M=(E=U.scale)==null?void 0:E.y)!=null?M:Z;return console.log("[SceneEditor] getRuntimeLayoutReference: using any screen contentLayer",{screenId:B,visible:$.visible,contentLayerScale:{x:Z,y:ae},position:{x:X+N,y:re+ee}}),{scale:{x:Z,y:ae},position:{x:X+N,y:re+ee},pivot:U.pivot?{x:U.pivot.x,y:U.pivot.y}:void 0}}}}}let t=window.__mainContainer;if(t){let H=(k=(I=t.scale)==null?void 0:I.x)!=null?k:1,B=(A=(T=t.scale)==null?void 0:T.y)!=null?A:H;return console.log("[SceneEditor] getRuntimeLayoutReference: using __mainContainer",{scale:{x:H,y:B},position:{x:(C=t.position)==null?void 0:C.x,y:(w=t.position)==null?void 0:w.y}}),t}let i=window.gameApp,n=(x=i==null?void 0:i.stage)!=null?x:null;if(n){let H=(P=(O=n.scale)==null?void 0:O.x)!=null?P:1,B=(z=(R=n.scale)==null?void 0:R.y)!=null?z:H;console.log("[SceneEditor] getRuntimeLayoutReference: using gameApp.stage (fallback)",{scale:{x:H,y:B},position:{x:(F=n.position)==null?void 0:F.x,y:(G=n.position)==null?void 0:G.y}})}else console.log("[SceneEditor] getRuntimeLayoutReference: no reference found");return n}getRuntimeScale(){var i,n;let e=this.getRuntimeLayoutReference(),t=Number((n=(i=e==null?void 0:e.scale)==null?void 0:i.x)!=null?n:1);return Number.isFinite(t)&&t>0?t:Number.isFinite(this.layoutScale)&&this.layoutScale>0?this.layoutScale:1}getRuntimeParentContainer(e){var c,d,u,p,g;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((c=i==null?void 0:i.getDisplayObject)==null?void 0:c.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let r=window.__screenManager;if(r){let h=["gameplay","start","tutorial","endgame","loading"];for(let m of h){let f=(d=r.get)==null?void 0:d.call(r,m);if(!f)continue;let b=(p=(u=f.getBgLayer)==null?void 0:u.call(f))!=null?p:f.bgLayer;if(b&&(a===b||typeof b.contains=="function"&&b.contains(a)))return this.bgContainer}}let o=this.getRuntimeLayoutReference(),l=(g=window.gameApp)==null?void 0:g.stage;return o&&l&&o===l?this.mainContainer:o&&typeof o.contains=="function"&&o.contains(a)?this.mainContainer:a===o||a===l?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var r,o,l,c,d,u,p,g,h,m;if(!e)return console.log("[SceneEditor] applyRuntimeTransform: no reference"),!1;let t=1,i=1,n=Number((o=(r=e.position)==null?void 0:r.x)!=null?o:0),a=Number((c=(l=e.position)==null?void 0:l.y)!=null?c:0);if(!Number.isFinite(n)||!Number.isFinite(a))return console.log("[SceneEditor] applyRuntimeTransform: invalid position",{posX:n,posY:a}),!1;if(console.log("[SceneEditor] applyRuntimeTransform: applying (scale always 1)",{scale:{x:t,y:i},position:{x:n,y:a}}),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((d=this.mainContainer.pivot)!=null&&d.set)&&((u=this.uiContainer.pivot)!=null&&u.set)){let f=Number((g=(p=e.pivot)==null?void 0:p.x)!=null?g:0),b=Number((m=(h=e.pivot)==null?void 0:h.y)!=null?m:0);Number.isFinite(f)&&Number.isFinite(b)&&(this.mainContainer.pivot.set(f,b),this.uiContainer.pivot.set(f,b))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),r=this.playModeEnabled?this.getRuntimeParentContainer(e):null,o=a?this.uiContainer:this.mainContainer,l=r!=null?r:o;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let d=await this.createDisplayObject(e,t);if(!d)return;l.addChild(d),this.objectMap.set(e,{id:e,displayObject:d,assetKey:i,isUi:a}),this.attachObjectInteraction(d,e)}let c=this.objectMap.get(e);c&&(c.displayObject.parent!==l&&l.addChild(c.displayObject),this.applyVisualConfig(c.displayObject,t),this.playModeEnabled||this.applyTransformFromConfig(e,c.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,u,p,g,h,m,f,b,y,v,S,L;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let _=await Te.create(e,t,this.app);if(_ instanceof $e)return _}}catch(j){console.warn("[SceneEditor] ObjectFactory failed for",e,j)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let j=this.getScreen(),_=(u=j==null?void 0:j.width)!=null?u:0,E=(p=j==null?void 0:j.height)!=null?p:0,M=new we,I=this.parseColor(n.background_color,0),k=typeof n.background_alpha=="number"?n.background_alpha:1;_>0&&E>0&&M.rect(0,0,_,E).fill({color:I,alpha:k});let T=new $e;return T.addChild(M),T}if(a){let j=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",_=new No({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:j,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new Ho({text:(y=i==null?void 0:i.text)!=null?y:"",style:_})}if((v=t==null?void 0:t.effects)!=null&&v.width||(S=t==null?void 0:t.effects)!=null&&S.height){let j=new we,_=typeof t.effects.width=="number"?t.effects.width:100,E=typeof t.effects.height=="number"?t.effects.height:100,M=(L=t.effects.fill_color)!=null?L:"#ffffff",I=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,k=Number.parseInt(String(M).replace("#",""),16);return j.rect(0,0,_,E).fill({color:Number.isFinite(k)?k:16777215,alpha:I}),j}return new $e}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new hs(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var a,r,o;if(!e)return;let i=(a=t==null?void 0:t.render)!=null?a:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n={x:.5,y:.5};if((r=e.anchor)!=null&&r.set)e.anchor.set(n.x,n.y);else if(e.pivot){let l=(o=e.getLocalBounds)==null?void 0:o.call(e);l&&e.pivot.set(l.width*n.x,l.height*n.y)}}applyTransformFromConfig(e,t,i){var _,E,M,I,k,T,A,C,w,x,O;if(!t)return;let n=this.getScreen();if(!(n!=null&&n.width)||!(n!=null&&n.height))return;let a=(_=i==null?void 0:i.transform)!=null?_:{},r=this.getPositioningAnchor(e,a),o=a==null?void 0:a.position_ratio,l=a==null?void 0:a.position,c=a==null?void 0:a.offset,d=Array.isArray(l)?Number((E=l[0])!=null?E:0):Number((M=l==null?void 0:l.x)!=null?M:0),u=Array.isArray(l)?Number((I=l[1])!=null?I:0):Number((k=l==null?void 0:l.y)!=null?k:0),p=Array.isArray(c)?Number((T=c[0])!=null?T:0):Number((A=c==null?void 0:c.x)!=null?A:0),g=Array.isArray(c)?Number((C=c[1])!=null?C:0):Number((w=c==null?void 0:c.y)!=null?w:0),h=(Number.isFinite(d)?d:0)+(Number.isFinite(p)?p:0),m=(Number.isFinite(u)?u:0)+(Number.isFinite(g)?g:0),f=o!=null?ze(n.width,n.height,o):Re(n.width,n.height,r),b=this.getRuntimeScale(),y=(f.x-n.width/2)/b+h,v=(f.y-n.height/2)/b+m;(x=t.position)!=null&&x.set?t.position.set(y,v):t.position&&(t.position.x=y,t.position.y=v);let L=(typeof(a==null?void 0:a.scale)=="number"?a.scale:1)*this.getRuntimeScale();(O=t.scale)!=null&&O.set?t.scale.set(L,L):t.scale&&(t.scale.x=L,t.scale.y=L);let j=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(j)}getAnchorLocalPoint(e,t=this.mainContainer){var d;let i=(d=this.getRuntimeScreenSize())!=null?d:this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n="top-right",a=this.getPositioningAnchor(this.selectedId,e!=null?e:{}),r=(e==null?void 0:e.position_ratio)!=null?ze(i.width,i.height,e.position_ratio):Re(i.width,i.height,a!=null?a:n);if(t===this.bgContainer)return new J(r.x,r.y);let o=this.getRuntimeScale(),l=(r.x-i.width/2)/o,c=(r.y-i.height/2)/o;return new J(l,c)}getPositioningAnchor(e,t){var i,n,a,r,o,l,c,d,u,p;if((t==null?void 0:t.anchor)!=null&&t.anchor!=="")return t.anchor;if(typeof window!="undefined"&&e){let g=window,h=g.__editableConfig,m=(n=(i=h==null?void 0:h.objects)==null?void 0:i.get)==null?void 0:n.call(i,e),f=(o=(a=m==null?void 0:m.transform)==null?void 0:a.anchor)!=null?o:(r=m==null?void 0:m.render)==null?void 0:r.anchor;if(f!=null&&f!=="")return f;let b=g.__editableConfigBaseline,y=(c=(l=b==null?void 0:b.objects)==null?void 0:l.get)==null?void 0:c.call(l,e),v=(p=(d=y==null?void 0:y.transform)==null?void 0:d.anchor)!=null?p:(u=y==null?void 0:y.render)==null?void 0:u.anchor;if(v!=null&&v!=="")return v}return"top-left"}getActiveScreenSize(e){var t,i;return this.playModeEnabled?(i=(t=this.getRuntimeScreenSize())!=null?t:e)!=null?i:this.getScreen():e!=null?e:this.getScreen()}updateLayout(e){var i,n,a,r,o,l,c,d,u;let t=this.getActiveScreenSize(e);if(!(!(t!=null&&t.width)||!(t!=null&&t.height))){if(console.log("[SceneEditor] updateLayout: called",{screen:{width:t.width,height:t.height},currentScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y}}),this.playModeEnabled){let p=this.getRuntimeLayoutReference();if(p){let g=Number((n=(i=p.position)==null?void 0:i.x)!=null?n:t.width/2),h=Number((r=(a=p.position)==null?void 0:a.y)!=null?r:t.height/2);this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h);let m=Number((l=(o=p.scale)==null?void 0:o.x)!=null?l:1);Number.isFinite(m)&&m>0&&(this.layoutScale=m)}this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1)}else this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.position.set(t.width/2,t.height/2),this.uiContainer.position.set(t.width/2,t.height/2),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.rotation=0,this.uiContainer.rotation=0,(c=this.mainContainer.pivot)!=null&&c.set&&this.mainContainer.pivot.set(0,0),(d=this.uiContainer.pivot)!=null&&d.set&&this.uiContainer.pivot.set(0,0);console.log("[SceneEditor] updateLayout: result",{finalScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y},position:{x:this.mainContainer.position.x,y:this.mainContainer.position.y}}),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(u=this.app)!=null&&u.stage&&(this.app.stage.hitArea=new hs(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new J(0,0)),n=this.camera.toLocal(new J(t.width,t.height)),a=Math.min(i.x,n.x),r=Math.max(i.x,n.x),o=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((r-a)/e),u=Math.ceil((l-o)/e),p=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(u/c)),h=Math.floor(a/p)*p,m=Math.floor(o/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=r;f+=p)this.gridLayer.moveTo(f,o),this.gridLayer.lineTo(f,l);for(let f=m;f<=l;f+=g)this.gridLayer.moveTo(a,f),this.gridLayer.lineTo(r,f);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){let t=this.getActiveScreenSize(e);if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=t.width,n=t.height,a=0,r=0;this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(a,r,i,n),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}syncFromGameObjectsInternal(){var i,n,a,r,o,l,c,d;if(!this.app||!this.isVisible)return;let e=window.gameObjectManager;if(!(e!=null&&e.get))return;let t=this.dragMode?this.selectedId:null;for(let[u,p]of this.objectMap.entries()){if(t&&u===t)continue;let g=e.get(u),h=((i=g==null?void 0:g.getDisplayObject)==null?void 0:i.call(g))||(g==null?void 0:g.pixiObject)||g;if(!h)continue;let m=(a=(n=p.displayObject)==null?void 0:n.parent)!=null?a:this.mainContainer,f=new J;if(typeof h.getGlobalPosition=="function"){h.getGlobalPosition(f);let L=m.toLocal(f,this.camera);p.displayObject.position.set(L.x,L.y)}else if(h.worldTransform){f.set(h.worldTransform.tx,h.worldTransform.ty);let L=m.toLocal(f,this.camera);p.displayObject.position.set(L.x,L.y)}let b=this.getWorldScale(h);if(b){let L=Number((o=(r=m.scale)==null?void 0:r.x)!=null?o:1)||1,j=Number((c=(l=m.scale)==null?void 0:l.y)!=null?c:1)||1,_=b.x/L,E=b.y/j;(d=p.displayObject.scale)!=null&&d.set?p.displayObject.scale.set(_,E):p.displayObject.scale&&(p.displayObject.scale.x=_,p.displayObject.scale.y=E)}let y=this.getWorldRotation(h);if(typeof y=="number"){let L=m?m.rotation:0;p.displayObject.rotation=y-L}let v=h.parent,S=typeof(v==null?void 0:v.getChildIndex)=="function"?v.getChildIndex(h):0;typeof h.zIndex=="number"?p.displayObject.zIndex=h.zIndex:Number.isFinite(S)&&(p.displayObject.zIndex=S)}this.updateGizmos()}getWorldScale(e){var a,r;let t=(r=e==null?void 0:e.worldTransform)!=null?r:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){if(!this.app)return;let e=this.getActiveScreenSize();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var m,f;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(f=(m=e.displayObject).getBounds)==null?void 0:f.call(m);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new J(t.x,t.y)),n=this.camera.toLocal(new J(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=7,d={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(o,l,c).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(d),this.moveHandle.cursor="move";let u=i.x+a,p=i.y+r;this.scaleHandle.clear(),this.scaleHandle.rect(u-c,p-c,c*2,c*2).fill({color:3718648,alpha:.95}),this.scaleHandle.stroke(d),this.scaleHandle.cursor="nwse-resize";let g=o,h=i.y-c*2;this.rotateHandle.clear(),this.rotateHandle.circle(g,h,c).fill({color:16347926,alpha:.95}),this.rotateHandle.stroke(d),this.rotateHandle.cursor="crosshair"}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new we;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let r=this.toCameraFromMain(i);a.position.set(r.x,r.y),a.cursor="move",a.eventMode="static",a.on("pointerdown",o=>this.startSpawnPointDrag(n,o)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var r,o;return{x:Number((r=a==null?void 0:a.x)!=null?r:0),y:Number((o=a==null?void 0:a.y)!=null?o:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new J(e.x,e.y)),i=new J;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var o,l;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let r=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new J(r.x-a.x,r.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let r=this.getSpawnPoints(a);if(!r||!r[t])return;let o=r.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",o),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var c,d,u,p,g,h;if(!this.selectedId)return;let i=this.objectMap.get(this.selectedId);if(!(i!=null&&i.displayObject))return;let n=this.getEditableObjectConfig(this.selectedId);if(!n)return;let a=(c=n.transform)!=null?c:{},r=(d=i.displayObject.parent)!=null?d:this.mainContainer,o=this.getEventLocalPoint(t,r);if(!o)return;(u=t==null?void 0:t.stopPropagation)==null||u.call(t),(p=t==null?void 0:t.stopImmediatePropagation)==null||p.call(t);let l=this.getPositioningAnchor(this.selectedId,a);(a.anchor==null||a.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"transform.anchor",l),(((g=n==null?void 0:n.render)==null?void 0:g.anchor)==null||n.render.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"render.anchor",l),this.dragMode=e,this.dragContainer=r,this.dragStartPointer=new J(o.x,o.y),this.dragStartPos=new J(i.displayObject.position.x,i.displayObject.position.y),this.dragStartScale=typeof((h=i.displayObject.scale)==null?void 0:h.x)=="number"?i.displayObject.scale.x:1,this.dragStartRotation=typeof i.displayObject.rotation=="number"?i.displayObject.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(a,r),this.dragStartValue=this.getDragStartValue(e,a),this.dragAnchorLocal&&(this.dragStartAngle=Math.atan2(o.y-this.dragAnchorLocal.y,o.x-this.dragAnchorLocal.x),this.dragStartDistance=Math.max(1,this.distance(o,this.dragAnchorLocal))),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var y,v,S,L,j,_,E,M;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=(y=i.transform)!=null?y:{};i.transform||(i.transform=n);let a=(v=this.getRuntimeScreenSize())!=null?v:this.getScreen();if(!(a!=null&&a.width)||!(a!=null&&a.height))return;let r=this.objectMap.get(this.selectedId),o=((S=r==null?void 0:r.displayObject)==null?void 0:S.parent)===this.bgContainer,l=this.getPositioningAnchor(this.selectedId,n),c=(n==null?void 0:n.position_ratio)!=null?ze(a.width,a.height,n.position_ratio):Re(a.width,a.height,l),d=c.x,u=c.y;if(!o){let I=this.getRuntimeScale();d=(c.x-a.width/2)/I,u=(c.y-a.height/2)/I}let p=e-d,g=t-u,h=(L=n.offset)!=null?L:{x:0,y:0},m=Array.isArray(h)?Number((j=h[0])!=null?j:0):Number((_=h==null?void 0:h.x)!=null?_:0),f=Array.isArray(h)?Number((E=h[1])!=null?E:0):Number((M=h==null?void 0:h.y)!=null?M:0),b=this.buildPositionValue(n,{x:p-m,y:g-f});this.updateManager.updateProperty(this.selectedId,"transform.position",b,{refreshInspector:!0})}updateLiveConfigScale(e){var a;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(a=t.transform)!=null?a:{};t.transform||(t.transform=i);let n=Math.round(e*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.scale",n,{refreshInspector:!0})}updateLiveConfigRotation(e){var r;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(r=t.transform)!=null?r:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;if(Math.abs(n-a)>.01){let o=Math.round(n*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.rotation",o,{refreshInspector:!0})}}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Ge({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&(n(t,i),window.dispatchEvent(new CustomEvent("inspector:refresh")))}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new J(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),r=(i-a.left)*(this.app.renderer.width/a.width),o=(n-a.top)*(this.app.renderer.height/a.height);return new J(r,o)}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new J(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new J;return t.toLocal(new J(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new J;return i.toLocal(new J(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var Vn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[ct("playable-portrait"),ct("iphone-14"),ct("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.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;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=ct(e.defaultDevice||un.id),this.debugPanel=new Bi,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.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new Ui({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}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,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}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(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.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.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=ct(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),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(),this.updateSceneVisibility(),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=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let u=c.getBoundingClientRect().width,p=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=p?p.offsetWidth:i==="left"?350:300,m=u-g-200;return Math.max(200,m)},o=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,u=r(),p=Math.max(200,Math.min(u,a+d));e.style.width=`${p}px`;let g=this.container.querySelector(".preview-main");if(g){let m=i==="left"?`${p}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${m} minmax(${b}px, 1fr) ${f}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&et(this.scenePane,e,i!=null?i:this.previewContainer),t&&Hi(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=u=>{let p=u.clientX-r,g=Math.max(240,Math.min(l,o+p));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
|
|
2255
2255
|
<div class="preview-toolbar">
|
|
2256
2256
|
<div class="preview-toolbar-left">
|
|
2257
2257
|
<span class="preview-logo">PREVIEWER</span>
|
|
@@ -2260,7 +2260,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2260
2260
|
<div class="preview-toolbar-center">
|
|
2261
2261
|
<div class="device-selector-wrapper">
|
|
2262
2262
|
<select class="device-dropdown" id="device-select">
|
|
2263
|
-
${
|
|
2263
|
+
${Cr.map(i=>`
|
|
2264
2264
|
<optgroup label="${i.label}">
|
|
2265
2265
|
${i.devices.map(n=>`
|
|
2266
2266
|
<option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
|
|
@@ -2443,7 +2443,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2443
2443
|
</div>
|
|
2444
2444
|
|
|
2445
2445
|
</div>
|
|
2446
|
-
`,this.setupEventListeners(e),e}setupEventListeners(e){var j,_,E,M,I,k,T,A;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",C=>{if(this.viewMode==="compare")return;let w=C.target.value;this.setDevice(w)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",C=>{let w=C.target.value;this.setTheme(w)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.viewToggle;w&&this.setViewMode(w)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.layoutToggle;w&&this.setLayoutMode(w)})});let s=e.querySelector("#scene-toggle");s==null||s.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=C=>{let w=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${C}::${w}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),u=(C,w,x)=>{C&&(C.textContent=w?`${x} On`:`${x} Off`,C.setAttribute("aria-pressed",w?"true":"false"))},p=()=>{let C=window.localStorage.getItem(l("grid_gap")),w=Number(C!=null?C:50);return Number.isFinite(w)?w:50},g=C=>{try{window.localStorage.setItem(l("grid_enabled"),C?"true":"false")}catch{}u(c,C,"Grid");let w=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:C,gap:w}}))},h=C=>{try{window.localStorage.setItem(l("play_mode"),C?"true":"false")}catch{}u(d,C,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:C}}))};try{let C=window.localStorage.getItem(l("grid_enabled"))==="true",w=!0;try{window.localStorage.setItem(l("play_mode"),"true")}catch{}if(u(c,C,"Grid"),u(d,w,"Play"),d&&(d.disabled=!0),c){let x=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:C,gap:x}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:w}}))}catch{}c==null||c.addEventListener("click",()=>{let C=c.getAttribute("aria-pressed")==="true";g(!C)}),d==null||d.addEventListener("click",()=>{let C=d.getAttribute("aria-pressed")==="true";h(!C)}),(j=e.querySelector("#rotate-btn"))==null||j.addEventListener("click",()=>this.toggleRotation()),(_=e.querySelector("#zoom-in-btn"))==null||_.addEventListener("click",()=>this.adjustUserZoom(.1)),(E=e.querySelector("#zoom-out-btn"))==null||E.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#refresh-btn"))==null||M.addEventListener("click",()=>this.refresh());let m=e.querySelector("#bottom-dock"),f=e.querySelector("#bottom-dock-resize");m&&f&&this.makeBottomDockResizable(m,f);let b=Array.from(e.querySelectorAll(".bottom-dock-tab"));b.forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.dockTab;if(!w)return;b.forEach(O=>O.classList.remove("active")),C.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let P=O.dataset.dockPanel;O.classList.toggle("active",P===w)})})}),(I=e.querySelector("#console-clear"))==null||I.addEventListener("click",()=>this.clearConsole()),(k=e.querySelector("#corner-zoom-in-btn"))==null||k.addEventListener("click",()=>this.adjustUserZoom(.1)),(T=e.querySelector("#corner-zoom-out-btn"))==null||T.addEventListener("click",()=>this.adjustUserZoom(-.1)),(A=e.querySelector("#corner-grab-btn"))==null||A.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let y=e.querySelector(".scene-panel.scene-objects"),v=y==null?void 0:y.querySelector("[data-panel-resize-v]");y&&v&&this.makeSidebarResizable(y,v,"left");let S=e.querySelector(".debug-workbench"),L=S==null?void 0:S.querySelector("#workbench-resize-v");S&&L&&this.makeSidebarResizable(S,L,"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 s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier: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.gameViewPane||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}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),Ba();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),Ua();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=st().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}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.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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(s=>typeof s=="object"?this.safeStringify(s):String(s)).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 s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>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(u=>u.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!s||!o||!l||(t.addEventListener("click",u=>{let p=u.target;if(p!=null&&p.closest("[data-compare-focus]")){u.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:s,wrapper:o,frame:l,canvas:c,focus:d}))})}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");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(a=this.options).onDeviceChange)==null||s.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,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,u=(s-c)/2;n.clearRect(0,0,a,s),n.drawImage(i,d,u,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"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.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 mr(r={}){let e=new Vn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Yn(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function fr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Fo(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 br(r,e){var d,u,p;if(!r||!e)return;let t=e.transform||{};Fo(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0),o=333,l=111;a+=o,s+=l,console.log("[DEBUG FALLBACK] tryApplyTransform (live-edit) position.set",a,s,"(raw + 333, +111)"),(d=r.position)!=null&&d.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((u=r.scale)!=null&&u.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let c=t.anchor;if(c&&((p=r.anchor)!=null&&p.set)){let g=null;typeof window!="undefined"&&window.resolveAnchorVec2?g=window.resolveAnchorVec2(c):typeof c=="object"&&c.x!==void 0&&c.y!==void 0?g=c:Array.isArray(c)&&c.length===2&&(g={x:c[0],y:c[1]}),g&&typeof g.x=="number"&&typeof g.y=="number"&&r.anchor.set(g.x,g.y)}}function yr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=Yn(e),i=a=>{var s;try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let l=window.__HANDLER_SCREEN_INDEX,c=(s=l==null?void 0:l.screenToInstances)==null?void 0:s[o];if(Array.isArray(c)&&c.length>0){let u=new Set(c);return a.filter(p=>u.has(p))}let d=l==null?void 0:l.instanceToScreen;return d?a.filter(u=>d[u]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>yr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Yn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Yn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var u,p,g,h,m,f;let s=(h=(g=(p=(u=window.__editableConfig)==null?void 0:u.objects)==null?void 0:p.get)==null?void 0:g.call(p,a))!=null?h:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.screenToInstances)==null?void 0:m[o];if(Array.isArray(c))return c.includes(a)?s:null;let d=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return d&&d===o?s: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 s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function Bo(){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,s,o;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),u=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),p=await l.load(u);if(!p)return;c[t]=p;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=p);let h=window.gameObjectManager,m=(s=h==null?void 0:h.get)==null?void 0:s.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=p;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=p)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=nn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Wt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=nn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Wt(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,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&Wt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Wn(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let u=window.gameApp,p=await Te.create(a,s,u);c&&(d!==void 0&&d!==-1?c.addChildAt(p,d):c.addChild(p));let g=t.create(a,p);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(Bo(),window.applyEditableObjectConfig=(a,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let u=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!u),u&&(console.log("[LIVE-EDIT] gameObject type:",(c=u.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof u.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof u.onConfigUpdate=="function")),u&&typeof u.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),u.updateConfig(s);else if(u&&typeof u.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),u.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let p=fr(u);br(p,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,s){var d,u;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(u=t==null?void 0:t.get)==null?void 0:u.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(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let p=fr(l);br(p,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,yr(a))}};return n.rebuildIndexes(),n}import Uo from"lottie-web";Jn(Ss);typeof window!="undefined"&&!window.lottie&&(window.lottie=Uo);var ht=null,Go=async()=>{if(!ht){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]);ht=JSON.parse(i)}else ht=JSON.parse(e);return ht}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ht=await(await fetch("./handler.config.json")).json()}return ht},Zn,Dt,xr,mt,Kn,Xn;function Yp(r){Zn=r.initGame,Dt=r.CustomAssets,xr=r.updateScreenState,mt=r.globalResponsiveMultipliers,Kn=r.layout,Xn=r.clearResponsiveElements}var Gi="web_embed",zt="https://example.com",vr={profile_id:Gi},We=null,ke=null,Rt={width:0,height:0},qo=!0,Wp=async()=>{var c,d,u,p;document.title="Handler Pixi Game";let r=await Go();vr={...r.ids||{},profile_id:Gi},zt=r.destination_url||((d=(c=r.export_profiles)==null?void 0:c[Gi])==null?void 0:d.destination_url)||zt,He.init({ids:vr,profile:Gi,destinationUrl:zt});let e=He.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ke=mr({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),wr()},onRefresh:wr});let g=ke.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,S,L,j,_,E,M,I,k,T,A,C,w;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if(Rt.width=b,Rt.height=y,xr(b,y),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(b,y);let x=m.view;x&&(x.style.width="100%",x.style.height="100%",x.style.display="block")}catch(x){console.warn("[SCREEN] Error resizing renderer:",x);return}if(t&&f&&Kn)try{let x=(v=window.__mainContainer)!=null?v:m.stage,O=(M=(E=(j=window.__tutorialLabel)!=null?j:(L=(S=f.get("label_1"))==null?void 0:S.getDisplayObject)==null?void 0:L.call(S))!=null?E:(_=f.get("label_1"))==null?void 0:_.pixiObject)!=null?M:f.get("label_1"),P=f.get("background_1"),R=(A=(T=(k=window.__background)!=null?k:(I=P==null?void 0:P.getDisplayObject)==null?void 0:I.call(P))!=null?T:P==null?void 0:P.pixiObject)!=null?A:P;if(x){let z=x===m.stage;Kn({mainContainer:x,label:O,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:m},t,0,Rt,f,{skipMainContainerTransform:z}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:Rt.width,height:Rt.height,presetId:(w=(C=h.detail)==null?void 0:C.presetId)!=null?w:null}}))}}catch(x){console.warn("[SCREEN] Error in layout:",x)}}})}let t=await Xt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=an(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(p=(u=t.engine.runtime)==null?void 0:u.layout)!=null&&p.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Xt("scene.main"));let i=await Zn(e,t,zt,ke);We=i.app;let n=i.gameObjectManager;window.gameApp=We,window.gameObjectManager=n;try{window.__liveEditBridge=Wn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Dt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ke&&ke.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(mt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(We,n);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,S=await fetch(v,{cache:"no-cache"});if(!S.ok)return null;let L=await S.text();try{return JSON.parse(L)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[y,v]of Object.entries(m)){let S=v==null?void 0:v.source;if(typeof S!="string")continue;let L=await g(S),j=L==null?void 0:L.elements;if(!Array.isArray(j))continue;let _=j.map(E=>E==null?void 0:E.instance_id).filter(E=>typeof E=="string");f[y]=_;for(let E of _)b[E]||(b[E]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(qo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${mt.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((S,L)=>{if(S&&S.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(S&&S.scale){let j=S.scale.x||1,_=S.scale.y||1;S.__originalScale||(S.__originalScale={x:j,y:_},console.log(`${v}[RESPONSIVE] Stored original scale for child[${L}]: ${j.toFixed(3)}, ${_.toFixed(3)}`));let E=S.__originalScale.x*mt.scale,M=S.__originalScale.y*mt.scale;typeof S.scale.set=="function"?S.scale.set(E,M):(S.scale.x=E,S.scale.y=M),console.log(`${v}[RESPONSIVE] Child[${L}] scale: ${j.toFixed(3)}\u2192${S.scale.x.toFixed(3)} (type: ${S.constructor.name})`),f(S,y+1)}else S&&console.log(`${v}[RESPONSIVE] Child[${L}] has no scale (type: ${S.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(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){mt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,He.start()},wr=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(ke){ke.notifyGameDestroyed();try{Xn&&Xn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ke.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),We){try{We.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}We=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Dt.resetScene=="function"&&Dt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Xt("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=an(o)),Zn(a,o,zt).then(l=>{We=l.app,window.gameApp=We,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Wn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Dt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ke&&ke.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{He.start()}catch{}})})},100)},1e3)}};var Ne={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Vo=1.25,Yo={fontFamily:"Inter, system-ui, sans-serif"};var Qn=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=`
|
|
2446
|
+
`,this.setupEventListeners(e),e}setupEventListeners(e){var j,_,E,M,I,k,T,A;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",C=>{if(this.viewMode==="compare")return;let w=C.target.value;this.setDevice(w)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",C=>{let w=C.target.value;this.setTheme(w)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.viewToggle;w&&this.setViewMode(w)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.layoutToggle;w&&this.setLayoutMode(w)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=C=>{let w=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${C}::${w}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),u=(C,w,x)=>{C&&(C.textContent=w?`${x} On`:`${x} Off`,C.setAttribute("aria-pressed",w?"true":"false"))},p=()=>{let C=window.localStorage.getItem(l("grid_gap")),w=Number(C!=null?C:50);return Number.isFinite(w)?w:50},g=C=>{try{window.localStorage.setItem(l("grid_enabled"),C?"true":"false")}catch{}u(c,C,"Grid");let w=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:C,gap:w}}))},h=C=>{try{window.localStorage.setItem(l("play_mode"),C?"true":"false")}catch{}u(d,C,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:C}}))};try{let C=window.localStorage.getItem(l("grid_enabled"))==="true",w=!0;try{window.localStorage.setItem(l("play_mode"),"true")}catch{}if(u(c,C,"Grid"),u(d,w,"Play"),d&&(d.disabled=!0),c){let x=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:C,gap:x}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:w}}))}catch{}c==null||c.addEventListener("click",()=>{let C=c.getAttribute("aria-pressed")==="true";g(!C)}),d==null||d.addEventListener("click",()=>{let C=d.getAttribute("aria-pressed")==="true";h(!C)}),(j=e.querySelector("#rotate-btn"))==null||j.addEventListener("click",()=>this.toggleRotation()),(_=e.querySelector("#zoom-in-btn"))==null||_.addEventListener("click",()=>this.adjustUserZoom(.1)),(E=e.querySelector("#zoom-out-btn"))==null||E.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#refresh-btn"))==null||M.addEventListener("click",()=>this.refresh());let m=e.querySelector("#bottom-dock"),f=e.querySelector("#bottom-dock-resize");m&&f&&this.makeBottomDockResizable(m,f);let b=Array.from(e.querySelectorAll(".bottom-dock-tab"));b.forEach(C=>{C.addEventListener("click",()=>{let w=C.dataset.dockTab;if(!w)return;b.forEach(O=>O.classList.remove("active")),C.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let P=O.dataset.dockPanel;O.classList.toggle("active",P===w)})})}),(I=e.querySelector("#console-clear"))==null||I.addEventListener("click",()=>this.clearConsole()),(k=e.querySelector("#corner-zoom-in-btn"))==null||k.addEventListener("click",()=>this.adjustUserZoom(.1)),(T=e.querySelector("#corner-zoom-out-btn"))==null||T.addEventListener("click",()=>this.adjustUserZoom(-.1)),(A=e.querySelector("#corner-grab-btn"))==null||A.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let y=e.querySelector(".scene-panel.scene-objects"),v=y==null?void 0:y.querySelector("[data-panel-resize-v]");y&&v&&this.makeSidebarResizable(y,v,"left");let S=e.querySelector(".debug-workbench"),L=S==null?void 0:S.querySelector("#workbench-resize-v");S&&L&&this.makeSidebarResizable(S,L,"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 r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier: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.gameViewPane||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}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),Ba();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),Ua();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=rt().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}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.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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(r=>typeof r=="object"?this.safeStringify(r):String(r)).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 r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>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(u=>u.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",u=>{let p=u.target;if(p!=null&&p.closest("[data-compare-focus]")){u.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}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");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.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,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,u=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,u,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"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.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 ms(s={}){let e=new Vn(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Yn(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function fs(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function Fo(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function bs(s,e){var d,u,p;if(!s||!e)return;let t=e.transform||{};Fo(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0),o=333,l=111;a+=o,r+=l,console.log("[DEBUG FALLBACK] tryApplyTransform (live-edit) position.set",a,r,"(raw + 333, +111)"),(d=s.position)!=null&&d.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((u=s.scale)!=null&&u.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let c=t.anchor;if(c&&((p=s.anchor)!=null&&p.set)){let g=null;typeof window!="undefined"&&window.resolveAnchorVec2?g=window.resolveAnchorVec2(c):typeof c=="object"&&c.x!==void 0&&c.y!==void 0?g=c:Array.isArray(c)&&c.length===2&&(g={x:c[0],y:c[1]}),g&&typeof g.x=="number"&&typeof g.y=="number"&&s.anchor.set(g.x,g.y)}}function ys(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Yn(e),i=a=>{var r;try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let l=window.__HANDLER_SCREEN_INDEX,c=(r=l==null?void 0:l.screenToInstances)==null?void 0:r[o];if(Array.isArray(c)&&c.length>0){let u=new Set(c);return a.filter(p=>u.has(p))}let d=l==null?void 0:l.instanceToScreen;return d?a.filter(u=>d[u]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>ys(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Yn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Yn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var u,p,g,h,m,f;let r=(h=(g=(p=(u=window.__editableConfig)==null?void 0:u.objects)==null?void 0:p.get)==null?void 0:g.call(p,a))!=null?h:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.screenToInstances)==null?void 0:m[o];if(Array.isArray(c))return c.includes(a)?r:null;let d=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return d&&d===o?r: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 r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function Bo(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),u=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),p=await l.load(u);if(!p)return;c[t]=p;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=p);let h=window.gameObjectManager,m=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=p;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=p)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=nn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Wt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=nn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Wt(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,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Wt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Wn(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let u=window.gameApp,p=await Te.create(a,r,u);c&&(d!==void 0&&d!==-1?c.addChildAt(p,d):c.addChild(p));let g=t.create(a,p);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(Bo(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let u=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!u),u&&(console.log("[LIVE-EDIT] gameObject type:",(c=u.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof u.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof u.onConfigUpdate=="function")),u&&typeof u.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),u.updateConfig(r);else if(u&&typeof u.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),u.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let p=fs(u);bs(p,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,u;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(u=t==null?void 0:t.get)==null?void 0:u.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(r);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 p=fs(l);bs(p,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,ys(a))}};return n.rebuildIndexes(),n}import Uo from"lottie-web";Jn(Sr);typeof window!="undefined"&&!window.lottie&&(window.lottie=Uo);var ht=null,Go=async()=>{if(!ht){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ht=JSON.parse(i)}else ht=JSON.parse(e);return ht}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ht=await(await fetch("./handler.config.json")).json()}return ht},Zn,Dt,xs,mt,Kn,Xn;function Yp(s){Zn=s.initGame,Dt=s.CustomAssets,xs=s.updateScreenState,mt=s.globalResponsiveMultipliers,Kn=s.layout,Xn=s.clearResponsiveElements}var Gi="web_embed",zt="https://example.com",vs={profile_id:Gi},We=null,ke=null,Rt={width:0,height:0},qo=!0,Wp=async()=>{var c,d,u,p;document.title="Handler Pixi Game";let s=await Go();vs={...s.ids||{},profile_id:Gi},zt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[Gi])==null?void 0:d.destination_url)||zt,He.init({ids:vs,profile:Gi,destinationUrl:zt});let e=He.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ke=ms({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),ws()},onRefresh:ws});let g=ke.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,S,L,j,_,E,M,I,k,T,A,C,w;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if(Rt.width=b,Rt.height=y,xs(b,y),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(b,y);let x=m.view;x&&(x.style.width="100%",x.style.height="100%",x.style.display="block")}catch(x){console.warn("[SCREEN] Error resizing renderer:",x);return}if(t&&f&&Kn)try{let x=(v=window.__mainContainer)!=null?v:m.stage,O=(M=(E=(j=window.__tutorialLabel)!=null?j:(L=(S=f.get("label_1"))==null?void 0:S.getDisplayObject)==null?void 0:L.call(S))!=null?E:(_=f.get("label_1"))==null?void 0:_.pixiObject)!=null?M:f.get("label_1"),P=f.get("background_1"),R=(A=(T=(k=window.__background)!=null?k:(I=P==null?void 0:P.getDisplayObject)==null?void 0:I.call(P))!=null?T:P==null?void 0:P.pixiObject)!=null?A:P;if(x){let z=x===m.stage;Kn({mainContainer:x,label:O,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:m},t,0,Rt,f,{skipMainContainerTransform:z}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:Rt.width,height:Rt.height,presetId:(w=(C=h.detail)==null?void 0:C.presetId)!=null?w:null}}))}}catch(x){console.warn("[SCREEN] Error in layout:",x)}}})}let t=await Xt("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=an(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(p=(u=t.engine.runtime)==null?void 0:u.layout)!=null&&p.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Xt("scene.main"));let i=await Zn(e,t,zt,ke);We=i.app;let n=i.gameObjectManager;window.gameApp=We,window.gameObjectManager=n;try{window.__liveEditBridge=Wn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Dt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ke&&ke.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(mt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(We,n);async function r(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,S=await fetch(v,{cache:"no-cache"});if(!S.ok)return null;let L=await S.text();try{return JSON.parse(L)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[y,v]of Object.entries(m)){let S=v==null?void 0:v.source;if(typeof S!="string")continue;let L=await g(S),j=L==null?void 0:L.elements;if(!Array.isArray(j))continue;let _=j.map(E=>E==null?void 0:E.instance_id).filter(E=>typeof E=="string");f[y]=_;for(let E of _)b[E]||(b[E]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(qo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${mt.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((S,L)=>{if(S&&S.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(S&&S.scale){let j=S.scale.x||1,_=S.scale.y||1;S.__originalScale||(S.__originalScale={x:j,y:_},console.log(`${v}[RESPONSIVE] Stored original scale for child[${L}]: ${j.toFixed(3)}, ${_.toFixed(3)}`));let E=S.__originalScale.x*mt.scale,M=S.__originalScale.y*mt.scale;typeof S.scale.set=="function"?S.scale.set(E,M):(S.scale.x=E,S.scale.y=M),console.log(`${v}[RESPONSIVE] Child[${L}] scale: ${j.toFixed(3)}\u2192${S.scale.x.toFixed(3)} (type: ${S.constructor.name})`),f(S,y+1)}else S&&console.log(`${v}[RESPONSIVE] Child[${L}] has no scale (type: ${S.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(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){mt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,He.start()},ws=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;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(ke){ke.notifyGameDestroyed();try{Xn&&Xn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ke.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),We){try{We.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}We=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Dt.resetScene=="function"&&Dt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Xt("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=an(o)),Zn(a,o,zt).then(l=>{We=l.app,window.gameApp=We,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Wn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Dt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ke&&ke.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{He.start()}catch{}})})},100)},1e3)}};var Ne={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Vo=1.25,Yo={fontFamily:"Inter, system-ui, sans-serif"};var Qn=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=`
|
|
2447
2447
|
position: fixed;
|
|
2448
2448
|
inset: 0;
|
|
2449
2449
|
display: flex;
|
|
@@ -2478,17 +2478,17 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2478
2478
|
justify-content: space-between;
|
|
2479
2479
|
align-items: flex-end;
|
|
2480
2480
|
margin-bottom: 8px;
|
|
2481
|
-
`;let
|
|
2481
|
+
`;let r=document.createElement("span");r.style.cssText=`
|
|
2482
2482
|
font-size: 12px;
|
|
2483
2483
|
font-weight: 900;
|
|
2484
2484
|
letter-spacing: 0.15em;
|
|
2485
2485
|
color: ${Ne.ink};
|
|
2486
|
-
`,
|
|
2486
|
+
`,r.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
|
|
2487
2487
|
font-size: 10px;
|
|
2488
2488
|
font-family: monospace;
|
|
2489
2489
|
font-weight: bold;
|
|
2490
2490
|
color: ${Ne.primaryAccent};
|
|
2491
|
-
`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(
|
|
2491
|
+
`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(r),a.appendChild(this.progressText);let o=document.createElement("div");o.style.cssText=`
|
|
2492
2492
|
height: 4px;
|
|
2493
2493
|
width: 100%;
|
|
2494
2494
|
background-color: #E0DDD8;
|
|
@@ -2642,7 +2642,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2642
2642
|
0%, 100% { opacity: 1; }
|
|
2643
2643
|
50% { opacity: 0.3; }
|
|
2644
2644
|
}
|
|
2645
|
-
`,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 ea=is.version,Wo=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"]);ts();var kr={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"},Pr=Math.random().toString(36).slice(2),yt=null,ft={...kr},Mr="web_embed",aa={},Ht,ta=!1,$t=!1,Ft=!1,Ir=!1,la=1,Vi=0,Ki=!1,Fe=!1,bt="",vt=Math.floor(window.innerWidth),wt=Math.floor(window.innerHeight),sa=vt>wt,Be=!1,Nt=!1,Sr=!1,Er=!1,ia=!1,Yi=null,it=null,ra=!1,oa=!1,qi=new Map;function jr(){if(!it)return null;let r=Date.now()-it;return!Number.isFinite(r)||r<0?null:r}function na(r){if(ra)return;let e=jr();e!==null&&(ra=!0,D("session_time",{duration_ms:e,reason:r}))}function Cr(){if(yt)return yt;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),yt=r,r}function Wi(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function _r(r,e){return{event_name:r,ts:Date.now(),session_id:Pr,deployment_id:ft.deployment_id,variant_id:ft.variant_id,export_profile_id:ft.profile_id,instance_id:ft.instance_id||"default",env:Mr==="mraid"?"mraid":"web",attribution:Ht,payload:e}}function D(r,e){let t=Wi(r),i=_r(t,e);on(i,!!aa.analytics),Zt(t,i),t!==r&&Zt(r,i)}function Bt(){Yi&&(Yi(vt,wt),Yi=null)}function xt(r){la=r,D("volume",r)}function St(r){r&&(Ir=!0),!Ft&&(Ft=!0,D("pause"),xt(0))}function Ut(r){!r&&Ir||Ft&&(Ft=!1,D("resume"),xt(la))}function Ke(r,e){vt=Math.floor(r||window.innerWidth),wt=Math.floor(e||window.innerHeight),sa=vt>wt,D("resize",{width:vt,height:wt})}function Ko(){if(hs())try{let r=mraid.getMaxSize();Ke(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ut():St()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ke(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();xt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&xt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ki=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt();else{let t=()=>{Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Xo(){if(ms())try{let r=dapi.getScreenSize();Ke(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ut():St()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ke(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(xt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>xt(t?1:0)),Ki=!0,dapi.isViewable())Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt();else{let t=()=>{Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Ar(){let r=()=>{Be||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt(),Nt&&(Nt=!1,Pe.start()))};window.addEventListener("resize",()=>Ke()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ut(),r()):St()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),Ki=!0}function Jo(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Sr=!0),!(Sr&&e instanceof MouseEvent)&&(Vi+=1,oa||(oa=!0,D("first_interaction",{count:Vi})),D("interaction",Vi))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function Lr(r){var i,n,a,s,o,l,c,d,u,p,g,h;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(lt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(fs())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(ws())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(vs())try{(u=(d=window.smxTracking)==null?void 0:d.redirect)==null||u.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(bs()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(r||bt||""):r&&window.open(r)}else ot()?(p=window.install)==null||p.call(window):ys()?(g=window.openAppStore)==null||g.call(window):ln()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):r&&window.open(r)}function Zo(){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;he("view",()=>e(t.mraid_viewable)),he("start",()=>e(t.game_viewable)),he("engagement",()=>e(t.engagement));let i=()=>e(t.complete);he("complete",i),Jt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),he("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;he("view",()=>e(t.Ad_Load_Start)),he("start",()=>e(t.Ad_Viewable)),he("engagement",()=>e(t.First_Engagement)),he("complete",()=>e(t.Gameplay_Complete)),he("cta_click",()=>e(t.DSP_Click)),he("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Qo(){if(!lt())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{Pe.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Tr(){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 el(){ot()&&(window.mintGameStart=()=>{Ut(!0),Ke()},window.mintGameClose=()=>{St(!0)})}function tl(){if(!cn())return;let r=window.NUC;!r||!r.trigger||(Pe.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,bt)}),Pe.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var Pe={init(r={},e){var t;if(Mr=r.profile||"web_embed",aa=r.consent||{},ft={...kr,...r.ids||{}},yt=r.rootEl||yt,Ht=void 0,Wa((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),it=null,ra=!1,oa=!1,qi.clear(),bt=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Yi=e),D("init"),document.body.oncontextmenu=()=>!1,Cr(),nl(yt),xs(),Ko(),Xo(),!Ki){if(document.readyState==="complete")Ar();else if(!Er){Er=!0;let i=()=>{Ar(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Jo(),Zo(),Qo(),el(),tl(),console.log(`%c @handler/playable-sdk %c v${ea} `,"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;"),Be&&!Fe&&(D("boot"),D("view"),D("ready"),Nt&&(Nt=!1,Pe.start()),Fe=!0),Fe=Be},getRoot(){return Cr()},get version(){return ea},get maxWidth(){return vt},get maxHeight(){return wt},get isLandscape(){return sa},get isReady(){return Fe},get isStarted(){return ta},get isPaused(){return Ft},get isFinished(){return $t},get volume(){return la},get interactions(){return Vi},on(r,e){Jt(Wi(r),e)},off(r,e){rn(Wi(r),e)},start(){var r,e;if(!ta){if(!Be){Nt=!0;return}if(ta=!0,it||(it=Date.now()),D("start"),Ke(),ot())St(),(r=window.gameReady)==null||r.call(window);else if(lt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:sa?"landscape":"portrait",buildID:ea})}}},finish(){var r,e;$t||($t=!0,D("complete"),na("complete"),ot()?(r=window.gameEnd)==null||r.call(window):ln()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):lt()&&Tr())},install(r){if(!$t){$t=!0,lt()?(Tr(),setTimeout(()=>Pe.install(r),300)):(D("complete"),setTimeout(()=>Pe.install(r),0));return}ia||(ia=!0,setTimeout(()=>ia=!1,500),D("cta_click"),D("conversion"),na("cta"),Lr(r||bt))},emit(r,e){let t=Wi(r);if(!Wo.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=_r(t,e);on(i,!!aa.analytics),Zt(t,i)},gameStart(){Pe.start()},gameEnd(){Pe.finish()},ctaClick(r,e){D("cta_click",{url:r||bt,manual:!0}),(e==null?void 0:e.open)!==!1&&Lr(r||bt)},ctaShow(r){D("cta_show",r)},ctaDismiss(r){D("cta_dismiss",r)},getGameTimeMs(){return jr()},endSession(r="manual"){na(r)},setAttribution(r){Ht=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(il(`${Pr}:${r}`))%e.length,i=e[t];return Ht={...Ht||{},experiment_id:r},ft.variant_id=i,D("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){it||(it=Date.now()),D("level_start",{level_id:r,...e})},levelComplete(r,e){D("level_complete",{level_id:r,...e})},levelFail(r,e){D("level_fail",{level_id:r,...e})},checkpoint(r,e){D("checkpoint",{checkpoint_id:r,...e})},reward(r,e){D("reward",{reward_id:r,...e})},tutorialStart(r,e){D("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){D("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){D("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&qi.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=qi.get(r);if(!i)return;qi.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){D("engagement",{action:"timer",key:r,duration_ms:n,...t});return}D(e,{key:r,duration_ms:n,...t})}},fps(r,e){D("fps",{value:r,...e})},memory(r,e){D("memory",{bytes:r,...e})},assetLoadStart(r,e){D("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){D("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){D("error",{code:r,message:e,...t})},retry(){var r,e,t;if(ot())(r=window.gameRetry)==null||r.call(window);else if(cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}D("engagement",{action:"retry"})},pause(){St(!0)},resume(){Ut(!0)},resize(r,e){Ke(r,e)}},He=Pe;function il(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 nl(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2645
|
+
`,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 ea=ir.version,Wo=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"]);tr();var ks={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"},Ps=Math.random().toString(36).slice(2),yt=null,ft={...ks},Ms="web_embed",aa={},Ht,ta=!1,$t=!1,Ft=!1,Is=!1,la=1,Vi=0,Ki=!1,Fe=!1,bt="",vt=Math.floor(window.innerWidth),wt=Math.floor(window.innerHeight),ra=vt>wt,Be=!1,Nt=!1,Ss=!1,Es=!1,ia=!1,Yi=null,it=null,sa=!1,oa=!1,qi=new Map;function js(){if(!it)return null;let s=Date.now()-it;return!Number.isFinite(s)||s<0?null:s}function na(s){if(sa)return;let e=js();e!==null&&(sa=!0,D("session_time",{duration_ms:e,reason:s}))}function Cs(){if(yt)return yt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),yt=s,s}function Wi(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function _s(s,e){return{event_name:s,ts:Date.now(),session_id:Ps,deployment_id:ft.deployment_id,variant_id:ft.variant_id,export_profile_id:ft.profile_id,instance_id:ft.instance_id||"default",env:Ms==="mraid"?"mraid":"web",attribution:Ht,payload:e}}function D(s,e){let t=Wi(s),i=_s(t,e);on(i,!!aa.analytics),Zt(t,i),t!==s&&Zt(s,i)}function Bt(){Yi&&(Yi(vt,wt),Yi=null)}function xt(s){la=s,D("volume",s)}function St(s){s&&(Is=!0),!Ft&&(Ft=!0,D("pause"),xt(0))}function Ut(s){!s&&Is||Ft&&(Ft=!1,D("resume"),xt(la))}function Ke(s,e){vt=Math.floor(s||window.innerWidth),wt=Math.floor(e||window.innerHeight),ra=vt>wt,D("resize",{width:vt,height:wt})}function Ko(){if(hr())try{let s=mraid.getMaxSize();Ke(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ut():St()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ke(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();xt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&xt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ki=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt();else{let t=()=>{Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Xo(){if(mr())try{let s=dapi.getScreenSize();Ke(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ut():St()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ke(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(xt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>xt(t?1:0)),Ki=!0,dapi.isViewable())Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt();else{let t=()=>{Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function As(){let s=()=>{Be||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Be=!0,D("boot"),D("view"),D("ready"),Fe=!0,Bt(),Nt&&(Nt=!1,Pe.start()))};window.addEventListener("resize",()=>Ke()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ut(),s()):St()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),Ki=!0}function Jo(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Ss=!0),!(Ss&&e instanceof MouseEvent)&&(Vi+=1,oa||(oa=!0,D("first_interaction",{count:Vi})),D("interaction",Vi))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Ls(s){var i,n,a,r,o,l,c,d,u,p,g,h;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(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(lt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(fr())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(wr())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(vr())try{(u=(d=window.smxTracking)==null?void 0:d.redirect)==null||u.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(br()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(s||bt||""):s&&window.open(s)}else ot()?(p=window.install)==null||p.call(window):yr()?(g=window.openAppStore)==null||g.call(window):ln()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function Zo(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;he("view",()=>e(t.mraid_viewable)),he("start",()=>e(t.game_viewable)),he("engagement",()=>e(t.engagement));let i=()=>e(t.complete);he("complete",i),Jt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),he("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;he("view",()=>e(t.Ad_Load_Start)),he("start",()=>e(t.Ad_Viewable)),he("engagement",()=>e(t.First_Engagement)),he("complete",()=>e(t.Gameplay_Complete)),he("cta_click",()=>e(t.DSP_Click)),he("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Qo(){if(!lt())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{Pe.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Ts(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function el(){ot()&&(window.mintGameStart=()=>{Ut(!0),Ke()},window.mintGameClose=()=>{St(!0)})}function tl(){if(!cn())return;let s=window.NUC;!s||!s.trigger||(Pe.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,bt)}),Pe.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var Pe={init(s={},e){var t;if(Ms=s.profile||"web_embed",aa=s.consent||{},ft={...ks,...s.ids||{}},yt=s.rootEl||yt,Ht=void 0,Wa((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),it=null,sa=!1,oa=!1,qi.clear(),bt=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Yi=e),D("init"),document.body.oncontextmenu=()=>!1,Cs(),nl(yt),xr(),Ko(),Xo(),!Ki){if(document.readyState==="complete")As();else if(!Es){Es=!0;let i=()=>{As(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Jo(),Zo(),Qo(),el(),tl(),console.log(`%c @handler/playable-sdk %c v${ea} `,"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;"),Be&&!Fe&&(D("boot"),D("view"),D("ready"),Nt&&(Nt=!1,Pe.start()),Fe=!0),Fe=Be},getRoot(){return Cs()},get version(){return ea},get maxWidth(){return vt},get maxHeight(){return wt},get isLandscape(){return ra},get isReady(){return Fe},get isStarted(){return ta},get isPaused(){return Ft},get isFinished(){return $t},get volume(){return la},get interactions(){return Vi},on(s,e){Jt(Wi(s),e)},off(s,e){sn(Wi(s),e)},start(){var s,e;if(!ta){if(!Be){Nt=!0;return}if(ta=!0,it||(it=Date.now()),D("start"),Ke(),ot())St(),(s=window.gameReady)==null||s.call(window);else if(lt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ra?"landscape":"portrait",buildID:ea})}}},finish(){var s,e;$t||($t=!0,D("complete"),na("complete"),ot()?(s=window.gameEnd)==null||s.call(window):ln()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):lt()&&Ts())},install(s){if(!$t){$t=!0,lt()?(Ts(),setTimeout(()=>Pe.install(s),300)):(D("complete"),setTimeout(()=>Pe.install(s),0));return}ia||(ia=!0,setTimeout(()=>ia=!1,500),D("cta_click"),D("conversion"),na("cta"),Ls(s||bt))},emit(s,e){let t=Wi(s);if(!Wo.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=_s(t,e);on(i,!!aa.analytics),Zt(t,i)},gameStart(){Pe.start()},gameEnd(){Pe.finish()},ctaClick(s,e){D("cta_click",{url:s||bt,manual:!0}),(e==null?void 0:e.open)!==!1&&Ls(s||bt)},ctaShow(s){D("cta_show",s)},ctaDismiss(s){D("cta_dismiss",s)},getGameTimeMs(){return js()},endSession(s="manual"){na(s)},setAttribution(s){Ht=s},abTest(s,e){if(!s)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(il(`${Ps}:${s}`))%e.length,i=e[t];return Ht={...Ht||{},experiment_id:s},ft.variant_id=i,D("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){it||(it=Date.now()),D("level_start",{level_id:s,...e})},levelComplete(s,e){D("level_complete",{level_id:s,...e})},levelFail(s,e){D("level_fail",{level_id:s,...e})},checkpoint(s,e){D("checkpoint",{checkpoint_id:s,...e})},reward(s,e){D("reward",{reward_id:s,...e})},tutorialStart(s,e){D("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){D("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){D("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&qi.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=qi.get(s);if(!i)return;qi.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){D("engagement",{action:"timer",key:s,duration_ms:n,...t});return}D(e,{key:s,duration_ms:n,...t})}},fps(s,e){D("fps",{value:s,...e})},memory(s,e){D("memory",{bytes:s,...e})},assetLoadStart(s,e){D("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){D("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){D("error",{code:s,message:e,...t})},retry(){var s,e,t;if(ot())(s=window.gameRetry)==null||s.call(window);else if(cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}D("engagement",{action:"retry"})},pause(){St(!0)},resume(){Ut(!0)},resize(s,e){Ke(s,e)}},He=Pe;function il(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function nl(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
|
|
2646
2646
|
(function(){
|
|
2647
2647
|
var events = ['touchstart','touchend','mousedown','keydown'];
|
|
2648
2648
|
function unlock(){
|
|
@@ -2658,7 +2658,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2658
2658
|
}
|
|
2659
2659
|
events.forEach(function(e){ document.addEventListener(e, unlock, false); });
|
|
2660
2660
|
})();
|
|
2661
|
-
`,r.appendChild(e)}async function ca(r,e={}){let t=new al;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var u,p,g,h;if(!t.renderer)return;let o=(u=s==null?void 0:s.width)!=null?u:r.clientWidth,l=(p=s==null?void 0:s.height)!=null?p:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};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),He.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),He.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),He.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={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:d}))}}}).observe(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as da,Ticker as Et,ColorMatrixFilter as sl}from"pixi.js";var Xi=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)}},Ji=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}=Hr("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Zi=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new Xi(n.transform),this.renderer=new Ji(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&&(Et.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,u,p,g,h,m,f,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(p=(u=this._config)==null?void 0:u.render)==null?void 0:p.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,s=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,o=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,s,o;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=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,s,o,l,c,d,u;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 p=new da;p.blur=(a=e.blur.strength)!=null?a:4,t.push(p)}if((s=e.shadow)!=null&&s.enabled){let p=e.shadow,g=new da;g.blur=(o=p.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(p.offsetX!==0||p.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let p=e.glow,g=new da;if(g.blur=(c=p.blur)!=null?c:8,t.push(g),p.color){let h=new sl,m=typeof p.color=="string"?parseInt(p.color.replace("#",""),16):p.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(u=e.distortion)!=null&&u.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 d,u,p,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((u=e.intro)!=null&&u.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,s=this.transform.scale*(((g=(p=this._config)==null?void 0:p.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&Et.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(s,o);return}let l=0,c=b=>{var M,I,k,T,A,C;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),S=this.renderer.alpha,L=this.transform.scale*(((I=(M=this._config)==null?void 0:M.effects)==null?void 0:I.scale_x)||1),j=this.transform.scale*(((T=(k=this._config)==null?void 0:k.effects)==null?void 0:T.scale_y)||1),_=this.transform.position.y,E=this.transform.position.x;if(this.pixiObject.alpha=((A=t.startAlpha)!=null?A:0)+(S-((C=t.startAlpha)!=null?C:0))*v,t.startScale!==void 0){let w=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(L*w,j*w)}t.startYOffset!==void 0&&(this.pixiObject.y=_+t.startYOffset+(_-(_+t.startYOffset))*v),y>=1&&(Et.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=S,this.pixiObject.x=E,this.pixiObject.y=_,this.pixiObject.scale.set(L,j))};this._introTicker=c,Et.shared.add(c)}applyMotion(){var u,p,g,h,m,f;let e=(u=this._config)==null?void 0:u.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(),!(((p=e.pulse)==null?void 0:p.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,d=b=>{var k,T,A,C,w,x,O,P,R,z,F,G,H,B,$,U,X,se,N,ee,Z,ae,ge,xe,Me,Ie;let y=((k=b.deltaTime)!=null?k:1)*c;a+=b.deltaTime*.05;let v=this.transform.scale,S=v*(((A=(T=this._config)==null?void 0:T.effects)==null?void 0:A.scale_x)||1),L=v*(((w=(C=this._config)==null?void 0:C.effects)==null?void 0:w.scale_y)||1),j=this.transform.position.x,_=this.transform.position.y,E=this.transform.rotation,M=0,I=0;if((x=e.swing)!=null&&x.enabled){let V=(O=e.swing.amplitude)!=null?O:10,re=(P=e.swing.speed)!=null?P:1,Q=Math.sin(a*re)*V;e.swing.axis==="vertical"?I+=Q:e.swing.axis==="both"?(M+=Q,I+=Q):M+=Q}if((R=e.continuousMove)!=null&&R.enabled){let V=(z=e.continuousMove.axis)!=null?z:"x",re=Math.max(0,(F=e.continuousMove.speed)!=null?F:50),Q=Math.sign((G=e.continuousMove.direction)!=null?G:1)||1,ce=Math.max(0,(H=e.continuousMove.lifetime)!=null?H:0);s+=y;let Ue=ce>0?Math.min(s,ce):s,Xe=re*Q*Ue;(V==="x"||V==="both")&&(M+=Xe),(V==="y"||V==="both")&&(I+=Xe)}if((B=e.orbit)!=null&&B.enabled){let V=Math.max(0,($=e.orbit.radius)!=null?$:50),re=Math.max(0,(U=e.orbit.speed)!=null?U:45),Q=Math.sign((X=e.orbit.direction)!=null?X:1)||1,ce=re*Math.PI/180;l+=ce*Q*y;let Ue=(se=e.orbit.pivotOffsetX)!=null?se:0,Xe=(N=e.orbit.pivotOffsetY)!=null?N:0;M+=Ue+V*Math.cos(l),I+=Xe+V*Math.sin(l)}if(this.pixiObject.x=j+M,this.pixiObject.y=_+I,(ee=e.pulse)!=null&&ee.enabled){let V=(Z=e.pulse.intensity)!=null?Z:.1,re=(ae=e.pulse.speed)!=null?ae:1,ce=1+Math.sin(a*re)*V;(ge=this.pixiObject.scale)!=null&&ge.set?this.pixiObject.scale.set(S*ce,L*ce):this.pixiObject.scale&&(this.pixiObject.scale.x=S*ce,this.pixiObject.scale.y=L*ce)}if((xe=e.continuousRotate)!=null&&xe.enabled){let V=Math.max(0,(Me=e.continuousRotate.speed)!=null?Me:90),re=Math.sign((Ie=e.continuousRotate.direction)!=null?Ie:1)||1,Q=V*Math.PI/180;o+=Q*re*y,this.pixiObject.rotation=E+o}};Et.shared.add(d),this._tickerCleanup=()=>{var b,y,v,S,L;if(Et.shared.remove(d),this.pixiObject){let j=this.transform.scale*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_x)||1),_=this.transform.scale*(((S=(v=this._config)==null?void 0:v.effects)==null?void 0:S.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(L=this.pixiObject.scale)!=null&&L.set?this.pixiObject.scale.set(j,_):this.pixiObject.scale&&(this.pixiObject.scale.x=j,this.pixiObject.scale.y=_)}}}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)}},Gt=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 Zi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(s)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Qi={"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 rl(r){let e=Qi[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function ol(r){var t;let e=Qi[r];return e&&(t=e.weight)!=null?t:"400"}function ll(r,e){Qi[r]=e}function cl(){return Object.keys(Qi)}var Ct=null;function dl(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!Ct),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),Ct||(typeof window!="undefined"&&window.lottie?(Ct=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"),Ct=null)),Ct}function pl(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function ul(r){try{let e=new XMLHttpRequest;return e.open("GET",pl(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Or(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 Jn(r){Ct=r}function gl(r,e,t,i){var j,_,E,M,I,k,T,A,C,w,x,O,P,R,z,F,G,H,B;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((j=n.effects)==null?void 0:j.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Or(l);if(!c){let $=(E=(_=n.render)==null?void 0:_.asset)==null?void 0:E.path;if(typeof $=="string"&&$.toLowerCase().endsWith(".json")){let U=ul($);if(c=Or(U),c)try{i[r]=c}catch{}}}if(!c){let $=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:$}),null}let d=dl();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let u=(M=a.width)!=null?M:300,p=(I=a.height)!=null?I:300,g=(k=s.scale)!=null?k:1,h=((A=(T=s.position)==null?void 0:T.x)!=null?A:0)+((w=(C=s.offset)==null?void 0:C.x)!=null?w:0),m=((O=(x=s.position)==null?void 0:x.y)!=null?O:0)+((R=(P=s.offset)==null?void 0:P.y)!=null?R:0),f=(z=s.rotation)!=null?z:0,b=(F=o.z_index)!=null?F:100,y=(G=o.alpha)!=null?G:1,v=document.createElement("div");v.style.cssText=`
|
|
2661
|
+
`,s.appendChild(e)}async function ca(s,e={}){let t=new al;await t.init({resizeTo:s,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=r=>{var u,p,g,h;if(!t.renderer)return;let o=(u=r==null?void 0:r.width)!=null?u:s.clientWidth,l=(p=r==null?void 0:r.height)!=null?p:s.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};s.appendChild(t.canvas),s.style.position="relative",s.style.display="flex",s.style.flexDirection="column",s.style.alignItems="stretch",s.style.width="100%",s.style.height="100dvh",s.style.minHeight="100vh",s.style.maxWidth="100%",s.style.maxHeight="100%",s.style.boxSizing="border-box",s.style.overflow="hidden",e.background&&(s.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(";")),s.appendChild(n),He.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),He.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),He.on("resize",({payload:r})=>{i({width:r==null?void 0:r.width,height:r==null?void 0:r.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(r=>{let o=r[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={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:d}))}}}).observe(s),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as da,Ticker as Et,ColorMatrixFilter as rl}from"pixi.js";var Xi=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)}},Ji=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}=Hs("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Zi=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new Xi(n.transform),this.renderer=new Ji(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&&(Et.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,u,p,g,h,m,f,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(p=(u=this._config)==null?void 0:u.render)==null?void 0:p.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,r=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,o=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==a||r!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${r} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,r,o;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=(o=(r=this._config)==null?void 0:r.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,r,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(r=this._config)==null?void 0:r.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,r,o,l,c,d,u;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 p=new da;p.blur=(a=e.blur.strength)!=null?a:4,t.push(p)}if((r=e.shadow)!=null&&r.enabled){let p=e.shadow,g=new da;g.blur=(o=p.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(p.offsetX!==0||p.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let p=e.glow,g=new da;if(g.blur=(c=p.blur)!=null?c:8,t.push(g),p.color){let h=new rl,m=typeof p.color=="string"?parseInt(p.color.replace("#",""),16):p.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(u=e.distortion)!=null&&u.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 d,u,p,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((u=e.intro)!=null&&u.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,r=this.transform.scale*(((g=(p=this._config)==null?void 0:p.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(r*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&Et.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(r,o);return}let l=0,c=b=>{var M,I,k,T,A,C;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),S=this.renderer.alpha,L=this.transform.scale*(((I=(M=this._config)==null?void 0:M.effects)==null?void 0:I.scale_x)||1),j=this.transform.scale*(((T=(k=this._config)==null?void 0:k.effects)==null?void 0:T.scale_y)||1),_=this.transform.position.y,E=this.transform.position.x;if(this.pixiObject.alpha=((A=t.startAlpha)!=null?A:0)+(S-((C=t.startAlpha)!=null?C:0))*v,t.startScale!==void 0){let w=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(L*w,j*w)}t.startYOffset!==void 0&&(this.pixiObject.y=_+t.startYOffset+(_-(_+t.startYOffset))*v),y>=1&&(Et.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=S,this.pixiObject.x=E,this.pixiObject.y=_,this.pixiObject.scale.set(L,j))};this._introTicker=c,Et.shared.add(c)}applyMotion(){var u,p,g,h,m,f;let e=(u=this._config)==null?void 0:u.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(),!(((p=e.pulse)==null?void 0:p.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,r=0,o=0,l=0,c=1/60,d=b=>{var k,T,A,C,w,x,O,P,R,z,F,G,H,B,$,U,X,re,N,ee,Z,ae,ge,xe,Me,Ie;let y=((k=b.deltaTime)!=null?k:1)*c;a+=b.deltaTime*.05;let v=this.transform.scale,S=v*(((A=(T=this._config)==null?void 0:T.effects)==null?void 0:A.scale_x)||1),L=v*(((w=(C=this._config)==null?void 0:C.effects)==null?void 0:w.scale_y)||1),j=this.transform.position.x,_=this.transform.position.y,E=this.transform.rotation,M=0,I=0;if((x=e.swing)!=null&&x.enabled){let V=(O=e.swing.amplitude)!=null?O:10,se=(P=e.swing.speed)!=null?P:1,Q=Math.sin(a*se)*V;e.swing.axis==="vertical"?I+=Q:e.swing.axis==="both"?(M+=Q,I+=Q):M+=Q}if((R=e.continuousMove)!=null&&R.enabled){let V=(z=e.continuousMove.axis)!=null?z:"x",se=Math.max(0,(F=e.continuousMove.speed)!=null?F:50),Q=Math.sign((G=e.continuousMove.direction)!=null?G:1)||1,ce=Math.max(0,(H=e.continuousMove.lifetime)!=null?H:0);r+=y;let Ue=ce>0?Math.min(r,ce):r,Xe=se*Q*Ue;(V==="x"||V==="both")&&(M+=Xe),(V==="y"||V==="both")&&(I+=Xe)}if((B=e.orbit)!=null&&B.enabled){let V=Math.max(0,($=e.orbit.radius)!=null?$:50),se=Math.max(0,(U=e.orbit.speed)!=null?U:45),Q=Math.sign((X=e.orbit.direction)!=null?X:1)||1,ce=se*Math.PI/180;l+=ce*Q*y;let Ue=(re=e.orbit.pivotOffsetX)!=null?re:0,Xe=(N=e.orbit.pivotOffsetY)!=null?N:0;M+=Ue+V*Math.cos(l),I+=Xe+V*Math.sin(l)}if(this.pixiObject.x=j+M,this.pixiObject.y=_+I,(ee=e.pulse)!=null&&ee.enabled){let V=(Z=e.pulse.intensity)!=null?Z:.1,se=(ae=e.pulse.speed)!=null?ae:1,ce=1+Math.sin(a*se)*V;(ge=this.pixiObject.scale)!=null&&ge.set?this.pixiObject.scale.set(S*ce,L*ce):this.pixiObject.scale&&(this.pixiObject.scale.x=S*ce,this.pixiObject.scale.y=L*ce)}if((xe=e.continuousRotate)!=null&&xe.enabled){let V=Math.max(0,(Me=e.continuousRotate.speed)!=null?Me:90),se=Math.sign((Ie=e.continuousRotate.direction)!=null?Ie:1)||1,Q=V*Math.PI/180;o+=Q*se*y,this.pixiObject.rotation=E+o}};Et.shared.add(d),this._tickerCleanup=()=>{var b,y,v,S,L;if(Et.shared.remove(d),this.pixiObject){let j=this.transform.scale*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_x)||1),_=this.transform.scale*(((S=(v=this._config)==null?void 0:v.effects)==null?void 0:S.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(L=this.pixiObject.scale)!=null&&L.set?this.pixiObject.scale.set(j,_):this.pixiObject.scale&&(this.pixiObject.scale.x=j,this.pixiObject.scale.y=_)}}}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)}},Gt=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 Zi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,r)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,r);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(r)},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 Qi={"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 sl(s){let e=Qi[s];return e?e.family:(console.warn(`Font ID "${s}" not found in registry, using fallback`),"Arial, sans-serif")}function ol(s){var t;let e=Qi[s];return e&&(t=e.weight)!=null?t:"400"}function ll(s,e){Qi[s]=e}function cl(){return Object.keys(Qi)}var Ct=null;function dl(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!Ct),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),Ct||(typeof window!="undefined"&&window.lottie?(Ct=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(s=>s.toLowerCase().includes("lottie")):"no window"),Ct=null)),Ct}function pl(s){return!s||s.startsWith("http://")||s.startsWith("https://")||s.startsWith("/")?s:`/${s.replace(/^\.\//,"")}`}function ul(s){try{let e=new XMLHttpRequest;return e.open("GET",pl(s),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Os(s){return!s||typeof s!="object"||!Array.isArray(s.layers)?null:(Array.isArray(s.assets)||(s.assets=[]),Array.isArray(s.chars)||(s.chars=[]),s)}function Jn(s){Ct=s}function gl(s,e,t,i){var j,_,E,M,I,k,T,A,C,w,x,O,P,R,z,F,G,H,B;let n=t.objects.get(s);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${s}`),null;let a=((j=n.effects)==null?void 0:j.lottie)||{},r=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[s],c=Os(l);if(!c){let $=(E=(_=n.render)==null?void 0:_.asset)==null?void 0:E.path;if(typeof $=="string"&&$.toLowerCase().endsWith(".json")){let U=ul($);if(c=Os(U),c)try{i[s]=c}catch{}}}if(!c){let $=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${s}`,{kind:$}),null}let d=dl();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${s}`),null;let u=(M=a.width)!=null?M:300,p=(I=a.height)!=null?I:300,g=(k=r.scale)!=null?k:1,h=((A=(T=r.position)==null?void 0:T.x)!=null?A:0)+((w=(C=r.offset)==null?void 0:C.x)!=null?w:0),m=((O=(x=r.position)==null?void 0:x.y)!=null?O:0)+((R=(P=r.offset)==null?void 0:P.y)!=null?R:0),f=(z=r.rotation)!=null?z:0,b=(F=o.z_index)!=null?F:100,y=(G=o.alpha)!=null?G:1,v=document.createElement("div");v.style.cssText=`
|
|
2662
2662
|
position: absolute;
|
|
2663
2663
|
top: calc(50% + ${m}px);
|
|
2664
2664
|
left: calc(50% + ${h}px);
|
|
@@ -2668,4 +2668,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
|
|
|
2668
2668
|
pointer-events: none;
|
|
2669
2669
|
z-index: ${b};
|
|
2670
2670
|
opacity: ${y};
|
|
2671
|
-
`,e.appendChild(v);let S;try{S=d.loadAnimation({container:v,renderer:a.renderer||"svg",loop:(H=a.loop)!=null?H:!1,autoplay:(B=a.autoplay)!=null?B:!0,animationData:c})}catch($){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${
|
|
2671
|
+
`,e.appendChild(v);let S;try{S=d.loadAnimation({container:v,renderer:a.renderer||"svg",loop:(H=a.loop)!=null?H:!1,autoplay:(B=a.autoplay)!=null?B:!0,animationData:c})}catch($){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${s}`,$),null}a.speed!==void 0&&S.setSpeed(a.speed);let L=()=>{S.destroy(),v.parentNode&&v.parentNode.removeChild(v)};return a.loop||S.addEventListener("complete",L),{animation:S,cleanup:L}}var pa=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 ca(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 Gt(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 qt=class{setContext(e){this.context=e}};var Vt=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 Rs from"pixi.js";var hl=Rs;typeof window!="undefined"&&(window.__basePixi=Rs);import{Sprite as ml,Text as fl,TextStyle as bl,Texture as zs}from"pixi.js";var Ds=s=>s*Math.PI/180;function yl(s,e){var r,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(r=e.render)!=null&&r.tint&&(i=e.render.tint);let n=new bl({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),a=new fl({text:t.text,style:n});return a.label=s,a}function vl(s){var d,u,p,g,h,m,f,b,y,v;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:r}=s,o={},l={},c={};t.sortableChildren=!0;for(let[S,L]of i.objects.entries()){if(r!=null&&r.has(S)||a&&!a.has(S)||(L==null?void 0:L.enabled)===!1)continue;let j=(u=(d=L==null?void 0:L.render)==null?void 0:d.asset)==null?void 0:u.path,_=(g=(p=L==null?void 0:L.render)==null?void 0:p.asset)==null?void 0:g.type,E=!!(j&&_==="image"),M=!!((h=L==null?void 0:L.ui)!=null&&h.text),I=M?(m=L==null?void 0:L.ui)==null?void 0:m.renderMode:void 0,k;if(I==="png"&&E?k="png":I==="text"&&M?k="text":E?k="png":M?k="text":k="skip",k!=="skip"){if(k==="text"){let T=yl(S,L);if(!T)continue;let A=L.render;T.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,T.visible=(A==null?void 0:A.visible)!==!1,T.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"?T.anchor.set(A.anchor.x,A.anchor.y):T.anchor.set(.5,.5);let C=L.transform,w=(C==null?void 0:C.position)||(C==null?void 0:C.offset);w&&T.position.set((f=w.x)!=null?f:0,(b=w.y)!=null?b:0);let x=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;T.scale.set(x,x);let O=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;T.rotation=Ds(O),T.parent||t.addChild(T);try{n.create(S,T)}catch{}o[S]=T,c[S]=T}else if(k==="png"){let T=Ce[S]||(typeof zs!="undefined"?zs.EMPTY:void 0),A=new ml(T);A.label=S;let C=L.render;A.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,A.visible=(C==null?void 0:C.visible)!==!1,A.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"&&A.anchor.set(C.anchor.x,C.anchor.y);let w=L.transform,x=(w==null?void 0:w.position)||(w==null?void 0:w.offset);x&&A.position.set((y=x.x)!=null?y:0,(v=x.y)!=null?v:0);let O=typeof(w==null?void 0:w.scale)=="number"?w.scale:1;A.scale.set(O,O);let P=typeof(w==null?void 0:w.rotation)=="number"?w.rotation:0;A.rotation=Ds(P),A.parent||t.addChild(A);try{n.create(S,A)}catch{}o[S]=A,l[S]=A}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var ua=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Vt}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 o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await Te.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.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 Te.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},$s=new ua,wl=new Proxy($s,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});function xl(s,e){$s.init(s,e)}var ga=class extends qt{async init(){tn(this.context.config,this.context.app),await Ce.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Sl(s){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=s,r=((l=(o=n.engine)==null?void 0:o.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=r.tutorial_delay_ms)!=null?c:1500)}export{Sr as a,ca as b,Xi as c,Ji as d,Zi as e,Gt as f,sl as g,ol as h,ll as i,cl as j,Jn as k,gl as l,Te as m,pa as n,qt as o,Vt as p,hl as q,vl as r,wl as s,xl as t,ga as u,vi as v,Js as w,hn as x,Oe as y,Re as z,ze as A,mn as B,ho as C,Sl as D,Er as E,Cr as F,un as G,ct as H,Rl as I,Bi as J,Vn as K,ms as L,Wn as M,Yp as N,Wp as O,Ne as P,Vo as Q,Yo as R,Qn as S,Pe as T,He as U};
|