handler-playable-sdk 1.0.92 → 1.0.93
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-D2ZGUL6U.js → chunk-6676ZMVB.js} +2 -2
- 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 +2 -2
- package/dist/index.js +1 -1
- package/dist/pixi/index.cjs +1 -1
- 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 Wt,c as en,d as Ae,e as tn}from"./chunk-I5OOVR5U.js";import{i as Jt}from"./chunk-GVZ2445E.js";import{c as Ue,d as Kt,e as Ze,g as Na,h as nn,j as Fa,k as Ba,n as an,o as Xt,p as st,q as Ga,r as sn,s as Ua}from"./chunk-EFRB44UC.js";import{a as $r}from"./chunk-JXBG6UFL.js";import{Application as nl}from"pixi.js";var qe={};function Zt(o,e,t=!1){qe[o]||(qe[o]=[]),qe[o].push({fn:e,once:t})}function rn(o,e){if(qe[o]){if(!e){delete qe[o];return}qe[o]=qe[o].filter(t=>t.fn!==e)}}function Qt(o,...e){let t=qe[o];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(o,i.fn)}function fe(o,e){Zt(o,e,!0)}var ne=null,ve=[],rt=null;function Ya(o){ne=o,ve=[],rt!==null&&(clearTimeout(rt),rt=null)}function Wa(){var o,e,t;return{endpoint:(ne==null?void 0:ne.endpoint)||"",transport:(ne==null?void 0:ne.transport)||"beacon",batchSize:(o=ne==null?void 0:ne.batchSize)!=null?o:10,flushIntervalMs:(e=ne==null?void 0:ne.flushIntervalMs)!=null?e:300,maxQueue:(t=ne==null?void 0:ne.maxQueue)!=null?t:200,debug:!!(ne!=null&&ne.debug)}}async function qa(o,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(o,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(o,{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(o,e){let t=Wa();if(e&&t.endpoint){if(ve.push(o),ve.length>t.maxQueue&&(ve=ve.slice(ve.length-t.maxQueue)),ve.length>=t.batchSize){Va();return}rt===null&&(rt=window.setTimeout(()=>{rt=null,Va()},t.flushIntervalMs))}}async function Va(){let o=Wa();if(!o.endpoint||ve.length===0)return;let e=ve.splice(0,o.batchSize);await qa(o.endpoint,{events:e},o.transport,o.debug),ve.length>0&&await qa(o.endpoint,{events:ve.splice(0,o.batchSize)},o.transport,o.debug)}function Ka(o){return Math.max(0,Math.min(1,o))}function Hr(o){let e=String(o!=null?o:"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 Nr(o,e){let t=o==null?void 0:o[e];return typeof t=="number"?t:0}function Xa(o,e,t){try{o[e]=t}catch{}}function Fr(o){let e=o==null?void 0:o.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 Ja(o,e){let t=o==null?void 0:o.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 Za(o,e){let t=Fr(o);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 Qa(){let o=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,r(),o.size>0&&i()})},n=d=>{var u;o.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{o.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},r=()=>{var p,u;let d=Tt();for(let g of Array.from(o)){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=Ka(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=Ka(L)}let w=g.ease(f);g.yoyo&&y%2===1&&(w=1-w);for(let L of g.props)Xa(g.target,L.key,L.from+(L.to-L.from)*w);g.scaleFrom&&g.scaleTo&&Ja(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var L;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((L=u==null?void 0:u.delayMsOverride)!=null?L:0)),m=Hr(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let M of Object.keys(p)){if(y.has(M))continue;let I=p[M];typeof I=="number"&&w.push({key:M,from:Nr(d,M),to:I})}let v=Za(d,p);return{target:d,startMs:Tt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:v.from,scaleTo:v.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Tt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:Tt(),h=Tt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Xa(d,g,h)}let u=Za(d,p);u.to&&Ja(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let w=typeof y=="string"?y.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=y=>{p.push(y);let w=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+w)},b={to(y,w,v){return f({kind:"to",target:y,vars:w,atMs:m(v)}),b},fromTo(y,w,v,L){return f({kind:"fromTo",target:y,vars:v,from:w,atMs:m(L)}),b},play(){var y,w;if(g)return b;g=!0,h=[];for(let v of p)v.kind==="fromTo"&&c.set(v.target,(y=v.from)!=null?y:{}),h.push(c.to(v.target,{...v.vars,delay:v.atMs/1e3+((w=v.vars.delay)!=null?w: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 es(){if(typeof window=="undefined")return;let o=window;if(!o.gsap)try{o.gsap=Qa()}catch{}}var ts={name:"handler-playable-sdk",version:"1.0.92",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 be=0,Gr=be++,is=be++,ns=be++,as=be++,ss=be++,rs=be++,os=be++,ls=be++,cs=be++,ds=be++,ps=be++,us=be++,Q=Gr;function gs(){return Q===is}function hs(){return Q===ns}function ms(){return Q===as}function fs(){return Q===ss}function ot(){return Q===rs}function lt(){return Q===os}function bs(){return Q===ls}function ys(){return Q===cs}function vs(){return Q===ds}function ln(){return Q===ps}function cn(){return Q===us}function ws(){let o=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(o==="mraid")try{mraid.getState(),Q=is;return}catch{}else if(o==="dapi")try{dapi.isReady(),Q=ns;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(Q=as)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(Q=ss)}catch{}else if(e==="mintegral")window.gameReady&&(Q=rs);else if(e==="tapjoy")window.TJ_API&&(Q=os);else if(e==="tiktok")window.openAppStore&&(Q=ls);else if(e==="smadex")try{window.smxTracking&&(Q=cs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(Q=ds)}catch{}else e==="vungle"?Q=ps:(o==="nucleo"||e==="nucleo")&&(Q=us)}import dn from"lottie-web";var xs=dn;typeof window!="undefined"&&(window.lottie=dn,window.__baseLottie=dn);function ae(o,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(o,e);return`${o/i}:${e/i}`}var Il=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:ae(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:ae(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:ae(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:ae(360,780)}],jl=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:ae(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:ae(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:ae(412,915)}],_l=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:ae(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:ae(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:ae(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:ae(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:ae(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:ae(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:ae(768,1024),mraidScale:.7}];var Ss=[...pn],Es=[{category:"playable",label:"Playable Ad",devices:pn}],un=pn[0];function ct(o){return Ss.find(e=>e.id===o)||un}function Ol(o){return Ss.filter(e=>e.category===o)}var Le=class{async updateProperty(e,t,i,n={}){var l,c,d,p,u,g,h,m,f,b,y,w;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(Ue({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform.")){console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e);let v=s==null?void 0:s.motion;if(v&&typeof v=="object"&&v.enabled!==!1&&(((p=v==null?void 0:v.intro)==null?void 0:p.enabled)===!0||((u=v==null?void 0:v.pulse)==null?void 0:u.enabled)===!0||((g=v==null?void 0:v.swing)==null?void 0:g.enabled)===!0||((h=v==null?void 0:v.continuousMove)==null?void 0:h.enabled)===!0||((m=v==null?void 0:v.continuousRotate)==null?void 0:m.enabled)===!0||((f=v==null?void 0:v.orbit)==null?void 0:f.enabled)===!0)){let I=window.applyEditableObjectConfig;if(typeof I=="function"){let P=window.__editableConfig,j=(w=(y=(b=P==null?void 0:P.objects)==null?void 0:b.get)==null?void 0:y.call(b,e))!=null?w:s;await I(e,j),console.log("[PropertyUpdateManager] Applied config for motion object")}}n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))})}else{let v=window.applyEditableObjectConfig;if(typeof v=="function"){let L=window.__editableConfig,M=(d=(c=(l=L==null?void 0:L.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await v(e,M),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(o){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,r=o.category||"misc",c=`${(o.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:r,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(r,`${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 o.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var ei=class{constructor(){this.updateManager=new Le}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 r=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";r&&(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 r,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=((r=t.identity)==null?void 0:r.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 p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}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,r=s==null?void 0:s(e),l=(a=r==null?void 0:r.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 r=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(r),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(r);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,r);let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,r);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(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 r=null;if(s.schemas instanceof Map?r=s.schemas.get(n):typeof s.schemas=="object"&&(r=s.schemas[n]),!(r!=null&&r.defaults))return;let l=r.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.`,r="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",r),n(e,s,"",{objectId:e,path:r});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 Ur=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],qr=["environment","ui","character","system","backgrounds"],Vr=["bg","world","ui"],Cs={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}}},ti=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 Wt,c as en,d as Ae,e as tn}from"./chunk-I5OOVR5U.js";import{i as Jt}from"./chunk-GVZ2445E.js";import{c as Ue,d as Kt,e as Ze,g as Na,h as nn,j as Fa,k as Ba,n as an,o as Xt,p as st,q as Ga,r as sn,s as Ua}from"./chunk-EFRB44UC.js";import{a as $r}from"./chunk-JXBG6UFL.js";import{Application as nl}from"pixi.js";var qe={};function Zt(o,e,t=!1){qe[o]||(qe[o]=[]),qe[o].push({fn:e,once:t})}function rn(o,e){if(qe[o]){if(!e){delete qe[o];return}qe[o]=qe[o].filter(t=>t.fn!==e)}}function Qt(o,...e){let t=qe[o];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(o,i.fn)}function fe(o,e){Zt(o,e,!0)}var ne=null,ve=[],rt=null;function Ya(o){ne=o,ve=[],rt!==null&&(clearTimeout(rt),rt=null)}function Wa(){var o,e,t;return{endpoint:(ne==null?void 0:ne.endpoint)||"",transport:(ne==null?void 0:ne.transport)||"beacon",batchSize:(o=ne==null?void 0:ne.batchSize)!=null?o:10,flushIntervalMs:(e=ne==null?void 0:ne.flushIntervalMs)!=null?e:300,maxQueue:(t=ne==null?void 0:ne.maxQueue)!=null?t:200,debug:!!(ne!=null&&ne.debug)}}async function qa(o,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(o,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(o,{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(o,e){let t=Wa();if(e&&t.endpoint){if(ve.push(o),ve.length>t.maxQueue&&(ve=ve.slice(ve.length-t.maxQueue)),ve.length>=t.batchSize){Va();return}rt===null&&(rt=window.setTimeout(()=>{rt=null,Va()},t.flushIntervalMs))}}async function Va(){let o=Wa();if(!o.endpoint||ve.length===0)return;let e=ve.splice(0,o.batchSize);await qa(o.endpoint,{events:e},o.transport,o.debug),ve.length>0&&await qa(o.endpoint,{events:ve.splice(0,o.batchSize)},o.transport,o.debug)}function Ka(o){return Math.max(0,Math.min(1,o))}function Hr(o){let e=String(o!=null?o:"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 Nr(o,e){let t=o==null?void 0:o[e];return typeof t=="number"?t:0}function Xa(o,e,t){try{o[e]=t}catch{}}function Fr(o){let e=o==null?void 0:o.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 Ja(o,e){let t=o==null?void 0:o.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 Za(o,e){let t=Fr(o);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 Qa(){let o=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,r(),o.size>0&&i()})},n=d=>{var u;o.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{o.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},r=()=>{var p,u;let d=Tt();for(let g of Array.from(o)){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=Ka(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=Ka(L)}let w=g.ease(f);g.yoyo&&y%2===1&&(w=1-w);for(let L of g.props)Xa(g.target,L.key,L.from+(L.to-L.from)*w);g.scaleFrom&&g.scaleTo&&Ja(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var L;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((L=u==null?void 0:u.delayMsOverride)!=null?L:0)),m=Hr(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let M of Object.keys(p)){if(y.has(M))continue;let I=p[M];typeof I=="number"&&w.push({key:M,from:Nr(d,M),to:I})}let v=Za(d,p);return{target:d,startMs:Tt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:v.from,scaleTo:v.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Tt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:Tt(),h=Tt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Xa(d,g,h)}let u=Za(d,p);u.to&&Ja(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let w=typeof y=="string"?y.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=y=>{p.push(y);let w=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+w)},b={to(y,w,v){return f({kind:"to",target:y,vars:w,atMs:m(v)}),b},fromTo(y,w,v,L){return f({kind:"fromTo",target:y,vars:v,from:w,atMs:m(L)}),b},play(){var y,w;if(g)return b;g=!0,h=[];for(let v of p)v.kind==="fromTo"&&c.set(v.target,(y=v.from)!=null?y:{}),h.push(c.to(v.target,{...v.vars,delay:v.atMs/1e3+((w=v.vars.delay)!=null?w: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 es(){if(typeof window=="undefined")return;let o=window;if(!o.gsap)try{o.gsap=Qa()}catch{}}var ts={name:"handler-playable-sdk",version:"1.0.93",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 be=0,Gr=be++,is=be++,ns=be++,as=be++,ss=be++,rs=be++,os=be++,ls=be++,cs=be++,ds=be++,ps=be++,us=be++,Q=Gr;function gs(){return Q===is}function hs(){return Q===ns}function ms(){return Q===as}function fs(){return Q===ss}function ot(){return Q===rs}function lt(){return Q===os}function bs(){return Q===ls}function ys(){return Q===cs}function vs(){return Q===ds}function ln(){return Q===ps}function cn(){return Q===us}function ws(){let o=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(o==="mraid")try{mraid.getState(),Q=is;return}catch{}else if(o==="dapi")try{dapi.isReady(),Q=ns;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(Q=as)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(Q=ss)}catch{}else if(e==="mintegral")window.gameReady&&(Q=rs);else if(e==="tapjoy")window.TJ_API&&(Q=os);else if(e==="tiktok")window.openAppStore&&(Q=ls);else if(e==="smadex")try{window.smxTracking&&(Q=cs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(Q=ds)}catch{}else e==="vungle"?Q=ps:(o==="nucleo"||e==="nucleo")&&(Q=us)}import dn from"lottie-web";var xs=dn;typeof window!="undefined"&&(window.lottie=dn,window.__baseLottie=dn);function ae(o,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(o,e);return`${o/i}:${e/i}`}var Il=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:ae(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:ae(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:ae(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:ae(360,780)}],jl=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:ae(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:ae(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:ae(412,915)}],_l=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:ae(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:ae(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:ae(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:ae(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:ae(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:ae(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:ae(768,1024),mraidScale:.7}];var Ss=[...pn],Es=[{category:"playable",label:"Playable Ad",devices:pn}],un=pn[0];function ct(o){return Ss.find(e=>e.id===o)||un}function Ol(o){return Ss.filter(e=>e.category===o)}var Le=class{async updateProperty(e,t,i,n={}){var l,c,d,p,u,g,h,m,f,b,y,w;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(Ue({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform.")){console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e);let v=s==null?void 0:s.motion;if(v&&typeof v=="object"&&v.enabled!==!1&&(((p=v==null?void 0:v.intro)==null?void 0:p.enabled)===!0||((u=v==null?void 0:v.pulse)==null?void 0:u.enabled)===!0||((g=v==null?void 0:v.swing)==null?void 0:g.enabled)===!0||((h=v==null?void 0:v.continuousMove)==null?void 0:h.enabled)===!0||((m=v==null?void 0:v.continuousRotate)==null?void 0:m.enabled)===!0||((f=v==null?void 0:v.orbit)==null?void 0:f.enabled)===!0)){let I=window.applyEditableObjectConfig;if(typeof I=="function"){let P=window.__editableConfig,j=(w=(y=(b=P==null?void 0:P.objects)==null?void 0:b.get)==null?void 0:y.call(b,e))!=null?w:s;await I(e,j),console.log("[PropertyUpdateManager] Applied config for motion object")}}n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))})}else{let v=window.applyEditableObjectConfig;if(typeof v=="function"){let L=window.__editableConfig,M=(d=(c=(l=L==null?void 0:L.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await v(e,M),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(o){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,r=o.category||"misc",c=`${(o.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:r,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(r,`${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 o.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var ei=class{constructor(){this.updateManager=new Le}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 r=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";r&&(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 r,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=((r=t.identity)==null?void 0:r.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 p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}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,r=s==null?void 0:s(e),l=(a=r==null?void 0:r.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 r=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(r),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(r);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,r);let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,r);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(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 r=null;if(s.schemas instanceof Map?r=s.schemas.get(n):typeof s.schemas=="object"&&(r=s.schemas[n]),!(r!=null&&r.defaults))return;let l=r.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.`,r="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",r),n(e,s,"",{objectId:e,path:r});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 Ur=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],qr=["environment","ui","character","system","backgrounds"],Vr=["bg","world","ui"],Cs={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}}},ti=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">
|
|
@@ -1296,7 +1296,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
|
|
|
1296
1296
|
|
|
1297
1297
|
OUTPUT:
|
|
1298
1298
|
Generate the requested asset matching the brand style.${o.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
|
|
1299
|
-
`.trim()}function _s(o){return o.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 Os(o,e){return!(o.includes("background")&&(o.includes("_1")||o.includes("splash")||o.includes("endgame")||o.includes("main"))||e==="text"||e==="effects"&&o.includes("particle"))}async function Rs(o){var s,r;let e=_s(o.gameObjects),t={gamePrompt:o.gamePrompt,gameObjects:e,brandAssets:o.manifest.assets,brandDna:o.manifest.brand_dna,brandName:o.manifest.brand_name},i=Is(t),n=[];if(o.flatDesignDataUrl)try{let l=zs(o.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 Ti(o.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."):(r=l.message)!=null&&r.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return So(a,o.gameObjects)}function So(o,e){try{let t=o,i=o.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=o.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:o,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:o,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:o,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function xn(o,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 r=await Eo(o,s);s.output_dataUrl=r,s.status="Generated \u2713"}catch(r){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,r),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Eo(o,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&o.manifest){let r=o.manifest.assets.find(l=>l.id===e.reference_asset);if(r){let l=o.assetFiles.get(r.file);if(l){let c=await Ve(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(o.flatDesignDataUrl){let r=zs(o.flatDesignDataUrl);r&&t.push(r)}let i=Os(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:o.manifest.brand_dna,needsTransparency:i},a=js(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await ut(o.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await pt(s)||s}function zs(o){let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ds(o,e){let t=o.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=[],o.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 $s(o){var t,i;let e=new Map;if(!o)return console.warn("[CanvaZip] No position data provided"),e;if(typeof o=="string")try{o=JSON.parse(o)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(o!=null&&o.layers&&Array.isArray(o.layers)){console.log(`[CanvaZip] Parsing ${o.layers.length} layers from position data`);for(let n of o.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let s=n.layout,r={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 p=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:r,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:r,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",o);if(e.size===0&&typeof o=="object"&&!Array.isArray(o)){for(let[n,a]of Object.entries(o))if(a&&typeof a=="object"&&"layout"in a){let s=a.layout,r={x:0,y:0},l=1,c=0;if(s.position&&typeof s.position=="object"?r={x:s.position.x||0,y:s.position.y||0}:(typeof s.x=="number"||typeof s.y=="number")&&(r={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,p=(i=s.scaleY)!=null?i:1;l=(d+p)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:r,scale:l,rotation:c})}}return e}function Hs(o,e){if(!o)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",o),null;if(e.has(o))return console.log(`[CanvaZip] Exact match found for ${o}`),e.get(o);let t=o.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${o} -> ${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 ${o} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${o}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Co(o){return o.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Ns(){let o=window.getEditableAssets;if(typeof o!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=o();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||Co(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as jt}from"pixi.js";async function Bs(o,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),r=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",r);let l=await jt.load(r);if(!l){console.error("[LIBRARY] Failed to load texture:",r);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)Ae[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);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:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Gs(o,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,r=(t=s==null?void 0:s.slots)==null?void 0:t.find(f=>f.category===e),l=r==null?void 0:r.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 p=await jt.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Ae[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,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=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Pi(o,e,t,i){var n,a,s,r,l,c,d,p,u,g,h,m,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let v=qs(w),L=Date.now(),M=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",M);let I=await jt.load(M);if(!I){console.error("[LIBRARY] Failed to load texture:",M);return}console.log("[LIBRARY] \u2705 Texture loaded"),Ae[w]=I,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let P=window.CustomAssets;P!=null&&P[w]&&(P[w].texture=I,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let j=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!j),j){let T=Array.from(((n=j.keys)==null?void 0:n.call(j))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",T);let S=j.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!S),S){let x=((a=S.getDisplayObject)==null?void 0:a.call(S))||S.pixiObject||S.pixi||S,E=(s=x==null?void 0:x.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",x),console.log("[LIBRARY] displayObject type:",E),console.log("[LIBRARY] has texture?",!!(x!=null&&x.texture)),x!=null&&x.texture)x.texture=I,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(E==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),A=x.parent,O=(l=(r=A==null?void 0:A.getChildIndex)==null?void 0:r.call(A,x))!=null?l:0,k={x:x.x,y:x.y},R={x:(d=(c=x.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=x.anchor)==null?void 0:p.y)!=null?u:.5},z={x:(h=(g=x.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=x.scale)==null?void 0:m.y)!=null?f:1},$=(b=x.alpha)!=null?b:1,U=(y=x.visible)!=null?y:!0,H=new C(I);H.anchor.set(R.x,R.y),H.position.set(k.x,k.y),H.scale.set(z.x,z.y),H.alpha=$,H.visible=U,A&&(A.removeChild(x),A.addChildAt(H,O),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),S.pixiObject&&(S.pixiObject=H),S.pixi&&(S.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(x!=null&&x.children){let C=x.children.find(A=>A.texture);C?(C.texture=I,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;Vs(w,_,I,v),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:w,texture:I,assetPath:_}})),Ue({objectId:w,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",_)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function Us(o,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=qs(a),r=Date.now(),l=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await jt.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Ae[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 p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Vs(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Ue({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 qs(o){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(o):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 Vs(o,e,t,i){if(e){try{let n=`${o}:${e}`;Wt.set(n,t)}catch{}if(i&&i!==e)try{let n=Wt.store;n!=null&&n.delete&&n.delete(`${o}:${i}`)}catch{}Fs(e,t),i&&i!==e&&Fs(i,null)}}function Fs(o,e){if(!o)return;let t=jt.cache;if(!t)return;let i=o.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`
|
|
1299
|
+
`.trim()}function _s(o){return o.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 Os(o,e){return!(o.includes("background")&&(o.includes("_1")||o.includes("splash")||o.includes("endgame")||o.includes("main"))||e==="text"||e==="effects"&&o.includes("particle"))}async function Rs(o){var s,r;let e=_s(o.gameObjects),t={gamePrompt:o.gamePrompt,gameObjects:e,brandAssets:o.manifest.assets,brandDna:o.manifest.brand_dna,brandName:o.manifest.brand_name},i=Is(t),n=[];if(o.flatDesignDataUrl)try{let l=zs(o.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 Ti(o.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."):(r=l.message)!=null&&r.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return So(a,o.gameObjects)}function So(o,e){try{let t=o,i=o.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=o.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:o,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:o,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:o,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function xn(o,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 r=await Eo(o,s);s.output_dataUrl=r,s.status="Generated \u2713"}catch(r){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,r),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Eo(o,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&o.manifest){let r=o.manifest.assets.find(l=>l.id===e.reference_asset);if(r){let l=o.assetFiles.get(r.file);if(l){let c=await Ve(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(o.flatDesignDataUrl){let r=zs(o.flatDesignDataUrl);r&&t.push(r)}let i=Os(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:o.manifest.brand_dna,needsTransparency:i},a=js(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await ut(o.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await pt(s)||s}function zs(o){let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ds(o,e){let t=o.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=[],o.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 $s(o){var t,i;let e=new Map;if(!o)return console.warn("[CanvaZip] No position data provided"),e;if(typeof o=="string")try{o=JSON.parse(o)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(o!=null&&o.layers&&Array.isArray(o.layers)){console.log(`[CanvaZip] Parsing ${o.layers.length} layers from position data`);for(let n of o.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let s=n.layout,r={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 p=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:r,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:r,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",o);if(e.size===0&&typeof o=="object"&&!Array.isArray(o)){for(let[n,a]of Object.entries(o))if(a&&typeof a=="object"&&"layout"in a){let s=a.layout,r={x:0,y:0},l=1,c=0;if(s.position&&typeof s.position=="object"?r={x:s.position.x||0,y:s.position.y||0}:(typeof s.x=="number"||typeof s.y=="number")&&(r={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,p=(i=s.scaleY)!=null?i:1;l=(d+p)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:r,scale:l,rotation:c})}}return e}function Hs(o,e){if(!o)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",o),null;if(e.has(o))return console.log(`[CanvaZip] Exact match found for ${o}`),e.get(o);let t=o.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${o} -> ${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 ${o} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${o}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Co(o){return o.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Ns(){let o=window.getEditableAssets;if(typeof o!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=o();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||Co(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as jt}from"pixi.js";async function Bs(o,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),r=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",r);let l=await jt.load(r);if(!l){console.error("[LIBRARY] Failed to load texture:",r);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)Ae[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);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:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Gs(o,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,r=(t=s==null?void 0:s.slots)==null?void 0:t.find(f=>f.category===e),l=r==null?void 0:r.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 p=await jt.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Ae[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,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=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Pi(o,e,t,i){var n,a,s,r,l,c,d,p,u,g,h,m,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let v=qs(w),L=Date.now(),M=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",M);let I=await jt.load(M);if(!I){console.error("[LIBRARY] Failed to load texture:",M);return}console.log("[LIBRARY] \u2705 Texture loaded"),Ae[w]=I,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let P=window.CustomAssets;P!=null&&P[w]&&(P[w].texture=I,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let j=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!j),j){let T=Array.from(((n=j.keys)==null?void 0:n.call(j))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",T);let S=j.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!S),S){let x=((a=S.getDisplayObject)==null?void 0:a.call(S))||S.pixiObject||S.pixi||S,E=(s=x==null?void 0:x.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",x),console.log("[LIBRARY] displayObject type:",E),console.log("[LIBRARY] has texture?",!!(x!=null&&x.texture)),x!=null&&x.texture)x.texture=I,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(E==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),A=x.parent,O=(l=(r=A==null?void 0:A.getChildIndex)==null?void 0:r.call(A,x))!=null?l:0,k={x:x.x,y:x.y},R={x:(d=(c=x.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=x.anchor)==null?void 0:p.y)!=null?u:.5},z={x:(h=(g=x.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=x.scale)==null?void 0:m.y)!=null?f:1},$=(b=x.alpha)!=null?b:1,U=(y=x.visible)!=null?y:!0,H=new C(I);H.anchor.set(R.x,R.y),H.position.set(k.x,k.y),H.scale.set(z.x,z.y),H.alpha=$,H.visible=U,A&&(A.removeChild(x),A.addChildAt(H,O),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),S.pixiObject&&(S.pixiObject=H),S.pixi&&(S.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(x!=null&&x.children){let C=x.children.find(A=>A.texture);C?(C.texture=I,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;Vs(w,_,I,v),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:w,texture:I,assetPath:_}})),Ue({objectId:w,path:"render.asset.path",value:_},{persist:!0,emitEvent:!0}),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",_)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function Us(o,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=qs(a),r=Date.now(),l=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await jt.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Ae[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 p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Vs(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Ue({objectId:a,path:"render.asset.path",value:t},{persist:!0,emitEvent:!0}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}function qs(o){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(o):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 Vs(o,e,t,i){if(e){try{let n=`${o}:${e}`;Wt.set(n,t)}catch{}if(i&&i!==e)try{let n=Wt.store;n!=null&&n.delete&&n.delete(`${o}:${i}`)}catch{}Fs(e,t),i&&i!==e&&Fs(i,null)}}function Fs(o,e){if(!o)return;let t=jt.cache;if(!t)return;let i=o.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`
|
|
1300
1300
|
<div class="canva-wizard-overlay" data-canva-wizard>
|
|
1301
1301
|
<div class="canva-wizard-modal">
|
|
1302
1302
|
<div class="canva-wizard-header">
|