exodeui 6.3.48 → 6.3.50
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/index.js +19 -34
- package/dist/index.mjs +3200 -3119
- package/dist/src/__tests__/adjustments.test.d.ts +1 -0
- package/dist/src/engine.d.ts +5 -0
- package/dist/src/useExodeUI.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,34 +1,19 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`||
|
|
3
|
-
`||
|
|
4
|
-
`&&
|
|
5
|
-
`||T
|
|
6
|
-
`&&k++)}let M=(C==null?void 0:C.lines)||[];return g.composer==="every-line"&&M.length>1&&(M=Ms(M)),g.balanceRaggedLines===!0&&M.length>1&&(M=Is(M)),{width:a,height:w,lineCount:M.length,lines:M}}function es(g,t,s){let o=String(g||"").trim();if(o&&!isNaN(Number(o))&&!o.includes(" ")&&!o.endsWith("fr")&&!o.endsWith("px")&&!o.endsWith("%")){const r=Math.max(1,parseInt(o));o=new Array(r).fill("1fr").join(" ")}const e=o.split(/\s+/).filter(Boolean),i=new Array(e.length).fill(0);let n=t-(e.length-1)*s,a=0;if(e.forEach((r,l)=>{if(r.endsWith("px")){const h=parseFloat(r);i[l]=h,n-=h}else r.endsWith("fr")?a+=parseFloat(r):r==="auto"&&(i[l]=100,n-=100)}),a>0&&n>0){const r=n/a;e.forEach((l,h)=>{l.endsWith("fr")&&(i[h]=r*parseFloat(l))})}return i}function ss(g,t,s){try{const o=g.autoLayout;return!o||!o.enabled?{childUpdates:[]}:(o.mode||"linear")==="grid"?Ts(g,t,s):ks(g,t,s)}catch(o){return console.error("Layout Engine Error:",o),{childUpdates:[]}}}function ks(g,t,s){var P,E;const o=g.autoLayout,{direction:e,spacing:i,padding:n,align:a,wrap:r}=o,l=e==="vertical",h=t.map(A=>{const B=s(A.id),D=A.geometry;let W=(B==null?void 0:B.width)??D.width??100,X=(B==null?void 0:B.height)??D.height??100;if(D.type==="Ellipse"||D.type==="Polygon"||D.type==="Star"){const H=(B==null?void 0:B.radius)??D.radius??(B==null?void 0:B.outer_radius)??D.outer_radius??50;W=H*2,X=H*2}else if(D.type==="Text"){const H=ts({text:(B==null?void 0:B.text)??D.text??"",fontFamily:D.fontFamily,fontSize:D.fontSize,fontWeight:D.fontWeight,fontStyle:D.fontStyle,lineHeight:D.lineHeight,width:D.width||200,letterSpacing:D.letterSpacing,paragraphSpacing:D.paragraphSpacing,paragraphIndent:D.paragraphIndent,textCase:D.textCase,segments:D.segments,enableSegments:D.enableSegments});X=H.height,D.width||(W=H.width)}return W*=A.transform.scale_x||1,X*=A.transform.scale_y||1,{id:A.id,w:W,h:X,original:A}});let f=g.width,p=g.height;const c=((P=g.layoutProps)==null?void 0:P.width)==="hug",d=((E=g.layoutProps)==null?void 0:E.height)==="hug",u=[];let y=[],m=0,b=0;const v=f-n.left-n.right,S=p-n.top-n.bottom;h.forEach(A=>{r&&y.length>0&&(l?b+i+A.h>S:m+i+A.w>v)?(u.push({children:y,width:m,height:b}),y=[A],m=A.w,b=A.h):(y.push(A),l?(m=Math.max(m,A.w),b+=(y.length>1?i:0)+A.h):(m+=(y.length>1?i:0)+A.w,b=Math.max(b,A.h)))}),y.length>0&&u.push({children:y,width:m,height:b}),c&&!l&&(f=Math.max(...u.map(A=>A.width),0)+n.left+n.right),d&&l&&(p=Math.max(...u.map(A=>A.height),0)+n.top+n.bottom);const C=[];let w=n.left,M=n.top;const I=a.toLowerCase(),k=I==="center"||I.endsWith("-center"),T=I.endsWith("-right"),O=I==="center"||I.startsWith("center-"),_=I.startsWith("bottom-");return u.forEach(A=>{let B=w,D=M;l?O?D=n.top+(p-n.top-n.bottom-A.height)/2:_&&(D=p-n.bottom-A.height):k?B=n.left+(f-n.left-n.right-A.width)/2:T&&(B=f-n.right-A.width),A.children.forEach(W=>{var R,et;let X=B,H=D;l?k?X+=(A.width-W.w)/2:T&&(X+=A.width-W.w):O?H+=(A.height-W.h)/2:_&&(H+=A.height-W.h);const Q=((R=W.original.layoutProps)==null?void 0:R.width)==="fill",L=((et=W.original.layoutProps)==null?void 0:et.height)==="fill";C.push({id:W.id,x:X+W.w/2-f/2,y:H+W.h/2-p/2,width:Q&&l?A.width:void 0,height:L?l?void 0:A.height:void 0}),l?D+=W.h+i:B+=W.w+i}),l?w+=A.width+i:M+=A.height+i}),{frameWidth:c?f:void 0,frameHeight:d?p:void 0,childUpdates:C}}function Ts(g,t,s){const o=g.autoLayout;if(!o)return{childUpdates:[]};const{gridColumns:e,gridRows:i,columnGap:n=0,rowGap:a=0,padding:r,align:l}=o;let h=g.width,f=g.height;const p=h-r.left-r.right,c=f-r.top-r.bottom,d=es(e||"1fr",p,n),u=es(i||"auto",c,a),y=d.length>0?d.reduce((T,O)=>T+O,0)+(d.length-1)*n:0,m=u.length>0?u.reduce((T,O)=>T+O,0)+(u.length-1)*a:0,b=l.toLowerCase(),v=b==="center"||b.endsWith("-center"),S=b.endsWith("-right"),C=b==="center"||b.startsWith("center-"),w=b.startsWith("bottom-");let M=0,I=0;v?M=(p-y)/2:S&&(M=p-y),C?I=(c-m)/2:w&&(I=c-m);const k=[];return t.forEach((T,O)=>{var et,U;const _=O%d.length||0,P=Math.floor(O/d.length)||0;P>=u.length&&u.push(100);const E=d[_],A=u[P];let B=r.left+M+d.slice(0,_).reduce((lt,x)=>lt+x+n,0),D=r.top+I+u.slice(0,P).reduce((lt,x)=>lt+x+a,0);const W=s(T.id),X=T.geometry;let H=(W==null?void 0:W.width)??X.width??100,Q=(W==null?void 0:W.height)??X.height??100;if(X.type==="Ellipse"||X.type==="Polygon"||X.type==="Star"){const lt=(W==null?void 0:W.radius)??X.radius??(W==null?void 0:W.outer_radius)??X.outer_radius??50;H=lt*2,Q=lt*2}H*=T.transform.scale_x||1,Q*=T.transform.scale_y||1;let L=B,R=D;v?L+=(E-H)/2:S&&(L+=E-H),C?R+=(A-Q)/2:w&&(R+=A-Q),k.push({id:T.id,x:L+H/2-h/2,y:R+Q/2-f/2,width:((et=T.layoutProps)==null?void 0:et.width)==="fill"?E:void 0,height:((U=T.layoutProps)==null?void 0:U.height)==="fill"?A:void 0})}),{childUpdates:k}}class is{constructor(){ct(this,"world",null);ct(this,"bodies",new Map);ct(this,"colliders",new Map);ct(this,"joints",new Map);ct(this,"initialized",!1);ct(this,"bodyIdByCollider",new Map);ct(this,"onCollisionCB",null);ct(this,"eventQueue",null)}setCollisionCallback(t){this.onCollisionCB=t}async init(t){this.initialized||(await ee.init(),this.world=new ee.World(new ee.Vector2(t.x*100,t.y*100)),this.eventQueue=new ee.EventQueue(!0),this.initialized=!0)}destroy(){this.bodies.clear(),this.colliders.clear(),this.joints.clear(),this.world&&(this.world.free(),this.world=null),this.initialized=!1}setGravity(t){this.world&&(this.world.gravity=new ee.Vector2(t.x*100,t.y*100))}createBody(t){if(!this.world){console.warn("[RapierPhysics] World not initialized");return}this.bodies.has(t.id)&&this.removeBody(t.id);const s=t.isStatic?ee.RigidBodyDesc.fixed():ee.RigidBodyDesc.dynamic();s.setTranslation(t.x,t.y),t.rotation!==void 0&&s.setRotation(t.rotation);const o=this.world.createRigidBody(s);let e;switch(t.type){case"Rectangle":e=ee.ColliderDesc.cuboid(t.width/2,t.height/2);break;case"Ellipse":e=ee.ColliderDesc.ball(Math.max(t.width,t.height)/2);break;case"Triangle":case"Star":case"Polygon":e=ee.ColliderDesc.cuboid(t.width/2,t.height/2);break;default:e=ee.ColliderDesc.cuboid(t.width/2,t.height/2)}if(t.friction!==void 0&&e.setFriction(t.friction),t.restitution!==void 0&&e.setRestitution(t.restitution),t.density!==void 0)e.setDensity(t.density);else if(t.mass!==void 0&&!t.isStatic){const n=t.width*t.height;e.setDensity(t.mass/n)}t.isSensor&&e.setSensor(!0);const i=this.world.createCollider(e,o);this.bodyIdByCollider.set(i.handle,t.id),t.frictionAir!==void 0&&o.setLinearDamping(t.frictionAir*10),this.bodies.set(t.id,o),this.colliders.set(t.id,i)}removeBody(t){const s=this.bodies.get(t),o=this.colliders.get(t);o&&this.bodyIdByCollider.delete(o.handle),s&&this.world&&(this.world.removeRigidBody(s),this.bodies.delete(t),this.colliders.delete(t))}step(t){if(!this.world)return;this.world.step(this.eventQueue);const s=this.onCollisionCB,o=this.eventQueue;s&&o&&o.drainContactEvents((e,i,n)=>{const a=this.bodyIdByCollider.get(e),r=this.bodyIdByCollider.get(i);a&&r&&s(a,r,n)})}getPosition(t){const s=this.bodies.get(t);if(!s)return null;const o=s.translation();return{x:o.x,y:o.y}}getRotation(t){const s=this.bodies.get(t);return s?s.rotation():null}getVelocity(t){const s=this.bodies.get(t);if(!s)return null;const o=s.linvel();return{x:o.x,y:o.y}}setPosition(t,s,o){const e=this.bodies.get(t);e&&e.setTranslation(new ee.Vector2(s,o),!0)}setRotation(t,s){const o=this.bodies.get(t);o&&o.setRotation(s,!0)}setVelocity(t,s,o){const e=this.bodies.get(t);e&&e.setLinvel(new ee.Vector2(s,o),!0)}setAngularVelocity(t,s){const o=this.bodies.get(t);o&&o.setAngvel(s,!0)}applyForce(t,s,o){const e=this.bodies.get(t);e&&e.addForce(new ee.Vector2(s,o),!0)}applyImpulse(t,s,o){const e=this.bodies.get(t);e&&e.applyImpulse(new ee.Vector2(s,o),!0)}createJoint(t){if(!this.world){console.warn("[RapierPhysics] World not initialized");return}this.joints.has(t.id)&&this.removeJoint(t.id);const s=this.bodies.get(t.bodyA),o=this.bodies.get(t.bodyB);if(!s||!o){console.warn(`[RapierPhysics] Cannot create joint ${t.id}: bodyA (${t.bodyA}) or bodyB (${t.bodyB}) not found`);return}const e=new ee.Vector2(t.anchorA.x,t.anchorA.y),i=new ee.Vector2(t.anchorB.x,t.anchorB.y);let n;if(t.type==="Distance"){const a=t.length??100,r=t.stiffness??100,l=t.damping??10;n=ee.JointData.spring(a,r,l,e,i)}else n=ee.JointData.revolute(e,i);try{const a=this.world.createImpulseJoint(n,s,o,!0);this.joints.set(t.id,a)}catch(a){console.error(`[RapierPhysics] Failed to create joint ${t.id}:`,a)}}removeJoint(t){const s=this.joints.get(t);if(s&&this.world){try{this.world.removeImpulseJoint(s,!0)}catch(o){console.error(`[RapierPhysics] Failed to remove joint ${t}:`,o)}this.joints.delete(t)}}}const ns=g=>g,Ps=g=>g>0?1:0,_s=g=>g<1?0:1,os=g=>g*g,as=g=>g*(2-g),rs=g=>g<.5?2*g*g:-1+(4-2*g)*g,Es=g=>g*g*g,As=g=>--g*g*g+1,Os=g=>g<.5?4*g*g*g:(g-1)*(2*g-2)*(2*g-2)+1,Ls=g=>g*g*g*g,xs=g=>1- --g*g*g*g,Rs=g=>g<.5?8*g*g*g*g:1-8*--g*g*g*g,Fs=g=>g*g*g*g*g,$s=g=>1+--g*g*g*g*g,Bs=g=>g<.5?16*g*g*g*g*g:1+16*--g*g*g*g*g,Ws=g=>1-Math.cos(g*Math.PI/2),Ys=g=>Math.sin(g*Math.PI/2),Xs=g=>-(Math.cos(Math.PI*g)-1)/2,Ds=g=>g===0?0:Math.pow(2,10*(g-1)),Gs=g=>g===1?1:1-Math.pow(2,-10*g),Ns=g=>g===0?0:g===1?1:g<.5?Math.pow(2,20*g-10)/2:(2-Math.pow(2,-20*g+10))/2,zs=g=>1-Math.sqrt(1-g*g),Vs=g=>Math.sqrt(1- --g*g),Hs=g=>g<.5?(1-Math.sqrt(1-4*g*g))/2:(Math.sqrt(1-(-2*g+2)*(-2*g+2))+1)/2,Ne=1.70158,ze=Ne*1.525,ls=Ne+1,Us=g=>ls*g*g*g-Ne*g*g,qs=g=>1+ls*Math.pow(g-1,3)+Ne*Math.pow(g-1,2),Ks=g=>g<.5?Math.pow(2*g,2)*((ze+1)*2*g-ze)/2:(Math.pow(2*g-2,2)*((ze+1)*(g*2-2)+ze)+2)/2,cs=2*Math.PI/3,fs=2*Math.PI/4.5,Js=g=>g===0?0:g===1?1:-Math.pow(2,10*g-10)*Math.sin((g*10-10.75)*cs),Qs=g=>g===0?0:g===1?1:Math.pow(2,-10*g)*Math.sin((g*10-.75)*cs)+1,Zs=g=>g===0?0:g===1?1:g<.5?-(Math.pow(2,20*g-10)*Math.sin((20*g-11.125)*fs))/2:Math.pow(2,-20*g+10)*Math.sin((20*g-11.125)*fs)/2+1,Ve=g=>g<1/2.75?7.5625*g*g:g<2/2.75?7.5625*(g-=1.5/2.75)*g+.75:g<2.5/2.75?7.5625*(g-=2.25/2.75)*g+.9375:7.5625*(g-=2.625/2.75)*g+.984375,js=g=>1-Ve(1-g),ti=Ve,ei=g=>g<.5?(1-Ve(1-2*g))/2:(1+Ve(2*g-1))/2,Ze=new Map,We=(g,t,s,o)=>{const e=`${g},${t},${s},${o}`;if(Ze.has(e))return Ze.get(e);const i=h=>(1-3*s+3*g)*h*h*h+(3*s-6*g)*h*h+3*g*h,n=h=>(1-3*o+3*t)*h*h*h+(3*o-6*t)*h*h+3*t*h,a=h=>3*(1-3*s+3*g)*h*h+2*(3*s-6*g)*h+3*g,r=h=>{let f=h;for(let p=0;p<8;p++){const c=i(f)-h;if(Math.abs(c)<1e-6)return f;const d=a(f);if(Math.abs(d)<1e-6)break;f=f-c/d}return f},l=h=>h===0?0:h===1?1:n(r(h));return Ze.set(e,l),l},hs=g=>{const t=g.match(/cubic-bezier\s*\(\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*\)/);if(!t)return null;const[,s,o,e,i]=t.map(Number);return We(s,o,e,i)},ds={ease:We(.25,.1,.25,1),"ease-in":We(.42,0,1,1),"ease-out":We(0,0,.58,1),"ease-in-out":We(.42,0,.58,1)},He={Linear:ns,EaseInQuad:os,EaseOutQuad:as,EaseInOutQuad:rs,EaseInCubic:Es,EaseOutCubic:As,EaseInOutCubic:Os,EaseInQuart:Ls,EaseOutQuart:xs,EaseInOutQuart:Rs,EaseInQuint:Fs,EaseOutQuint:$s,EaseInOutQuint:Bs,EaseInSine:Ws,EaseOutSine:Ys,EaseInOutSine:Xs,EaseInExpo:Ds,EaseOutExpo:Gs,EaseInOutExpo:Ns,EaseInCirc:zs,EaseOutCirc:Vs,EaseInOutCirc:Hs,EaseInBack:Us,EaseOutBack:qs,EaseInOutBack:Ks,EaseInElastic:Js,EaseOutElastic:Qs,EaseInOutElastic:Zs,EaseInBounce:js,EaseOutBounce:ti,EaseInOutBounce:ei,EaseIn:os,EaseOut:as,EaseInOut:rs,StepStart:Ps,StepEnd:_s},si=g=>{const t=g.trim(),s=t.toLowerCase();if(He[t])return He[t];const o=Object.keys(He).find(i=>i.toLowerCase()===s);if(o)return He[o];const e=Object.keys(ps).find(i=>i.toLowerCase()===s);if(e){const i=hs(ps[e].value);if(i)return i}if(ds[s])return ds[s];if(s.startsWith("cubic-bezier")){const i=hs(t);if(i)return i}return ns},ps={Snappy:{label:"Snappy",description:"High energy, quick arrival.",value:"cubic-bezier(0.2, 1, 0.2, 1)"},Bouncy:{label:"Bouncy",description:"Springy with an overshoot.",value:"cubic-bezier(0.2, 0.9, 0.4, 1.3)"},Gentle:{label:"Gentle",description:"Smooth and organic flow.",value:"cubic-bezier(0.4, 0, 0.6, 1)"},Stiff:{label:"Stiff",description:"Solid and reliable movement.",value:"cubic-bezier(0.3, 1, 0.7, 1)"},Floating:{label:"Floating",description:"Weightless and airy transition.",value:"cubic-bezier(0.5, 0, 0.5, 1)"},Sudden:{label:"Sudden",description:"Instant, direct movement.",value:"cubic-bezier(1, 0, 1, 1)"},Elastic:{label:"Elastic",description:"Extreme overshoot and spring.",value:"cubic-bezier(0.5, 1.5, 0.5, 1.5)"},Sharp:{label:"Sharp",description:"Fast start, very hard stop.",value:"cubic-bezier(0.1, 0.9, 0.1, 1)"},Fluid:{label:"Fluid",description:"Natural high-end flow.",value:"cubic-bezier(0.4, 0, 0.2, 1)"},Heavy:{label:"Heavy",description:"Slow start, massive impact.",value:"cubic-bezier(0.6, 0, 1, 1)"}},ii=(g,t,s,o,e)=>{if(!g||!t||!s)return g;const i=o.scale_x??1,n=o.scale_y??1,a=(r,l,h)=>{let f=0,p=0;const c=o.rotation*Math.PI/180,d=Math.cos(c),u=Math.sin(c),y=r*i*d-l*n*u+o.x,m=r*i*u+l*n*d+o.y;h.forEach(I=>{const k=e(I.boneId);if(!k)return;const T={x:k.x,y:k.y,rotation:k.rotation,scaleX:k.scale_x??1,scaleY:k.scale_y??1},O=s[I.boneId]||[1,0,0,1,0,0],_=y*O[0]+m*O[2]+O[4],P=y*O[1]+m*O[3]+O[5],E=T.rotation*Math.PI/180,A=Math.cos(E),B=Math.sin(E),D=_*T.scaleX*A-P*T.scaleY*B+T.x,W=_*T.scaleX*B+P*T.scaleY*A+T.y;f+=D*I.amount,p+=W*I.amount});const b=[...h].sort((I,k)=>k.amount-I.amount);if(b.length>=2&&b[0].amount>0&&b[1].amount>0){const I=e(b[0].boneId),k=e(b[1].boneId);if(I&&k&&I.length!==void 0&&k.length!==void 0){const T=I.length*(I.scale_y??1),O=I.rotation*Math.PI/180,_=I.x-T*Math.sin(O),P=I.y+T*Math.cos(O),E=k.length*(k.scale_y??1),A=k.rotation*Math.PI/180,B=k.x-E*Math.sin(A),D=k.y+E*Math.cos(A);let W=null,X=null,H=!1;const Q=1;if(Math.hypot(I.x-k.x,I.y-k.y)<Q||Math.hypot(I.x-B,I.y-D)<Q?(W=I.x,X=I.y):(Math.hypot(_-k.x,P-k.y)<Q||Math.hypot(_-B,P-D)<Q)&&(W=_,X=P,H=!0),W!==null&&X!==null){const L=s[b[0].boneId]||[1,0,0,1,0,0],R=L[0]*L[3]-L[1]*L[2];let et=0,U=0;if(R!==0){const lt=(L[2]*L[5]-L[3]*L[4])/R,x=(L[1]*L[4]-L[0]*L[5])/R,F=Math.atan2(-L[1],L[3]);if(!H)et=lt,U=x;else{const N=-L[2]/R,gt=L[0]/R,mt=Math.hypot(N,gt),ut=I.length*mt;et=lt-ut*Math.sin(F),U=x+ut*Math.cos(F)}const z=Math.hypot(y-et,m-U),st=Math.hypot(f-W,p-X);if(st>0&&z>0){const N=Math.max(st,.01),gt=Math.min(z/N,3),mt=W+(f-W)*gt,ut=X+(p-X)*gt,wt=b[0].amount,Mt=b[1].amount,Et=Math.min(wt,Mt)*2,Ut=1-Math.pow(1-Et,4);f=f*(1-Ut)+mt*Ut,p=p*(1-Ut)+ut*Ut}}}}}const v=o.rotation*Math.PI/180,S=Math.cos(v),C=Math.sin(v),w=f-o.x,M=p-o.y;return{x:(w*S+M*C)/i,y:(-w*C+M*S)/n}};return g.map((r,l)=>{const h=t[l];if(!h||h.length===0)return{...r};const f={...r,...a(r.x,r.y,h)};if(r.in_x!==void 0&&r.in_y!==void 0){const p=a(r.in_x,r.in_y,h);f.in_x=p.x,f.in_y=p.y}if(r.out_x!==void 0&&r.out_y!==void 0){const p=a(r.out_x,r.out_y,h);f.out_x=p.x,f.out_y=p.y}return f})};function ni(g,t,s,o,e){const i=g*s*.01,n=t*s*.01,a=Math.sin(e*12.9898)*43758.5453%(Math.PI*2),r=Math.cos(e*78.233)*43758.5453%(Math.PI*2);return(Math.sin(i+a)*Math.cos(n+r)+.5*Math.sin(i*2.1-r)*Math.cos(n*2.3+a)+.25*Math.sin(i*4.5+a)*Math.cos(n*4.2-r))/1.75*o}function oi(g,t,s,o,e,i,n=0,a=0){const r=[];if(!g)return[];const l=g.type;if(l==="Rectangle"||l==="Image"||l==="Frame"){const d=Math.max(20,Math.floor((t+s)/10)),u=Math.max(2,Math.floor(d*(t/(t+s)))),y=Math.max(2,Math.floor(d*(s/(t+s))));for(let m=0;m<u;m++)r.push({x:-t/2+t/u*m,y:-s/2,nx:0,ny:-1});for(let m=0;m<y;m++)r.push({x:t/2,y:-s/2+s/y*m,nx:1,ny:0});for(let m=0;m<u;m++)r.push({x:t/2-t/u*m,y:s/2,nx:0,ny:1});for(let m=0;m<y;m++)r.push({x:-t/2,y:s/2-s/y*m,nx:-1,ny:0})}else if(l==="Ellipse"){const d=Math.max(60,Math.floor(Math.PI*Math.max(t,s)/5));for(let u=0;u<d;u++){const y=u/d*Math.PI*2,m=Math.cos(y),b=Math.sin(y);r.push({x:m*t/2,y:b*s/2,nx:m,ny:b})}}else if(l==="Triangle"){const d={x:0,y:-s/2},u={x:t/2,y:s/2},y={x:-t/2,y:s/2},m=20;let b=u.x-d.x,v=u.y-d.y,S=Math.hypot(b,v),C=-v/S,w=b/S;for(let M=0;M<m;M++)r.push({x:d.x+b*(M/m),y:d.y+v*(M/m),nx:C,ny:w});b=y.x-u.x,v=y.y-u.y,S=Math.hypot(b,v),C=-v/S,w=b/S;for(let M=0;M<m;M++)r.push({x:u.x+b*(M/m),y:u.y+v*(M/m),nx:C,ny:w});b=d.x-y.x,v=d.y-y.y,S=Math.hypot(b,v),C=-v/S,w=b/S;for(let M=0;M<m;M++)r.push({x:y.x+b*(M/m),y:y.y+v*(M/m),nx:C,ny:w})}else for(let u=0;u<80;u++){const y=u/80*Math.PI*2,m=Math.cos(y),b=Math.sin(y);r.push({x:m*t/2,y:b*s/2,nx:m,ny:b})}const h=n*Math.PI/180,f=Math.cos(h),p=Math.sin(h);return r.map(d=>{const u=ni(d.x,d.y,e,o,i),y=d.nx*(1-a)+f*a,m=d.ny*(1-a)+p*a;let b=Math.hypot(y,m);return b===0&&(b=1),{x:d.x+y/b*u,y:d.y+m/b*u}})}const us={default:{label:"Default",colors:["#6366f1","#f59e0b"],cardBackground:"rgba(255,255,255,0.04)",cardBorderColor:"rgba(255,255,255,0.08)",gridColor:"rgba(255,255,255,0.06)",axisLabelColor:"rgba(255,255,255,0.5)",legendColor:"rgba(255,255,255,0.7)",barGradient:!0},neon:{label:"Neon",colors:["#00f5ff","#ff00e5"],cardBackground:"rgba(0,0,0,0.5)",cardBorderColor:"rgba(0,245,255,0.2)",gridColor:"rgba(0,245,255,0.08)",axisLabelColor:"rgba(0,245,255,0.6)",legendColor:"rgba(0,245,255,0.8)",barGradient:!0},pastel:{label:"Pastel",colors:["#a5b4fc","#fcd34d"],cardBackground:"rgba(255,255,255,0.06)",cardBorderColor:"rgba(255,255,255,0.12)",gridColor:"rgba(255,255,255,0.08)",axisLabelColor:"rgba(255,255,255,0.45)",legendColor:"rgba(255,255,255,0.65)",barGradient:!1},warm:{label:"Warm",colors:["#f97316","#ef4444"],cardBackground:"rgba(30,10,0,0.4)",cardBorderColor:"rgba(249,115,22,0.2)",gridColor:"rgba(249,115,22,0.08)",axisLabelColor:"rgba(253,186,116,0.7)",legendColor:"rgba(253,186,116,0.85)",barGradient:!0},ocean:{label:"Ocean",colors:["#06b6d4","#0ea5e9"],cardBackground:"rgba(0,20,40,0.5)",cardBorderColor:"rgba(6,182,212,0.2)",gridColor:"rgba(6,182,212,0.06)",axisLabelColor:"rgba(125,211,252,0.6)",legendColor:"rgba(125,211,252,0.8)",barGradient:!0},mono:{label:"Mono",colors:["rgba(255,255,255,0.9)","rgba(255,255,255,0.4)"],cardBackground:"rgba(255,255,255,0.03)",cardBorderColor:"rgba(255,255,255,0.1)",gridColor:"rgba(255,255,255,0.05)",axisLabelColor:"rgba(255,255,255,0.4)",legendColor:"rgba(255,255,255,0.6)",barGradient:!1}},gs={default:{label:"Default",colors:["#6366f1","#22d3ee","#f59e0b","#ec4899","#34d399"],cardBackground:"rgba(255,255,255,0.04)",cardBorderColor:"rgba(255,255,255,0.08)",legendColor:"rgba(255,255,255,0.65)",labelColor:"#ffffff",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.4)"},neon:{label:"Neon",colors:["#00f5ff","#ff00e5","#00ff9f","#ff6b00","#b400ff"],cardBackground:"rgba(0,0,0,0.55)",cardBorderColor:"rgba(0,245,255,0.2)",legendColor:"rgba(0,245,255,0.75)",labelColor:"#ffffff",centerTextColor:"#00f5ff",centerLabelColor:"rgba(0,245,255,0.5)"},pastel:{label:"Pastel",colors:["#a5b4fc","#67e8f9","#fcd34d","#f9a8d4","#6ee7b7"],cardBackground:"rgba(255,255,255,0.06)",cardBorderColor:"rgba(255,255,255,0.12)",legendColor:"rgba(255,255,255,0.6)",labelColor:"#1a1a2e",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.45)"},warm:{label:"Warm",colors:["#f97316","#ef4444","#f59e0b","#dc2626","#fb923c"],cardBackground:"rgba(30,10,0,0.45)",cardBorderColor:"rgba(249,115,22,0.2)",legendColor:"rgba(253,186,116,0.8)",labelColor:"#ffffff",centerTextColor:"#fb923c",centerLabelColor:"rgba(253,186,116,0.5)"},ocean:{label:"Ocean",colors:["#06b6d4","#0ea5e9","#38bdf8","#7dd3fc","#0284c7"],cardBackground:"rgba(0,20,40,0.5)",cardBorderColor:"rgba(6,182,212,0.2)",legendColor:"rgba(125,211,252,0.75)",labelColor:"#ffffff",centerTextColor:"#38bdf8",centerLabelColor:"rgba(125,211,252,0.5)"},mono:{label:"Mono",colors:["rgba(255,255,255,0.9)","rgba(255,255,255,0.65)","rgba(255,255,255,0.45)","rgba(255,255,255,0.28)","rgba(255,255,255,0.15)"],cardBackground:"rgba(255,255,255,0.03)",cardBorderColor:"rgba(255,255,255,0.1)",legendColor:"rgba(255,255,255,0.55)",labelColor:"#000000",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.4)"}};class ys{constructor(){ct(this,"artboard",null);ct(this,"objectStates",new Map);ct(this,"physicsEngine",null);ct(this,"activeStateMachine",null);ct(this,"inputs",new Map);ct(this,"inputNameMap",new Map);ct(this,"layerStates",new Map);ct(this,"pretextCache",new Map);ct(this,"pointerHistory",[]);ct(this,"MAX_HISTORY",200);ct(this,"imageCache",new Map);ct(this,"lastValidSvgImgMap",new Map);ct(this,"maskBuffer",null);ct(this,"maskCtx",null);ct(this,"lumaBuffer",null);ct(this,"lumaCtx",null);ct(this,"_noiseTileCanvas",null);ct(this,"layout",{fit:"Contain",alignment:"Center"});ct(this,"onTrigger");ct(this,"onInputUpdate");ct(this,"onComponentChange");ct(this,"onToggle");ct(this,"onInputChange");ct(this,"onInputFocus");ct(this,"onInputBlur");ct(this,"onLog");ct(this,"onButtonClick");ct(this,"onGraphPointClick");ct(this,"justFiredTriggers",new Set);ct(this,"rootTransform",null);ct(this,"canvasWidth",0);ct(this,"canvasHeight",0);ct(this,"lastHoveredObjectId",null);ct(this,"_lastPointerPos",null);ct(this,"_prevPointerPos",null);ct(this,"_mouseDelta",{dx:0,dy:0});ct(this,"focusedId",null);ct(this,"draggingSliderId",null);ct(this,"draggingJoystickId",null);ct(this,"activeDropdownId",null);ct(this,"activeObjectId",null);ct(this,"draggingListViewId",null);ct(this,"scrollOffset",{x:0,y:0});ct(this,"_totalScroll",{x:0,y:0});ct(this,"draggingBehaviors",new Set);ct(this,"isMouseDown",!1);ct(this,"activeKeys",new Set);ct(this,"_layoutAnimCache",new Map);ct(this,"_springChainState",new Map);ct(this,"_emitterPools",new Map);ct(this,"objectVelocities",new Map);ct(this,"currentTime",0);ct(this,"frameCount",0);ct(this,"fontLeadingFactors",{Inter:.35,Roboto:.45,Montserrat:.4,Outfit:.35,"Open Sans":.4,Poppins:.45,"Playfair Display":.35,Lora:.4,Lato:.35,"Bebas Neue":.45,Oswald:.4});ct(this,"onLogicUpdate");ct(this,"logicNodeValues",new Map);ct(this,"logicNodeState",new Map);ct(this,"pointerDownTimes",new Map);ct(this,"activeHoverIds",new Set);ct(this,"onNavigation");ct(this,"periodicTriggerTimes",new Map);ct(this,"wasInView",new Set);ct(this,"scrollProgressLastValue",new Map);ct(this,"debug_objectsRendered",0);ct(this,"debug_objectsTotal",0);ct(this,"lastRenderTime",0);ct(this,"debugMode",!1);ct(this,"activeTriggers",new Map);console.info("%c[ExodeUI Engine] Pixel-Perfect Parity Active (v6.3.10) - SVG Fill & Gradient Parity Active","color: #3b82f6; font-weight: bold; padding: 2px 4px; border-radius: 4px; background: rgba(59, 130, 246, 0.1)")}getInputValue(t){if(this.inputs.has(t))return this.inputs.get(t);const s=this.inputNameMap.get(t);if(s&&s.length>0)return this.inputs.get(s[0])}setTriggerCallback(t){this.onTrigger=t}setInputUpdateCallback(t){this.onInputUpdate=t}setComponentChangeCallback(t){this.onComponentChange=t}setToggleCallback(t){this.onToggle=t}setLogicUpdateCallback(t){this.onLogicUpdate=t}setInputChangeCallback(t){this.onInputChange=t}setButtonClickCallback(t){this.onButtonClick=t}setGraphPointClickCallback(t){this.onGraphPointClick=t}setNavigationCallback(t){this.onNavigation=t}ensurePathPoints(t){if(!t||t.type!=="Path"&&t.type!=="Subtract"&&t.type!=="Union"&&t.type!=="Intersect"&&t.type!=="Exclude"&&t.type!=="BooleanOperation")return;if(t.points&&t.points.length>0){if(t.is_closed===void 0&&t.isClosed===void 0&&t.data){const{isClosed:e}=this.svgPathToPoints(t.data);t.is_closed=e}return}if(!t.data)return;const{points:s,isClosed:o}=this.svgPathToPoints(t.data);t.points=s,t.is_closed===void 0&&(t.is_closed=o)}svgPathToPoints(t){const s=/([MLHVCSQTAZmlhvcsqtaz])([^MLHVCSQTAZmlhvcsqtaz]*)/g,o=/[-+]?(?:\d*\.\d+|\d+)(?:[eE][-+]?\d+)?/g,e=[];let i=!1,n=0,a=0,r=0,l=0,h=0,f=0,p;for(;(p=s.exec(t))!==null;){const c=p[1],d=(p[2].match(o)||[]).map(parseFloat),u=c===c.toLowerCase(),y=c.toUpperCase();let m=0;const b=S=>{let C=d[m++];return u&&(C+=S?n:a),C},v=()=>({x:b(!0),y:b(!1)});switch(y){case"M":{const S=v();for(h=n=S.x,f=a=S.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a,moveTo:!0});m<d.length;){const C=v();n=C.x,a=C.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break}case"L":for(;m<d.length;){const S=v();n=S.x,a=S.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break;case"H":for(;m<d.length;)n=b(!0),e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a});break;case"V":for(;m<d.length;)a=b(!1),e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a});break;case"C":for(;m<d.length;){const S=v(),C=v(),w=v();if(e.length>0){const M=e[e.length-1];M.out_x=S.x,M.out_y=S.y}n=w.x,a=w.y,e.push({x:n,y:a,in_x:C.x,in_y:C.y,out_x:n,out_y:a}),r=C.x,l=C.y}break;case"S":for(;m<d.length;){const S={x:2*n-r,y:2*a-l},C=v(),w=v();if(e.length>0){const M=e[e.length-1];M.out_x=S.x,M.out_y=S.y}n=w.x,a=w.y,e.push({x:n,y:a,in_x:C.x,in_y:C.y,out_x:n,out_y:a}),r=C.x,l=C.y}break;case"Q":for(;m<d.length;){const S=v(),C=v();if(e.length>0){const w=e[e.length-1];w.out_x=w.x+2/3*(S.x-w.x),w.out_y=w.y+2/3*(S.y-w.y)}n=C.x,a=C.y,e.push({x:n,y:a,in_x:n+2/3*(S.x-n),in_y:a+2/3*(S.y-a),out_x:n,out_y:a}),r=S.x,l=S.y}break;case"T":for(;m<d.length;){const S={x:2*n-r,y:2*a-l},C=v();if(e.length>0){const w=e[e.length-1];w.out_x=w.x+2/3*(S.x-w.x),w.out_y=w.y+2/3*(S.y-w.y)}n=C.x,a=C.y,e.push({x:n,y:a,in_x:n+2/3*(S.x-n),in_y:a+2/3*(S.y-a),out_x:n,out_y:a}),r=S.x,l=S.y}break;case"Z":if(i=!0,e.length>0){const S=e[e.length-1];S.closePath=!0;const C=[...e].reverse().find(w=>w.moveTo)||e[0];C&&Math.hypot(C.x-S.x,C.y-S.y)<.1&&(C.in_x=S.in_x,C.in_y=S.in_y,e.pop(),e.length>0&&(e[e.length-1].closePath=!0))}n=h,a=f;break;default:if(d.length>=2){const S=v();n=S.x,a=S.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break}}return{points:e,isClosed:i}}setOnLogCallback(t){this.onLog=t}debugLog(t){this.onLog&&this.onLog(t)}setInputFocusCallback(t){this.onInputFocus=t}setInputBlurCallback(t){this.onInputBlur=t}updateConstraint(t,s,o){var i;const e=(i=this.artboard)==null?void 0:i.objects.find(n=>n.id===t);e&&e.constraints&&e.constraints[s]&&(e.constraints[s]={...e.constraints[s],...o},o.useSpring===!1&&this.objectVelocities.delete(t))}log(...t){this.debugMode&&console.log(...t)}warn(...t){this.debugMode&&console.warn(...t)}setInternalInput(t,s){this.inputs.set(t,s),this.onInputUpdate&&this.onInputUpdate(t,s)}setLayout(t,s){this.layout={fit:t,alignment:s}}getActiveStateIds(t="Base Layer"){const s=this.layerStates.get(t);return s?s.currentStateIds:[]}getObjectState(t){return this.objectStates.get(t)}updateObjectOptions(t,s){const o=this.objectStates.get(t);o&&(o.options={...o.options,...s})}updateGraphData(t,s){var e,i;if(!this.artboard)return;const o=this.artboard.objects.find(n=>n.id===t||n.name===t);if(o&&((e=o.geometry)==null?void 0:e.type)==="LineGraph"){const n=o.geometry;!n.datasets||n.datasets.length===0?n.datasets=[{id:"default",label:"Runtime Data",data:s,lineColor:"#3b82f6",lineWidth:2,showArea:!1}]:n.datasets[0].data=s;const a=this.objectStates.get(o.id);a&&((i=a.geometry)==null?void 0:i.type)==="LineGraph"&&(!a.geometry.datasets||a.geometry.datasets.length===0?a.geometry.datasets=JSON.parse(JSON.stringify(n.datasets)):a.geometry.datasets[0].data=[...s]),n.datasets[0].inputId&&this.updateInput(n.datasets[0].inputId,s)}else this.updateInput(t,s)}load(t){var n,a;if(!t)return;let s=this.decompressStrings(t);const o=[],e=new Set,i=r=>{r&&r.forEach(l=>{if(e.has(l.id))return;const h={...l},f=h.childrenObjects||[];e.add(h.id),o.push(h),i(f)})};if(i(s.objects||[]),o.length>(s.objects||[]).length&&this.log(`[Engine] Flattened artboard from ${(s.objects||[]).length} to ${o.length} objects.`),s.objects=o,this.artboard=s,this.currentTime=0,this.objectStates.clear(),this.log(`[ExodeUIEngine] Loading artboard: "${(n=this.artboard)==null?void 0:n.name}" with ${(a=this.artboard)==null?void 0:a.objects.length} objects`),this.artboard&&this.artboard.objects){const r=new Map;this.artboard.objects.forEach(l=>{r.set(l.id,l),l.children||(l.children=[])}),this.artboard.objects.forEach(l=>{if(l.parentId){const h=r.get(l.parentId);h&&(h.children||(h.children=[]),h.children.includes(l.id)||h.children.push(l.id))}})}this.loadFonts(),this.preloadImages(this.artboard),this.reset(),this.advance(0)}preloadImages(t){if(!t||!t.objects)return;const s=o=>{if(!o||this.imageCache.has(o))return;const e=new Image;e.onload=()=>{this.log(`[ExodeUI Preload] loaded ${e.naturalWidth}x${e.naturalHeight}`)},e.onerror=i=>{console.error("[ExodeUI Preload] failed:",i,`Src: ${o.substring(0,80)}...`)},e.src=o,this.imageCache.set(o,e)};t.objects.forEach(o=>{var e,i,n;(e=o.geometry)!=null&&e.src&&s(o.geometry.src),(n=(i=o.style)==null?void 0:i.fill)!=null&&n.src&&s(o.style.fill.src)})}decompressStrings(t){if(t&&typeof t=="object"&&!Array.isArray(t)){if(t._compressed&&t._data)try{const o=Ss.decompressFromBase64(t._data);if(o)return o}catch(o){return console.error("[ExodeUI] Failed to decompress string:",o),t._data}const s={};for(const[o,e]of Object.entries(t))s[o]=this.decompressStrings(e);return s}return Array.isArray(t)?t.map(s=>this.decompressStrings(s)):t}reset(){if(!this.artboard)return;if(this.objectStates.clear(),this.objectVelocities.clear(),this.currentTime=0,this.inputs.clear(),this.inputNameMap.clear(),this.layerStates.clear(),this.logicNodeValues.clear(),this.justFiredTriggers.clear(),this.inputs.set("mouseX",0),this.inputs.set("mouseY",0),this.inputs.set("scrollX",0),this.inputs.set("scrollY",0),this.inputs.set("isMouseDown",!1),this.physicsEngine&&(this.physicsEngine.destroy(),this.physicsEngine=null),this._layoutAnimCache.clear(),this._springChainState.clear(),this._emitterPools.clear(),this.artboard.objects.forEach(s=>{var n,a,r,l,h,f,p;const o=s.width??((n=s.geometry)==null?void 0:n.width)??0,e=s.height??((a=s.geometry)==null?void 0:a.height)??0,i=s.cornerRadius??s.corner_radius??((r=s.geometry)==null?void 0:r.corner_radius)??((l=s.geometry)==null?void 0:l.cornerRadius)??0;this.objectStates.set(s.id,{...s.transform||{},x:((h=s.transform)==null?void 0:h.x)??s.x??0,y:((f=s.transform)==null?void 0:f.y)??s.y??0,width:o,height:e,cornerRadius:i,corner_radius:i,clipContent:s.clipContent??!1,autoLayout:s.autoLayout?JSON.parse(JSON.stringify(s.autoLayout)):void 0,layoutProps:s.layoutProps?JSON.parse(JSON.stringify(s.layoutProps)):void 0,opacity:((p=s.transform)==null?void 0:p.opacity)!==void 0?s.transform.opacity:s.opacity!==void 0?s.opacity:100,visible:s.visible!==void 0?s.visible:s.isVisible!==void 0?s.isVisible:!0,blendMode:s.blendMode||"Normal",style:JSON.parse(JSON.stringify(s.style||{})),geometry:JSON.parse(JSON.stringify(s.geometry||{})),options:s.options?JSON.parse(JSON.stringify(s.options)):{},masks:s.masks?JSON.parse(JSON.stringify(s.masks)):[],zIndex:s.zIndex!==void 0?s.zIndex:void 0})}),this.artboard.objects.some(s=>{var o;return(o=s.physics)==null?void 0:o.enabled})){this.physicsEngine=new is;const s=this.artboard.physics?{x:this.artboard.physics.gravity.x,y:this.artboard.physics.gravity.y}:{x:0,y:1};this.physicsEngine.init(s).then(()=>{var o;this.physicsEngine&&((o=this.artboard)==null||o.objects.forEach(e=>{var i,n;if((i=e.physics)!=null&&i.enabled&&e.type==="Shape"){const a=this.objectStates.get(e.id);if(!a)return;const r=e.geometry.width||100,l=e.geometry.height||100;this.physicsEngine.createBody({id:e.id,type:((n=e.geometry)==null?void 0:n.type)||"Rectangle",x:a.x,y:a.y,width:r,height:l,rotation:a.rotation*(Math.PI/180),isStatic:e.physics.bodyType==="Static",mass:e.physics.mass,friction:e.physics.friction,restitution:e.physics.restitution,frictionAir:e.physics.frictionAir,density:e.physics.density,isSensor:e.physics.isSensor})}}))})}this.artboard.stateVariables&&this.artboard.stateVariables.forEach(s=>{this.inputs.set(s.id,s.value);const o=this.inputNameMap.get(s.name)||[];o.includes(s.id)||o.push(s.id),this.inputNameMap.set(s.name,o)}),this.artboard.stateMachine&&(this.activeStateMachine=this.artboard.stateMachine,this.activeStateMachine.inputs.forEach(s=>{this.inputs.set(s.id,s.value.value);const o=this.inputNameMap.get(s.name)||[];o.push(s.id),this.inputNameMap.set(s.name,o)}),this.activeStateMachine.layers.forEach(s=>{let o=s.states.find(e=>e.id===s.entryStateId);!o&&s.states.length>0&&(console.warn(`[ExodeUI] Invalid entryStateId "${s.entryStateId}" in layer "${s.name}". Falling back to first state.`),o=s.states[0]),o&&this.enterStates(s.name,[o.id])}),this.evaluateTransitions()),this.initGlobalAnimationTriggers(),this.updateAutoLayout(!0),this.loadFonts()}updateAutoLayout(t=!1){var i;if(!this.artboard)return;const s=new Map;this.artboard.objects.forEach(n=>s.set(n.id,n));const o=.15,e=n=>{n.forEach(a=>{const r=this.objectStates.get(a.id);if(r){const l=Math.abs(r.x-a.x),h=Math.abs(r.y-a.y);!t&&(l>20||h>20)?(r.x+=(a.x-r.x)*o,r.y+=(a.y-r.y)*o):(r.x=a.x,r.y=a.y),a.width!==void 0&&(r.width=a.width),a.height!==void 0&&(r.height=a.height)}})};if((i=this.artboard.autoLayout)!=null&&i.enabled){const n=this.artboard.objects.filter(r=>!r.parentId),a=ss(this.artboard,n,r=>this.objectStates.get(r));e(a.childUpdates)}this.artboard.objects.forEach(n=>{var a;if(n.type==="Frame"&&((a=n.autoLayout)!=null&&a.enabled)&&n.children&&n.children.length>0){const r=n.children.map(f=>s.get(f)).filter(f=>!!f),l=this.objectStates.get(n.id);if(!l)return;const h=ss(l,r,f=>this.objectStates.get(f));h.frameWidth!==void 0&&(l.width=h.frameWidth),h.frameHeight!==void 0&&(l.height=h.frameHeight),e(h.childUpdates)}})}loadFonts(){if(!this.artboard)return;const t=new Set;if(this.artboard.objects.forEach(n=>{n.geometry&&n.geometry.type==="Text"&&n.geometry.fontFamily&&t.add(n.geometry.fontFamily)}),this.artboard.animations.forEach(n=>{n.tracks.forEach(a=>{(a.property==="geometry.fontFamily"||a.property==="fontFamily")&&a.keyframes.forEach(r=>{r.value&&typeof r.value=="string"&&t.add(r.value)})})}),t.size===0)return;let s="";t.forEach(n=>{const a=n.replace(/ /g,"+");s+=`&family=${a}:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900`});const o="exodeui-google-fonts",e="exodeui-fontshare-fonts";if(s.length>0){const n=`https://fonts.googleapis.com/css2?display=swap${s}`;let a=document.getElementById(o);a||(a=document.createElement("link"),a.id=o,a.rel="stylesheet",document.head.appendChild(a)),a.href!==n&&(a.href=n)}const i=[];if(t.forEach(n=>{n.toLowerCase().includes("clash display")&&i.push("clash-display@200,300,400,500,600,700")}),i.length>0){const n=`https://api.fontshare.com/v2/css?f[]=${i.join("&f[]=")}&display=swap`;let a=document.getElementById(e);a||(a=document.createElement("link"),a.id=e,a.rel="stylesheet",document.head.appendChild(a)),a.href!==n&&(a.href=n)}document.fonts&&document.fonts.ready&&document.fonts.ready.then(()=>{this.pretextCache.clear(),this.advance(0)})}enterStates(t,s){var n;if(s.length===0)return;const o=this.layerStates.get(t);if(o&&o.currentStateIds.length===s.length&&s.every(r=>o.currentStateIds.includes(r))&&this.justFiredTriggers.size===0)return;const e=[];let i=0;if(this.artboard&&this.activeStateMachine){const a=this.activeStateMachine.layers.find(r=>r.name===t);if(a)for(const r of s){const l=a.states.find(h=>h.id===r);if(l)if(l.isBlendState&&l.blendAnimations&&l.blendAnimations.length>0)e.push({animation:null,state:l}),l.blendAnimations.forEach(h=>{const f=this.artboard.animations.find(p=>p.id===h.animationId);f&&(i=Math.max(i,f.duration))});else{let h=null;l.animationId&&(h=this.artboard.animations.find(f=>f.id===l.animationId)||null),h||(h=this.artboard.animations.find(f=>{var p,c;return f.name===l.name||f.id===l.name||(l.name==="Entry"||l.id==="entry")&&(((p=f.name)==null?void 0:p.toLowerCase())==="onload"||((c=f.name)==null?void 0:c.toLowerCase())==="intro")})||null),h&&((n=this.artboard.animationFlow)!=null&&n.some(p=>(p.trigger==="on_load"||p.trigger==="after_delay")&&p.targetAnimationId===(h==null?void 0:h.id))||(e.push({animation:h,state:l}),i=Math.max(i,h.duration)))}}}this.layerStates.set(t,{currentStateIds:s,animations:e,time:0,duration:i})}setInputBool(t,s){this.updateInput(t,s)}setInputNumber(t,s){this.updateInput(t,s)}fireTrigger(t){this.updateInput(t,!0)}setInputText(t,s){this.updateInput(t,s)}setInputNumberArray(t,s){this.updateInput(t,s)}setInputStringArray(t,s){this.updateInput(t,s)}updateObjectProperty(t,s,o){const e=this.objectStates.get(t);if(e)if(s.includes(".")||s.includes("[")){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let n=e;for(let a=0;a<i.length-1;a++){if(typeof n[i[a]]!="object"||n[i[a]]===null){const r=i[a+1],l=!isNaN(Number(r));n[i[a]]=l?[]:{}}n=n[i[a]]}n[i[i.length-1]]=o}else e[s]=o}updateInput(t,s){var n,a,r;let o;if(this.inputs.has(t)){const l=(n=this.activeStateMachine)==null?void 0:n.inputs.find(h=>h.id===t);l&&typeof l.value=="object"&&(o=l.value.type)}else{const l=this.inputNameMap.get(t);if(l&&l.length>0){const h=(a=this.activeStateMachine)==null?void 0:a.inputs.find(f=>f.id===l[0]);h&&typeof h.value=="object"&&(o=h.value.type)}}let e=s;o==="Trigger"&&(s===1?e=!0:s===0&&(e=!1)),this.inputs.has(t)&&this.setInternalInput(t,e);const i=this.inputNameMap.get(t);i&&i.forEach(l=>this.setInternalInput(l,e)),o==="Trigger"&&e===!0&&(this.justFiredTriggers.add(t),i&&i.forEach(l=>this.justFiredTriggers.add(l))),Array.isArray(e)&&((r=this.artboard)==null||r.objects.forEach(l=>{if(l.inputId===t||l.name===t){const h=this.objectStates.get(l.id);h&&h.options&&(l.type==="ListView"||l.variant==="listview"?h.options.items=e:(l.type==="Dropdown"||l.variant==="dropdown")&&(h.options.optionsList=e))}})),this.evaluateTransitions(),this.evaluateVariableTriggers(t,e)}evaluateVariableTriggers(t,s){if(!this.artboard)return;const o=this.artboard.animationFlow||[],e=this.inputNameMap.get(t);o.forEach(i=>{if(i.trigger==="variable"&&i.conditionVariableId&&i.targetAnimationId&&(i.conditionVariableId===t||e&&e.includes(i.conditionVariableId))){const a=i.conditionOperator||"IsTrue",r=i.conditionValue;let l=!1;switch(a){case"Equal":case"==":l=s==r;break;case"NotEqual":case"!=":l=s!=r;break;case"GreaterThan":case">":l=s>r;break;case"LessThan":case"<":l=s<r;break;case"GreaterEqual":case">=":l=s>=r;break;case"LessEqual":case"<=":l=s<=r;break;case"IsTrue":l=!!s;break;case"IsFalse":l=!s;break}if(l){const h=i.delay||0;h<=0?this.triggerGlobalAnimation(i.targetAnimationId,i.subAnimationIds,i.loop,i.id):setTimeout(()=>this.triggerGlobalAnimation(i.targetAnimationId,i.subAnimationIds,i.loop,i.id),h)}}})}evaluateTransitions(){this.activeStateMachine&&(this.activeStateMachine.layers.forEach(t=>{const s=this.layerStates.get(t.name);if(!s||s.currentStateIds.length===0)return;const o=[];let e=!1;for(const i of s.currentStateIds){const n=t.states.find(r=>r.id===i);if(!n)continue;let a=!1;for(const r of n.transitions||[])this.checkConditions(r.conditions)&&(o.push(r.targetStateId),a=!0,e=!0);a||o.push(i)}if(!e){const i=this.findGlobalTransition(t,s.currentStateIds);i&&(o.length=0,o.push(i.targetStateId),e=!0,i.conditions&&(i.conditions||[]).forEach(n=>{var r;const a=(r=this.activeStateMachine)==null?void 0:r.inputs.find(l=>l.id===n.inputId);a&&typeof a.value=="object"&&a.value.type==="Trigger"&&this.setInternalInput(n.inputId,!1)}))}if(e){const i=Array.from(new Set(o));this.enterStates(t.name,i)}}),this.justFiredTriggers.size>0&&(this.justFiredTriggers.forEach(t=>{var o,e;this.setInternalInput(t,!1);const s=(o=this.activeStateMachine)==null?void 0:o.inputs.find(i=>i.id===t);s&&this.inputNameMap.has(s.name)&&((e=this.inputNameMap.get(s.name))==null||e.forEach(i=>this.setInternalInput(i,!1)))}),this.justFiredTriggers.clear()))}findGlobalTransition(t,s){for(const o of t.states)if(!(s.includes(o.id)&&this.justFiredTriggers.size===0)){for(const i of o.transitions||[])if(!(s.includes(i.targetStateId)&&this.justFiredTriggers.size===0)&&this.checkConditions(i.conditions))return i}return null}checkConditions(t){return!t||t.length===0?!0:t.every(s=>{const o=s.inputId,e=s.op,i=s.value,n=this.evaluateLogicTree(o);if(n===void 0)return this.log(`[Engine] Condition Check Failed: Input ${o} is undefined`),!1;let a=!1;switch(e){case"Equal":case"==":a=n==i;break;case"NotEqual":case"!=":a=n!=i;break;case"GreaterThan":case">":a=n>i;break;case"LessThan":case"<":a=n<i;break;case"GreaterEqual":case">=":a=n>=i;break;case"LessEqual":case"<=":a=n<=i;break;case"IsTrue":a=!!n;break;case"IsFalse":a=!n;break;default:a=!1}return a||this.justFiredTriggers.has(o),a})}evaluateLogicTree(t,s=null,o=new Set){var a,r,l,h,f,p;if(o.has(t))return this.inputs.get(t)??this.logicNodeValues.get(t)??0;o.add(t);const e=(r=(a=this.activeStateMachine)==null?void 0:a.logicNodes)==null?void 0:r.find(c=>c.id===t);if(e){const c=(u,y)=>{const m=e.inputs.find(b=>b.id===u);return m?m.sourceId?this.evaluateLogicTree(m.sourceId,m.sourceHandleId,o):m.value!==void 0?m.value:y:y};let d=0;switch(e.op){case It.AND:d=c("a",!1)&&c("b",!1);break;case It.OR:d=c("a",!1)||c("b",!1);break;case It.NOT:d=!c("in",!1);break;case It.XOR:d=!!c("a",!1)!=!!c("b",!1);break;case It.OBJECT:d=e.name;break;case It.PROPERTY:case It.GET_PROPERTY:{const u=c("id","");if(!u){d=0;break}const y=e.name;if(!y||y==="GET_PROPERTY"||y==="PROPERTY"){d=0;break}const m=this.objectStates.get(u);if(!m){d=0;break}y in m?d=m[y]:d=this.resolvePath(m,y);break}case It.SET_PROPERTY:{const u=c("id",""),y=c("value",void 0);if(!u||y===void 0){d=0;break}const m=e.name;if(!m||m==="SET_PROPERTY"){d=0;break}const b=this.objectStates.get(u);if(!b){d=0;break}if(["x","y","rotation","scale_x","scale_y","opacity","width","height","cornerRadius","visible","zIndex"].includes(m))b[m]=y,d=y;else{const S=m.replace(/\[(\d+)\]/g,".$1").split(".");let C=b;for(let M=0;M<S.length-1;M++){const I=S[M],k=S[M+1];C[I]===void 0&&(C[I]=isNaN(Number(k))?{}:[]),C=C[I]}const w=S[S.length-1];C[w]=y,d=y}break}case It.ADD:d=c("a",0)+c("b",0);break;case It.SUB:d=c("a",0)-c("b",0);break;case It.MUL:d=c("a",0)*c("b",0);break;case It.DIV:{const u=c("b",1);d=u===0?0:c("a",0)/u;break}case It.MOD:d=c("a",0)%c("b",1);break;case It.POW:d=Math.pow(c("a",0),c("b",1));break;case It.ABS:d=Math.abs(c("in",0));break;case It.ROUND:d=Math.round(c("in",0));break;case It.FLOOR:d=Math.floor(c("in",0));break;case It.CEIL:d=Math.ceil(c("in",0));break;case It.SIN:d=Math.sin(c("in",0));break;case It.COS:d=Math.cos(c("in",0));break;case It.TAN:d=Math.tan(c("in",0));break;case It.CLAMP:{const u=c("in",0),y=c("min",0),m=c("max",1);d=Math.max(y,Math.min(m,u));break}case It.REMAP:{const u=c("in",0),y=c("inMin",0),m=c("inMax",100),b=c("outMin",0),v=c("outMax",1);d=m===y?b:b+(u-y)*(v-b)/(m-y);break}case It.EQ:d=c("a",0)==c("b",0);break;case It.NEQ:d=c("a",0)!=c("b",0);break;case It.GT:d=c("a",0)>c("b",0);break;case It.LT:d=c("a",0)<c("b",0);break;case It.GTE:d=c("a",0)>=c("b",0);break;case It.LTE:d=c("a",0)<=c("b",0);break;case It.IF_ELSE:d=c("cond",!1)?c("then",0):c("else",0);break;case It.VALUE:d=e.value!==void 0?e.value:0;break;case It.INPUT:d=this.inputs.get(e.name)??0;break;case It.LOG:{const u=c("in","");this.debugLog(`[User Logic] ${u}`),d=u;break}case It.SCROLL_X:d=this.inputs.get("scrollX")??0;break;case It.SCROLL_Y:d=this.inputs.get("scrollY")??0;break;case It.MOUSE_X:d=this.inputs.get("mouseX")??0;break;case It.MOUSE_Y:d=this.inputs.get("mouseY")??0;break;case It.IS_MOUSE_DOWN:d=this.inputs.get("isMouseDown")??!1;break;case It.EFFECTOR:{const u=c("id",""),y=c("intensity",1),m=c("trigger",!0);if(!u||!m){d=0;break}const b=e.name;if(!b){d=0;break}const v=this.objectStates.get(u);if(!v){d=0;break}if(["glitch","halftone","pixelate","noise","acid_gradient","acid_rave","shimmer"].includes(b))v.style||(v.style={}),v.style.artEffect={enabled:!0,type:b,intensity:y},d=1;else{v.behaviors||(v.behaviors=[]);let C=v.behaviors.find(w=>w.type===b);C?(C.enabled=!0,C.settings||(C.settings={}),C.settings.intensity=y):(C={id:`eff_${Date.now()}_${b}`,type:b,enabled:!0,sensors:[],settings:{intensity:y}},v.behaviors.push(C)),d=1}break}case It.MONITOR:{d=c("in",0);break}case It.SPRING_PULL:{const u=c("objectId",""),y=c("forceX",0),m=c("forceY",0);u&&((l=this.artboard)==null||l.objects.forEach(b=>{b.behaviors&&b.behaviors.forEach(v=>{var S;if(v.type===q.SpringChain&&((S=v.settings)!=null&&S.connections)&&(v.settings.connections.some(w=>w.targetId===u)||b.id===u)){this._springChainState.has(b.id)||this._springChainState.set(b.id,new Map);const w=this._springChainState.get(b.id);if(!w.has(u)){const I=this.objectStates.get(u);w.set(u,{x:(I==null?void 0:I.x)??0,y:(I==null?void 0:I.y)??0,vx:0,vy:0})}const M=w.get(u);M&&(M.vx+=y,M.vy+=m)}})})),d=1;break}case It.SPRING_SETTLE:{const u=c("objectId","");let y=!0;if(u){const m=c("threshold",1);this._springChainState.forEach(b=>{const v=b.get(u);v&&(Math.abs(v.vx)>m||Math.abs(v.vy)>m)&&(y=!1)})}d=y;break}case It.EMIT:{const u=c("objectId",""),y=c("count",20);u&&((h=this.artboard)==null||h.objects.forEach(m=>{m.behaviors&&m.behaviors.forEach(b=>{b.type===q.ParticleEmitter&&m.id===u&&(b._pendingBurst=(b._pendingBurst||0)+y)})})),d=1;break}default:d=0;break}if(this.logicNodeValues.set(t,d),e.op===It.DELAY){const u=c("delay",0),y=c("in",0);let m=this.logicNodeState.get(t);for(m||(m={queue:[]},this.logicNodeState.set(t,m)),m.queue.push({time:this.currentTime+u,value:y});m.queue.length>0&&m.queue[0].time<=this.currentTime;)m.lastValue=m.queue.shift().value;d=m.lastValue??0}return d}const i=(f=this.activeStateMachine)==null?void 0:f.inputs.find(c=>c.id===t||c.name===t);if(i&&i.sourceId&&!o.has(i.sourceId)){const c=this.evaluateLogicTree(i.sourceId,i.sourceHandleId,o);return this.inputs.set(i.id,c),c}let n=this.inputs.get(t)??(i?this.inputs.get(i.id):void 0);if((this.justFiredTriggers.has(t)||i&&this.justFiredTriggers.has(i.id))&&(n=!0),s&&n!==void 0){const c=(p=this.activeStateMachine)==null?void 0:p.inputs.find(d=>d.id===t);if(c&&c.value.type==="Number"&&typeof n=="number"){const d=c.value.defaultValue??c.value.value;if(s==="source-greater")return n>d;if(s==="source-less")return n<d;if(s==="source-equal")return n===d}if(s==="source-true")return n===!0;if(s==="source-false")return n===!1;if(s==="source-fire")return this.justFiredTriggers.has(t)}return n!==void 0?n:0}runLogicNodes(){!this.activeStateMachine||!this.activeStateMachine.logicNodes||this.activeStateMachine.logicNodes.forEach(t=>{(t.op===It.SET_PROPERTY||t.op===It.EFFECTOR)&&this.evaluateLogicTree(t.id)})}resolvePath(t,s){const o=s.replace(/\[(\d+)\]/g,".$1").split(".");let e=t;for(const i of o)if(e&&typeof e=="object"&&i in e)e=e[i];else return;return e}processLogicProperties(){!this.artboard||!this.artboard.objects||this.artboard.objects.forEach(t=>{const s=t.logicProperties;if(s&&s.length>0){const o=this.objectStates.get(t.id);if(!o)return;s.forEach(e=>{let i;if(e.valueType==="variable"?i=this.getInputValue(e.variableId):e.valueType==="constant"&&(i=e.value),i!==void 0){const n=e.name;if(["x","y","rotation","scale_x","scale_y","opacity","width","height","cornerRadius","visible","zIndex"].includes(n))o[n]=i;else{const r=n.replace(/\[(\d+)\]/g,".$1").split(".");let l=o;for(let f=0;f<r.length-1;f++){const p=r[f],c=r[f+1];l[p]===void 0&&(l[p]=isNaN(Number(c))?{}:[]),l=l[p]}const h=r[r.length-1];l[h]=i}}})}})}seek(t){this.artboard&&(this.currentTime=t,this.layerStates.forEach(s=>{s.time=t,s.time>(s.duration||0)&&(s.animations.some(e=>{var i;return((i=e.state)==null?void 0:i.loop)===!0})?s.time%=s.duration||1:s.time=s.duration)}),this.advance(0))}advance(t){if(!this.artboard)return;this.currentTime+=t,this.isMouseDown&&this.pointerDownTimes.forEach((o,e)=>{e&&this.currentTime-o>=.5&&(this.log(`[Engine] onHold detected for ${e}`),this.fireEventForObject(e,"onHold"),this.pointerDownTimes.delete(e))}),this.frameCount++,this.physicsEngine&&(this.physicsEngine.step(t),this.artboard.objects.forEach(o=>{var e;if((e=o.physics)!=null&&e.enabled){const i=this.physicsEngine.getPosition(o.id),n=this.physicsEngine.getRotation(o.id),a=this.objectStates.get(o.id);a&&i!==null&&n!==null&&(a.x=i.x,a.y=i.y,a.rotation=n*(180/Math.PI))}})),this.activeStateMachine&&(this.runLogicNodes(),this.evaluateTransitions()),this.processLogicProperties();const s=[];this.layerStates.forEach((o,e)=>{if(o.animations.length>0){if(o.time+=t,this.frameCount%240===0&&this.debugLog(`Advancing Layer time: ${o.time.toFixed(3)} / ${o.duration.toFixed(3)}`),o.time>o.duration)if(o.animations.some(n=>{var a;return((a=n.state)==null?void 0:a.loop)===!0}))o.time%=o.duration;else{const n=o.time<o.duration+.1;o.time=o.duration,n&&(o.currentStateIds.length>0&&this.handleAnimationFinished(o.currentStateIds[0],o.ruleId),e.startsWith("global_")&&s.push(e))}o.animations.forEach(i=>{var n;(n=i.state)!=null&&n.isBlendState&&i.state.blendAnimations?this.applyBlendState(i.state,o.time):i.animation&&this.applyAnimation(i.animation,o.time,i.filterObjectIds)})}}),s.forEach(o=>{this.layerStates.delete(o),this.debugLog(`[Engine] Cleaned up completed global layer: ${o}`)}),this.solveConstraints(t),this.solveBehaviors(t),this.activeTriggers.forEach((o,e)=>{var i,n,a,r,l,h,f;if(o.phase==="entry")o.time+=t,o.time>=o.animation.duration&&((a=(n=(i=this.artboard)==null?void 0:i.objects.find(p=>p.id===e))==null?void 0:n.triggers)==null||a.find(p=>p.id===o.triggerId),o.phase="hold",o.elapsedHold=0,o.time=o.animation.duration),this.applyAnimation(o.animation,o.time,o.filterObjectIds||o.filterObjectId||void 0);else if(o.phase==="hold"){const p=(h=(l=(r=this.artboard)==null?void 0:r.objects.find(u=>u.id===e))==null?void 0:l.triggers)==null?void 0:h.find(u=>u.id===o.triggerId),c=(p==null?void 0:p.duration)||0;o.elapsedHold+=t*1e3;let d=o.elapsedHold>=c;if((p==null?void 0:p.eventType)==="hover"&&!this.activeHoverIds.has(e)&&(d=!0),((p==null?void 0:p.eventType)==="onHold"||(p==null?void 0:p.eventType)==="pointerDown")&&!this.isMouseDown&&(d=!0),d)if(p!=null&&p.exitAnimationId){const u=(f=this.artboard)==null?void 0:f.animations.find(y=>y.id===p.exitAnimationId);u?(o.phase="exit",o.animation=u,o.time=0):this.activeTriggers.delete(e)}else this.activeTriggers.delete(e)}else o.phase==="exit"&&(o.time+=t,o.time>=o.animation.duration?this.activeTriggers.delete(e):this.applyAnimation(o.animation,o.time,o.filterObjectIds||o.filterObjectId||void 0))}),this.evaluateContinuousInteractions(t),this.processJoysticks(t),this.activeStateMachine&&this.onLogicUpdate&&this.logicNodeValues.size>0&&this.onLogicUpdate(Object.fromEntries(this.logicNodeValues))}evaluateContinuousInteractions(t){this.artboard&&(this.artboard.objects.forEach(s=>{var e,i,n;const o=(e=s.style)==null?void 0:e.analytics;if(o&&o.isEnabled&&o.triggerType==="visible"){const a=this.objectStates.get(s.id);if(a&&a.visible!==!1){const r=this.getGlobalTransform(s.id),l=(((i=s.geometry)==null?void 0:i.width)||100)*(r.scale_x||1),h=(((n=s.geometry)==null?void 0:n.height)||100)*(r.scale_y||1),f=50,p=r.x+l/2>=-this.canvasWidth/2-f&&r.x-l/2<=this.canvasWidth/2+f&&r.y+h/2>=-this.canvasHeight/2-f&&r.y-h/2<=this.canvasHeight/2+f,c=`analytics_${s.id}`,d=this.wasInView.has(c);p&&!d&&this.fireAnalyticsEvent(s.id,"visible"),p?this.wasInView.add(c):this.wasInView.delete(c)}}}),this.artboard.objects.forEach(s=>{const o=s.interactions||[];o.length!==0&&o.forEach(e=>{const i=e.triggers||[e.event||e.trigger];i&&i.forEach(n=>{var r,l,h;const a=n.toLowerCase();if(a==="on interval"||a==="oninterval"){const f=e.intervalValue||2e3,p=this.periodicTriggerTimes.get(e.id)||0;this.currentTime*1e3-p>=f&&(!e.conditions||this.checkConditions(e.conditions))&&(this.fireEventForObject(s.id,"On Interval"),this.periodicTriggerTimes.set(e.id,this.currentTime*1e3))}if(a==="on delay"||a==="ondelay"){const f=e.delayValue||1e3;!this.periodicTriggerTimes.has(e.id)&&this.currentTime*1e3>=f&&(!e.conditions||this.checkConditions(e.conditions))&&(this.fireEventForObject(s.id,"On Delay"),this.periodicTriggerTimes.set(e.id,this.currentTime*1e3))}if(a==="scroll into view"||a==="scrollintoview"){const f=this.objectStates.get(s.id);if(f&&f.visible!==!1){const p=this.getGlobalTransform(s.id),c=(((r=s.geometry)==null?void 0:r.width)||100)*(p.scale_x||1),d=(((l=s.geometry)==null?void 0:l.height)||100)*(p.scale_y||1),u=50,y=p.x+c/2>=-this.canvasWidth/2-u&&p.x-c/2<=this.canvasWidth/2+u&&p.y+d/2>=-this.canvasHeight/2-u&&p.y-d/2<=this.canvasHeight/2+u,m=this.wasInView.has(s.id);y&&!m&&(!e.conditions||this.checkConditions(e.conditions))&&this.fireEventForObject(s.id,"Scroll Into View"),y?this.wasInView.add(s.id):this.wasInView.delete(s.id)}}if(a==="scroll progress"||a==="scrollprogress"){const f=Math.abs(this.scrollOffset.y)/(((h=this.artboard)==null?void 0:h.height)||1e3),p=this.scrollProgressLastValue.get(e.id)||0;Math.abs(f-p)>.001&&(this.scrollProgressLastValue.set(e.id,f),(e.action==="Set Input"||e.action==="setInput")&&this.updateInput(e.targetInputId,f))}})})}))}solveConstraints(t){this.artboard&&this.artboard.objects.forEach(s=>{if(!s.constraints||s.constraints.length===0)return;const o=this.objectStates.get(s.id);if(!o)return;const e=this.getGlobalTransform(s.id);if(s.constraints.forEach((i,n)=>{var h,f,p,c,d,u,y,m,b;const a=((h=o.constraints)==null?void 0:h[n])||{},r={...i,...a},l=r.strength??1;if(r.type==="Translation"){const v=this.getGlobalTransform(r.targetId);if(v){const S=r.offsetX||0,C=r.offsetY||0,w=v.x+S,M=v.y+C,I=r.useSpring;if(I){const T=this.objectVelocities.get(s.id)||{vx:0,vy:0},{x:O,y:_,vx:P,vy:E}=this.computeSpring(e.x,e.y,T.vx,T.vy,w,M,r,t);r.copyX&&(e.x=e.x+(O-e.x)*l),r.copyY&&(e.y=e.y+(_-e.y)*l),this.objectVelocities.set(s.id,{vx:P,vy:E})}else r.copyX&&(e.x=e.x+(w-e.x)*l),r.copyY&&(e.y=e.y+(M-e.y)*l);let k=!1;if((f=r.limitX)!=null&&f.enabled){const T=e.x;e.x=Math.max(r.limitX.min,Math.min(r.limitX.max,e.x)),e.x!==T&&(k=!0)}if((p=r.limitY)!=null&&p.enabled){const T=e.y;e.y=Math.max(r.limitY.min,Math.min(r.limitY.max,e.y)),e.y!==T&&(k=!0)}k&&I&&this.objectVelocities.set(s.id,{vx:0,vy:0})}}else if(r.type==="Rotation"){const v=this.getGlobalTransform(r.targetId);if(v){let C=(v.rotation+(r.offset||0)-e.rotation)%360;C>180&&(C-=360),C<-180&&(C+=360),e.rotation=e.rotation+C*l}}else if(r.type==="Scale"){const v=this.getGlobalTransform(r.targetId);v&&(r.copyX&&(e.scale_x=e.scale_x+(v.scale_x-e.scale_x)*l),r.copyY&&(e.scale_y=e.scale_y+(v.scale_y-e.scale_y)*l))}else if(r.type==="Transform"){const v=this.getGlobalTransform(r.targetId);if(v){e.x=e.x+(v.x-e.x)*l,e.y=e.y+(v.y-e.y)*l;let S=(v.rotation-e.rotation)%360;S>180&&(S-=360),S<-180&&(S+=360),e.rotation=e.rotation+S*l,e.scale_x=e.scale_x+(v.scale_x-e.scale_x)*l,e.scale_y=e.scale_y+(v.scale_y-e.scale_y)*l}}else if(r.type==="FollowPointer"){const v=((c=this._lastPointerPos)==null?void 0:c.x)??e.x,S=((d=this._lastPointerPos)==null?void 0:d.y)??e.y,C=r.useSpring;if(C){const M=this.objectVelocities.get(s.id)||{vx:0,vy:0},{x:I,y:k,vx:T,vy:O}=this.computeSpring(e.x,e.y,M.vx,M.vy,v,S,r,t);e.x=I,e.y=k,this.objectVelocities.set(s.id,{vx:T,vy:O})}else e.x=e.x+(v-e.x)*l,e.y=e.y+(S-e.y)*l;let w=!1;if((u=r.limitX)!=null&&u.enabled){const M=e.x;e.x=Math.max(r.limitX.min,Math.min(r.limitX.max,e.x)),e.x!==M&&(w=!0)}if((y=r.limitY)!=null&&y.enabled){const M=e.y;e.y=Math.max(r.limitY.min,Math.min(r.limitY.max,e.y)),e.y!==M&&(w=!0)}w&&C&&this.objectVelocities.set(s.id,{vx:0,vy:0})}else if(r.type==="Distance"){const v=this.getGlobalTransform(r.targetId);if(v){const S=e.x-v.x,C=e.y-v.y,w=Math.sqrt(S*S+C*C),M=r.distance||0;let I=w;switch(r.mode){case"exact":I=M;break;case"minimum":I=Math.max(M,w);break;case"maximum":I=Math.min(M,w);break;case"clamped":I=Math.max(0,Math.min(M,w));break}if(w>0){const k=e.x===v.x&&e.y===v.y?1:I/w;e.x=e.x+(v.x+S*k-e.x)*l,e.y=e.y+(v.y+C*k-e.y)*l}}}else if(r.type==="FollowPath"){const v=(m=this.artboard)==null?void 0:m.objects.find(S=>S.id===r.targetId);if(v){const S=this.getGlobalTransform(v.id);if(S){let C=v.geometry;if(v.type==="Frame"||v.type==="Group"||!C||C.type!=="Path"&&C.type!=="Ellipse"&&C.type!=="Rectangle"){const R=(b=this.artboard)==null?void 0:b.objects.find(et=>et.parentId===v.id&&et.type==="Shape"&&et.geometry&&(et.geometry.type==="Path"||et.geometry.type==="Ellipse"||et.geometry.type==="Rectangle"));R&&(C=R.geometry)}if(!C)return;const w=(r.distance||0)/100,M=S.width||C.width||0,I=S.height||C.height||0,k=this.getPointOnPath(C,M,I,w),T=S.rotation*Math.PI/180,O=Math.cos(T),_=Math.sin(T),P=k.x*S.scale_x*O-k.y*S.scale_y*_,E=k.x*S.scale_x*_+k.y*S.scale_y*O;let A=S.rotation+(r.offsetRotation||0);if(r.orient){const R=Math.cos(k.angle),et=Math.sin(k.angle),U=R*S.scale_x*O-et*S.scale_y*_,lt=R*S.scale_x*_+et*S.scale_y*O;A=Math.atan2(lt,U)*180/Math.PI+(r.offsetRotation||0)}const B=A*Math.PI/180,D=Math.cos(B),W=Math.sin(B),X=(r.offsetX||0)*D-(r.offsetY||0)*W,H=(r.offsetX||0)*W+(r.offsetY||0)*D,Q=S.x+P+X,L=S.y+E+H;if(e.x=e.x+(Q-e.x)*l,e.y=e.y+(L-e.y)*l,r.orient){let R=(A-e.rotation)%360;R>180&&(R-=360),R<-180&&(R+=360),e.rotation=e.rotation+R*l}}}}else if(r.type==="IK"){const v=this.getGlobalTransform(r.targetId);v&&this.solveIK(s,v,r.boneCount||2,l)}}),s.constraints.some(i=>i.type!=="IK")){const i=this.globalToLocal(s.parentId,e);o.x=i.x,o.y=i.y,o.rotation=i.rotation,o.flip_x=i.scale_x<0,o.scale_x=Math.abs(i.scale_x),o.flip_y=i.scale_y<0,o.scale_y=Math.abs(i.scale_y)}})}getGlobalTransform(t){var f,p;const s=this.objectStates.get(t);if(!s)return{x:0,y:0,rotation:0,scale_x:1,scale_y:1};const o=(f=this.artboard)==null?void 0:f.objects.find(c=>c.id===t),e=(o==null?void 0:o.type)==="Bone"?(p=o.geometry)==null?void 0:p.length:void 0;if(!o||!o.parentId)return{x:s.x,y:s.y,rotation:s.rotation,scale_x:(s.scale_x??1)*(s.flip_x?-1:1),scale_y:(s.scale_y??1)*(s.flip_y?-1:1),length:e};const i=this.getGlobalTransform(o.parentId),n=i.rotation*Math.PI/180,a=Math.cos(n),r=Math.sin(n),l=i.x+(s.x*i.scale_x*a-s.y*i.scale_y*r),h=i.y+(s.x*i.scale_x*r+s.y*i.scale_y*a);return{x:l,y:h,rotation:i.rotation+s.rotation,scale_x:i.scale_x*(s.scale_x??1)*(s.flip_x?-1:1),scale_y:i.scale_y*(s.scale_y??1)*(s.flip_y?-1:1),length:e}}globalToLocal(t,s){if(!t)return s;const o=this.getGlobalTransform(t),e=o.scale_x===0?0:1/o.scale_x,i=o.scale_y===0?0:1/o.scale_y,n=-o.rotation*Math.PI/180,a=Math.cos(n),r=Math.sin(n),l=s.x-o.x,h=s.y-o.y,f=(l*a-h*r)*e,p=(l*r+h*a)*i;return{x:f,y:p,rotation:s.rotation-o.rotation,scale_x:s.scale_x/(o.scale_x||1),scale_y:s.scale_y/(o.scale_y||1)}}solveIK(t,s,o,e){var l;const i=[];let n=t.id;for(let h=0;h<o&&n;h++){const f=(l=this.artboard)==null?void 0:l.objects.find(p=>p.id===n);if(!f)break;i.push({id:n,local:this.objectStates.get(n),global:this.getGlobalTransform(n)}),n=f.parentId}if(i.length<2)return;const a=i.reverse(),r=5;for(let h=0;h<r;h++){const f=this.getGlobalTransform(t.id);for(let p=a.length-2;p>=0;p--){const c=a[p],d=this.getGlobalTransform(c.id),u=f.x-d.x,y=f.y-d.y,m=s.x-d.x,b=s.y-d.y,v=Math.sqrt(u*u+y*y),S=Math.sqrt(m*m+b*b);if(v>.001&&S>.001){const C=Math.atan2(y,u);let M=(Math.atan2(b,m)-C)*180/Math.PI;M*=e;const I=this.objectStates.get(c.id);I&&(I.rotation+=M)}}}}computeSpring(t,s,o,e,i,n,a,r){const l=a.stiffness??100,h=a.damping??10,f=a.mass??1,p=-l*(t-i),c=-l*(s-n),d=-h*o,u=-h*e,y=(p+d)/f,m=(c+u)/f,b=o+y*r,v=e+m*r,S=t+b*r,C=s+v*r;return{x:S,y:C,vx:b,vy:v}}handlePointerInput(t,s,o,e,i){if(!this.artboard)return;const n=this.calculateTransform(e,i,this.artboard.width,this.artboard.height,this.layout.fit,this.layout.alignment),a=(s-n.tx)/n.scaleX,r=(o-n.ty)/n.scaleY;this._prevPointerPos=this._lastPointerPos,this._lastPointerPos={x:a,y:r},this._prevPointerPos&&(this._mouseDelta.dx+=a-this._prevPointerPos.x,this._mouseDelta.dy+=r-this._prevPointerPos.y),this.updateInput("mouseX",a),this.updateInput("mouseY",r),this.handlePointerEvent(t,a,r)}handleScroll(t,s){const o=this.scrollOffset.x,e=this.scrollOffset.y;this.scrollOffset={x:t,y:s},this._totalScroll.x+=t-o,this._totalScroll.y+=s-e,this.updateInput("scrollX",this._totalScroll.x),this.updateInput("scrollY",this._totalScroll.y)}handleWheel(t,s){this._totalScroll.x+=t,this._totalScroll.y+=s,this.scrollOffset={x:this._totalScroll.x,y:this._totalScroll.y},this.updateInput("scrollX",this._totalScroll.x),this.updateInput("scrollY",this._totalScroll.y)}handlePointerEvent(t,s,o){var r,l,h,f,p;if(!this.artboard)return;t==="down"?(this.isMouseDown=!0,this.updateInput("isMouseDown",!0)):(t==="up"||t==="blur")&&(this.isMouseDown=!1,this.updateInput("isMouseDown",!1));let e=null;const i=(c,d)=>{var S;let u=d;d==="click"?u="onClick":d==="down"?u="onPointerDown":d==="up"?u="onPointerUp":d==="blur"&&(u="onPointerLeave");const y=new Set([u]);d==="move"&&y.add("onPointerEnter").add("hover").add("onPointerLeave").add("blur"),u==="onClick"&&y.add("click"),u==="onPointerDown"&&y.add("pointerDown"),u==="onPointerUp"&&y.add("pointerUp");const m=["button","toggle","toggle_button","dropdown","listview","inputbox","slider","checkbox","radiogroup","joystick"];return!!(c.type==="Component"&&m.includes(c.variant)||c.type==="Joystick"||m.includes((S=c.type)==null?void 0:S.toLowerCase())||(c.interactions||[]).some(C=>y.has(C.event))||(c.triggers||[]).some(C=>y.has(C.eventType)))};let n=null;for(let c=this.artboard.objects.length-1;c>=0;c--){const d=this.artboard.objects[c],u=this.objectStates.get(d.id);if(u&&u.visible!==!1&&u.opacity>0&&this.hitTest(d,s,o)&&(n||(n=d),i(d,t))){e=d;break}}!e&&n&&(e=n),this.pointerHistory.push({x:s,y:o,time:Date.now()}),this.pointerHistory.length>this.MAX_HISTORY&&this.pointerHistory.shift();const a=(e==null?void 0:e.id)||null;if(t==="move"){if(this.draggingSliderId){const c=this.artboard.objects.find(d=>d.id===this.draggingSliderId);c&&this.updateSliderValueFromPointer(c,s,o);return}if(this.draggingJoystickId){const c=this.artboard.objects.find(d=>d.id===this.draggingJoystickId);c&&this.updateJoystickValueFromPointer(c,s,o);return}if(this.draggingListViewId){const c=this.artboard.objects.find(d=>d.id===this.draggingListViewId);c&&this.updateListViewScrollFromPointer(c);return}e&&(e.type==="ListView"||e.type==="Component"&&e.variant==="listview")&&this.updateListViewHoverFromPointer(e,s,o),this.isMouseDown&&a&&this.fireEventForObject(a,"Drag"),a!==this.lastHoveredObjectId&&(this.log(`[Engine] HOVER CHANGE: ${this.lastHoveredObjectId} -> ${a}`),this.lastHoveredObjectId&&this.fireEventForObject(this.lastHoveredObjectId,"onPointerLeave"),a&&this.fireEventForObject(a,"onPointerEnter"),this.lastHoveredObjectId=a);return}if((t==="up"||t==="blur")&&(this.draggingSliderId=null,this.draggingJoystickId=null,this.draggingListViewId=null,this.draggingBehaviors.clear(),this.pointerDownTimes.delete(a),this.activeObjectId=null),t==="down"&&(this.pointerDownTimes.set(a,this.currentTime),this.activeObjectId=a,e&&((r=e.behaviors)!=null&&r.some(c=>c.type===q.Draggable))&&this.draggingBehaviors.add(a)),t==="move"?(a&&!this.activeHoverIds.has(a)&&this.activeHoverIds.add(a),this.activeHoverIds.forEach(c=>{c!==a&&this.activeHoverIds.delete(c)})):t==="blur"&&this.activeHoverIds.clear(),this.activeDropdownId&&t==="down"){const c=this.artboard.objects.find(d=>d.id===this.activeDropdownId);if(c&&(c.type==="Dropdown"||c.variant==="dropdown")){const d=this.objectStates.get(c.id),u=(d==null?void 0:d.options)||c.options||{},y=c.geometry||{},m=y.width??c.width??200,b=y.height??c.height??40,v=u.optionsList||[],S=u.itemHeight||32,C=u.listPadding??4,w=v.length*S+C*2,M=this.getWorldTransform(c.id),I=m*Math.abs(M.scaleX),k=b*Math.abs(M.scaleY),T=M.y+k/2+4,O=Math.abs(s-M.x)<=I/2,_=o>=T&&o<=T+w*Math.abs(M.scaleY);if(O&&_){const P=Math.abs(M.scaleY),E=o-(T+C*P),A=Math.floor(E/(S*P));if(A>=0&&A<v.length){const B=v[A];u.selectedOption=B,u.isOpen=!1,this.activeDropdownId=null,c.inputId&&this.setInternalInput(c.inputId,B),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"dropdown",property:"selectedOption",value:B})}return}else a!==this.activeDropdownId&&(u.isOpen=!1,this.activeDropdownId=null)}}if(e){let c=e,d=e;for(;d&&d.parentId;){const y=this.artboard.objects.find(m=>m.id===d.parentId);if(y&&y.type==="Component"){c=y;break}d=y}let u=t;if(t==="click"?u="onClick":t==="down"?u="onPointerDown":t==="up"?u="onPointerUp":t==="blur"&&(u="onPointerLeave"),this.fireEventForObject(e.id,u),c!==e&&this.fireEventForObject(c.id,u),c.type==="Component"&&c.variant==="toggle_button"&&t==="down"){const y=this.objectStates.get(c.id),m=(y==null?void 0:y.options)||c.options||{};m.checked=!m.checked,c.inputId&&this.setInternalInput(c.inputId,m.checked),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"toggle_button",property:"checked",value:m.checked}),this.fireEventForObject(c.id,"Toggle"),this.fireEventForObject(c.id,m.checked?"Toggle True":"Toggle False")}if(c.type==="Component"&&c.variant==="toggle"&&t==="down"){const y=this.objectStates.get(c.id),m=(y==null?void 0:y.options)||c.options||{};m.checked=!m.checked,c.inputId&&this.setInternalInput(c.inputId,m.checked),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"toggle",property:"checked",value:m.checked}),this.onToggle&&this.onToggle(c.name,m.checked),this.fireEventForObject(c.id,"Toggle"),this.fireEventForObject(c.id,m.checked?"Toggle True":"Toggle False")}if(c.type==="Component"&&c.variant==="dropdown"&&t==="down"){const y=this.objectStates.get(c.id),m=(y==null?void 0:y.options)||c.options||{},b=!m.isOpen;if(b&&this.activeDropdownId&&this.activeDropdownId!==c.id){const v=this.artboard.objects.find(S=>S.id===this.activeDropdownId);v&&v.options&&(v.options.isOpen=!1)}m.isOpen=b,this.activeDropdownId=b?c.id:null}if(c.type==="Component"&&c.variant==="button"&&t==="down"&&(this.onButtonClick&&this.onButtonClick(c.name,c.id),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"button",property:"click",value:!0})),(c.type==="ListView"||c.type==="Component"&&c.variant==="listview")&&t==="down"){this.draggingListViewId=c.id;const y=this.getListViewItemIndexAtPointer(c,s,o);if(y!==null){const m=c.options||{};m.activeItemIndex=y;const b=this.objectStates.get(c.id);b&&b.options&&(b.options.activeItemIndex=y);const v=(m.items||[])[y],S=typeof v=="string"?v:v.label||v.value||y;b&&b.options&&(b.options.selectedValue=S),c.inputId&&this.setInternalInput(c.inputId,S),this.onComponentChange&&(this.onComponentChange({objectId:c.id,componentName:c.name,variant:"listview",property:"activeItemIndex",value:y}),this.onComponentChange({objectId:c.id,componentName:c.name,variant:"listview",property:"selected",value:S}))}}if(c.type==="Component"&&c.variant==="slider"&&t==="down"&&(this.draggingSliderId=c.id,this.updateSliderValueFromPointer(c,s,o)),c.type==="Joystick"||c.type==="Component"&&c.variant==="joystick"){if(t==="down")this.draggingJoystickId=c.id,this.updateJoystickValueFromPointer(c,s,o);else if(t==="up"||t==="blur"){const y=this.objectStates.get(c.id);y&&c.isSpringReturn!==!1&&(y.handleX=0,y.handleY=0),c.isSpringReturn!==!1&&(c.handleX=0,c.handleY=0)}}if(c.type==="Component"&&c.variant==="checkbox"&&t==="down"){const y=this.objectStates.get(c.id),m=(y==null?void 0:y.options)||c.options||{};m.checked=!m.checked,c.inputId&&this.setInternalInput(c.inputId,m.checked),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"checkbox",property:"checked",value:m.checked}),this.fireEventForObject(c.id,"Click"),this.fireEventForObject(c.id,m.checked?"Checked":"Unchecked")}if(c.type==="Component"&&c.variant==="radiogroup"&&t==="down"){const y=this.objectStates.get(c.id),m=(y==null?void 0:y.options)||c.options||{},b=m.optionsList||[],v=this.getRadioGroupItemIndexAtPointer(c,s,o);if(v!==null&&v>=0&&v<b.length){const S=b[v];m.selectedValue=S,c.inputId&&this.setInternalInput(c.inputId,S),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"radiogroup",property:"selectedValue",value:S}),this.fireEventForObject(c.id,"Click"),this.fireEventForObject(c.id,`Selected: ${S}`)}}if(c.type==="LineGraph"&&(t==="down"||t==="click")){const y=c.geometry,m=(y==null?void 0:y.datasets)||[],b=this.objectStates.get(c.id),v=(b==null?void 0:b.width)||(y==null?void 0:y.width)||200,S=(b==null?void 0:b.height)||(y==null?void 0:y.height)||150,C=this.getWorldTransform(c.id),w=30,M=20,I=v-w,k=S-M;let T=1;m.forEach(P=>{const E=Math.max(...P.data||[0]);E>T&&(T=E)});let O=1/0,_=null;m.forEach((P,E)=>{const A=P.data||[],B=I/Math.max(A.length-1,1);A.forEach((D,W)=>{const X=C.x-v/2+w+W*B,H=C.y+S/2-M-D/T*k,Q=Math.sqrt((s-X)**2+(o-H)**2);Q<O&&(O=Q,_={dIdx:E,pIdx:W,val:D,label:P.label||`Dataset ${E+1}`})})}),_&&O<20&&this.onGraphPointClick&&this.onGraphPointClick({objectId:c.id,componentName:c.name,datasetIndex:_.dIdx,pointIndex:_.pIdx,value:_.val,label:_.label}),this.onComponentChange&&this.onComponentChange({objectId:c.id,componentName:c.name,variant:"linegraph",property:"click",value:(_==null?void 0:_.val)??null})}if(t==="click"){const y=(l=this.artboard)==null?void 0:l.objects.find(v=>v.id===e.id),m=this.focusedId,b=(y==null?void 0:y.type)==="InputBox"||(y==null?void 0:y.type)==="Component"&&y.variant==="inputbox";if(y&&b){if(this.focusedId=e.id,this.log(`[Engine] Focus set to: ${e.id}`),m!==this.focusedId){if(m){const v=(h=this.artboard)==null?void 0:h.objects.find(S=>S.id===m);v&&this.onInputBlur&&this.onInputBlur(v.name)}this.onInputFocus&&this.onInputFocus(y.name)}}else if(this.focusedId=null,m){const v=(f=this.artboard)==null?void 0:f.objects.find(S=>S.id===m);v&&this.onInputBlur&&this.onInputBlur(v.name)}}}else if(t==="click"){const c=this.focusedId;if(this.focusedId=null,c){const d=(p=this.artboard)==null?void 0:p.objects.find(u=>u.id===c);d&&this.onInputBlur&&this.onInputBlur(d.name)}}}handleKeyDown(t){if(!this.artboard||(this.activeKeys.add(t.key.toLowerCase()),this.activeKeys.add(t.code),!this.focusedId))return;const s=this.artboard.objects.find(a=>a.id===this.focusedId),o=(s==null?void 0:s.type)==="InputBox"||(s==null?void 0:s.type)==="Component"&&s.variant==="inputbox";if(!s||!o)return;const e=s.options||{};let i=e.text||"";if(t.key==="Backspace")i=i.slice(0,-1);else if(t.key==="Enter")if(e.multiline)i+=`
|
|
7
|
-
`;else{this.focusedId=null;return}else if(t.key.length===1)i+=t.key;else return;e.text=i;const n=s.geometry;n.textInputId&&this.updateInput(n.textInputId,i),this.onComponentChange&&this.onComponentChange({objectId:s.id,componentName:s.name,variant:"inputbox",property:"text",value:i}),this.onInputChange&&this.onInputChange(s.name,i),this.onInputUpdate&&this.onInputUpdate(this.focusedId,i)}handleKeyUp(t){this.artboard&&(this.activeKeys.delete(t.key.toLowerCase()),this.activeKeys.delete(t.code))}fireEventForObject(t,s){var h,f,p,c,d;const o=(h=this.artboard)==null?void 0:h.objects.find(u=>u.id===t);if(!o)return;const e=new Set([s,s.toLowerCase()]),i=s.toLowerCase();i==="onclick"||i==="click"||i==="onpointerdown"||i==="pointerdown"?this.fireAnalyticsEvent(t,"click"):(i==="onpointerenter"||i==="hover"||i==="move")&&this.fireAnalyticsEvent(t,"hover"),i==="onclick"||i==="click"?(e.add("click"),e.add("onclick")):i==="onpointerdown"||i==="pointerdown"?(e.add("pointerdown"),e.add("onpointerdown")):i==="onpointerup"||i==="pointerup"?(e.add("pointerup"),e.add("onpointerup")):i==="onpointerenter"||i==="hover"||i==="move"?(e.add("hover"),e.add("onpointerenter")):i==="onpointerleave"||i==="blur"?(e.add("onpointerleave"),e.add("blur")):i==="drag"||i==="ondrag"?(e.add("drag"),e.add("ondrag")):i==="toggle"||i==="ontoggle"?(e.add("toggle"),e.add("ontoggle")):i==="toggle true"||i==="toggle_true"||i==="toggletrue"?(e.add("toggle true"),e.add("toggle_true"),e.add("toggletrue")):(i==="toggle false"||i==="toggle_false"||i==="togglefalse")&&(e.add("toggle false"),e.add("toggle_false"),e.add("togglefalse"));const a=(o.interactions||[]).find(u=>{const y=u.triggers||[u.event||u.trigger||"click"];return((u.triggerLogic||"OR")==="AND"?y.every(v=>e.has(v.toLowerCase())):y.some(v=>e.has(v.toLowerCase())))?u.conditions&&u.conditions.length>0?this.checkConditions(u.conditions):!0:!1});if(a){if(this.log(`[Engine] Interaction matched: ${s} -> Action: ${a.action}`),a.action==="setInput"||a.action==="Set Input"){let u=a.value||a.inputValue;u==="toggle"&&(u=!this.inputs.get(a.targetInputId)),this.updateInput(a.targetInputId,u)}else if(a.action==="Toggle Boolean"){const u=this.inputs.get(a.targetInputId);this.updateInput(a.targetInputId,!u)}else if(a.action==="fireTrigger")this.updateInput(a.targetInputId,!0);else if(a.action==="setProperty"){const u=a.targetObjectId||o.id,y=a.targetProperty;y&&this.updateObjectProperty(u,y,a.value)}else if(a.action==="Navigate Artboard"||a.action==="navigate")this.onNavigation&&this.onNavigation({type:"artboard",value:a.targetArtboard||a.value});else if(a.action==="Navigate URL")this.onNavigation&&this.onNavigation({type:"url",value:a.navigateUrl});else if(a.action==="Play Animation"){const u=a.targetAnimationId,y=!a.playMode||a.playMode==="all"?void 0:a.subAnimationIds;u==="__all__"?(p=(f=this.artboard)==null?void 0:f.animations)==null||p.forEach(m=>{this.triggerGlobalAnimation(m.id,y)}):u&&this.triggerGlobalAnimation(u,y)}else if(a.action==="setState"||a.action==="Set State"){const u=a.targetObjectId||o.id,m={...this.objectStates.get(u)||{},...a.value||{}};this.objectStates.set(u,m),this.log(`[Engine] State updated for ${u}:`,m)}else if(a.action==="Stop Animation"||a.action==="Pause Animation"){const u=a.targetAnimationId;u==="__all__"?this.layerStates.forEach((y,m)=>{m.startsWith("global_")&&this.layerStates.delete(m)}):u&&this.layerStates.forEach((y,m)=>{m.startsWith(`global_${u}_`)&&this.layerStates.delete(m)})}else if(a.action==="Switch to State"&&this.activeStateMachine){const u=a.targetState,y=this.activeStateMachine.layers.find(m=>m.states.some(b=>b.id===u||b.name===u));y&&(this.log(`[Engine] Switching Layer ${y.name} to State ${u}`),this.enterStates(y.name,[u]))}this.onTrigger&&this.onTrigger(s,a.action)}const l=(o.triggers||[]).find(u=>{const y=u.eventType.toLowerCase();let m=!1;return(e.has(y)||y==="click"&&e.has("onclick")||y==="hover"&&(e.has("onpointerenter")||e.has("hover"))||y==="pointerdown"&&e.has("onpointerdown")||y==="pointerup"&&e.has("onpointerup"))&&(m=!0),m&&u.conditions&&u.conditions.length>0?this.checkConditions(u.conditions):m});if(l&&l.entryAnimationId){this.log(`[Engine] Trigger matched: ${s} (as ${l.eventType}) -> Animation ${l.entryAnimationId}`);const u=(d=(c=this.artboard)==null?void 0:c.animations)==null?void 0:d.find(y=>y.id===l.entryAnimationId);u&&(this.activeTriggers.set(o.id,{triggerId:l.id,animation:u,time:0,phase:"entry",elapsedHold:0,filterObjectId:l.targetObjectId}),this.onTrigger&&this.onTrigger(l.name,u.name))}}fireAnalyticsEvent(t,s){var r,l;const o=(r=this.artboard)==null?void 0:r.objects.find(h=>h.id===t);if(!o)return;const e=(l=o.style)==null?void 0:l.analytics;if(!e||!e.isEnabled||e.triggerType!==s)return;const i=e.eventName||`${o.name.toLowerCase().replace(/\s+/g,"_")}_interacted`,n={};e.parameters&&Array.isArray(e.parameters)&&e.parameters.forEach(h=>{if(h.type==="literal")n[h.key]=h.value;else if(h.type==="variable"){const f=this.inputs.get(h.value);n[h.key]=f!==void 0?f:""}}),this.log(`[ExodeUI Analytics] Dispatching event "${i}" via ${s} trigger:`,n);const a=e.platforms||{ga4:!0,meta:!0,mixpanel:!1};if(a.ga4){const h=window;typeof h.gtag=="function"?(h.gtag("event",i,n),this.log(`[ExodeUI Analytics] GA4: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] GA4: window.gtag is not a function. Event "${i}" skipped.`)}if(a.meta){const h=window;typeof h.fbq=="function"?(h.fbq("track",i,n),this.log(`[ExodeUI Analytics] Meta Pixel: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] Meta Pixel: window.fbq is not a function. Event "${i}" skipped.`)}if(a.mixpanel){const h=window;h.mixpanel&&typeof h.mixpanel.track=="function"?(h.mixpanel.track(i,n),this.log(`[ExodeUI Analytics] Mixpanel: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] Mixpanel: window.mixpanel.track is not a function. Event "${i}" skipped.`)}}initGlobalAnimationTriggers(){if(!this.artboard)return;const t=this.artboard.animationFlow||[];let s=!1;t.forEach(o=>{if((o.trigger==="on_load"||o.trigger==="after_delay")&&o.targetAnimationId){s=!0;const e=o.delay||0;e<=0?this.triggerGlobalAnimation(o.targetAnimationId,o.subAnimationIds,o.loop,o.id):setTimeout(()=>this.triggerGlobalAnimation(o.targetAnimationId,o.subAnimationIds,o.loop,o.id),e)}}),!s&&this.artboard.startupAnimationId&&this.triggerGlobalAnimation(this.artboard.startupAnimationId,this.artboard.startupSubAnimationIds)}triggerGlobalAnimation(t,s,o=!1,e){if(!this.artboard)return;const i=this.artboard.animations.find(a=>a.id===t);if(!i)return;const n=`global_${t}_${Math.random().toString(36).substr(2,5)}`;this.layerStates.set(n,{currentStateIds:[t],animations:[{animation:i,state:{loop:o},filterObjectIds:s}],time:0,duration:i.duration,ruleId:e}),this.debugLog(`[Engine] Triggered global animation: ${i.name} (Loop: ${o}, Sub-Anims: ${(s==null?void 0:s.length)||"All"})`)}handleAnimationFinished(t,s){if(!this.artboard)return;(this.artboard.animationFlow||[]).forEach(e=>{if(e.trigger==="after_anim"&&e.targetAnimationId&&(e.afterAnim===t||s&&e.afterAnim===s)){const n=e.delay||0;n<=0?this.triggerGlobalAnimation(e.targetAnimationId,e.subAnimationIds,e.loop,e.id):setTimeout(()=>this.triggerGlobalAnimation(e.targetAnimationId,e.subAnimationIds,e.loop,e.id),n)}})}getWorldTransform(t){var p;const s=this.objectStates.get(t);if(!s)return{x:0,y:0,scaleX:1,scaleY:1,rotation:0};const o=(p=this.artboard)==null?void 0:p.objects.find(c=>c.id===t);if(!o||!o.parentId)return{x:s.x,y:s.y,scaleX:s.scale_x??1,scaleY:s.scale_y??1,rotation:s.rotation??0};const e=this.getWorldTransform(o.parentId),i=e.rotation*(Math.PI/180),n=Math.cos(i),a=Math.sin(i),r=s.x*e.scaleX,l=s.y*e.scaleY,h=e.x+(r*n-l*a),f=e.y+(r*a+l*n);return{x:h,y:f,scaleX:(s.scale_x??1)*e.scaleX,scaleY:(s.scale_y??1)*e.scaleY,rotation:e.rotation+(s.rotation??0)}}hitTest(t,s,o){var v,S;if(!this.objectStates.get(t.id))return!1;const i=((v=t.geometry)==null?void 0:v.width)??t.width??100,n=((S=t.geometry)==null?void 0:S.height)??t.height??100,a=this.getWorldTransform(t.id),r=s-a.x,l=o-a.y,h=-a.rotation*(Math.PI/180),f=Math.cos(h),p=Math.sin(h),c=r*f-l*p,d=r*p+l*f,u=a.scaleX,y=a.scaleY,m=i*Math.abs(u),b=n*Math.abs(y);return Math.abs(c)<=m/2&&Math.abs(d)<=b/2}updateSliderValueFromPointer(t,s,o){var M;const e=this.objectStates.get(t.id);if(!e)return;const i=t.options||{},n=((M=t.geometry)==null?void 0:M.width)??t.width??200,a=this.getWorldTransform(t.id),r=s-a.x,l=o-a.y,h=-a.rotation*(Math.PI/180),f=Math.cos(h),p=Math.sin(h),c=r*f-l*p,d=i.thumbWidth??16,u=n-d;let m=(c+u/2)/u;m=Math.max(0,Math.min(1,m));const b=i.min??0,v=i.max??100,S=i.step||1;let C=b+m*(v-b);S>0&&(C=Math.round(C/S)*S),C=Math.max(b,Math.min(v,C));const w=e.options||{};w.value!==C&&(e.options={...w,value:C},t.inputId&&this.setInternalInput(t.inputId,C),this.onComponentChange&&this.onComponentChange({objectId:t.id,componentName:t.name,variant:"slider",property:"value",value:C}))}updateJoystickValueFromPointer(t,s,o){var M,I;const e=this.objectStates.get(t.id);if(!e)return;const i=(e==null?void 0:e.width)!==void 0?e.width:((M=t.geometry)==null?void 0:M.width)??t.width??100,n=(e==null?void 0:e.height)!==void 0?e.height:((I=t.geometry)==null?void 0:I.height)??t.height??100,a=this.getWorldTransform(t.id),r=s-a.x,l=o-a.y,h=-a.rotation*(Math.PI/180),f=Math.cos(h),p=Math.sin(h);let c=(r*f-l*p)/Math.max(.001,Math.abs(a.scaleX||1)),d=(r*p+l*f)/Math.max(.001,Math.abs(a.scaleY||1));t.handleOrigin==="top-left"?(c-=i/2,d-=n/2):t.handleOrigin==="bottom-right"&&(c+=i/2,d+=n/2);const u=Math.min(i,n)*.45,y=Math.min(i,n)*.15,m=u-y;let b=c/m,v=d/m;const S=Math.sqrt(b*b+v*v);t.boundsShape==="square"?(b=Math.max(-1,Math.min(1,b)),v=Math.max(-1,Math.min(1,v))):S>1&&(b/=S,v/=S),t.deadzone!==void 0&&S<t.deadzone?(b=0,v=0):(t.stepX!==void 0&&t.stepX>0&&(b=Math.round(b/t.stepX)*t.stepX),t.stepY!==void 0&&t.stepY>0&&(v=Math.round(v/t.stepY)*t.stepY)),t.joystickType==="1D_X"?v=0:t.joystickType==="1D_Y"&&(b=0);const C=e.handleX,w=e.handleY;(C!==b||w!==v)&&(e.handleX=b,e.handleY=v,t.handleX=b,t.handleY=v)}processJoysticks(t){this.artboard&&(this.artboard.objects.forEach(s=>{var a,r;if(s.type!=="Joystick"&&!(s.type==="Component"&&s.variant==="joystick"))return;const o=s,e=this.objectStates.get(o.id);if(!e)return;let i=e.handleX??o.handleX??0,n=e.handleY??o.handleY??0;if(((a=o.inputBinding)==null?void 0:a.type)==="keyboard"&&o.inputBinding.keyboardConfig){const l=o.inputBinding.keyboardConfig;let h=i,f=n;const c=(l.speed||5)*t;let d=!1;this.activeKeys.has(l.upKey.toLowerCase())&&(f-=c,d=!0),this.activeKeys.has(l.downKey.toLowerCase())&&(f+=c,d=!0),this.activeKeys.has(l.leftKey.toLowerCase())&&(h-=c,d=!0),this.activeKeys.has(l.rightKey.toLowerCase())&&(h+=c,d=!0),o.joystickType==="1D_X"&&(f=0),o.joystickType==="1D_Y"&&(h=0);const u=Math.sqrt(h*h+f*f);u>1&&(h/=u,f/=u),!d&&o.isSpringReturn!==!1&&(h+=(0-h)*(10*t),f+=(0-f)*(10*t),Math.abs(h)<.01&&(h=0),Math.abs(f)<.01&&(f=0)),i=h,n=f}else if(((r=o.inputBinding)==null?void 0:r.type)==="mouse"&&o.inputBinding.mouseConfig){const l=o.inputBinding.mouseConfig;let h=i,f=n;const p=l.sensitivity||.01,c=Math.abs(this._mouseDelta.dx)>0||Math.abs(this._mouseDelta.dy)>0;l.axisX&&(h+=this._mouseDelta.dx*p),l.axisY&&(f+=this._mouseDelta.dy*p),o.joystickType==="1D_X"&&(f=0),o.joystickType==="1D_Y"&&(h=0);const d=Math.sqrt(h*h+f*f);d>1&&(h/=d,f/=d),!c&&o.isSpringReturn!==!1&&(h+=(0-h)*(10*t),f+=(0-f)*(10*t),Math.abs(h)<.01&&(h=0),Math.abs(f)<.01&&(f=0)),i=h,n=f}if(e.handleX=i,e.handleY=n,o.handleX=i,o.handleY=n,o.bindings&&o.bindings.length>0){const l=Math.sqrt(i*i+n*n);let h=Math.atan2(n,i)*(180/Math.PI);h<0&&(h+=360),o.bindings.forEach(f=>{var d,u,y,m,b,v,S,C;let p=0;f.sourceAxis==="x"?p=o.invertX?-i:i:f.sourceAxis==="y"?p=o.invertY?-n:n:f.sourceAxis==="distance"?p=l:f.sourceAxis==="angle"&&(p=h);const c=(d=this.artboard)==null?void 0:d.objects.find(w=>w.id===f.targetObjectId);if(c){if(f.actionType==="bind"&&f.targetProperty&&f.isContinuous!==!1){const w=f.sourceMin??-1,M=f.sourceMax??1,I=f.targetMin??0,k=f.targetMax??100;let T=!!f.isContinuous,O=0,_=0;if(T){if((f.sourceAxis==="x"||f.sourceAxis==="y")&&I>=0){const E=Math.max(Math.abs(w),Math.abs(M))||1;_=p/E*k}else{let E=(p-w)/(M-w);E=Math.max(0,Math.min(1,E)),_=I+E*(k-I)}Math.abs(p)<.05&&(_=0)}else{const E=(p-w)/(M-w),A=Math.max(0,Math.min(1,E));O=I+A*(k-I),f.step&&f.step>0&&(O=Math.round(O/f.step)*f.step)}const P=this.objectStates.get(c.id);if(P){const E=f.isRelative!==!1,A=E?((u=c.transform)==null?void 0:u.x)??0:0,B=E?((y=c.transform)==null?void 0:y.y)??0:0,D=E?((m=c.transform)==null?void 0:m.rotation)??0:0,W=E?((b=c.transform)==null?void 0:b.scale_x)??1:0,X=E?((v=c.transform)==null?void 0:v.scale_y)??1:0,H=E?((S=c.style)==null?void 0:S.opacity)??100:0,Q=t*60,L=(R,et)=>{let U=O;if(T){const lt=`_internal_${R}_${f.id}`;let x=P[lt];x===void 0&&(x=P[R]??et),U=x+_*Q,P[lt]=U,f.step&&f.step>0&&(U=Math.round(U/f.step)*f.step)}else U=et+O;P[R]=U};f.targetProperty==="x"||f.targetProperty==="transform.x"?L("x",A):f.targetProperty==="y"||f.targetProperty==="transform.y"?L("y",B):f.targetProperty==="rotation"||f.targetProperty==="r"||f.targetProperty==="transform.rotation"?L("rotation",D):f.targetProperty==="scaleX"||f.targetProperty==="transform.scale_x"?L("scale_x",W):f.targetProperty==="scaleY"||f.targetProperty==="transform.scale_y"?L("scale_y",X):(f.targetProperty==="opacity"||f.targetProperty==="transform.opacity")&&L("opacity",H)}(C=c.physics)!=null&&C.enabled&&this.physicsEngine&&(f.targetProperty==="x"||f.targetProperty==="transform.x"||f.targetProperty==="y"||f.targetProperty==="transform.y")&&(f.targetProperty==="x"||f.targetProperty==="transform.x"?this.physicsEngine.applyForce(c.id,(O-((P==null?void 0:P.x)||0))*10,0):(f.targetProperty==="y"||f.targetProperty==="transform.y")&&this.physicsEngine.applyForce(c.id,0,(O-((P==null?void 0:P.y)||0))*10))}else if(f.actionType==="playAnimation"||f.actionType==="stopAnimation"||f.actionType==="pauseAnimation"){let w=!1;const M=f.threshold??0;f.condition==="always"?w=!0:f.condition===">"?w=p>M:f.condition==="<"?w=p<M:f.condition==="=="&&(w=Math.abs(p-M)<.01);const I=e[`_prev_src_${f.id}`]??p;let k=!1;f.condition==="always"?k=!0:f.condition===">"?k=I>M:f.condition==="<"?k=I<M:f.condition==="=="&&(k=Math.abs(I-M)<.01),e[`_prev_src_${f.id}`]=p,w&&!k&&f.targetAnimationId&&(f.actionType==="playAnimation"||f.actionType)}}})}}),this._mouseDelta.dx=0,this._mouseDelta.dy=0)}applyBlendState(t,s){var l,h,f,p,c,d,u,y;if(!t.blendAnimations||t.blendAnimations.length===0)return;let o=0,e=0;t.blendInputX&&(o=this.inputs.get(t.blendInputX)??0),t.blendInputY&&(e=this.inputs.get(t.blendInputY)??0);const i=[];let n=0;if(t.blendType==="1D"){const m=[...t.blendAnimations].sort((b,v)=>b.position[0]-v.position[0]);if(m.length===1){const b=(h=(l=this.artboard)==null?void 0:l.animations)==null?void 0:h.find(v=>v.id===m[0].animationId);b&&(i.push({anim:b,weight:1}),n=1)}else{let b=0;for(;b<m.length-1&&m[b+1].position[0]<o;)b++;if(b===m.length-1&&o>m[b].position[0]){const v=(p=(f=this.artboard)==null?void 0:f.animations)==null?void 0:p.find(S=>S.id===m[b].animationId);v&&(i.push({anim:v,weight:1}),n=1)}else{const v=m[b].position[0],S=m[b+1].position[0],C=(d=(c=this.artboard)==null?void 0:c.animations)==null?void 0:d.find(T=>T.id===m[b].animationId),w=(y=(u=this.artboard)==null?void 0:u.animations)==null?void 0:y.find(T=>T.id===m[b+1].animationId),M=Math.max(.001,S-v);let I=(o-v)/M;I=Math.max(0,Math.min(1,I));const k=1-I;C&&(i.push({anim:C,weight:k}),n+=k),w&&(i.push({anim:w,weight:I}),n+=I)}}}else t.blendAnimations.forEach(m=>{var w,M;const b=(M=(w=this.artboard)==null?void 0:w.animations)==null?void 0:M.find(I=>I.id===m.animationId);if(!b)return;const v=m.position[0]-o,S=m.position[1]-e,C=v*v+S*S;if(C<1e-4)i.push({anim:b,weight:1e4}),n+=1e4;else{const I=1/C;i.push({anim:b,weight:I}),n+=I}});if(n===0)return;i.forEach(m=>m.weight/=n);const a=new Map,r=m=>{let b=m.startsWith("#")?m.substring(1):m;return b.length===3&&(b=[b[0],b[0],b[1],b[1],b[2],b[2]].join("")),b="0x"+b,{r:b>>16&255,g:b>>8&255,b:b&255,a:1}};i.forEach(({anim:m,weight:b})=>{m.tracks&&m.tracks.forEach(v=>{var O,_;const S=v.object_id||v.objectId,C=v.property,w=(O=this.artboard)==null?void 0:O.objects.find(P=>P.id===S);if(((_=w==null?void 0:w.physics)==null?void 0:_.enabled)&&w.physics.bodyType!=="Static"&&(C==="x"||C==="y"||C==="rotation"))return;const I=this.interpolate(v.keyframes,s);if(I===void 0)return;let k=a.get(S);k||(k=new Map,a.set(S,k));let T=k.get(C);if(!T){if(typeof I=="number")T={type:"number",value:0};else if(typeof I=="string"&&I.startsWith("#"))T={type:"color",value:I,colorAcc:{r:0,g:0,b:0,a:0}};else if(T={type:"number",value:I},b<.5)return;k.set(C,T)}if(T.type==="number"&&typeof I=="number")T.value+=I*b;else if(T.type==="color"&&typeof I=="string"&&T.colorAcc){const P=r(I);P&&(T.colorAcc.r+=P.r*b,T.colorAcc.g+=P.g*b,T.colorAcc.b+=P.b*b,T.colorAcc.a+=P.a*b)}else b>.5&&(T.value=I)})}),a.forEach((m,b)=>{var C;const v=this.objectStates.get(b),S=(C=this.artboard)==null?void 0:C.objects.find(w=>w.id===b);!v||!S||m.forEach((w,M)=>{let I=w.value;if(w.type==="color"&&w.colorAcc){const k=Math.round(w.colorAcc.r).toString(16).padStart(2,"0"),T=Math.round(w.colorAcc.g).toString(16).padStart(2,"0"),O=Math.round(w.colorAcc.b).toString(16).padStart(2,"0");I=`#${k}${T}${O}`}if(M.includes(".")||M.includes("[")){const k=(M||"").replace(/\[(\d+)\]/g,".$1").split(".");let T=v;for(let O=0;O<k.length-1;O++){if(typeof T[k[O]]!="object"||T[k[O]]===null){let _=S;for(let P=0;P<=O;P++)_=_?_[k[P]]:null;if(k[O]==="corner_radius"||k[O]==="cornerRadius"){const P=typeof T[k[O]]=="number"?T[k[O]]:typeof _=="number"?_:0;T[k[O]]={tl:P,tr:P,bl:P,br:P}}else{const P=k[O+1],E=!isNaN(Number(P));T[k[O]]=_?JSON.parse(JSON.stringify(_)):E?[]:{}}}T=T[k[O]]}T[k[k.length-1]]=I,k[k.length-1]==="color"&&(k[k.length-2]==="fill"||k[k.length-2]==="stroke")&&(T.type="Solid")}else M==="fill"?(v.style||(v.style={}),v.style.fill=I):M==="stroke"?(v.style||(v.style={}),v.style.stroke=I):v[M]=I})})}applyAnimation(t,s,o){!t||!t.tracks||t.tracks.forEach(e=>{var f,p,c;const i=e.object_id||e.objectId;if(o){if(Array.isArray(o)){if(!o.includes(i))return}else if(i!==o)return}const n=(f=this.artboard)==null?void 0:f.objects.find(d=>d.id===i),a=((p=n==null?void 0:n.physics)==null?void 0:p.enabled)&&n.physics.bodyType!=="Static";let r=e.property;if(a&&(r==="x"||r==="y"||r==="rotation"))return;const l=this.objectStates.get(i);if(!l){this.frameCount%600===0&&this.debugLog(`Skipping track: Object ${i} not found in state`);return}const h=this.interpolate(e.keyframes,s);if(h!==void 0){if(this.frameCount%240===0){const d=(n==null?void 0:n.name)||i,u=typeof h=="object"?JSON.stringify(h).slice(0,50):h;this.debugLog(`[Anim] Applying ${r} = ${u} to ${d}`)}if(r.includes(".")||r.includes("[")){const d=(r||"").replace(/\[(\d+)\]/g,".$1").split(".");let u=l;for(let y=0;y<d.length-1;y++){if(typeof u[d[y]]!="object"||u[d[y]]===null){let m=n;for(let b=0;b<=y;b++)m=m?m[d[b]]:null;if(d[y]==="corner_radius"||d[y]==="cornerRadius"){const b=typeof u[d[y]]=="number"?u[d[y]]:typeof m=="number"?m:0;u[d[y]]={tl:b,tr:b,bl:b,br:b}}else{const b=d[y+1],v=!isNaN(Number(b));u[d[y]]=m?JSON.parse(JSON.stringify(m)):v?[]:{}}}u=u[d[y]]}u[d[d.length-1]]=h,d[d.length-1]==="color"&&(d[d.length-2]==="fill"||d[d.length-2]==="stroke")&&(u.type="Solid")}else r==="fill"?(l.style||(l.style={}),l.style.fill=h):r==="stroke"?(l.style||(l.style={}),l.style.stroke=h):l[r]=h;if(this.physicsEngine&&((c=n==null?void 0:n.physics)!=null&&c.enabled)&&n.physics.bodyType==="Static")if(r==="x"){const d=this.physicsEngine.getPosition(i);d&&this.physicsEngine.setPosition(i,h,d.y)}else if(r==="y"){const d=this.physicsEngine.getPosition(i);d&&this.physicsEngine.setPosition(i,d.x,h)}else r==="rotation"&&this.physicsEngine.setRotation(i,h*(Math.PI/180))}})}interpolate(t,s){if(t.length===0)return;let o=t[0],e=t[t.length-1];if(s<=o.time)return o.value;if(s>=e.time)return e.value;for(let a=0;a<t.length-1;a++)if(s>=t[a].time&&s<t[a+1].time){o=t[a],e=t[a+1];break}const i=e.time-o.time;let n=(s-o.time)/i;return o.easing&&(n=si(o.easing)(n)),this.interpolateValue(o.value,e.value,n)}interpolateValue(t,s,o){if(t===void 0)return s;if(s===void 0)return t;if(typeof t=="string"&&typeof s=="string"){if(t.startsWith("#"))return this.interpolateColor(t,s,o);const e=parseFloat(t),i=parseFloat(s);return!isNaN(e)&&!isNaN(i)?Math.round(e+(i-e)*o).toString():o<.5?t:s}if(Array.isArray(t)&&Array.isArray(s))return t.length===s.length?t.map((e,i)=>this.interpolateValue(e,s[i],o)):o<.5?t:s;if(typeof t=="object"&&typeof s=="object"&&t!==null&&s!==null){if(t.width!==void 0&&t.color!==void 0&&typeof t.width=="number")return this.interpolateStroke(t,s,o);if(t.type&&s.type&&(t.type==="Solid"||t.type==="LinearGradient"||t.type==="RadialGradient"||t.type==="Image"))return this.interpolateFill(t,s,o);const e={};return new Set([...Object.keys(t),...Object.keys(s)]).forEach(n=>{e[n]=this.interpolateValue(t[n],s[n],o)}),e}return typeof t=="number"&&typeof s=="number"?t+(s-t)*o:o<.5?t:s}interpolateColor(t,s,o){var d,u;const e=((u=(d=this.artboard)==null?void 0:d.tokens)==null?void 0:u.colors)||{},i=e[t]||t,n=e[s]||s,a=y=>{if(!y)return{r:0,g:0,b:0};const m=y.startsWith("#")?y.replace("#",""):"000000";return m.length===3?{r:parseInt(m[0]+m[0],16),g:parseInt(m[1]+m[1],16),b:parseInt(m[2]+m[2],16)}:{r:parseInt(m.substring(0,2),16),g:parseInt(m.substring(2,4),16),b:parseInt(m.substring(4,6),16)}},r=a(i),l=a(n),h=Math.round(r.r+(l.r-r.r)*o),f=Math.round(r.g+(l.g-r.g)*o),p=Math.round(r.b+(l.b-r.b)*o),c=y=>{const m=Math.max(0,Math.min(255,y)).toString(16);return m.length===1?"0"+m:m};return`#${c(h)}${c(f)}${c(p)}`}interpolateStops(t,s,o){return!t||!s||t.length!==s.length?o<.5?t:s:t.map((e,i)=>{const n=s[i];return{offset:e.offset+(n.offset-e.offset)*o,color:this.interpolateColor(e.color,n.color,o),opacity:(e.opacity??1)+((n.opacity??1)-(e.opacity??1))*o}})}interpolateFill(t,s,o){if(!t||!s||t.type!==s.type)return o<.5?t:s;const e={...t,opacity:(t.opacity??1)+((s.opacity??1)-(t.opacity??1))*o};return t.type==="Solid"?e.color=this.interpolateColor(t.color,s.color,o):(t.type==="LinearGradient"||t.type==="RadialGradient")&&(t.start&&s.start&&(e.start=[t.start[0]+(s.start[0]-t.start[0])*o,t.start[1]+(s.start[1]-t.start[1])*o]),t.end&&s.end&&(e.end=[t.end[0]+(s.end[0]-t.end[0])*o,t.end[1]+(s.end[1]-t.end[1])*o]),t.center&&s.center&&(e.center=[t.center[0]+(s.center[0]-t.center[0])*o,t.center[1]+(s.center[1]-t.center[1])*o]),t.radius!==void 0&&s.radius!==void 0&&(e.radius=t.radius+(s.radius-t.radius)*o),e.stops=this.interpolateStops(t.stops,s.stops,o)),e}interpolateStroke(t,s,o){if(!t||!s)return o<.5?t:s;const e={...t};return e.width=(t.width??0)+((s.width??0)-(t.width??0))*o,e.opacity=(t.opacity??1)+((s.opacity??1)-(t.opacity??1))*o,t.fill&&s.fill?e.fill=this.interpolateFill(t.fill,s.fill,o):t.color&&s.color&&t.color.startsWith("#")&&s.color.startsWith("#")&&(e.color=this.interpolateColor(t.color,s.color,o)),e.trimStart=(t.trimStart??0)+((s.trimStart??0)-(t.trimStart??0))*o,e.trimEnd=(t.trimEnd??1)+((s.trimEnd??1)-(t.trimEnd??1))*o,e.trimOffset=(t.trimOffset??0)+((s.trimOffset??0)-(t.trimOffset??0))*o,e.dashOffset=(t.dashOffset??0)+((s.dashOffset??0)-(t.dashOffset??0))*o,e}render(t,s,o){var f;this.debug_objectsTotal=((f=this.artboard)==null?void 0:f.objects.length)||0,this.debug_objectsRendered=0;const e=performance.now();if(this.canvasWidth=s,this.canvasHeight=o,!this.artboard)return;t.clearRect(0,0,s,o);const i=this.artboard.width,n=this.artboard.height,a=this.calculateTransform(s,o,i,n,this.layout.fit,this.layout.alignment);if(t.save(),t.translate(Math.round(a.tx),Math.round(a.ty)),t.scale(a.scaleX,a.scaleY),this.rootTransform=t.getTransform(),this.artboard.backgroundVisible!==!1&&(t.fillStyle=this.artboard.backgroundColor||"#000000",t.fillRect(0,0,i,n)),this.artboard.backgroundImage){const p=this.artboard.backgroundImage;let c=this.imageCache.get(p);if(c||(c=new Image,c.src=p,this.imageCache.set(p,c)),c.complete&&c.naturalWidth>0){t.save(),t.globalAlpha=this.normalizeOpacity(this.artboard.backgroundOpacity??100);const d=c.naturalWidth/c.naturalHeight,u=i/n;let y,m,b,v;u>d?(y=i,m=i/d):(m=n,y=n*d),b=(i-y)/2,v=(n-m)/2,t.drawImage(c,b,v,y,m),t.restore()}}(this.artboard.clipContent===!0||this.artboard.clip_content===!0)&&(t.beginPath(),t.rect(0,0,i,n),t.clip());const l=new Map;this.artboard.objects.forEach(p=>l.set(p.id,p)),this.artboard.objects.filter(p=>!p.parentId).map((p,c)=>{const d=this.objectStates.get(p.id),u=(d==null?void 0:d.zIndex)??c;return{obj:p,zIndex:u}}).sort((p,c)=>p.zIndex-c.zIndex).forEach(({obj:p})=>{this.renderObject(t,p,l)}),this._emitterPools.forEach((p,c)=>{if(!(p.length===0||!l.get(c)))for(const u of p)t.save(),t.globalAlpha=u.opacity,t.fillStyle=u.color,t.beginPath(),t.arc(u.x,u.y,Math.max(1,u.size*u.opacity),0,Math.PI*2),t.fill(),t.restore()}),this.lastRenderTime=performance.now()-e,this.debugMode&&this.frameCount%60===0&&this.log(`[Engine Debug] Rendered ${this.debug_objectsRendered}/${this.debug_objectsTotal} objects in ${this.lastRenderTime.toFixed(2)}ms`),t.restore()}isObjectInView(t,s,o,e,i,n=0){const a=t.getTransform(),r=s*a.a+o*a.c+a.e,l=s*a.b+o*a.d+a.f,h=Math.sqrt(a.a*a.a+a.b*a.b),f=Math.sqrt(a.c*a.c+a.d*a.d),p=(e/2+n)*h,c=(i/2+n)*f;return r+p>=0&&r-p<=this.canvasWidth&&l+c>=0&&l-c<=this.canvasHeight}calculateTransform(t,s,o,e,i,n){let a=1,r=1,l=1;const h=o/e,f=t/s;switch(i){case"Contain":f>h?l=s/e:l=t/o,a=r=l;break;case"Cover":f>h?l=t/o:l=s/e,a=r=l;break;case"Fill":a=t/o,r=s/e;break;case"FitWidth":l=t/o,a=r=l;break;case"FitHeight":l=s/e,a=r=l;break;case"None":a=r=1;break;case"ScaleDown":l=Math.min(t/o,s/e),l>1&&(l=1),a=r=l;break;default:a=r=1;break}const p=o*a,c=e*r;let d=0,u=0;return n.includes("Left")?d=0:n.includes("Right")?d=t-p:d=(t-p)/2,n.includes("Top")?u=0:n.includes("Bottom")?u=s-c:u=(s-c)/2,{scaleX:a,scaleY:r,tx:d,ty:u}}mapFontWeight(t){const s=t.toLowerCase();return s==="thin"||s==="100"?"100":s==="extralight"||s==="200"?"200":s==="light"||s==="300"?"300":s==="regular"||s==="normal"||s==="400"?"400":s==="medium"||s==="500"?"500":s==="semibold"||s==="600"?"600":s==="bold"||s==="700"?"700":s==="extrabold"||s==="800"?"800":s==="black"||s==="900"?"900":t}drawTextDecoration(t,s,o,e,i,n){t.beginPath();const a=Math.max(1,n/14);let r=e;s==="underline"?r=e+n*.12:s==="line-through"&&(r=e-n*.3),t.lineWidth=a,t.strokeStyle=t.fillStyle,t.moveTo(o-i/2,r),t.lineTo(o+i/2,r),t.stroke()}renderObject(t,s,o,e=!1,i=!1){var v,S,C,w,M,I,k,T,O,_,P,E,A,B,D,W,X,H,Q,L,R,et,U,lt,x,F,z,st;const n=this.objectStates.get(s.id);if(!n){this.warn("No state for object:",s.id);return}this.frameCount%60,t.roundRect||(t.roundRect=(N,gt,mt,ut,wt)=>(this.drawRoundRect(t,N,gt,mt,ut,wt),t));const a=n.geometry?this.deepMerge(s.geometry,n.geometry):s.geometry;let r=n.style?this.deepMerge(s.style,n.style):s.style,l=(a==null?void 0:a.width)||((v=s.geometry)==null?void 0:v.width)||s.width||0,h=(a==null?void 0:a.height)||((S=s.geometry)==null?void 0:S.height)||s.height||0;if((l===0||h===0)&&(a!=null&&a.points)&&Array.isArray(a.points)&&a.points.length>0){let N=1/0,gt=-1/0,mt=1/0,ut=-1/0;a.points.forEach(wt=>{N=Math.min(N,wt.x),gt=Math.max(gt,wt.x),mt=Math.min(mt,wt.y),ut=Math.max(ut,wt.y)}),l===0&&(l=gt-N),h===0&&(h=ut-mt)}const f=N=>{if(N)return N.corner_radius??N.cornerRadius},p=f(n)??f(r)??f(a)??f(s.style)??f(s.geometry)??0;let c={...a,width:l,height:h};if(delete c.cornerRadius,c.corner_radius=p,!c.type&&(s.type==="Frame"||s.type==="Component"||s.type==="Group")&&(c.type="Rectangle"),c.type==="Path"&&s.weights&&s.bindMatrices&&c.points){const N=this.getGlobalTransform(s.id);if(N){const gt=ii(c.points,s.weights,s.bindMatrices,N,mt=>this.getGlobalTransform(mt));c={...c,points:gt}}}if(n.visible===!1)return;const u=(r.effects||((C=s.style)==null?void 0:C.effects)||[]).find(N=>N.isEnabled!==!1&&N.type==="PathDistortion");if(u){const N=oi(c,l,h,u.amplitude||5,u.frequency||10,u.seed||0,u.direction||0,u.directionStrength||0);c={...c,type:"Path",points:N}}const y=s.repeaterConfig,m=y&&y.isEnabled&&y.count>1,b=m?y.count:1;for(let N=0;N<b;N++){let gt=n.x!==void 0?n.x:((w=n.transform)==null?void 0:w.x)??0,mt=n.y!==void 0?n.y:((M=n.transform)==null?void 0:M.y)??0,ut=n.rotation!==void 0?n.rotation:((I=n.transform)==null?void 0:I.rotation)??0,wt=n.scale_x!==void 0?n.scale_x:((k=n.transform)==null?void 0:k.scale_x)??1,Mt=n.scale_y!==void 0?n.scale_y:((T=n.transform)==null?void 0:T.scale_y)??1;if(m&&N>0){if(y.type==="Linear"){const ot=y.offsetX||0,ft=y.offsetY||0,it=y.rotation||0,G=y.scale!==void 0?y.scale:1;gt+=N*ot,mt+=N*ft,ut+=N*it,wt*=Math.pow(G,N),Mt*=Math.pow(G,N)}else if(y.type==="Grid"){const ot=y.cols||Math.ceil(Math.sqrt(y.count)),ft=y.gapX||0,it=y.gapY||0,G=Math.floor(N/ot),at=N%ot,V=l+ft,dt=h+it;gt+=at*V,mt+=G*dt}else if(y.type==="Radial"){const ot=y.radius||100,ft=y.startAngle||0,G=(y.endAngle||360)-ft,at=y.count>1?G/(G===360?y.count:y.count-1):0,V=ft+N*at,dt=V*Math.PI/180;gt=n.x+ot*Math.cos(dt),mt=n.y+ot*Math.sin(dt),ut+=V}}const Et=s.type==="Group"||s.type==="Frame"||s.type==="Component",Ut=l>0&&h>0;if(!Et&&Ut&&!e){const ot=(((O=r.shadow)==null?void 0:O.isEnabled)!==!1?(((_=r.shadow)==null?void 0:_.blur)||0)+10:0)+(((P=r.blur)==null?void 0:P.isEnabled)!==!1&&((E=r.blur)==null?void 0:E.radius)||0)+20;if(!this.isObjectInView(t,gt,mt,l,h,ot))continue}this.debug_objectsRendered++,t.save();const re=[],he=r.blur||((A=s.style)==null?void 0:A.blur);he&&he.amount>0&&re.push(`blur(${he.amount}px)`);const nt=r.effects||((B=s.style)==null?void 0:B.effects)||[];let yt=nt.find(ot=>ot.isEnabled!==!1&&(ot.type==="BackgroundBlur"||ot.type==="LayerBlur"));yt||(yt=r.effect||((D=s.style)==null?void 0:D.effect)||nt.find(ot=>ot.isEnabled!==!1));const Tt=yt,_t=(Tt==null?void 0:Tt.isEnabled)!==!1,St=Tt==null?void 0:Tt.type,Ft=(Tt==null?void 0:Tt.radius)??10;_t&&St==="LayerBlur"?re.push(`blur(${Ft}px)`):_t&&St==="BackgroundBlur"&&(r===s.style&&(r={...r}),r.fill={type:"None"});const Gt=((W=a==null?void 0:a.type)==null?void 0:W.toLowerCase().includes("image"))||((X=s.type)==null?void 0:X.toLowerCase().includes("image")),Bt=r.adjustments&&Object.keys(r.adjustments).length>0?r.adjustments:null,Wt=a!=null&&a.adjustments&&Object.keys(a.adjustments).length>0?a.adjustments:null,Jt=Gt?Wt||Bt:Bt||Wt,Yt=Gt&&!Jt?{exposure:0,contrast:0,saturation:100,temperature:0,tint:0,highlights:0,shadows:0,blur:0,negative:0,hue:0}:Jt;if(n&&Yt&&(n.geometry=n.geometry||{},n.geometry.adjustments={...Yt}),Yt){const ot=(Yt.exposure||0)/100,ft=Yt.contrast||0,it=1+(Yt.saturation||0)/100,G=(Yt.temperature||0)/200,at=(Yt.tint||0)/200,V=(Yt.highlights||0)/500,dt=(Yt.shadows||0)/500;let vt="",Pt="SourceGraphic";if(ot!==0&&(vt+=`
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<feColorMatrix in="${Pt}" type="matrix" result="invert"
|
|
19
|
-
values="${kt} 0 0 0 ${1-kt}
|
|
20
|
-
0 ${kt} 0 0 ${1-kt}
|
|
21
|
-
0 0 ${kt} 0 ${1-kt}
|
|
22
|
-
0 0 0 1 0"/>`,Pt="invert"}if(G!==0||at!==0||V!==0||dt!==0){const kt=1+V+dt,At=kt*(1+G-at/2),$=kt*(1+at),Xt=kt*(1-G-at/2),ne=Yt.shadows*.1/255,ie=[At,0,0,0,ne,0,$,0,0,ne,0,0,Xt,0,ne,0,0,0,1,0].join(" ");vt+=`<feColorMatrix in="${Pt}" type="matrix" values="${ie}" result="advanced"/>`,Pt="advanced"}if(Yt.blur&&(vt+=`<feGaussianBlur in="${Pt}" stdDeviation="${Yt.blur}" result="blur"/>`,Pt="blur"),vt){const kt=`<svg xmlns="http://www.w3.org/2000/svg"><filter id="f" color-interpolation-filters="sRGB">${vt}</filter></svg>`,At=btoa(kt);re.push(`url('data:image/svg+xml;base64,${At}#f')`)}}re.length>0?t.filter=re.join(" "):t.filter="none",t.imageSmoothingEnabled=!0,t.imageSmoothingQuality="high";const we=t.globalAlpha,Me=this.normalizeOpacity(n.opacity!==void 0?n.opacity:100);t.globalAlpha=we*Me;const Zt=n.compositeOperation||n.blendMode;if(Zt&&Zt!=="Normal"){const ot=Zt.toLowerCase();["multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","source-over","source-in","source-out","source-atop","destination-over","destination-in","destination-out","destination-atop","lighter","copy","xor","multiply","screen"].includes(ot)&&(t.globalCompositeOperation=ot)}const le=t,Ee=n.masks||(s.maskedBy?[{maskId:s.maskedBy,inverted:s.maskInverted===!0,type:s.maskType||"alpha",opacity:s.maskOpacity!==void 0?s.maskOpacity/100:1,feather:s.maskFeather||0,isVisible:!0}]:[]);let Ie=!1;const ke=Ee.filter(ot=>ot.isVisible!==!1&&o.has(ot.maskId));if(ke.length>0){const ot=ke[0],ft=o.get(ot.maskId),it=this.objectStates.get(ft.id);it&&it.visible!==!1&&(Ie=!0,(!this.maskBuffer||this.maskBuffer.width!==this.canvasWidth||this.maskBuffer.height!==this.canvasHeight)&&(this.maskBuffer=document.createElement("canvas"),this.maskBuffer.width=this.canvasWidth,this.maskBuffer.height=this.canvasHeight,this.maskCtx=this.maskBuffer.getContext("2d",{willReadFrequently:!0}),this.maskCtx&&(this.maskCtx.imageSmoothingEnabled=!0,this.maskCtx.imageSmoothingQuality="high")),this.maskCtx.setTransform(1,0,0,1,0,0),this.maskCtx.globalCompositeOperation="source-over",this.maskCtx.globalAlpha=1,this.maskCtx.filter="none",this.maskCtx.clearRect(0,0,this.maskBuffer.width,this.maskBuffer.height),this.rootTransform&&this.maskCtx.setTransform(this.rootTransform),s.parentId&&this.applyAbsoluteTransform(this.maskCtx,s.parentId,o),this.maskCtx.save(),this.maskCtx.globalAlpha=1,t=this.maskCtx,t.filter=le.filter)}if(!i){t.translate(Math.round(gt),Math.round(mt)),t.rotate(ut*Math.PI/180);const ot=n.skew_x||0,ft=n.skew_y||0;if(ot!==0||ft!==0){const Pt=Math.tan(ot*Math.PI/180),Ht=Math.tan(ft*Math.PI/180);t.transform(1+Pt*Ht,Ht,Pt,1,0,0)}const it=n.rotate_x!==void 0?n.rotate_x:((H=n.transform)==null?void 0:H.rotate_x)??0,G=n.rotate_y!==void 0?n.rotate_y:((Q=n.transform)==null?void 0:Q.rotate_y)??0,V=1+(n.translate_z!==void 0?n.translate_z:((L=n.transform)==null?void 0:L.translate_z)??0)/1e3,dt=(n.flip_x===!0?-1:1)*Math.cos(G*Math.PI/180)*V,vt=(n.flip_y===!0?-1:1)*Math.cos(it*Math.PI/180)*V;t.scale(wt*dt,Mt*vt)}r.shadow&&r.shadow.isEnabled!==!0&&((r.shadow.blur||0)>0||Math.abs(r.shadow.offsetX||0)>0||Math.abs(r.shadow.offsetY||0)>0)&&(r.shadow.isEnabled=!0);const de=r.shadow;if(de&&de.isEnabled!==!1&&!e){let ot=de.color||"#000000";(et=(R=this.artboard)==null?void 0:R.tokens)!=null&&et.colors&&this.artboard.tokens.colors[ot]&&(ot=this.artboard.tokens.colors[ot]);const ft=this.normalizeOpacity(de.opacity??100)*.75,it=de.spread||0,at=(de.blur||0)+it*1.5;let V=ot;if(ot.startsWith("#")){const Pt=ot.replace("#",""),Ht=parseInt(Pt.substring(0,2),16),kt=parseInt(Pt.substring(2,4),16),At=parseInt(Pt.substring(4,6),16);V=`rgba(${Ht}, ${kt}, ${At}, ${ft})`}else if(ot.startsWith("rgba")){const Pt=ot.match(/[\d.]+/g);if(Pt&&Pt.length>=4){const Ht=Pt[0],kt=Pt[1],At=Pt[2],$=Pt[3];V=`rgba(${Ht}, ${kt}, ${At}, ${parseFloat($)*ft})`}}const dt=t.getTransform(),vt=Math.sqrt(dt.a*dt.a+dt.b*dt.b)||1;t.shadowColor=V,t.shadowBlur=at*vt,t.shadowOffsetX=(de.offsetX||0)*vt,t.shadowOffsetY=(de.offsetY||0)*vt}const pe=s.liquidFill||((U=s.style)==null?void 0:U.liquidFill);if(pe&&pe.enabled){t.save();const ot=pe.fillLevel??.5;t.beginPath();const ft=h/2-h*ot;t.rect(-l/2,ft,l,h*ot),t.clip(),t.fillStyle=pe.color||"#3b82f6",t.globalAlpha=t.globalAlpha*(pe.opacity??1)}if(e||this.applyOuterGlowUnderlay(t,s,c,l,h,p,r,o),(a==null?void 0:a.type)==="Text")this._renderText(t,s,c,r,n,l,h,!1,!1,wt,Mt);else if((a==null?void 0:a.type)==="Image"){const ot=a.originalSrc||a.src;if(ot){let ft=this.imageCache.get(ot);ft||(ft=new Image,ft.onload=()=>{this.log(`[ExodeUI] Image loaded successfully, size: ${ft.naturalWidth}x${ft.naturalHeight}`)},ft.onerror=at=>{console.error("[ExodeUI] Image load failed:",at,`Src preview: ${ot.substring(0,100)}...`)},ft.src=ot,this.imageCache.set(ot,ft));const it=r.stroke&&r.stroke.width>0&&r.stroke.isEnabled!==!1,G=(((lt=r.stroke)==null?void 0:lt.alignment)||"center").toLowerCase();if(it&&(G==="outside"||G==="center")&&this.applyStrokeAlignment(t,r,c,l,h,p,wt,Mt),r.fill&&r.fill.type!=="None"){t.save();const at=t.globalAlpha,V=this.createCanvasFill(t,r.fill,l,h);t.fillStyle=V||r.fill.color||"transparent",t.globalAlpha=at*this.normalizeOpacity(r.fill.opacity??100),p!==0?(this.drawRoundRect(t,-l/2,-h/2,l,h,p),t.fill()):t.fillRect(-l/2,-h/2,l,h),t.globalAlpha=at,t.restore()}ft.complete&&ft.naturalWidth>0?(p!==0?(t.save(),this.drawRoundRect(t,-l/2,-h/2,l,h,p),t.clip(),t.drawImage(ft,-l/2,-h/2,l,h),t.restore()):t.drawImage(ft,-l/2,-h/2,l,h),it&&G==="inside"&&this.applyStrokeAlignment(t,r,c,l,h,p,wt,Mt)):it&&G==="inside"&&this.applyStrokeAlignment(t,r,c,l,h,p,wt,Mt)}}else if(a.type==="SVG"){const ot=a.svgContent;if(ot){const ft=r.palette||[],it=r.fill,G=r.stroke,at=it?this.normalizeOpacity(it.opacity??100):1,V=G&&G.isEnabled!==!1?this.normalizeOpacity(G.opacity??100):1,dt=(it==null?void 0:it.type)==="Solid"&&(!G||G.isEnabled===!1||G.type==="Solid"&&G.color===it.color&&V===at),vt=it&&it.type!=="None"?dt?"monochrome":it.type==="Solid"?(it.color||"")+"|opacity:"+at:JSON.stringify(it.stops||[])+"|opacity:"+at:"",Pt=G&&G.isEnabled!==!1&&(G.width||0)>0?dt?["monochrome",G.width||0,G.trimStart??0,G.trimEnd??1,G.trimOffset??0,G.dashOffset??0].join("|"):[G.width||0,G.fill?G.fill.type==="Solid"?G.fill.color||"":JSON.stringify(G.fill.stops||[]):G.color||"",G.opacity??1,G.lineCap||"",G.lineJoin||"",(G.dashArray||[]).join(","),G.trimStart??0,G.trimEnd??1,G.trimOffset??0,G.dashOffset??0].join("|"):"nostroke",Ht=[s.id,ft.join("_"),vt,Pt,n.opacity??100,n.visible!==!1?"v":"h"].join("_");let kt=this.imageCache.get(Ht);if(!kt){kt=new Image,kt.crossOrigin="anonymous";let $=ot;$.match(/xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i)||($=$.replace(/<svg([^>]*)>/i,(j,bt)=>`<svg xmlns="http://www.w3.org/2000/svg"${bt}>`));let Xt=a.width||l||100,ne=a.height||h||100;const ie=$.match(/viewBox=["']\s*0\s+0\s+([\d.]+)\s+([\d.]+)\s*["']/i);if(ie&&(Xt=parseFloat(ie[1]),ne=parseFloat(ie[2])),$=$.replace(/<svg([^>]*)>/i,(j,bt)=>{let Y=bt.replace(/\b(?:width|height)=["'][^"']*["']/gi," ");return Y.match(/\bviewBox=/i)||(Y+=` viewBox="0 0 ${Xt} ${ne}"`),Y.match(/\bpreserveAspectRatio=/i)||(Y+=' preserveAspectRatio="none"'),Y+=' width="100%" height="100%"',`<svg${Y}>`}),a.colors&&a.colors.length>0&&ft.length>0&&a.colors.forEach((j,bt)=>{if(ft[bt]){const Y=j.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),rt=new RegExp(Y,"gi");$=$.replace(rt,ft[bt])}}),it&&it.type&&it.type!=="None"){if(it.type==="Solid"&&it.color){const j=dt?"#FFFFFF":it.color,bt=dt?1:this.normalizeOpacity(it.opacity??100);$=$.replace(/\bfill\s*=\s*["'][^"']*["']/gi,Y=>/fill\s*=\s*["']\s*(none|transparent)\s*["']/i.test(Y)?Y:`fill="${j}"`),$=$.replace(/fill\s*:\s*[^;"')]+/gi,Y=>/fill\s*:\s*(none|transparent)/i.test(Y)?Y:`fill:${j}`),bt<1&&($=$.replace(/\bfill-opacity\s*=\s*["'][^"']*["']/gi,`fill-opacity="${bt}"`),$=$.replace(/fill-opacity\s*:\s*[^;"')]+/gi,`fill-opacity:${bt}`),$.match(/\bfill-opacity\s*=/i)||($=$.replace(/(<svg[^>]*>)/i,`$1<g fill-opacity="${bt}">`),$=$.replace(/<\/svg>/i,"</g></svg>")))}else if(it.type==="LinearGradient"||it.type==="RadialGradient"||it.type==="Linear"||it.type==="Radial"){const j="exode-fill",bt=this.normalizeOpacity(it.opacity??100),Y=(it.stops||[]).map(tt=>{const qt=tt.offset!==void 0?tt.offset:tt.pos??0,jt=this.normalizeOpacity(tt.opacity??100)*bt;return`<stop offset="${qt*100}%" stop-color="${tt.color||"#000"}" stop-opacity="${jt}"/>`}).join("");let rt="";if(it.type==="LinearGradient"||it.type==="Linear"){const tt=(te,Qt)=>Array.isArray(te)?te[Qt]??(Qt===0?0:1):te&&typeof te=="object"?te[Qt===0?"x":"y"]??(Qt===0?0:1):Qt===0?0:1,qt=tt(it.start,0)*100,jt=tt(it.start,1)*100,Se=tt(it.end,0)*100,Vt=tt(it.end,1)*100;rt=`<linearGradient id="${j}" x1="${qt}%" y1="${jt}%" x2="${Se}%" y2="${Vt}%" gradientUnits="objectBoundingBox">${Y}</linearGradient>`}else{const tt=(Vt,te)=>Array.isArray(Vt)?Vt[te]??.5:Vt&&typeof Vt=="object"?Vt[te===0?"x":"y"]??.5:.5,qt=tt(it.center,0)*100,jt=tt(it.center,1)*100,Se=(it.radius??.5)*100;rt=`<radialGradient id="${j}" cx="${qt}%" cy="${jt}%" r="${Se}%" gradientUnits="objectBoundingBox">${Y}</radialGradient>`}/<defs>/i.test($)?$=$.replace(/<defs>/i,`<defs>${rt}`):$=$.replace(/<svg([^>]*)>/i,`<svg$1><defs>${rt}</defs>`),$=$.replace(/\bfill\s*=\s*["'][^"']*["']/gi,tt=>/fill\s*=\s*["']\s*(none|transparent)\s*["']/i.test(tt)?tt:`fill="url(#${j})"`),$=$.replace(/fill\s*:\s*[^;"')]+/gi,tt=>/fill\s*:\s*(none|transparent)/i.test(tt)?tt:`fill:url(#${j})`)}}const zt=(j,bt,Y=1)=>{const rt=(j.stops||[]).map(Vt=>{const te=Vt.offset!==void 0?Vt.offset:Vt.pos??0,Qt=this.normalizeOpacity(Vt.opacity??100)*Y;return`<stop offset="${te*100}%" stop-color="${Vt.color||"#000"}" stop-opacity="${Qt}"/>`}).join(""),tt=(Vt,te,Qt=.5)=>Array.isArray(Vt)?Vt[te]??Qt:Vt&&typeof Vt=="object"?Vt[te===0?"x":"y"]??Qt:Qt;if(j.type==="LinearGradient"||j.type==="Linear"){const Vt=tt(j.start,0,0)*100,te=tt(j.start,1,0)*100,Qt=tt(j.end,0,1)*100,Te=tt(j.end,1,1)*100;return`<linearGradient id="${bt}" x1="${Vt}%" y1="${te}%" x2="${Qt}%" y2="${Te}%" gradientUnits="objectBoundingBox">${rt}</linearGradient>`}const qt=tt(j.center,0,.5)*100,jt=tt(j.center,1,.5)*100,Se=(j.radius??.5)*100;return`<radialGradient id="${bt}" cx="${qt}%" cy="${jt}%" r="${Se}%" gradientUnits="objectBoundingBox">${rt}</radialGradient>`},Rt=(j,bt)=>/<defs>/i.test(j)?j.replace(/<defs>/i,`<defs>${bt}`):j.replace(/(<svg[^>]*>)/i,`$1<defs>${bt}</defs>`);if(G&&G.isEnabled!==!1&&(G.width||0)>0){const j=dt?1:this.normalizeOpacity(G.opacity??100),bt=dt?"#FFFFFF":G.color||(it==null?void 0:it.color)||"#000000";let Y="";const rt=G.fill;if(rt&&rt.type){if(rt.type==="Solid")Y=rt.color||G.color||"#000000";else if(rt.type==="LinearGradient"||rt.type==="RadialGradient"||rt.type==="Linear"||rt.type==="Radial"){const Kt="exode-stroke";$=Rt($,zt(rt,Kt,j)),Y=`url(#${Kt})`}}Y||(Y=bt),$.match(/\bstroke\s*=\s*["']/i)?$=$.replace(/\bstroke\s*=\s*["'][^"']*["']/gi,Kt=>/stroke\s*=\s*["']\s*(none|transparent)\s*["']/i.test(Kt)?Kt:`stroke="${Y}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke="${Y}"`),$=$.replace(new RegExp(`(?<![a-z-])stroke\\s*:\\s*(?!none|transparent)[^;"')]+`,"gi"),`stroke:${Y}`);let tt=a.width||l||100,qt=a.height||h||100;const jt=ot.match(/viewBox=["']\s*0\s+0\s+([\d.]+)\s+([\d.]+)\s*["']/i);if(jt){const Kt=parseFloat(jt[1]),ae=parseFloat(jt[2]);!isNaN(Kt)&&!isNaN(ae)&&(tt=Kt,qt=ae)}const Se=Math.max(.001,l/tt),Vt=Math.max(.001,h/qt),te=(Se+Vt)/2,Qt=(G.width||1)/te;$.match(/\bstroke-width\s*=\s*["']/i)?$=$.replace(/\bstroke-width\s*=\s*["'][^"']*["']/gi,`stroke-width="${Qt}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-width="${Qt}"`),$=$.replace(/stroke-width\s*:\s*[^;"')]+/gi,`stroke-width:${Qt}`),$.match(/\bstroke-opacity\s*=\s*["']/i)?$=$.replace(/\bstroke-opacity\s*=\s*["'][^"']*["']/gi,`stroke-opacity="${j}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-opacity="${j}"`),$=$.replace(/stroke-opacity\s*:\s*[^;"')]+/gi,`stroke-opacity:${j}`);const Te=G.lineCap||"round";$.match(/\bstroke-linecap\s*=\s*["']/i)?$=$.replace(/\bstroke-linecap\s*=\s*["'][^"']*["']/gi,`stroke-linecap="${Te}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-linecap="${Te}"`),$=$.replace(/stroke-linecap\s*:\s*[^;"')]+/gi,`stroke-linecap:${Te}`);const Ae=G.lineJoin||"round";$.match(/\bstroke-linejoin\s*=\s*["']/i)?$=$.replace(/\bstroke-linejoin\s*=\s*["'][^"']*["']/gi,`stroke-linejoin="${Ae}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-linejoin="${Ae}"`),$=$.replace(/stroke-linejoin\s*:\s*[^;"')]+/gi,`stroke-linejoin:${Ae}`);const Oe=G.trimStart??0,Le=G.trimEnd??1,xe=G.trimOffset??0,Re=G.dashOffset??0,Ye=Oe!==0||Le!==1||xe!==0||Re!==0;if(Ye){const Kt=Math.max(0,Math.min(1,Oe)),ae=Math.max(0,Math.min(1,Le));this.frameCount%600===0&&this.debugLog(`SVG Trim - Object: ${s.name||s.id}, Start: ${Kt}, End: ${ae}`);const ue=(tt+qt)*2,Fe=(xe%1+1)%1,$e=(Re%1+1)%1;let me="",ge=0;if(Kt>=ae)me=`0 ${ue}`,ge=0;else{const ye=ue*(ae-Kt),Pe=ue-ye;ge=-(ue*(Kt+Fe+$e)),me=`${ye} ${Pe}`}$.match(/\bstroke-dasharray\s*=/i)?$=$.replace(/\bstroke-dasharray\s*=\s*["'][^"']*["']/gi,`stroke-dasharray="${me}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-dasharray="${me}"`),$=$.replace(/stroke-dasharray\s*:\s*[^;"')]+/gi,`stroke-dasharray:${me}`),$.match(/\bstroke-dashoffset\s*=/i)?$=$.replace(/\bstroke-dashoffset\s*=\s*["'][^"']*["']/gi,`stroke-dashoffset="${ge}"`):$=$.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-dashoffset="${ge}"`),$=$.replace(/stroke-dashoffset\s*:\s*[^;"')]+/gi,`stroke-dashoffset:${ge}`)}else if(G.dashArray&&G.dashArray.length>0){const Kt=G.dashArray.join(" ");if($=$.replace(/\bstroke-dasharray\s*=\s*["'][^"']*["']/gi,`stroke-dasharray="${Kt}"`),$=$.replace(/stroke-dasharray\s*:\s*[^;"')]+/gi,`stroke-dasharray:${Kt}`),G.dashOffset){const ae=(tt+qt)*2,ue=-(G.dashOffset*ae);$=$.replace(/\bstroke-dashoffset\s*=\s*["'][^"']*["']/gi,`stroke-dashoffset="${ue}"`),$=$.replace(/stroke-dashoffset\s*:\s*[^;"')]+/gi,`stroke-dashoffset:${ue}`)}}if(!/\bstroke\s*=\s*["']/i.test(ot)&&!new RegExp("(?<![a-z-])stroke\\s*:","i").test(ot)){let Kt="",ae="";if(Ye){const me=a.width||l||100,ge=a.height||h||100,ye=(me+ge)*2,Pe=Math.max(0,Math.min(1,Oe)),Xe=Math.max(0,Math.min(1,Le)),Ue=(xe%1+1)%1,qe=(Re%1+1)%1;if(Pe>=Xe)Kt=` stroke-dasharray="0 ${ye}"`,ae=' stroke-dashoffset="0"';else{const De=ye*(Xe-Pe),Ke=ye-De,Je=-(ye*(Pe+Ue+qe));Kt=` stroke-dasharray="${De} ${Ke}"`,ae=` stroke-dashoffset="${Je}"`}}else(x=G.dashArray)!=null&&x.length&&(Kt=` stroke-dasharray="${G.dashArray.join(" ")}"`,G.dashOffset&&(ae=` stroke-dashoffset="${G.dashOffset}"`));const ue=` stroke-linecap="${G.lineCap||"round"}"`,Fe=` stroke-linejoin="${G.lineJoin||"round"}"`,$e=`stroke="${Y}" stroke-width="${Qt}" stroke-opacity="${j}"${ue}${Fe}${Kt}${ae}`;$=$.replace(/(<svg[^>]*>)(\s*(?:<defs>[\s\S]*?<\/defs>)?)/i,(me,ge,ye)=>`${ge}${ye}<g ${$e}>`),$=$.replace(/<\/svg>/i,"</g></svg>")}}else G&&G.isEnabled===!1&&($=$.replace(/\bstroke\s*=\s*["'][^"']*["']/gi,'stroke="none"'),$=$.replace(new RegExp(`(?<![a-z-])stroke\\s*:\\s*(?!none|transparent)[^;"')]+`,"gi"),"stroke:none"));const Ct=new Blob([$],{type:"image/svg+xml"}),ht=URL.createObjectURL(Ct);kt.onload=()=>{if(URL.revokeObjectURL(ht),this.frameCount%900===0){const j=this.imageCache.get(Ht);j&&this.debugLog(`SVG Payload Ready: ${s.name||s.id} (${j.naturalWidth}x${j.naturalHeight})`)}},kt.onerror=()=>{URL.revokeObjectURL(ht),this.debugLog(`SVG Error: Failed to load payload for ${s.name||s.id}`)},kt.src=ht,this.imageCache.set(Ht,kt)}let At=null;if(kt.complete&&kt.naturalWidth>0?(At=kt,this.lastValidSvgImgMap.set(s.id,kt)):At=this.lastValidSvgImgMap.get(s.id)||null,At&&At.complete&&At.naturalWidth>0){const $=Math.max(1,l),Xt=Math.max(1,h);if(dt&&(it==null?void 0:it.type)==="Solid"){this.maskBuffer||(this.maskBuffer=document.createElement("canvas"),this.maskCtx=this.maskBuffer.getContext("2d")),this.maskBuffer.width=$,this.maskBuffer.height=Xt,this.maskCtx.setTransform(1,0,0,1,0,0),this.maskCtx.globalCompositeOperation="source-over",this.maskCtx.globalAlpha=1,this.maskCtx.filter="none",this.maskCtx.clearRect(0,0,$,Xt),this.maskCtx.drawImage(At,0,0,$,Xt),this.maskCtx.globalCompositeOperation="source-in";const ne=it.color||"#000000",ie=this.normalizeOpacity(it.opacity??100);this.maskCtx.fillStyle=ne,this.maskCtx.globalAlpha=ie,this.maskCtx.fillRect(0,0,$,Xt),t.drawImage(this.maskBuffer,-$/2,-Xt/2,$,Xt)}else p!==0?(t.save(),this.drawRoundRect(t,-$/2,-Xt/2,$,Xt,p),t.clip(),t.drawImage(At,-$/2,-Xt/2,$,Xt),t.restore()):t.drawImage(At,-$/2,-Xt/2,$,Xt)}}}else if(c.type==="LineGraph")this.renderLineGraph(t,c,l,h);else if(s.type==="Shape"){if(this.applyPath(t,c,l,h,p),t.save(),r.blur&&r.blur.amount>0&&(t.filter=`blur(${r.blur.amount}px)`),_t&&St==="BackgroundBlur")if(e)t.fillStyle="#000000",t.globalAlpha=1,this.applyPath(t,c,l,h,p),t.fill();else{if(t.shadowColor&&t.shadowColor!=="rgba(0, 0, 0, 0)"&&t.shadowColor!=="transparent"){const it=t.getTransform(),G=t.shadowOffsetX,at=t.shadowOffsetY;t.shadowOffsetX=G+1e4*it.a,t.shadowOffsetY=at+1e4*it.b,t.save(),t.translate(-1e4,0),this.applyPath(t,c,l,h,p),t.fillStyle="white",t.fill(),t.restore(),t.shadowOffsetX=G,t.shadowOffsetY=at,t.shadowColor="transparent"}this.applyBackgroundBlurGlass(t,c,l,h,p,Tt,r)}else if(r.fill){const ft=t.globalAlpha;if(((F=r.fill)==null?void 0:F.type)==="Image"&&(r.fill.originalSrc||r.fill.src)){const it=r.fill.originalSrc||r.fill.src;let G=this.imageCache.get(it);G||(G=new Image,G.src=it,this.imageCache.set(it,G)),G.complete&&G.naturalWidth>0&&(t.save(),this.applyPath(t,c,l,h,p),t.clip(),this.renderFittedImage(t,G,-l/2,-h/2,l,h,r.fill.fillMode),t.restore())}else{const it=this.createCanvasFill(t,r.fill,l,h);t.fillStyle=it||(typeof r.fill=="string"?r.fill:r.fill.color||"transparent"),t.globalAlpha=ft*this.normalizeOpacity(r.fill.opacity??100),this.applyPath(t,c,l,h,p),t.fill()}t.globalAlpha=ft}t.restore(),r.stroke&&r.stroke.width>0&&(this.applyPath(t,c,l,h,p),this.applyStrokeAlignment(t,r,c,l,h,p,wt,Mt))}else if(s.type==="Frame"||s.type==="Component"&&!s.variant||s.type==="Group"&&!s.isStructuralGroup){const ot=n.width??a.width??s.width??l,ft=n.height??a.height??s.height??h,it=p;if(t.save(),t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),_t&&St==="BackgroundBlur")if(e)t.fillStyle="#000000",t.globalAlpha=1,t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),t.fill();else{if(t.shadowColor&&t.shadowColor!=="rgba(0, 0, 0, 0)"&&t.shadowColor!=="transparent"){const V=t.getTransform(),dt=t.shadowOffsetX,vt=t.shadowOffsetY;t.shadowOffsetX=dt+1e4*V.a,t.shadowOffsetY=vt+1e4*V.b,t.save(),t.translate(-1e4,0),t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),t.fillStyle="white",t.fill(),t.restore(),t.shadowOffsetX=dt,t.shadowOffsetY=vt,t.shadowColor="transparent"}this.applyBackgroundBlurGlass(t,c,ot,ft,it,Tt,r)}else if(r.fill&&r.fill.type!=="None"){const at=t.globalAlpha;if(((z=r.fill)==null?void 0:z.type)==="Image"&&(r.fill.originalSrc||r.fill.src)){const V=r.fill.originalSrc||r.fill.src;let dt=this.imageCache.get(V);dt||(dt=new Image,dt.src=V,this.imageCache.set(V,dt)),dt.complete&&dt.naturalWidth>0&&(t.save(),t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),t.clip(),this.renderFittedImage(t,dt,-ot/2,-ft/2,ot,ft,r.fill.fillMode),t.restore())}else{const V=this.createCanvasFill(t,r.fill,ot,ft);t.fillStyle=V||r.fill.color||"transparent",t.globalAlpha=at*this.normalizeOpacity(r.fill.opacity??100),t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),t.fill(),t.globalAlpha=at}}if(t.restore(),!e&&(_t&&St==="BackgroundBlur"||r.fill&&r.fill.type!=="None")&&(t.shadowColor="transparent"),r.stroke&&r.stroke.width>0&&r.stroke.isEnabled!==!1){const at={type:"Rectangle"};t.beginPath(),this.drawRoundRect(t,-ot/2,-ft/2,ot,ft,it),this.applyStrokeAlignment(t,r,at,ot,ft,it,wt,Mt)}}else s.type==="Group"&&s.isStructuralGroup||(s.type==="Component"&&s.variant==="inputbox"?this.renderInputBox(t,s):s.type==="Component"&&s.variant==="button"?this.renderButton(t,s):s.type==="Component"&&s.variant==="toggle_button"?this.renderToggleButton(t,s):s.type==="Toggle"||s.type==="Component"&&s.variant==="toggle"?this.renderToggle(t,s):s.type==="Slider"||s.type==="Component"&&s.variant==="slider"?this.renderSlider(t,s):s.type==="Dropdown"||s.type==="Component"&&s.variant==="dropdown"?this.renderDropdown(t,s):s.type==="ListView"||s.type==="Component"&&s.variant==="listview"?this.renderListView(t,s):s.type==="Checkbox"||s.type==="Component"&&s.variant==="checkbox"?this.renderCheckbox(t,s):s.type==="RadioGroup"||s.type==="Component"&&s.variant==="radiogroup"?this.renderRadioGroup(t,s):s.type==="BarChart"||s.type==="Component"&&s.variant==="barchart"?this.renderBarChart(t,s):s.type==="PieChart"||s.type==="Component"&&s.variant==="piechart"?this.renderPieChart(t,s):s.type==="Joystick"||s.type==="Component"&&s.variant==="joystick"?this.renderJoystick(t,s):this.frameCount%300===0&&this.warn("[Engine] Unhandled object type in renderObject:",s.type,"Geo:",(st=s.geometry)==null?void 0:st.type));if(e||(this.applyInnerGlowOverlay(t,s,c,l,h,p,r),this.applyArtEffectOverlay(t,s,c,l,h,p)),pe&&pe.enabled&&t.restore(),s.children&&s.children.length>0){const ft=s.type==="Frame",it=s.clipsContent!==void 0?s.clipsContent:s.clipContent!==void 0?s.clipContent:ft;if(t.save(),it){t.beginPath();const at=n.width??(a==null?void 0:a.width)??s.width??0,V=n.height??(a==null?void 0:a.height)??s.height??0,dt=n.cornerRadius??(a==null?void 0:a.corner_radius)??s.cornerRadius??0;this.drawRoundRect(t,-at/2,-V/2,at,V,dt),t.clip()}let G=0;for(s.children.forEach(at=>{const V=o.get(at);if(!V)return;const dt=this.objectStates.get(at),vt=(dt==null?void 0:dt.geometry)||V.geometry;if(vt&&vt.isMask&&(dt==null?void 0:dt.visible)!==!1){const Pt=vt.width||0,Ht=vt.height||0;this.applyObjectTransform(t,at);const kt=(dt==null?void 0:dt.corner_radius)??(vt==null?void 0:vt.corner_radius)??0;this.applyPath(t,vt,Pt,Ht,kt),t.clip(),G++}else this.renderObject(t,V,o,e)});G>0;)t.restore(),G--;t.restore()}if(Ie){this.maskCtx.restore(),(n.masks||(s.maskedBy?[{maskId:s.maskedBy,inverted:s.maskInverted===!0,type:s.maskType||"alpha",opacity:s.maskOpacity!==void 0?s.maskOpacity/100:1,feather:s.maskFeather||0,isVisible:!0}]:[])).filter(G=>G.isVisible!==!1&&o.has(G.maskId)).forEach(G=>{var kt,At,$,Xt,ne,ie;const at=o.get(G.maskId),V=this.objectStates.get(at.id),dt=G.feather||0,vt=G.inverted===!0,Pt=G.opacity!==void 0?typeof G.opacity=="number"?G.opacity:G.opacity/100:1;if((G.type||"alpha")==="luma"){(!this.lumaBuffer||this.lumaBuffer.width!==this.maskBuffer.width||this.lumaBuffer.height!==this.maskBuffer.height)&&(this.lumaBuffer=document.createElement("canvas"),this.lumaBuffer.width=this.maskBuffer.width,this.lumaBuffer.height=this.maskBuffer.height,this.lumaCtx=this.lumaBuffer.getContext("2d",{willReadFrequently:!0}),this.lumaCtx&&(this.lumaCtx.imageSmoothingEnabled=!0,this.lumaCtx.imageSmoothingQuality="high")),this.lumaCtx.setTransform(1,0,0,1,0,0),this.lumaCtx.globalCompositeOperation="source-over",this.lumaCtx.globalAlpha=1,this.lumaCtx.filter="none",this.lumaCtx.clearRect(0,0,this.lumaBuffer.width,this.lumaBuffer.height),this.lumaCtx.save(),this.rootTransform&&this.lumaCtx.setTransform(this.rootTransform),this.applyAbsoluteTransform(this.lumaCtx,at.id,o),dt>0&&(this.lumaCtx.filter=`blur(${dt}px)`),this.lumaCtx.globalAlpha=Pt;const zt=(V==null?void 0:V.width)||at.geometry.width||0,Rt=(V==null?void 0:V.height)||at.geometry.height||0,Ct=(V==null?void 0:V.corner_radius)??at.corner_radius??0;if(((kt=at.geometry)==null?void 0:kt.type)==="Text"){const Y=V!=null&&V.geometry?this.deepMerge(at.geometry,V.geometry):at.geometry,rt=V!=null&&V.style?this.deepMerge(at.style,V.style):at.style;this._renderText(this.lumaCtx,at,{...Y,width:zt,height:Rt,corner_radius:Ct},rt,V,zt,Rt,!0,!1,wt,Mt)}else if(((At=at.geometry)==null?void 0:At.type)==="Image"){const Y=at.geometry.src;if(Y){let rt=this.imageCache.get(Y);rt||(rt=new Image,rt.src=Y,this.imageCache.set(Y,rt)),rt.complete&&rt.naturalWidth>0?this.lumaCtx.drawImage(rt,-zt/2,-Rt/2,zt,Rt):(this.applyPath(this.lumaCtx,at.geometry,zt,Rt,Ct),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill())}}else if((($=at.geometry)==null?void 0:$.type)==="SVG"){const Y=at.geometry.svgContent;if(Y){const rt=`__lumamask_${at.id}`;let tt=this.imageCache.get(rt);if(!tt){tt=new Image;const qt=new Blob([Y],{type:"image/svg+xml"});tt.src=URL.createObjectURL(qt),tt.onload=()=>{this.artboard&&this.reset()},this.imageCache.set(rt,tt)}tt.complete&&tt.naturalWidth>0?this.lumaCtx.drawImage(tt,-zt/2,-Rt/2,zt,Rt):(this.applyPath(this.lumaCtx,at.geometry,zt,Rt,Ct),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill())}}else this.applyPath(this.lumaCtx,at.geometry,zt,Rt,Ct),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill();this.lumaCtx.restore();const ht=this.maskCtx.getImageData(0,0,this.canvasWidth,this.canvasHeight),j=this.lumaCtx.getImageData(0,0,this.canvasWidth,this.canvasHeight).data,bt=ht.data;for(let Y=0;Y<bt.length;Y+=4){const rt=j[Y],tt=j[Y+1],qt=j[Y+2];let jt=(.299*rt+.587*tt+.114*qt)/255;vt&&(jt=1-jt),bt[Y+3]*=jt}this.maskCtx.putImageData(ht,0,0)}else{this.maskCtx.save(),this.rootTransform&&this.maskCtx.setTransform(this.rootTransform),this.maskCtx.globalCompositeOperation=vt?"destination-out":"destination-in",dt>0&&(this.maskCtx.filter=`blur(${dt}px)`),this.maskCtx.globalAlpha=Pt,this.applyAbsoluteTransform(this.maskCtx,at.id,o);const zt=(V==null?void 0:V.width)||at.geometry.width||0,Rt=(V==null?void 0:V.height)||at.geometry.height||0,Ct=(V==null?void 0:V.corner_radius)??at.corner_radius??0;if(((Xt=at.geometry)==null?void 0:Xt.type)==="Text"){const ht=V!=null&&V.geometry?this.deepMerge(at.geometry,V.geometry):at.geometry,j=V!=null&&V.style?this.deepMerge(at.style,V.style):at.style;this._renderText(this.maskCtx,at,{...ht,width:zt,height:Rt,corner_radius:Ct},j,V,zt,Rt,!0,!1,wt,Mt)}else if(((ne=at.geometry)==null?void 0:ne.type)==="Image"){const ht=at.geometry.src;if(ht){let j=this.imageCache.get(ht);j||(j=new Image,j.src=ht,this.imageCache.set(ht,j)),j.complete&&j.naturalWidth>0?this.maskCtx.drawImage(j,-zt/2,-Rt/2,zt,Rt):(this.applyPath(this.maskCtx,at.geometry,zt,Rt,Ct),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill())}}else if(((ie=at.geometry)==null?void 0:ie.type)==="SVG"){const ht=at.geometry.svgContent;if(ht){const j=`__alphamask_${at.id}`;let bt=this.imageCache.get(j);if(!bt){bt=new Image;const Y=new Blob([ht],{type:"image/svg+xml"});bt.src=URL.createObjectURL(Y),bt.onload=()=>{this.artboard&&this.reset()},this.imageCache.set(j,bt)}bt.complete&&bt.naturalWidth>0?this.maskCtx.drawImage(bt,-zt/2,-Rt/2,zt,Rt):(this.applyPath(this.maskCtx,at.geometry,zt,Rt,Ct),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill())}}else this.applyPath(this.maskCtx,at.geometry,zt,Rt,Ct),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill();this.maskCtx.restore()}}),le.save(),le.setTransform(1,0,0,1,0,0);const it=s.maskBlendMode||s.blendMode;it&&it!=="Normal"&&(le.globalCompositeOperation=it.toLowerCase()),le.drawImage(this.maskBuffer,0,0),le.restore(),le.restore()}else t.restore()}}applyOuterGlowUnderlay(t,s,o,e,i,n,a,r){var I,k,T;const l=a||s.style||{},h=l.effect,f=l.effects||(h?[h]:[]),p=f.find(O=>O.isEnabled!==!1&&O.type==="Glow"&&(O.mode==="outer"||O.mode==="Outer Glow"||!O.mode));if(!p)return;const c=p.blur||10,d=1e4;let u=p.color||"white";(k=(I=this.artboard)==null?void 0:I.tokens)!=null&&k.colors&&this.artboard.tokens.colors[u]&&(u=this.artboard.tokens.colors[u]),t.save();const y=l.fill&&l.fill.type!=="None",m=f.some(O=>O.isEnabled!==!1&&O.type==="BackgroundBlur"),b=s.type==="Text",v=s.type==="Group";!b&&!v&&(y||m)&&(t.beginPath(),t.rect(-1e6,-1e6,2e6,2e6),s.type==="Frame"||s.type==="Component"?this.drawRoundRect(t,-e/2,-i/2,e,i,n):this._tracePath(t,o,e,i,n),t.clip("evenodd"));const S=t.getTransform();t.shadowColor=u,t.shadowBlur=c,t.shadowOffsetX=d*S.a,t.shadowOffsetY=d*S.b,t.translate(-d,0);let C="black";l.fill&&l.fill.type!=="None"&&(C=this.createCanvasFill(t,l.fill,e,i)||l.fill.color||"black");let w="black";l.stroke&&l.stroke.width>0&&(w=this.createCanvasFill(t,l.stroke.fill||{type:"Solid",color:l.stroke.color},e,i)||l.stroke.color||"black"),t.fillStyle=C,t.strokeStyle=w,t.lineWidth=((T=l.stroke)==null?void 0:T.width)||0;const M=Math.min(p.intensity||1,10);for(let O=0;O<M;O++)if(r)this.renderObject(t,s,r,!0,!0);else if(o.type==="Text")l.fill&&l.fill.type!=="None"&&t.fillText(s.text||"",0,0),l.stroke&&l.stroke.width>0&&t.strokeText(s.text||"",0,0);else if(o.points&&o.type==="Path")this.applyPath(t,o,e,i,n),l.fill&&l.fill.type!=="None"&&t.fill(),l.stroke&&l.stroke.width>0&&t.stroke();else{if(t.beginPath(),o.type==="circle"||o.type==="Ellipse"){const E=e/2,A=i/2;t.ellipse(0,0,E,A,0,0,Math.PI*2)}else n!==0?this.drawRoundRect(t,-e/2,-i/2,e,i,n):t.rect(-e/2,-i/2,e,i);const _=l.fill&&l.fill.type!=="None",P=l.stroke&&l.stroke.width>0;(_||!_&&!P)&&t.fill(),P&&t.stroke()}t.restore()}_renderText(t,s,o,e,i,n,a,r=!1,l=!1,h=1,f=1){var gt,mt,ut,wt,Mt,Et,Ut,re,he;let p=o.text||"";if(o.textInputId&&!r){const nt=this.inputs.get(o.textInputId);nt!==void 0&&(p=String(nt),i.geometry&&i.geometry.type==="Text"&&(i.geometry.text=p))}if(o.svgPath){const nt=o.svgPath;t.save();const yt=((gt=e==null?void 0:e.fill)==null?void 0:gt.color)||"#000000",Tt=((mt=e==null?void 0:e.fill)==null?void 0:mt.opacity)!==void 0?(ut=e==null?void 0:e.fill)==null?void 0:ut.opacity:1;t.fillStyle=yt,t.globalAlpha*=Tt;const _t=new Path2D(nt);t.fill(_t),t.restore();return}let c=p||"";o.enableSegments===!0&&o.segments&&Array.isArray(o.segments)&&(c=o.segments.map(nt=>nt&&nt.text?nt.text:"").join(""));const d=o.textCase||"none";d==="uppercase"?c=c.toUpperCase():d==="lowercase"?c=c.toLowerCase():d==="capitalize"&&(c=c.replace(/\b\w/g,nt=>nt.toUpperCase()));let u=((wt=o.fontWeight)==null?void 0:wt.toString())||"400",y=o.fontStyle||"normal";u.toLowerCase().includes("italic")&&(y="italic",u=u.replace(/italic/gi,"").trim()||"400");const m=this.mapFontWeight(u),b=Math.max(1,o.fontSize||32);let v=o.fontFamily||"Inter";const S=["Bold","SemiBold","Medium","Regular","Light","Thin","ExtraBold","Black","Italic"];S.forEach(nt=>{const yt=new RegExp(`[\\s-]${nt}$`,"i");yt.test(v)&&(v=v.replace(yt,"").trim())});const M=`${o.smallCaps===!0?"small-caps ":""}${y} ${m} ${b}px "${v}", sans-serif`;t.font=M;const I=o.textVerticalAlign||"top";t.textBaseline="top";const k=o.textAlign||"left";t.textAlign=k;let T=0;if(typeof o.letterSpacing=="number")T=o.letterSpacing;else if(typeof o.letterSpacing=="object"&&o.letterSpacing.value!==void 0){const nt=o.letterSpacing;T=nt.unit==="PERCENT"?nt.value/100*b:nt.value}t.letterSpacing!==void 0&&(t.letterSpacing=`${T}px`);const O=o.kerning||"auto",_=o.kerningValue||0;O==="manual"&&_!==0&&(t.letterSpacing=`${T+_}px`);const P=o.paragraphSpacing||0;let E=o.lineHeight??1.2;typeof E=="string"&&(E=parseFloat(E)),E>5&&b>0&&(E=E/b);const A=(E||1.2)*b,B=o.isPointText===!0||!o.width||o.width<=0,D=((Mt=o.padding)==null?void 0:Mt.left)||((Et=o.padding)==null?void 0:Et.right)||0,W=B?1e5:o.width&&o.width>0?Math.ceil(o.width)-D*2:1e5;o.autoHeight;const X=ts({text:c,fontFamily:v,fontSize:b,fontWeight:m,fontStyle:y,lineHeight:E,width:W,letterSpacing:T,paragraphSpacing:P,paragraphIndent:o.paragraphIndent||0,segments:o.segments,enableSegments:o.enableSegments,textCase:d,hyphenation:o.hyphenation,composer:o.composer,balanceRaggedLines:o.balanceRaggedLines}),H=X.lines||[],Q=X.maxFontSize||b,L=this.fontLeadingFactors[v]??.5,R=(A-b)*L;let et=X.height,U=n,lt=a;if(U===0||lt===0||U>=1e5){let nt=0,yt=0;const Tt=X.fullText||c;(H||[]).forEach(_t=>{const St=_t.text||"",Ft=t.measureText(St).width+(St.length>0?(St.length-1)*T:0);Ft>nt&&(nt=Ft),yt+=St.length,yt<Tt.length&&(Tt[yt]===`
|
|
23
|
-
`||Tt[yt]==="\r")&&(yt++,Tt[yt-1]==="\r"&&Tt[yt]===`
|
|
24
|
-
`&&yt++)}),(U===0||U>=1e5)&&(U=nt),lt===0&&(lt=et||0)}let x=-et/2;a>0&&a>et&&(I==="top"?x=-a/2:I==="middle"||I==="center"?x=-et/2:I==="bottom"&&(x=a/2-et)),x+=R;let F=null,z=0;if(o.pathId&&this.artboard){const nt=this.artboard.objects.find(yt=>yt.id===o.pathId);if(nt&&nt.type==="Shape"&&((Ut=nt.geometry)==null?void 0:Ut.type)==="Path"){const yt=this.objectStates.get(nt.id),Tt=yt!=null&&yt.geometry?this.deepMerge(nt.geometry,yt.geometry):nt.geometry,_t=(yt==null?void 0:yt.scale_x)!==void 0?(nt.width||0)*yt.scale_x:nt.width||0,St=(yt==null?void 0:yt.scale_y)!==void 0?(nt.height||0)*yt.scale_y:nt.height||0;F={geo:Tt,obj:nt,w:_t,h:St},z=this.getPerimeter(Tt,_t,St)}}const st=(nt,yt)=>{var _t,St;if(T===0&&(!o.enableSegments||!((_t=o.segments)!=null&&_t.length)))return t.measureText(nt).width;let Tt=0;for(let Ft=0;Ft<nt.length;Ft++){const Gt=yt+Ft;let Bt=0;if(o.enableSegments===!0&&((St=o.segments)==null?void 0:St.length)>0){let Wt=0,Jt=null;for(const Yt of o.segments){if(Gt<Wt+(Yt.text||"").length){Jt=Yt;break}Wt+=(Yt.text||"").length}if(Jt){t.save();let Yt=Jt.fontFamily||o.fontFamily||"Inter";const we=this.mapFontWeight((Jt.fontWeight||o.fontWeight||"400").toString()),Me=Jt.fontStyle||y,Zt=Jt.fontSize||b;t.font=`${Me} ${we} ${Zt}px "${Yt}", sans-serif`,Bt=t.measureText(nt[Ft]).width,t.restore()}else Bt=t.measureText(nt[Ft]).width}else Bt=t.measureText(nt[Ft]).width;Tt+=Bt+T}return Tt-(nt.length>0?T:0)},N=(nt,yt,Tt,_t,St)=>{var we,Me;const Gt=(St===0||c[St-1]===`
|
|
25
|
-
`||c[St-1]==="\r")&&o.paragraphIndent?o.paragraphIndent:0,Bt=(!r||l)&&(s.behaviors||[]).some(Zt=>Zt.enabled&&(Zt.type.toString().includes("Text")||["Typewriter","Scramble","Wave","Bounce","GlitchText","Reveal3D","RevealSlide","RevealBlur"].includes(Zt.type))),Wt=!o.pathId&&!Bt&&(o.enableSegments!==!0||!o.segments||o.segments.length===0),Jt=o.baselineShift||0,Yt=Tt+Jt;if(Wt)t.font=M,_t?t.strokeText(nt,yt+Gt,Yt):t.fillText(nt,yt+Gt,Yt);else{const Zt=st(nt,St);let le=yt+Gt;k==="center"?le-=Zt/2:k==="right"&&(le-=Zt);const Ee=St+nt.length>=c.length||c[St+nt.length]===`
|
|
26
|
-
`||c[St+nt.length]==="\r";let Ie=0,ke=0;const de=o.justifyMinWordSpacing,pe=o.justifyMaxWordSpacing;if(k==="justify"&&!Ee&&Zt>0&&!o.pathId){const G=B?Zt:W-D*2+0,at=Math.max(0,G-Zt);for(let V=0;V<nt.length;V++)nt[V]===" "&&ke++;if(ke>0){const V=t.measureText(" ").width;let dt=de||V*.5,vt=pe||V*2.5;Ie=Math.max(0,Math.min(at/ke,vt-dt))}}let ot=o.pathOffset||0;o.pathId&&z>0&&F&&(k==="center"?ot+=z/2-Zt/2:k==="right"&&(ot+=z-Zt));let ft=le;const it=r&&!l?[]:((we=s.behaviors)==null?void 0:we.filter(G=>[q.Typewriter,q.Scramble,q.Wave,q.Bounce,q.GlitchText,q.TextTrail,q.Reveal3D,q.RevealSlide,q.RevealBlur,q.TextLiquid,q.TextVortex,q.TextExplosion,q.TextRain,q.TextGravity,q.TextElastic,q.TextMatrix,q.TextNeon,q.TextGlitch3D,q.TextDissolve,q.TextOrganic,q.TextBreathe,q.TextFloral,q.TextSmoke,q.TextVariable,q.TextMagnet,q.TextSpin,q.TextZing,q.TextPerspective,q.TextMirror].includes(G.type)&&G.enabled))||[];for(let G=0;G<nt.length;G++){let at=nt[G];const V=St+G;let dt=0,vt=0,Pt=1,Ht=1,kt=0,At=1,$=at;it.forEach(Ct=>{const ht=Ct.settings||{},j=ht.strength||1,bt=Date.now();if(Ct.type===q.Typewriter)this.currentTime*(ht.speed||1)-V*(ht.stagger||.05)<0&&(At=0);else if(Ct.type===q.Scramble)Math.max(0,Math.min(1,this.currentTime/(ht.duration||1.5))-V*.02)<1&&Math.random()<.3&&($="$%#@!*&"[Math.floor(Math.random()*7)]);else if(Ct.type===q.Wave)vt+=Math.sin(this.currentTime*5*(ht.speed||1)+V*(ht.frequency||1))*(ht.amplitude||20)*j;else if(Ct.type===q.Bounce){const Y=Math.max(0,this.currentTime%2-V*(ht.stagger||.1));Y<1&&(vt-=Math.abs(Math.sin(Y*Math.PI))*(ht.height||50)*j)}else if(Ct.type===q.TextTrail){const Y=this.pointerHistory[Math.max(0,this.pointerHistory.length-1-V*(ht.delay||5))];Y&&(dt+=(Y.x-(i.x+ft))*j*.2,vt+=(Y.y-(i.y+Tt+vt))*j*.2)}else if(Ct.type===q.Reveal3D){const Y=Math.max(0,Math.min(1,this.currentTime*(ht.speed||1)-V*(ht.stagger||.1)));Pt*=Y,Ht*=Y,At=Y}else if(Ct.type===q.RevealSlide){const Y=Math.max(0,Math.min(1,this.currentTime*1.5-V*.05)),rt=(1-Y)*(ht.distance||40)*j,tt=ht.direction||"up";tt==="up"?vt-=rt:tt==="down"?vt+=rt:tt==="left"?dt-=rt:tt==="right"&&(dt+=rt),At=Y}else if(Ct.type===q.RevealBlur){const Y=Math.max(0,Math.min(1,this.currentTime*1.2-V*.1));At=Y,dt+=(1-Y)*5}else if(Ct.type===q.TextLiquid){const Y=Math.max(0,Math.sin(bt*.001*(ht.speed||1)+V*.5));vt+=Y*(ht.amplitude||10)*j,Ht*=1+Y*.2}else if(Ct.type===q.TextVortex){const Y=bt*.002*(ht.speed||1)+V*.2,rt=(1-(Math.sin(bt*.001)*.5+.5))*(ht.radius||50);dt+=Math.cos(Y)*rt*j,vt+=Math.sin(Y)*rt*j}else if(Ct.type===q.TextExplosion){const Y=ht.force||1,rt=this.currentTime%2;if(rt<1){const tt=(V/nt.length-.5)*Math.PI*2,qt=rt*100*Y;dt+=Math.cos(tt)*qt*j,vt+=Math.sin(tt)*qt*j,At=1-rt}}else if(Ct.type===q.TextRain){const Y=ht.speed||1,rt=ht.height||100,tt=(bt*.001*Y+V*.1)%1;vt-=(1-tt)*rt*j,At=tt>.1?1:tt*10}else if(Ct.type===q.TextGravity){const Y=ht.gravity||9.8,rt=this.currentTime%3/3,tt=.5*Y*Math.pow(rt*10,2);tt<100?vt+=tt*j:vt+=100*j}else if(Ct.type===q.TextMatrix){const Y=ht.speed||1;if(Math.random()<.1*Y){const tt="0123456789ABCDEF!@#$%^&*";$=tt[Math.floor(Math.random()*tt.length)]}At=.3+(Math.sin(bt*.01*Y+V)+1)/2*.7}else if(Ct.type===q.TextNeon){const Y=Math.random()>.95?.5:1;At=(.7+(Math.sin(bt*.005)+1)/2*.3)*Y}else if(Ct.type===q.TextDissolve)Math.sin(V*1.5+bt*.002*(ht.speed||1))>.5&&(At=0);else if(Ct.type===q.TextOrganic){const Y=ht.speed||1,rt=ht.amplitude||10;dt+=Math.sin(bt*.002*Y+V)*rt*j,vt+=Math.cos(bt*.0015*Y+V*.7)*rt*j}else if(Ct.type===q.TextBreathe){const rt=1+(Math.sin(bt*.003+V*.2)+1)/2*.2*j;Pt*=rt,Ht*=rt}else if(Ct.type===q.TextSpin){const Y=ht.speed||1;kt+=bt*.01*Y+V}else if(Ct.type===q.TextMagnet){const Y=this.pointerHistory[this.pointerHistory.length-1];if(Y){const rt=Y.x-(i.x+ft),tt=Y.y-(i.y+Tt);kt=Math.atan2(tt,rt)}}else if(Ct.type===q.TextPerspective){const Y=nt.length/2,rt=(V-Y)/Y,tt=1-Math.abs(rt)*.3*j;Pt*=tt,Ht*=tt,dt+=rt*20*j}else if(Ct.type===q.TextMirror)At*=.8;else if(Ct.type===q.TextFloral){const Y=ht.speed||1,rt=ht.stagger||.1,tt=(bt*.001*Y+V*rt)%2;tt<1&&(Pt*=tt,Ht*=tt,kt+=tt*Math.PI)}else if(Ct.type===q.TextSmoke){const Y=ht.speed||1,rt=ht.height||50,tt=(bt*5e-4*Y+V*.2)%1;vt-=tt*rt*j,dt+=Math.sin(bt*.002+V)*5*j,At=1-tt}else if(Ct.type===q.TextVariable){const Y=ht.speed||1,rt=ht.intensity||1.5,tt=(Math.sin(bt*.004*Y+V*.3)+1)/2;Pt*=1+tt*(rt-1)*j}else if(Ct.type===q.TextZing){const Y=ht.speed||2,rt=ht.distance||100,tt=(bt*.002*Y+V*.05)%1;dt+=(1-tt)*rt*j,At=tt}else if(Ct.type===q.TextElastic){const Y=ht.stiffness||.2,rt=ht.damping||.1,tt=Math.sin(bt*.01)*Math.exp(-bt*.001*rt);Ht*=1+tt*Y*j}else if(Ct.type===q.TextGlitch3D){const Y=ht.intensity||5;Math.random()<.2&&(dt+=(Math.random()-.5)*Y,vt+=(Math.random()-.5)*Y,At=.8)}else if(Ct.type===q.GlitchText){const Y=ht.intensity||5;Math.random()<.1&&(dt+=(Math.random()-.5)*Y,vt+=(Math.random()-.5)*Y,Math.random()<.05&&(At=.5))}});let Xt=null,ne=o.textDecoration||"none",ie=b;if(o.enableSegments===!0&&((Me=o.segments)==null?void 0:Me.length)>0){let Ct=0,ht=null;for(const j of o.segments){if(V<Ct+(j.text||"").length){ht=j;break}Ct+=(j.text||"").length}if(ht){let j=ht.fontFamily||o.fontFamily||"Inter";S.forEach(rt=>{const tt=new RegExp(`[\\s-]${rt}$`,"i");tt.test(j)&&(j=j.replace(tt,"").trim())});const bt=this.mapFontWeight((ht.fontWeight||o.fontWeight||"400").toString()),Y=ht.fontStyle||y;ie=ht.fontSize||b,t.font=`${Y} ${bt} ${ie}px "${j}", sans-serif`,ht.fill&&(Xt=ht.fill),ht.textDecoration&&(ne=ht.textDecoration),ie<Q&&(vt+=(Q-ie)*.85)}}else t.font=M;const zt=t.globalAlpha;t.globalAlpha*=At,t.save();const Rt=t.measureText($).width;if(F&&z>0){const Ct=ft-le+Rt/2,j=(ot+Ct)/z,bt=this.getPointOnPath(F.geo,F.w,F.h,Math.abs(j%1)),Y=bt.angle,rt=Tt+vt+(o.pathOffsetY||0),tt=o.pathSide==="right"?-1:1,qt=Math.cos(Y+Math.PI/2)*rt*tt,jt=Math.sin(Y+Math.PI/2)*rt*tt;t.translate(bt.x+qt+dt,bt.y+jt),t.rotate(Y+kt+(tt===-1?Math.PI:0))}else t.translate(ft+dt+Rt/2,Tt+vt),kt!==0&&t.rotate(kt);if(t.scale(Pt,Ht),Xt&&!r&&!l){const Ct=this.createCanvasFill(t,Xt,U,lt);t.fillStyle=Ct||Xt.color||"#000000"}else if(!r&&!l){const Ct=this.createCanvasFill(t,e.fill,U,lt);t.fillStyle=Ct||e.fill.color||"#000000"}if(At>0)if(r||l){const Ct=l?"#000000":this.createCanvasFill(t,e.fill,U,lt);t.fillStyle=Ct||e.fill.color||"#ffffff",t.fillText($,-Rt/2,0)}else _t?t.strokeText($,-Rt/2,0):t.fillText($,-Rt/2,0);ne!=="none"&&!r&&this.drawTextDecoration(t,ne,0,0,Rt,ie),t.restore(),t.globalAlpha=zt,k==="justify"&&Ie>0&&$===" "&&!Ee?ft+=Rt+T+Ie:ft+=Rt+T}}};if(r){let nt=0,yt=x;(H||[]).forEach(Tt=>{const _t=Tt.text||"",St=c.indexOf(_t,nt);St!==-1&&(nt=St);let Ft=-U/2;k==="center"?Ft=0:k==="right"&&(Ft=U/2),N(_t,Ft,yt,!1,nt),nt+=_t.length,yt+=A})}else if(l){let nt=0,yt=x;(H||[]).forEach(Tt=>{const _t=Tt.text||"";let St=-U/2;k==="center"?St=0:k==="right"&&(St=U/2),N(_t,St,yt,!1,nt),nt+=_t.length,nt<c.length&&(c[nt]===`
|
|
27
|
-
`||c[nt]==="\r")&&(nt++,c[nt-1]==="\r"&&c[nt]===`
|
|
28
|
-
`&&nt++),yt+=A})}else{if(e.fill){const yt=t.globalAlpha,Tt=this.createCanvasFill(t,e.fill,U,lt);t.fillStyle=Tt||e.fill.color||"#000000",t.globalAlpha=yt*this.normalizeOpacity(e.fill.opacity??100);const _t=X.fullText||(o.enableSegments?(o.segments||[]).map(Gt=>{let Bt=Gt.text||"";const Wt=Gt.textCase||o.textCase||"none";return Wt==="uppercase"?Bt.toUpperCase():Wt==="lowercase"?Bt.toLowerCase():Wt==="capitalize"?Bt.replace(/\b\w/g,Jt=>Jt.toUpperCase()):Bt}).join(""):c);let St=0,Ft=x;(H||[]).forEach(Gt=>{const Bt=Gt.text||"";let Wt=-U/2;k==="center"?Wt=0:k==="right"&&(Wt=U/2),N(Bt,Wt,Ft,!1,St),St+=Bt.length,Ft+=A,St<_t.length&&(_t[St]===`
|
|
29
|
-
`||_t[St]==="\r")&&(P>0&&(Ft+=P),St++,_t[St-1]==="\r"&&_t[St]===`
|
|
30
|
-
`&&St++)}),t.globalAlpha=yt}const nt=o.paragraphRule;if(nt&&(((re=nt.top)==null?void 0:re.width)>0||((he=nt.bottom)==null?void 0:he.width)>0)){let yt=0;(H||[]).forEach((Tt,_t)=>{var Gt,Bt;const Ft=yt===0||yt<c.length&&(c[yt]===`
|
|
31
|
-
`||c[yt]==="\r");if(Ft&&_t>0&&yt++,Ft){if(((Gt=nt.top)==null?void 0:Gt.width)>0){const Wt=x+_t*A-nt.top.offset;t.strokeStyle=nt.top.color||"#000000",t.lineWidth=nt.top.width,t.beginPath();const Jt=-n/2+A*.2;t.moveTo(Jt,Wt),t.lineTo(n/2-A*.2,Wt),t.stroke()}if(((Bt=nt.bottom)==null?void 0:Bt.width)>0){const Wt=x+(_t+1)*A-nt.bottom.offset;t.strokeStyle=nt.bottom.color||"#000000",t.lineWidth=nt.bottom.width,t.beginPath();const Jt=-n/2+A*.2;t.moveTo(Jt,Wt),t.lineTo(n/2-A*.2,Wt),t.stroke()}}yt+=(Tt.text||"").length})}if(e.stroke&&e.stroke.width>0){const yt=t.globalAlpha;e.fill&&e.fill.type!=="None"&&e.fill.isEnabled!==!1&&e.fill.opacity!==0&&e.fill.color!=="transparent"&&e.fill.color!=="rgba(0,0,0,0)"&&(t.shadowColor="transparent",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0),t.strokeStyle=e.stroke.color;let _t=1;if(this.rootTransform){const Gt=t.getTransform(),Bt=Math.sqrt(Gt.a*Gt.a+Gt.b*Gt.b)||1,Wt=this.rootTransform,Jt=Math.sqrt(Wt.a*Wt.a+Wt.b*Wt.b)||1;_t=Bt/Jt}else _t=(Math.abs(h)+Math.abs(f))/2||1;t.lineWidth=(e.stroke.width||1)/(_t||1),t.globalAlpha=yt*this.normalizeOpacity(e.stroke.opacity??100);let St=0,Ft=x;(H||[]).forEach(Gt=>{let Bt=-U/2;k==="center"?Bt=0:k==="right"&&(Bt=U/2),N(Gt.text,Bt,Ft,!0,St),St+=(Gt.text||"").length,Ft+=A,St<c.length&&(c[St]===`
|
|
32
|
-
`||c[St]==="\r")&&(P>0&&(Ft+=P),St++,c[St-1]==="\r"&&c[St]===`
|
|
33
|
-
`&&St++)}),t.globalAlpha=yt}}}applyStrokeAlignment(t,s,o,e,i,n,a=1,r=1){if(!s.stroke||s.stroke.width<=0||s.stroke.isEnabled===!1)return;const l=s.stroke;let h=1;if(this.rootTransform){const S=t.getTransform(),C=Math.sqrt(S.a*S.a+S.b*S.b)||1,w=this.rootTransform,M=Math.sqrt(w.a*w.a+w.b*w.b)||1;h=C/M}else h=(Math.abs(a)+Math.abs(r))/2||1;const f=(l.width||1)/(h||1),p=(l.alignment||"center").toLowerCase();if(t.save(),s.fill&&s.fill.type!=="None"&&s.fill.isEnabled!==!1&&s.fill.opacity!==0&&s.fill.color!=="transparent"&&s.fill.color!=="rgba(0,0,0,0)"&&(t.shadowColor="transparent",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0),l.fill){const S=this.createCanvasFill(t,l.fill,e,i);S?t.strokeStyle=S:t.strokeStyle=l.color||"#000000"}else t.strokeStyle=l.color||"#000000";const d=t.globalAlpha;t.globalAlpha=d*this.normalizeOpacity(l.opacity??100),t.lineWidth=f,t.lineCap=l.lineCap||"round",t.lineJoin=l.lineJoin||"round",l.miterLimit!==void 0&&(t.miterLimit=l.miterLimit);const u=l.trimStart??0,y=l.trimEnd??1,m=l.trimOffset??0,b=l.dashOffset??0,v=l.dashArray||[];if(u!==0||y!==1||m!==0){const S=this.getPerimeter(o,e,i);if(S>0){const C=Math.max(0,Math.min(1,u)),w=Math.max(0,Math.min(1,y));if(C<w){const M=S*(w-C),I=S-M,k=-(S*(C+m%1));t.setLineDash([M,I]),t.lineDashOffset=k-b*S}else if(C===w)t.setLineDash([0,S]);else{const M=S*(1-C+w),I=S-M,k=-(S*C);t.setLineDash([M,I]),t.lineDashOffset=k-b*S}}}else if(v.length>0||b!==0){v.length>0&&t.setLineDash(v);const S=this.getPerimeter(o,e,i);t.lineDashOffset=-(b*S)}if((o==null?void 0:o.type)==="Line"||e===0||i===0)this.applyPath(t,o,e,i,n),t.stroke();else if(p==="inside")t.lineWidth=f*2,t.save(),this.applyPath(t,o,e,i,n),t.clip(),t.stroke(),t.restore();else if(p==="outside"){t.save(),t.beginPath();const S=Math.max(e,i,2e4);t.rect(-S,-S,S*2,S*2),this.applyPath(t,o,e,i,n),t.clip("evenodd"),t.lineWidth=f*2,t.beginPath(),this.applyPath(t,o,e,i,n),t.stroke(),t.restore()}else t.lineWidth=f,this.applyPath(t,o,e,i,n),t.stroke();t.restore()}getPerimeter(t,s,o){switch(this.ensurePathPoints(t),t==null?void 0:t.type){case"Rectangle":return(s+o)*2;case"Ellipse":{const e=Math.abs(s)/2,i=Math.abs(o)/2,n=Math.abs(t.sweepAngle??360),a=t.ratio||0,r=Math.PI*(3*(e+i)-Math.sqrt((3*e+i)*(e+3*i)));if(n>=360&&a<=0)return r;let l=n/360*r;if(a>0){const h=Math.PI*(3*(e*a+i*a)-Math.sqrt((3*e*a+i*a)*(e*a+3*i*a)));l+=n/360*h,n<360&&(l+=2*Math.sqrt((e-e*a)**2+(i-i*a)**2))}else n<360&&(l+=2*Math.max(e,i));return isNaN(l)?0:l}case"Line":return t.length||Math.sqrt(s*s+o*o);case"Triangle":return s+Math.sqrt((s/2)**2+o**2)*2;case"Polygon":{const e=t.sides||3,i=t.radius||Math.min(s,o)/2;return 2*e*i*Math.sin(Math.PI/e)}case"Star":{const e=t.points||5,i=t.outer_radius||Math.min(s,o)/2,n=t.inner_radius||i/2,a=Math.PI/e;return Math.sqrt(i*i+n*n-2*i*n*Math.cos(a))*e*2}case"Path":{const e=t.points||[];if(e.length<2)return t.length||0;let i=0,n=e[0].x,a=e[0].y;for(let r=1;r<e.length;r++){const l=e[r];if(l.moveTo){n=l.x,a=l.y;continue}const h=n,f=a,p=e[r-1].out_x,c=e[r-1].out_y;if(p!==void 0||l.in_x!==void 0?i+=this.getBezierLength(h,f,p??h,c??f,l.in_x??l.x,l.in_y??l.y,l.x,l.y):i+=Math.sqrt((l.x-h)**2+(l.y-f)**2),n=l.x,a=l.y,l.closePath||r===e.length-1&&(t.is_closed||t.isClosed)){const d=n,u=a,y=[...e.slice(0,r+1)].reverse().find(M=>M.moveTo)||e[0],m=y.x,b=y.y,v=e[r].out_x,S=e[r].out_y,C=y.in_x,w=y.in_y;v!==void 0||C!==void 0?i+=this.getBezierLength(d,u,v??d,S??u,C??m,w??b,m,b):i+=Math.sqrt((m-d)**2+(b-u)**2)}}return i}default:return(s+o)*2}}getBezierLength(t,s,o,e,i,n,a,r,l=10){let h=0,f=t,p=s;for(let c=1;c<=l;c++){const d=c/l,u=1-d,y=d*d,m=u*u,b=m*u,v=y*d,S=b*t+3*m*d*o+3*u*y*i+v*a,C=b*s+3*m*d*e+3*u*y*n+v*r,w=S-f,M=C-p;h+=Math.sqrt(w*w+M*M),f=S,p=C}return h}getBezierTAtLength(t,s,o,e,i,n,a,r,l,h=20){if(t<=0)return 0;let f=0,p=s,c=o;for(let d=1;d<=h;d++){const u=d/h,y=1-u,m=u*u,b=y*y,v=b*y,S=m*u,C=v*s+3*b*u*e+3*y*m*n+S*r,w=v*o+3*b*u*i+3*y*m*a+S*l,M=C-p,I=w-c,k=Math.sqrt(M*M+I*I);if(f+k>=t){const T=t-f,O=k===0?0:T/k;return(d-1+O)/h}f+=k,p=C,c=w}return 1}getPointOnPath(t,s,o,e){if(this.ensurePathPoints(t),(t==null?void 0:t.type)==="Path"){const i=t.points||[];if(i.length<2)return{x:0,y:0,angle:0};let n=1/0,a=-1/0,r=1/0,l=-1/0;i.forEach(b=>{typeof b.x=="number"&&typeof b.y=="number"&&(n=Math.min(n,b.x),a=Math.max(a,b.x),r=Math.min(r,b.y),l=Math.max(l,b.y),b.out_x!==void 0&&(n=Math.min(n,b.out_x),a=Math.max(a,b.out_x)),b.out_y!==void 0&&(r=Math.min(r,b.out_y),l=Math.max(l,b.out_y)),b.in_x!==void 0&&(n=Math.min(n,b.in_x),a=Math.max(a,b.in_x)),b.in_y!==void 0&&(r=Math.min(r,b.in_y),l=Math.max(l,b.in_y)))});const h=(n+a)/2,f=(r+l)/2,c=this.getPerimeter(t,s,o)*e;let d=0;const u=[];let y=i[0],m=i[0];for(let b=1;b<i.length;b++){const v=i[b];if(v.moveTo){y=v,m=v;continue}u.push({p0:y,p1:v}),(v.closePath||b===i.length-1&&(t.is_closed||t.isClosed))&&u.push({p0:v,p1:m}),y=v}for(const b of u){const v=b.p0,S=b.p1;let C=0;const w=v.out_x!==void 0||S.in_x!==void 0;if(w?C=this.getBezierLength(v.x,v.y,v.out_x??v.x,v.out_y??v.y,S.in_x??S.x,S.in_y??S.y,S.x,S.y):C=Math.sqrt((S.x-v.x)**2+(S.y-v.y)**2),d+C>=c||b===u[u.length-1]){let M=0;if(w)return M=this.getBezierTAtLength(c-d,v.x,v.y,v.out_x??v.x,v.out_y??v.y,S.in_x??S.x,S.in_y??S.y,S.x,S.y,20),this.getBezierPointAndAngle(M,v,S,h,f);{M=C===0?0:(c-d)/C;const I=v.x+(S.x-v.x)*M-h,k=v.y+(S.y-v.y)*M-f,T=Math.atan2(S.y-v.y,S.x-v.x);return{x:I,y:k,angle:T}}}d+=C}}else if(t.type==="Ellipse"){const i=Math.abs(s)/2,n=Math.abs(o)/2,a=t.sweepAngle??360,l=((t.startAngle??0)+a*e)*Math.PI/180,h=i*Math.cos(l),f=n*Math.sin(l),p=-i*Math.sin(l),c=n*Math.cos(l),d=Math.atan2(c,p);return{x:h,y:f,angle:d}}else if((t==null?void 0:t.type)==="Rectangle"){const i=Math.abs(s),n=Math.abs(o),r=(i+n)*2*e;let l=0,h=0,f=0;return r<i?(l=-i/2+r,h=-n/2,f=0):r<i+n?(l=i/2,h=-n/2+(r-i),f=Math.PI/2):r<2*i+n?(l=i/2-(r-(i+n)),h=n/2,f=Math.PI):(l=-i/2,h=n/2-(r-(2*i+n)),f=-Math.PI/2),{x:l,y:h,angle:f}}return{x:0,y:0,angle:0}}getBezierPointAndAngle(t,s,o,e,i){const n=s.x,a=s.y,r=s.out_x??s.x,l=s.out_y??s.y,h=o.in_x??o.x,f=o.in_y??o.y,p=o.x,c=o.y,d=1-t,u=t*t,y=d*d,m=y*d,b=u*t,v=m*n+3*y*t*r+3*d*u*h+b*p-e,S=m*a+3*y*t*l+3*d*u*f+b*c-i,C=3*y*(r-n)+6*d*t*(h-r)+3*u*(p-h),w=3*y*(l-a)+6*d*t*(f-l)+3*u*(c-f),M=Math.atan2(w,C);return{x:v,y:S,angle:M}}applyAbsoluteTransform(t,s,o){if(!o.get(s))return;const i=[];let n=s;for(;n;){i.unshift(n);const a=o.get(n);n=a==null?void 0:a.parentId}i.forEach(a=>{this.applyObjectTransform(t,a)})}applyObjectTransform(t,s){var d,u,y;const o=this.objectStates.get(s);if(!o)return;t.translate(o.x,o.y),t.rotate((o.rotation??0)*Math.PI/180);const e=o.skew_x||0,i=o.skew_y||0;if(e!==0||i!==0){const m=Math.tan(e*Math.PI/180),b=Math.tan(i*Math.PI/180);t.transform(1+m*b,b,m,1,0,0)}const n=o.rotate_x!==void 0?o.rotate_x:((d=o.transform)==null?void 0:d.rotate_x)??0,a=o.rotate_y!==void 0?o.rotate_y:((u=o.transform)==null?void 0:u.rotate_y)??0,l=1+(o.translate_z!==void 0?o.translate_z:((y=o.transform)==null?void 0:y.translate_z)??0)/1e3,h=(o.flip_x===!0?-1:1)*Math.cos(a*Math.PI/180)*l,f=(o.flip_y===!0?-1:1)*Math.cos(n*Math.PI/180)*l,p=(o.scale_x??1)*h,c=(o.scale_y??1)*f;t.scale(p,c)}applyInnerGlowOverlay(t,s,o,e,i,n,a){var m,b;const r=a||s.style||{},l=r==null?void 0:r.effect,f=((r==null?void 0:r.effects)||(l?[l]:[])).find(v=>v.isEnabled!==!1&&v.type==="Glow"&&(v.mode==="inner"||v.mode==="Inner Glow"));if(!f)return;t.save(),t.beginPath(),this.applyPath(t,o,e,i,n),t.clip();const p=f.blur||10,c=1e4,d=t.getTransform();let u=f.color||"white";(b=(m=this.artboard)==null?void 0:m.tokens)!=null&&b.colors&&this.artboard.tokens.colors[u]&&(u=this.artboard.tokens.colors[u]),t.shadowColor=u,t.shadowBlur=p,t.shadowOffsetX=c*d.a,t.shadowOffsetY=c*d.b,t.translate(-c,0),t.lineWidth=p+5,t.strokeStyle=u;const y=Math.min(f.intensity||1,5);for(let v=0;v<y;v++)t.beginPath(),this.applyPath(t,o,e,i,n),t.stroke();t.restore()}applyArtEffectOverlay(t,s,o,e,i,n){var c,d,u,y,m;const a=this.objectStates.get(s.id),r=((c=a==null?void 0:a.style)==null?void 0:c.artEffect)||s.artEffect||((d=s.style)==null?void 0:d.artEffect);if(!r||!r.enabled)return;const l=r.type,h=r.intensity??.5,f=r.speed??1,p=r.scale??10;if(l==="acid_gradient"||l==="acid_rave"||l==="shimmer"||l==="glint_overlay"||l==="halftone"||l==="noise"||l==="scanlines"||l==="chromatic_aberration"||l==="pixelate"||l==="glitch"||l==="fold_overlay"||l==="crumple_overlay"){if(t.save(),this.applyPath(t,o,e,i,n),t.clip(),l==="shimmer"){const v=this.currentTime*f%2/2,S=t.createLinearGradient(-e,-i,e,i);S.addColorStop(Math.max(0,v-.2),"rgba(255,255,255,0)"),S.addColorStop(v,`rgba(255,255,255,${h*.8})`),S.addColorStop(Math.min(1,v+.2),"rgba(255,255,255,0)"),t.fillStyle=S,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over"}else if(l==="glint_overlay"){let S=((this._lastPointerPos||{x:0}).x-(((u=s.transform)==null?void 0:u.x)??0)+300)/600;S=Math.max(-.2,Math.min(1.2,S));const C=t.createLinearGradient(-e,-i,e,i);C.addColorStop(Math.max(0,S-.15),"rgba(255,255,255,0)"),C.addColorStop(Math.max(0,Math.min(1,S)),`rgba(255,255,255,${h})`),C.addColorStop(Math.min(1,S+.15),"rgba(255,255,255,0)"),t.fillStyle=C,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over"}else if(l==="fold_overlay"){const b=this._lastPointerPos||{x:0,y:0},v=b.x-(((y=s.transform)==null?void 0:y.x)??0),S=b.y-(((m=s.transform)==null?void 0:m.y)??0),C=t.createLinearGradient(v>0?-e/2:e/2,S>0?-i/2:i/2,v>0?e/2:-e/2,S>0?i/2:-i/2);C.addColorStop(0,`rgba(0,0,0,${h*.6})`),C.addColorStop(.4,"rgba(0,0,0,0)"),C.addColorStop(.5,`rgba(255,255,255,${h*.4})`),C.addColorStop(1,`rgba(0,0,0,${h*.2})`),t.fillStyle=C,t.globalCompositeOperation="overlay",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over",t.beginPath(),v>0&&S>0?(t.moveTo(e/2-40,i/2),t.lineTo(e/2,i/2-40),t.lineTo(e/2-40,i/2-40)):v<0&&S>0?(t.moveTo(-e/2+40,i/2),t.lineTo(-e/2,i/2-40),t.lineTo(-e/2+40,i/2-40)):v>0&&S<0?(t.moveTo(e/2-40,-i/2),t.lineTo(e/2,-i/2+40),t.lineTo(e/2-40,-i/2+40)):(t.moveTo(-e/2+40,-i/2),t.lineTo(-e/2,-i/2+40),t.lineTo(-e/2+40,-i/2+40)),t.closePath(),t.fillStyle="#ffffff",t.shadowColor="rgba(0,0,0,0.5)",t.shadowBlur=10,t.shadowOffsetX=v>0?-2:2,t.shadowOffsetY=S>0?-2:2,t.fill()}else if(l==="crumple_overlay"){const b=Math.floor(e/p),v=document.createElement("canvas");v.width=b,v.height=Math.floor(i/p);const S=v.getContext("2d"),C=S.createImageData(v.width,v.height);for(let w=0;w<C.data.length;w+=4){const M=Math.random()>.95?150:255;C.data[w]=M,C.data[w+1]=M,C.data[w+2]=M,C.data[w+3]=255*h}S.putImageData(C,0,0),t.globalCompositeOperation="multiply",t.imageSmoothingEnabled=!1,t.drawImage(v,-e/2,-i/2,e,i)}else if(l==="acid_gradient"||l==="acid_rave"){const b=this.currentTime*f,v=r.color1,S=r.color2,C=t.createLinearGradient(-e/2,-i/2,e/2,i/2);if(v&&S){const w=b*60%360;C.addColorStop(0,this._shiftHue(v,w,h*.7)),C.addColorStop(1,this._shiftHue(S,(w+180)%360,h*.7))}else{const w=b*100%360,M=(w+180)%360;C.addColorStop(0,`hsla(${w}, 80%, 50%, ${h*.5})`),C.addColorStop(1,`hsla(${M}, 80%, 50%, ${h*.5})`)}t.fillStyle=C,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i)}else if(l==="halftone"){const b=Math.max(2,p*(1-h*.8)),v=document.createElement("canvas");v.width=b,v.height=b;const S=v.getContext("2d");if(S){S.fillStyle="black",S.beginPath(),S.arc(b/2,b/2,b/2*h,0,Math.PI*2),S.fill();const C=t.createPattern(v,"repeat");C&&(t.globalAlpha=.3*h,t.fillStyle=C,t.fillRect(-e/2,-i/2,e,i))}}else if(l==="noise"){const b=Math.floor(e*i*h*.02);t.globalAlpha=.4*h;for(let v=0;v<b;v++){const S=Math.random()>.5?255:0;t.fillStyle=`rgba(${S}, ${S}, ${S}, ${.5+Math.random()*.5})`,t.fillRect(-e/2+Math.random()*e,-i/2+Math.random()*i,2,2)}}else if(l==="scanlines"){t.globalAlpha=.2*h,t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=1;for(let b=-i/2;b<i/2;b+=4)t.beginPath(),t.moveTo(-e/2,b),t.lineTo(e/2,b),t.stroke()}else if(l==="chromatic_aberration"){const b=5*h;t.globalCompositeOperation="screen",t.globalAlpha=.5,t.fillStyle="cyan",t.fillRect(-e/2-b,-i/2,e,i),t.fillStyle="magenta",t.fillRect(-e/2+b,-i/2,e,i)}else if(l==="pixelate"){const b=Math.max(2,Math.round(p*(1-h*.5))),v=document.createElement("canvas"),S=Math.max(1,Math.ceil(e/b)),C=Math.max(1,Math.ceil(i/b));v.width=S,v.height=C;const w=v.getContext("2d");if(w){w.imageSmoothingEnabled=!1;const M=t.getTransform(),I=M.e-e/2,k=M.f-i/2;w.drawImage(t.canvas,I,k,e,i,0,0,S,C),t.imageSmoothingEnabled=!1,t.drawImage(v,0,0,S,C,-e/2,-i/2,e,i),t.imageSmoothingEnabled=!0}}else if(l==="glitch"){const b=this.currentTime*f,v=r.chaosAmount??.2,S=Math.max(3,Math.floor(8*h)),C=h*e*.15;t.globalCompositeOperation="screen",t.globalAlpha=h*.4;const w=C*.3;t.fillStyle="rgba(255, 0, 0, 0.4)",t.fillRect(-e/2+w,-i/2,e,i),t.fillStyle="rgba(0, 255, 255, 0.4)",t.fillRect(-e/2-w,-i/2,e,i),t.globalCompositeOperation="source-over",t.globalAlpha=1;const M=i/S;for(let I=0;I<S;I++){const k=Math.sin(I*127.1+b*311.7*f)*43758.5,T=k-Math.floor(k);if(T>1-v){const O=(T-(1-v))/v*C*(Math.random()>.5?1:-1),_=-i/2+I*M,P=t.getTransform(),E=P.e-e/2+O,A=P.f+_;t.save(),t.beginPath(),t.rect(-e/2,_,e,M),t.clip(),t.globalAlpha=.8,t.drawImage(t.canvas,E,A,e,M,-e/2+O,_,e,M),t.restore()}}}t.restore()}}_shiftHue(t,s,o){let e=0,i=0,n=0;if(t.startsWith("#")){const c=t.replace("#","");e=parseInt(c.substring(0,2),16)/255,i=parseInt(c.substring(2,4),16)/255,n=parseInt(c.substring(4,6),16)/255}const a=Math.max(e,i,n),r=Math.min(e,i,n);let l=0,h=0,f=(a+r)/2;if(a!==r){const c=a-r;switch(h=f>.5?c/(2-a-r):c/(a+r),a){case e:l=((i-n)/c+(i<n?6:0))/6;break;case i:l=((n-e)/c+2)/6;break;case n:l=((e-i)/c+4)/6;break}}return`hsla(${(((l*360+s)%360+360)%360).toFixed(0)}, ${(h*100).toFixed(0)}%, ${(f*100).toFixed(0)}%, ${o})`}applyBackgroundBlurGlass(t,s,o,e,i,n,a){const r=n.radius??10,l=n.opacity!==void 0?this.normalizeOpacity(n.opacity):.5,h=n.noise??0,f=n.color??"rgba(255,255,255,0.2)";t.save(),this.applyPath(t,s,o,e,i),t.clip();const p=t.getTransform(),c=t.canvas;try{const y=document.createElement("canvas");y.width=Math.max(1,Math.ceil(o)),y.height=Math.max(1,Math.ceil(e));const m=y.getContext("2d");if(m){m.save(),m.translate(o/2,e/2);const b=n.magnification||1;if(b!==1&&m.scale(b,b),typeof p.inverse=="function"){const C=p.inverse();m.transform(C.a,C.b,C.c,C.d,C.e,C.f)}else{const C=p.a*p.d-p.b*p.c;C!==0&&m.transform(p.d/C,-p.b/C,-p.c/C,p.a/C,(p.c*p.f-p.d*p.e)/C,(p.b*p.e-p.a*p.f)/C)}m.drawImage(c,0,0),m.restore();const v=document.createElement("canvas");v.width=y.width,v.height=y.height;const S=v.getContext("2d");S.filter=`blur(${r}px)`,S.drawImage(y,0,0),t.globalCompositeOperation="destination-out",t.fillRect(-o/2,-e/2,o,e),t.globalCompositeOperation="source-over",t.globalAlpha=1,t.drawImage(v,-o/2,-e/2,o,e)}}catch(y){console.error("Background blur failed:",y)}t.globalCompositeOperation="source-over",t.globalAlpha=l,t.fillStyle=f,t.fillRect(-o/2,-e/2,o,e),t.globalAlpha=1;const d=t.createLinearGradient(-o/2,-e/2,o/2,e/2);if(d.addColorStop(0,"rgba(255,255,255,0.12)"),d.addColorStop(.3,"rgba(255,255,255,0.04)"),d.addColorStop(.5,"rgba(255,255,255,0.0)"),d.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=d,t.fillRect(-o/2,-e/2,o,e),h>0){if(t.globalAlpha=h/100,!this._noiseTileCanvas){const m=document.createElement("canvas");m.width=64,m.height=64;const b=m.getContext("2d"),v=b.createImageData(64,64),S=v.data;for(let C=0;C<S.length;C+=4){const w=Math.floor(Math.random()*255);S[C]=w,S[C+1]=w,S[C+2]=w,S[C+3]=18}b.putImageData(v,0,0),this._noiseTileCanvas=m}const y=t.createPattern(this._noiseTileCanvas,"repeat");y&&(t.fillStyle=y,t.fillRect(-o/2,-e/2,o,e))}t.restore(),t.save(),t.globalAlpha=1,(a==null?void 0:a.stroke)&&a.stroke.width>0&&a.stroke.isEnabled!==!1?(this.applyPath(t,s,o,e,i),this.applyStrokeAlignment(t,a,s,o,e,i,1,1)):(t.strokeStyle="rgba(255, 255, 255, 0.25)",t.lineWidth=1.5,this.applyPath(t,s,o,e,i),t.stroke()),t.restore()}applyPath(t,s,o,e,i){s!=null&&s.data&&(s.type==="Path"||s.type==="Subtract"||s.type==="Union"||s.type==="Intersect"||s.type==="Exclude"||s.type),t.beginPath(),this._tracePath(t,s,o,e,i)}_tracePath(t,s,o,e,i){if(s){if(this.ensurePathPoints(s),(s==null?void 0:s.type)==="Rectangle"||s.type==="Image"){const n=i!==void 0?i:s.corner_radius??0;this.drawRoundRect(t,-o/2,-e/2,o,e,n)}else if(s.type==="Line")t.moveTo(-o/2,0),t.lineTo(o/2,0);else if(s.type==="Ellipse"||s.type==="circle"){const{startAngle:n=0,sweepAngle:a=360,ratio:r=0}=s,l=o/2,h=e/2,f=n*Math.PI/180,p=a*Math.PI/180,c=f+p;a>=360&&r<=0?t.ellipse(0,0,l,h,0,0,Math.PI*2):(t.ellipse(0,0,l,h,0,f,c,!1),r>0?t.ellipse(0,0,l*r,h*r,0,c,f,!0):t.lineTo(0,0),t.closePath())}else if(s.type==="Triangle")t.moveTo(0,-e/2),t.lineTo(o/2,e/2),t.lineTo(-o/2,e/2),t.closePath();else if(s.type==="Polygon"){const n=s.sides||3,a=s.radius||Math.min(o,e)/2;for(let r=0;r<n;r++){const l=r*2*Math.PI/n-Math.PI/2,h=a*Math.cos(l),f=a*Math.sin(l);r===0?t.moveTo(h,f):t.lineTo(h,f)}t.closePath()}else if(s.type==="Star"){const n=s.points||5,a=s.outer_radius||Math.min(o,e)/2;let r=s.inner_radius;r==null?r=a*.382:r<=1&&(r=a*r);for(let l=0;l<n*2;l++){const h=l*Math.PI/n-Math.PI/2,f=l%2===0?a:r,p=f*Math.cos(h),c=f*Math.sin(h);l===0?t.moveTo(p,c):t.lineTo(p,c)}t.closePath()}else if(((s==null?void 0:s.type)==="Path"||s.type==="Subtract"||s.type==="Union"||s.type==="Intersect"||s.type==="Exclude"||s.type==="BooleanOperation")&&s.points){this.frameCount%300===0&&this.log("[Engine] Tracing Path:",s.points.length,"points");let n=1/0,a=-1/0,r=1/0,l=-1/0;if(s.points.forEach(p=>{typeof p.x=="number"&&typeof p.y=="number"&&(n=Math.min(n,p.x),a=Math.max(a,p.x),r=Math.min(r,p.y),l=Math.max(l,p.y),p.out_x!==void 0&&(n=Math.min(n,p.out_x),a=Math.max(a,p.out_x)),p.out_y!==void 0&&(r=Math.min(r,p.out_y),l=Math.max(l,p.out_y)),p.in_x!==void 0&&(n=Math.min(n,p.in_x),a=Math.max(a,p.in_x)),p.in_y!==void 0&&(r=Math.min(r,p.in_y),l=Math.max(l,p.in_y)))}),n===1/0)return;const h=(n+a)/2,f=(r+l)/2;if(isNaN(h)||isNaN(f)){this.warn("[Engine] Invalid path center:",h,f);return}s.points.forEach((p,c)=>{if(c===0||p.moveTo)t.moveTo(p.x-h,p.y-f);else{const d=s.points[c-1];if(!d)return;const u=(d.out_x??d.x)-h,y=(d.out_y??d.y)-f,m=(p.in_x??p.x)-h,b=(p.in_y??p.y)-f;isNaN(u)||isNaN(m)||isNaN(p.x)?t.lineTo(p.x-h,p.y-f):t.bezierCurveTo(u,y,m,b,p.x-h,p.y-f)}if(p.closePath||c===s.points.length-1&&(s.is_closed||s.isClosed)){const d=[...s.points.slice(0,c+1)].reverse().find(u=>u.moveTo)||s.points[0];d&&(p.out_x!==void 0||d.in_x!==void 0)&&t.bezierCurveTo((p.out_x??p.x)-h,(p.out_y??p.y)-f,(d.in_x??d.x)-h,(d.in_y??d.y)-f,d.x-h,d.y-f),t.closePath()}})}else if(s.points&&Array.isArray(s.points)){let n=1/0,a=-1/0,r=1/0,l=-1/0;s.points.forEach(p=>{n=Math.min(n,p.x),a=Math.max(a,p.x),r=Math.min(r,p.y),l=Math.max(l,p.y)});const h=(n+a)/2,f=(r+l)/2;s.points.forEach((p,c)=>{if(c===0)t.moveTo(p.x-h,p.y-f);else{const d=s.points[c-1];d.out_x!==void 0||p.in_x!==void 0?t.bezierCurveTo((d.out_x??d.x)-h,(d.out_y??d.y)-f,(p.in_x??p.x)-h,(p.in_y??p.y)-f,p.x-h,p.y-f):t.lineTo(p.x-h,p.y-f)}(p.closePath||c===s.points.length-1&&(s.is_closed||s.isClosed))&&t.closePath()})}}}renderInputBox(t,s){var x,F;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((x=s.geometry)==null?void 0:x.width)||250,n=((F=s.geometry)==null?void 0:F.height)||45,a=this.focusedId===s.id,r=this.lastHoveredObjectId===s.id,l=e.previewState||"default",h=l!=="default"?l:a?"focused":r?"hovered":"default",f=e.label||{visible:!0,text:"Label"},p=e.helperText||{visible:!1,text:"Helper text"},c=e.leftIcon||{visible:!1},d=e.rightIcon||{visible:!1},u=e.multiline===!0,y=e.corner_radius??8,m=e.corners||{tl:y,tr:y,bl:y,br:y},b=[m.tl,m.tr,m.br,m.bl];let v=e.backgroundColor||"rgba(31, 41, 55, 1)",S=e.borderColor||"rgba(55, 65, 81, 1)",C=e.borderWidth??1.5,w=e.color||"#ffffff",M=e.placeholderColor||"rgba(156, 163, 175, 1)",I=e.fontSize||14;const k=`${h}Style`,T=e[k];T?(T.backgroundColor!==void 0&&(v=T.backgroundColor),T.borderColor!==void 0&&(S=T.borderColor),T.borderWidth!==void 0&&(C=T.borderWidth),T.color!==void 0&&(w=T.color),T.placeholderColor!==void 0&&(M=T.placeholderColor),T.fontSize!==void 0&&(I=T.fontSize)):h==="focused"?(S=e.focusBorderColor||"rgba(59, 130, 246, 1)",C=Math.max(C,2)):h==="hovered"||h==="hover"?(S=e.hoverBorderColor||S,v=e.hoverBackgroundColor||v):h==="disabled"?(v=e.disabledBackgroundColor||"rgba(31, 41, 55, 0.6)",S=e.disabledBorderColor||"rgba(55, 65, 81, 0.4)"):h==="error"&&(S="rgba(239, 68, 68, 1)",C=Math.max(C,2)),t.beginPath(),this.drawRoundRect(t,-i/2,-n/2,i,n,b);const O=this.createCanvasFill(t,v,i,n);if(O&&(t.fillStyle=O,t.fill()),C>0){const z=this.createCanvasFill(t,S,i,n);if(z&&(t.strokeStyle=z,t.lineWidth=C,t.stroke()),h==="focused"||h==="focus"){t.save(),t.beginPath();const st=b.map(N=>N+2);this.drawRoundRect(t,-i/2-2,-n/2-2,i+4,n+4,st),t.strokeStyle="rgba(59, 130, 246, 0.3)",t.lineWidth=2,t.stroke(),t.restore()}}const _=(z,st)=>{if(!z.visible||!z.svgPath)return;const N=z.size||14,gt=z.offset??16,mt=z.color||"#ffffff",ut=st?-(i/2)+gt:i/2-gt,wt=z.svgPath;if(t.save(),t.translate(ut,0),!wt.startsWith("<svg")){const Mt=new Path2D(wt),Et=N/24;t.scale(Et,Et),t.translate(-12,-12),t.fillStyle=mt,t.fill(Mt)}t.restore()};_(c,!0),_(d,!1);const P=e.text||"",E=e.placeholder||"Enter text...",A=!P,B=P||E,D=A?M:w,W=I,X=e.fontFamily||"Inter",H=e.fontWeight||400;t.font=`${H} ${W}px "${X}", sans-serif`,t.fillStyle=D,t.textAlign="left",t.textBaseline=u?"top":"middle";const Q=e.inputPadding??16,L=c.visible?(c.offset??16)+(c.size||14)/2+8:Q,R=d.visible?(d.offset??16)+(d.size||14)/2+8:Q,et=-(i/2)+L,U=i-L-R,lt=e.inputType==="password"?"•".repeat(B.length):B;if(t.save(),t.beginPath(),t.rect(et-2,-n/2+4,U+4,n-8),t.clip(),u){const z=lt.split(`
|
|
34
|
-
`);let st=-n/2+Q;const N=W*1.2;let gt=0;z.forEach((mt,ut)=>{const wt=mt.split(" ");let Mt="";for(let Et=0;Et<wt.length;Et++){const Ut=Mt+wt[Et]+" ";t.measureText(Ut).width>U&&Et>0?(t.fillText(Mt,et,st),Mt=wt[Et]+" ",st+=N):Mt=Ut}t.fillText(Mt,et,st),gt=t.measureText(Mt).width,ut<z.length-1&&(st+=N,gt=0)}),a&&!A&&Math.floor(performance.now()/500)%2===0&&t.fillRect(et+gt,st,1.5,W)}else{const st=t.measureText(lt).width;let N=0;if(st>U&&(N=st-U),t.fillText(lt,et-N,0),a&&!A&&Math.floor(performance.now()/500)%2===0){const mt=et+st-N;t.fillRect(mt,-(W/2),1.5,W)}}if(t.restore(),f.visible!==!1){const z=f.text||"Label",st=f.fontSize||12,N=f.color||"rgba(156, 163, 175, 1)",gt=f.offset??8;t.font=`600 ${st}px "${X}", sans-serif`,t.fillStyle=N,t.textAlign="left",t.textBaseline="bottom";const mt=-(i/2),ut=-(n/2)-gt;t.fillText(z,mt,ut)}if(p.visible===!0){const z=p.text||"Helper text",st=p.fontSize||11,N=h==="error"?"rgba(239, 68, 68, 1)":p.color||"rgba(156, 163, 175, 1)",gt=p.offset??6;t.font=`400 ${st}px "${X}", sans-serif`,t.fillStyle=N,t.textAlign="left",t.textBaseline="top";const mt=-(i/2),ut=n/2+gt;t.fillText(z,mt,ut)}}renderSlider(t,s){const o=this.objectStates.get(s.id),e=(o==null?void 0:o.geometry)||s.geometry,i=(o==null?void 0:o.options)||s.options||{},n=e.width||200,a=i.value??50,r=i.min??0,h=(i.max??100)-r,f=h===0?0:(a-r)/h,p=i.trackHeight||4,c=i.trackRoundedness??2,d=i.trackShape??"Rectangle",u=i.trackPath||"",y=i.accentColor||"#3b82f6",m=i.inactiveColor||"#374151",b=i.thumbShape||"Ellipse",v=i.thumbWidth??16,S=i.thumbHeight??16,C=i.thumbRoundedness??0,w=i.thumbColor||"#ffffff",M=i.thumbPath||"",I=i.thumbIcon||"",k=i.showValueTooltip??!1,T=i.tooltipBgColor||"#333333",O=i.tooltipColor||"#ffffff",_=i.tooltipOffsetX??0,P=i.tooltipOffsetY??-25,E=(U,lt,x,F,z,st,N)=>{if((U==="Custom"||U==="Icon")&&N)try{const gt=new Path2D(N);if(t.save(),t.translate(lt,x),U==="Icon"){const mt=Math.min(F,z)/24;t.scale(mt,mt),t.translate(-12,-12)}t.fill(gt),t.restore();return}catch(gt){console.error("Error drawing slider shape in engine:",gt)}if(t.beginPath(),U==="Ellipse")t.ellipse(lt,x,F/2,z/2,0,0,Math.PI*2);else if(U==="Rectangle")this.drawRoundRect(t,lt-F/2,x-z/2,F,z,st);else if(U==="Triangle")t.moveTo(lt,x-z/2),t.lineTo(lt+F/2,x+z/2),t.lineTo(lt-F/2,x+z/2),t.closePath();else if(U==="Diamond")t.moveTo(lt,x-z/2),t.lineTo(lt+F/2,x),t.lineTo(lt,x+z/2),t.lineTo(lt-F/2,x),t.closePath();else if(U==="Polygon"){const gt=s.geometry.sides||3,mt=s.geometry.radius||Math.min(F,z)/2;for(let ut=0;ut<gt;ut++){const wt=ut*2*Math.PI/gt-Math.PI/2,Mt=lt+mt*Math.cos(wt),Et=x+mt*Math.sin(wt);ut===0?t.moveTo(Mt,Et):t.lineTo(Mt,Et)}t.closePath()}else if(U==="Star"){const mt=Math.min(F,z)/2,ut=mt/2;for(let wt=0;wt<10;wt++){const Mt=wt%2===0?mt:ut,Et=wt*Math.PI/5-Math.PI/2;t.lineTo(lt+Mt*Math.cos(Et),x+Mt*Math.sin(Et))}t.closePath()}else U==="Line"&&(t.moveTo(lt-F/2,x),t.lineTo(lt+F/2,x));t.fill()},A=this.createCanvasFill(t,m,n,p);A&&(t.fillStyle=A,t.strokeStyle=A),d==="Line"?(t.lineWidth=p,t.beginPath(),t.moveTo(-n/2,0),t.lineTo(n/2,0),t.stroke()):E(d,0,0,n,p,c,u);const B=n-v,D=-n/2+v/2+f*B,W=D- -n/2;if(W>0){const U=this.createCanvasFill(t,y,n,p);U&&(t.fillStyle=U,t.strokeStyle=U),d==="Line"?(t.lineWidth=p,t.beginPath(),t.moveTo(-n/2,0),t.lineTo(D,0),t.stroke()):d==="Rectangle"&&(t.beginPath(),this.drawRoundRect(t,-n/2,-p/2,W,p,c),t.fill())}t.save(),t.translate(D,0);const X=t.getTransform(),H=Math.sqrt(X.a*X.a+X.b*X.b)||1;t.shadowColor="rgba(0,0,0,0.2)",t.shadowBlur=4*H,t.shadowOffsetY=1*H;const Q=this.createCanvasFill(t,w,v,S);if(Q&&(t.fillStyle=Q),E(b,0,0,v,S,C,b==="Icon"?I:M),t.restore(),k){t.save(),t.translate(D+_,P);const U=Math.round(a).toString();t.font="10px Inter, sans-serif";const lt=t.measureText(U),x=6,F=4,z=lt.width+x*2,st=14+F;t.beginPath(),this.drawRoundRect(t,-z/2,-st/2,z,st,4),t.fillStyle=T,t.fill(),t.fillStyle=O,t.textAlign="center",t.textBaseline="middle",t.fillText(U,0,0),t.restore()}const L=i.label||{},R=i.helperText||{},et=i.fontFamily||"Inter";if(L.visible!==!1){const U=L.text||"Label",lt=L.fontSize||12,x=L.color||"rgba(156, 163, 175, 1)",F=L.offset??8;t.font=`600 ${lt}px "${et}", sans-serif`,t.fillStyle=x,t.textAlign="left",t.textBaseline="bottom";const z=-(n/2),st=-(p/2)-F;t.fillText(U,z,st)}if(R.visible===!0){const U=R.text||"Helper text",lt=R.fontSize||11,x=R.color||"rgba(156, 163, 175, 1)",F=R.offset??6;t.font=`400 ${lt}px "${et}", sans-serif`,t.fillStyle=x,t.textAlign="left",t.textBaseline="top";const z=-(n/2),st=p/2+F;t.fillText(U,z,st)}}renderDropdown(t,s){var P;const o=this.objectStates.get(s.id);if(!o)return;const e=o.options||s.options||{},i=s.geometry.width||160,n=s.geometry.height||40,a=-i/2,r=-n/2,l=e.corner_radius??6,h=e.disabled||e.previewState==="disabled",f=this.lastHoveredObjectId===s.id||e.previewState==="hover",p=(e.isOpen||e.previewState==="active")&&!h;let c=e.backgroundColor,d=e.borderColor,u=e.color||"#333333";h?(c=e.disabledBackgroundColor||"#f3f4f6",d=e.disabledBorderColor||"#e5e7eb",u=e.disabledColor||"#9ca3af"):p?(c=e.activeBackgroundColor||c,d=e.activeBorderColor||d,u=e.activeColor||u):f&&(c=e.hoverBackgroundColor||c,d=e.hoverBorderColor||d,u=e.hoverColor||u),c||(c="#ffffff"),d||(d="#e5e7eb");const y=t.globalAlpha;t.globalAlpha=y*(e.opacity??1),this.drawRoundRect(t,a,r,i,n,l),t.fillStyle=this.createCanvasFill(t,typeof c=="string"?{type:"Solid",color:c}:c,i,n)||"#ffffff",t.fill();const m=e.borderWidth??1;m>0&&(t.strokeStyle=this.createCanvasFill(t,typeof d=="string"?{type:"Solid",color:d}:d,i,n)||"#e5e7eb",t.lineWidth=m,t.stroke());const b=12,v=e.chevronType||"chevron",S=e.chevronSize||16,C=(p?e.openIconColor:e.closedIconColor)||e.chevronColor||"#6b7280";if(v!=="none"){const E=a+i-b-S/2;t.save(),t.translate(E,0);const A=p?e.openIconAngle??180:e.closedIconAngle??0;if(t.rotate(A*Math.PI/180),t.strokeStyle=C,t.fillStyle=C,t.lineWidth=1.5,t.lineCap="round",t.lineJoin="round",v==="chevron")t.beginPath(),t.moveTo(-S/2,-S*.2),t.lineTo(0,S*.2),t.lineTo(S/2,-S*.2),t.stroke();else if(v==="custom"||v==="path"){const B=p&&e.openIconPath||e.closedIconPath;if(B){const D=new Path2D(B);t.save();const W=S/24;t.scale(W,W),t.translate(-12,-12),t.fill(D),t.restore()}}t.restore()}const w=e.selectedOption||e.placeholder||"Select...",M=e.fontSize||14,I=e.fontWeight||400,k=e.fontFamily||"Inter, sans-serif";t.font=`${I} ${M}px ${k}`;const T=h?e.disabledColor||"#9ca3af":!e.selectedOption&&e.placeholder?"#9ca3af":u;t.fillStyle=this.createCanvasFill(t,typeof T=="string"?{type:"Solid",color:T}:T,i,n)||"#333333",t.textAlign="left",t.textBaseline="middle";const O=v==="none"?0:S+8,_=i-b*2-O;if(t.save(),t.beginPath(),t.rect(a+b,r,_,n),t.clip(),t.fillText(w,a+b,0),t.restore(),p&&!h){const E=r+n+4,A=e.optionsList||[],B=e.itemHeight||32,D=e.listPadding??4,W=A.length*B+D*2,X=e.listCornerRadius??l;t.save();const H=e.listShadow||{},Q=t.getTransform(),L=Math.sqrt(Q.a*Q.a+Q.b*Q.b)||1;t.shadowColor=typeof H.color=="string"?H.color:((P=H.color)==null?void 0:P.color)||"rgba(0,0,0,0.15)",t.shadowBlur=(H.blur??12)*L,t.shadowOffsetY=(H.offsetY??6)*L,t.shadowOffsetX=(H.offsetX??0)*L,t.beginPath(),this.drawRoundRect(t,a,E,i,W,X),t.fillStyle=this.createCanvasFill(t,typeof e.listBackgroundColor=="string"?{type:"Solid",color:e.listBackgroundColor}:e.listBackgroundColor||{type:"Solid",color:"#ffffff"},i,W)||"#ffffff",t.fill();const R=e.listBorderWidth??1;R>0&&(t.shadowColor="transparent",t.strokeStyle=this.createCanvasFill(t,typeof e.listBorderColor=="string"?{type:"Solid",color:e.listBorderColor}:e.listBorderColor||{type:"Solid",color:d},i,W)||"#e5e7eb",t.lineWidth=R,t.stroke()),t.restore();const et=e.itemFontSize||M,U=e.itemFontFamily||k;t.font=`${I} ${et}px ${U}`,A.forEach((lt,x)=>{const F=E+D+x*B;if(lt===e.selectedOption)t.fillStyle=this.createCanvasFill(t,typeof e.itemSelectedBackgroundColor=="string"?{type:"Solid",color:e.itemSelectedBackgroundColor}:e.itemSelectedBackgroundColor||{type:"Solid",color:"#f3f4f6"},i,B)||"#f3f4f6",t.fillRect(a+R,F,i-R*2,B),t.fillStyle=e.itemSelectedColor||e.accentColor||u||"#374151";else if(t.fillStyle=e.listTextColor||u||"#333333",this.activeDropdownId===s.id&&this._lastPointerPos){const st=this._lastPointerPos.y-(E+D),N=Math.floor(st/B);x===N&&(t.fillStyle=this.createCanvasFill(t,typeof e.itemHoverBackgroundColor=="string"?{type:"Solid",color:e.itemHoverBackgroundColor}:e.itemHoverBackgroundColor||{type:"Solid",color:"#f9fafb"},i,B)||"#f9fafb",t.fillRect(a+R,F,i-R*2,B),t.fillStyle=e.itemHoverColor||u)}t.fillText(lt,a+b,F+B/2)})}t.globalAlpha=y}renderButton(t,s){if(s.children&&s.children.length>0)return;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=s.geometry||{},n=i.width||120,a=i.height||40,r=this.lastHoveredObjectId===s.id,l=this.activeObjectId===s.id,h=e.label||{},f=e.hoverStyle||{},p=e.activeStyle||{},c=e.icon||{enabled:!1};let d=e.backgroundColor||"#3b82f6",u=h.color||"#ffffff",y=h.text||"Button",m=i.cornerRadius??8,b=e.borderColor||"transparent",v=e.borderWidth||0,S=1;l&&p?(d=p.backgroundColor||d,u=p.color||u,y=p.text||y,S=p.scale??.95,m=p.cornerRadius??m):r&&f&&(d=f.backgroundColor||d,u=f.color||u,y=f.text||y,S=f.scale??1,m=f.cornerRadius??m,b=f.borderColor||b);const C=-n/2,w=-a/2;t.save(),t.scale(S,S),t.beginPath(),this.drawRoundRect(t,C,w,n,a,m);const M=this.createCanvasFill(t,d,n,a);M&&(t.fillStyle=M,t.fill()),(v>0||r&&f.borderColor)&&(t.strokeStyle=b,t.lineWidth=v||(r?1:0),t.stroke());const I=h.fontSize||14,k=h.fontFamily||"Inter",T=h.fontWeight||600;t.font=`${T} ${I}px "${k}", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,t.fillStyle=u,t.textAlign="center",t.textBaseline="middle";let O=0;if(c.enabled&&c.svgPath){const _=I*1.1,P=c.gap||8,E=t.measureText(y),B=-(E.width+_+P)/2,D=c.position==="left"?B+_/2:B+E.width+P+_/2;O=c.position==="left"?B+_+P+E.width/2:B+E.width/2,t.save(),t.translate(D,0);const W=new Path2D(c.svgPath),X=_/24;t.scale(X,X),t.translate(-12,-12),t.fillStyle=u,t.fill(W),t.restore()}t.fillText(y,O,0),t.restore()}renderToggleButton(t,s){var y,m;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=e.checked??!1,n=((y=s.geometry)==null?void 0:y.width)||120,a=((m=s.geometry)==null?void 0:m.height)||40,r=-n/2,l=-a/2,h=e.corner_radius??8,f=e.label||{},p=i?e.accentColor||"#3b82f6":e.inactiveColor||"#374151",c=i?e.activeTextColor||"#ffffff":e.inactiveTextColor||"#9ca3af";t.save(),t.beginPath(),this.drawRoundRect(t,r,l,n,a,h),t.fillStyle=p,t.fill();const d=f.fontSize||14,u=f.fontFamily||"Inter";t.font=`${f.fontWeight||600} ${d}px "${u}", sans-serif`,t.fillStyle=c,t.textAlign="center",t.textBaseline="middle",t.fillText(f.text||"Toggle",0,0),t.restore()}renderToggle(t,s){var X,H,Q,L,R,et,U,lt,x,F,z,st;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((X=s.geometry)==null?void 0:X.width)||52,n=((H=s.geometry)==null?void 0:H.height)||30,a=-i/2,r=-n/2,l=e.checked??!1,h=e.cornerRadius??e.corner_radius??n/2,f=e.toggleStyle||{},p=f.backgroundColor||e.activeColor||"#10b981",c=f.borderColor||e.borderColor||"transparent",d=f.borderWidth??e.borderWidth??0,u=f.knobColor||e.knobColor||"#ffffff",y=l?p:e.inactiveColor||"#374151",m=l?c:e.borderColor||"transparent",b=l?d:e.borderWidth??0,v=l?u:e.knobColor||"#ffffff";e.disabled&&(t.globalAlpha*=.5),t.beginPath(),this.drawRoundRect(t,a,r,i,n,h);const S=this.createCanvasFill(t,y,i,n);if(S&&(t.fillStyle=S,t.fill()),b>0){t.lineWidth=b;const N=this.createCanvasFill(t,m,i,n);N&&(t.strokeStyle=N,t.stroke())}const C=2,w=n-C*2,M=w/2,I=a+C,k=a+i-C-w,T=l?k:I,O=r+C;t.beginPath(),t.arc(T+M,O+M,M,0,Math.PI*2);const _=this.createCanvasFill(t,v,w,w);_&&(t.fillStyle=_,t.fill()),e.disabled&&(t.globalAlpha*=2);let P=!1,E=!1;const A=(l?(Q=f.leftLabel)==null?void 0:Q.text:null)||((L=e.leftLabel)==null?void 0:L.text)||"",B=(l?(R=f.leftLabel)==null?void 0:R.color:null)||((et=e.leftLabel)==null?void 0:et.color)||"#f3f4f6";if((U=e.leftLabel)!=null&&U.enabled&&A){const N=e.leftLabel;t.font=`${N.fontWeight||400} ${N.fontSize||12}px "${N.fontFamily||"Inter"}", sans-serif`,t.fillStyle=B,t.textBaseline="middle",t.textAlign="right",t.fillText(A,a-(N.gap||8),0),P=!0}const D=(l?(lt=f.rightLabel)==null?void 0:lt.text:null)||((x=e.rightLabel)==null?void 0:x.text)||"",W=(l?(F=f.rightLabel)==null?void 0:F.color:null)||((z=e.rightLabel)==null?void 0:z.color)||"#f3f4f6";if((st=e.rightLabel)!=null&&st.enabled&&D){const N=e.rightLabel;t.font=`${N.fontWeight||400} ${N.fontSize||12}px "${N.fontFamily||"Inter"}", sans-serif`,t.fillStyle=W,t.textBaseline="middle",t.textAlign="left",t.fillText(D,a+i+(N.gap||8),0),E=!0}if(!P&&!E&&e.label&&e.label.text){const N=e.label,gt=N.fontSize||14,mt=N.fontWeight||400,ut=N.fontFamily||"Inter";t.font=`${mt} ${gt}px "${ut}", sans-serif`,t.fillStyle=N.color||"#f3f4f6",t.textBaseline="middle";const wt=N.gap||10;let Mt=0,Et=0;N.position==="left"?(t.textAlign="right",Mt=a-wt,Et=0):N.position==="right"?(t.textAlign="left",Mt=a+i+wt,Et=0):N.position==="top"?(t.textAlign="center",Mt=0,Et=r-wt,t.textBaseline="bottom"):N.position==="bottom"?(t.textAlign="center",Mt=0,Et=r+n+wt,t.textBaseline="top"):(t.textAlign="left",Mt=a+i+wt,Et=0),t.fillText(N.text,Mt,Et)}}renderCheckbox(t,s){var S,C;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((S=s.geometry)==null?void 0:S.width)||20,n=((C=s.geometry)==null?void 0:C.height)||20,a=-i/2,r=-n/2,l=e.cornerRadius??4,h=e.checked??!1,f=e.activeColor||"#3b82f6",p=e.inactiveColor||"transparent",c=e.checkColor||"#ffffff",d=e.borderColor||"#4b5563",u=e.borderWidth??2,y=h?f:p,m=h?"transparent":d,b=h?0:u;e.disabled&&(t.globalAlpha*=.5),t.beginPath(),this.drawRoundRect(t,a,r,i,n,l);const v=this.createCanvasFill(t,y,i,n);if(v&&(t.fillStyle=v,t.fill()),b>0){t.lineWidth=b;const w=this.createCanvasFill(t,m,i,n);w&&(t.strokeStyle=w,t.stroke())}else if(h){t.lineWidth=1;const w=this.createCanvasFill(t,f,i,n);w&&(t.strokeStyle=w,t.stroke())}if(h){t.save(),t.beginPath();const w=this.createCanvasFill(t,c,i,n);t.strokeStyle=w||c,t.lineWidth=Math.max(2,i*.12),t.lineCap="round",t.lineJoin="round";const M=a+i*.25,I=r+n*.5,k=a+i*.45,T=r+n*.7,O=a+i*.75,_=r+n*.25;t.moveTo(M,I),t.lineTo(k,T),t.lineTo(O,_),t.stroke(),t.restore()}if(e.disabled&&(t.globalAlpha*=2),e.label&&e.label.text){const w=e.label;t.save(),t.font=`${w.fontWeight||400} ${w.fontSize||14}px "${w.fontFamily||"Inter"}", sans-serif`,t.fillStyle=w.color||"#f3f4f6",t.textBaseline="middle";const M=w.gap||8;let I=0,k=0;w.position==="left"?(t.textAlign="right",I=a-M,k=0):w.position==="right"?(t.textAlign="left",I=a+i+M,k=0):w.position==="top"?(t.textAlign="center",I=0,k=r-M,t.textBaseline="bottom"):w.position==="bottom"&&(t.textAlign="center",I=0,k=r+n+M,t.textBaseline="top"),t.fillText(w.text,I,k),t.restore()}}renderRadioGroup(t,s){var C,w;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((C=s.geometry)==null?void 0:C.width)||180,n=((w=s.geometry)==null?void 0:w.height)||100,a=-i/2,r=-n/2,l=e.selectedValue,h=e.optionsList||["Option 1","Option 2","Option 3"],f=e.orientation||"vertical",p=e.itemGap!==void 0?e.itemGap:16,c=e.activeColor||"#3b82f6",d=e.inactiveColor||"#4b5563",u=e.textColor||"#ffffff",y=e.fontSize||14,m=e.fontFamily||"Inter",b=e.fontWeight||400;e.disabled&&(t.globalAlpha*=.5);const v=8,S=v*2;if(t.save(),t.font=`${b} ${y}px "${m}", sans-serif`,t.textBaseline="middle",t.textAlign="left",f==="vertical"){const M=Math.max(S,y)+p;h.forEach((I,k)=>{const T=r+k*M+v;t.beginPath(),t.arc(a+v,T,v,0,Math.PI*2);const O=l===I,_=this.createCanvasFill(t,c,S,S),P=this.createCanvasFill(t,d,S,S);O?(t.strokeStyle=_||c,t.lineWidth=2,t.stroke(),t.beginPath(),t.arc(a+v,T,v/2,0,Math.PI*2),t.fillStyle=_||c,t.fill()):(t.strokeStyle=P||d,t.lineWidth=1.5,t.stroke()),t.fillStyle=u,t.fillText(I,a+S+8,T)})}else{let M=a;h.forEach(I=>{const k=l===I,T=t.measureText(I).width;t.beginPath(),t.arc(M+v,0,v,0,Math.PI*2);const O=this.createCanvasFill(t,c,S,S),_=this.createCanvasFill(t,d,S,S);k?(t.strokeStyle=O||c,t.lineWidth=2,t.stroke(),t.beginPath(),t.arc(M+v,0,v/2,0,Math.PI*2),t.fillStyle=O||c,t.fill()):(t.strokeStyle=_||d,t.lineWidth=1.5,t.stroke()),t.fillStyle=u,t.fillText(I,M+S+6,0),M+=S+6+T+p})}if(t.restore(),e.disabled&&(t.globalAlpha*=2),e.label&&e.label.text){const M=e.label;t.save(),t.font=`${M.fontWeight||400} ${M.fontSize||14}px "${M.fontFamily||"Inter"}", sans-serif`,t.fillStyle=M.color||"#9ca3af",t.textBaseline="middle";const I=M.gap||8;let k=0,T=0;M.position==="left"?(t.textAlign="right",k=a-I,T=0):M.position==="right"?(t.textAlign="left",k=a+i+I,T=0):M.position==="top"?(t.textAlign="center",k=0,T=r-I,t.textBaseline="bottom"):M.position==="bottom"&&(t.textAlign="center",k=0,T=r+n+I,t.textBaseline="top"),t.fillText(M.text,k,T),t.restore()}}renderBarChart(t,s){var T,O;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i={width:((T=s.geometry)==null?void 0:T.width)||300,height:((O=s.geometry)==null?void 0:O.height)||180,chartType:e.chartType||"grouped",stylePreset:e.stylePreset||"default",datasets:e.datasets||[{id:"ds-1",label:"Revenue",data:[42,67,31,55,78,48],color:"#6366f1"}],categories:e.categories||["Jan","Feb","Mar","Apr","May","Jun"],orientation:e.orientation||"vertical",barWidth:e.barWidth!==void 0?e.barWidth:14,barGap:e.barGap!==void 0?e.barGap:4,barCornerRadius:e.barCornerRadius!==void 0?e.barCornerRadius:5,showXAxis:!!e.showXAxis,showYAxis:!!e.showYAxis,xAxisColor:e.xAxisColor||"rgba(255,255,255,0.12)",yAxisColor:e.yAxisColor||"rgba(255,255,255,0.12)",showXLabels:e.showXLabels!==void 0?!!e.showXLabels:!0,showYLabels:!!e.showYLabels,axisLabelColor:e.axisLabelColor||"rgba(255,255,255,0.5)",axisLabelFontSize:e.axisLabelFontSize||9,showLegend:e.showLegend!==void 0?!!e.showLegend:!0,legendColor:e.legendColor||"rgba(255,255,255,0.7)",legendFontSize:e.legendFontSize||9,showGridLines:e.showGridLines!==void 0?!!e.showGridLines:!0,gridColor:e.gridColor||"rgba(255,255,255,0.06)",cardBackground:e.cardBackground||"rgba(255,255,255,0.04)",cardBorderColor:e.cardBorderColor||"rgba(255,255,255,0.08)",barGradient:e.barGradient!==void 0?!!e.barGradient:!0,showValueOnTop:!!e.showValueOnTop,chartBackground:e.chartBackground||"transparent",barStyle:e.barStyle||"solid",barBorderWidth:e.barBorderWidth!==void 0?e.barBorderWidth:1,barBorderColor:e.barBorderColor||"auto",enableShadows:!!e.enableShadows,shadowColor:e.shadowColor||"rgba(0,0,0,0.5)",shadowBlur:e.shadowBlur!==void 0?e.shadowBlur:4,shadowOffsetY:e.shadowOffsetY!==void 0?e.shadowOffsetY:2,valueFontSize:e.valueFontSize||10,valueColor:e.valueColor||"auto",valueFontWeight:e.valueFontWeight||"bold",xAxisLineWidth:e.xAxisLineWidth!==void 0?e.xAxisLineWidth:1,yAxisLineWidth:e.yAxisLineWidth!==void 0?e.yAxisLineWidth:1,gridLineWidth:e.gridLineWidth!==void 0?e.gridLineWidth:1,gridLineDash:e.gridLineDash||[3,4],_getPreset:function(){return us[this.stylePreset]||us.default},_resolveColor:function(_,P){const E=this._getPreset();return["#6366f1","#f59e0b","#10b981","#3b82f6","#a855f7"].includes(_)?E.colors[P%E.colors.length]:typeof _=="string"?_:E.colors[P%E.colors.length]},_makeGradient:function(_,P,E,A,B,D){if(!this._getPreset().barGradient&&!this.barGradient)return P;const X=_.createLinearGradient(E,A,B,D);return X.addColorStop(0,P),X.addColorStop(1,P+"44"),X},_drawRoundedBar:function(_,P,E,A,B,D,W){if(D=Math.min(D,Math.min(Math.abs(A),Math.abs(B))/2),D<=0||A===0||B===0){_.rect(P,E,A,B);return}_.beginPath(),W?(_.moveTo(P,E+B),_.lineTo(P,E+D),_.quadraticCurveTo(P,E,P+D,E),_.lineTo(P+A-D,E),_.quadraticCurveTo(P+A,E,P+A,E+D),_.lineTo(P+A,E+B),_.lineTo(P,E+B)):(_.moveTo(P,E),_.lineTo(P+A-D,E),_.quadraticCurveTo(P+A,E,P+A,E+D),_.lineTo(P+A,E+B-D),_.quadraticCurveTo(P+A,E+B,P+A-D,E+B),_.lineTo(P,E+B),_.lineTo(P,E)),_.closePath()}},n=i.width,a=i.height,r=-n/2,l=-a/2;if(!i.datasets||i.datasets.length===0||i.categories.length===0){t.save(),t.fillStyle="rgba(99,102,241,0.7)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO CHART DATA",0,0),t.restore();return}const h=i._getPreset();let f=-1/0,p=1/0;const c=i.categories.length,d=i.datasets.length;if(i.chartType==="stacked")for(let _=0;_<c;_++){let P=0,E=0;i.datasets.forEach(A=>{const B=A.data[_]??0;B>=0?P+=B:E+=B}),P>f&&(f=P),E<p&&(p=E)}else i.datasets.forEach(_=>{_.data&&_.data.forEach(P=>{P>f&&(f=P),P<p&&(p=P)})});isFinite(f)||(f=10),isFinite(p)||(p=0),f=Math.max(f,0),p=Math.min(p,0);const u=f-p||10;t.save(),i.enableShadows&&(t.shadowColor=i.shadowColor,t.shadowBlur=i.shadowBlur,t.shadowOffsetY=i.shadowOffsetY),t.font=i.axisLabelFontSize+"px Inter, sans-serif";const y=i.showYLabels?t.measureText(f.toFixed(0)).width+14:10,m=i.showXLabels?i.axisLabelFontSize+12:8,v=(i.showLegend&&d>0?i.legendFontSize+10:0)+8,S=10,C=r+y,w=l+v,M=n-y-S,I=a-v-m;if(i.enableShadows&&(t.shadowColor="transparent"),t.beginPath(),t.roundRect(r,l,n,a,10),t.fillStyle=h.cardBackground,t.fill(),t.strokeStyle=h.cardBorderColor,t.lineWidth=1,t.stroke(),i.chartBackground&&i.chartBackground!=="transparent"&&(t.beginPath(),t.rect(C,w,M,I),t.fillStyle=i.chartBackground,t.fill()),i.showLegend&&d>0){t.font=i.legendFontSize+"px Inter, sans-serif",t.textBaseline="middle";const _=l+12;let P=C;i.datasets.forEach((E,A)=>{const B=i._resolveColor(E.color,A),D=E.label||"Series "+(A+1),W=7;t.beginPath(),t.roundRect(P,_-W/2,W,W,2),t.fillStyle=B,t.fill(),t.fillStyle=h.legendColor,t.textAlign="left",t.fillText(D,P+W+4,_),P+=t.measureText(D).width+W+16})}const k=4;if(i.showGridLines){t.setLineDash(i.gridLineDash||[]),t.lineWidth=i.gridLineWidth||1,t.strokeStyle=h.gridColor;for(let _=0;_<=k;_++)if(i.orientation==="horizontal"){const P=C+_/k*M;t.beginPath(),t.moveTo(P,w),t.lineTo(P,w+I),t.stroke()}else{const P=w+_/k*I;t.beginPath(),t.moveTo(C,P),t.lineTo(C+M,P),t.stroke()}t.setLineDash([])}if(i.showYLabels){t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=h.axisLabelColor;for(let _=0;_<=k;_++)if(i.orientation==="horizontal"){const P=p+_/k*u,E=C+_/k*M;t.textAlign="center",t.fillText(P.toFixed(0),E,w+I+i.axisLabelFontSize)}else{const P=f-_/k*u,E=w+_/k*I;t.textAlign="right",t.fillText(P.toFixed(0),C-6,E)}}if(t.setLineDash([]),i.showXAxis&&(t.lineWidth=i.xAxisLineWidth||1,t.strokeStyle=i.xAxisColor,t.beginPath(),t.moveTo(C,w+I),t.lineTo(C+M,w+I),t.stroke()),i.showYAxis&&(t.lineWidth=i.yAxisLineWidth||1,t.strokeStyle=i.yAxisColor,t.beginPath(),t.moveTo(C,w),t.lineTo(C,w+I),t.stroke()),i.enableShadows&&(t.shadowColor=i.shadowColor),i.chartType==="stacked")if(i.orientation==="horizontal"){const _=I/c;for(let P=0;P<c;P++){const E=w+P*_+_/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=h.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[P]||"",C-5,E),i.enableShadows&&(t.shadowColor=i.shadowColor));let A=C;i.datasets.forEach((B,D)=>{const W=B.data[P]??0;if(W===0)return;const X=W/u*M,H=Math.min(i.barWidth*d+i.barGap,_-8),Q=E-H/2,L=A;A+=X;const R=i._resolveColor(B.color,D);t.beginPath(),t.fillStyle=i._makeGradient(t,R,L,Q,L+X,Q),i._drawRoundedBar(t,L,Q,X,H,D===d-1?i.barCornerRadius:0,!1),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?R:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill()})}}else{const _=M/c;for(let P=0;P<c;P++){const E=C+P*_+_/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="center",t.textBaseline="top",t.fillStyle=h.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[P]||"",E,w+I+5),i.enableShadows&&(t.shadowColor=i.shadowColor));let A=w+I;i.datasets.forEach((B,D)=>{const W=B.data[P]??0;if(W===0)return;const X=W/u*I,H=Math.min(i.barWidth*d+i.barGap,_-8),Q=E-H/2,L=A-X;A-=X;const R=i._resolveColor(B.color,D);t.beginPath(),t.fillStyle=i._makeGradient(t,R,Q,L,Q,L+X),i._drawRoundedBar(t,Q,L,H,X,D===d-1?i.barCornerRadius:0,!0),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?R:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill()})}}else if(i.orientation==="horizontal"){const _=I/c,P=d*i.barWidth+Math.max(0,(d-1)*i.barGap),E=C+(0-p)/u*M;for(let A=0;A<c;A++){const B=w+A*_+_/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=h.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[A]||"",C-5,B),i.enableShadows&&(t.shadowColor=i.shadowColor));const D=B-P/2;i.datasets.forEach((W,X)=>{const H=W.data[A]??0,Q=Math.abs(H/u*M);if(Q<1)return;const L=D+X*(i.barWidth+i.barGap),R=H>=0?E:E-Q,et=i._resolveColor(W.color,X);t.beginPath(),t.fillStyle=i._makeGradient(t,et,R,L,R+Q,L),i._drawRoundedBar(t,R,L,Q,i.barWidth,i.barCornerRadius,!1),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?et:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill(),i.showValueOnTop&&H!==0&&(t.font=(i.valueFontWeight||"bold")+" "+(i.valueFontSize||10)+"px Inter, sans-serif",t.textAlign=H>=0?"left":"right",t.textBaseline="middle",t.fillStyle=i.valueColor==="auto"?et:i.valueColor||"#fff",t.shadowColor="transparent",t.fillText(H.toString(),H>=0?R+Q+4:R-4,L+i.barWidth/2),i.enableShadows&&(t.shadowColor=i.shadowColor))})}}else{const _=M/c,P=d*i.barWidth+Math.max(0,(d-1)*i.barGap),E=w+I-(0-p)/u*I;for(let A=0;A<c;A++){const B=C+A*_+_/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="center",t.textBaseline="top",t.fillStyle=h.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[A]||"",B,w+I+5),i.enableShadows&&(t.shadowColor=i.shadowColor));const D=B-P/2;i.datasets.forEach((W,X)=>{const H=W.data[A]??0,Q=Math.abs(H/u*I);if(Q<1)return;const L=D+X*(i.barWidth+i.barGap),R=H>=0?E-Q:E,et=i._resolveColor(W.color,X);t.beginPath(),t.fillStyle=i._makeGradient(t,et,L,R,L,R+Q),i._drawRoundedBar(t,L,R,i.barWidth,Q,i.barCornerRadius,!0),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?et:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill(),i.showValueOnTop&&H!==0&&(t.font=(i.valueFontWeight||"bold")+" "+(i.valueFontSize||10)+"px Inter, sans-serif",t.textAlign="center",t.textBaseline=H>=0?"bottom":"top",t.fillStyle=i.valueColor==="auto"?et:i.valueColor||"#fff",t.shadowColor="transparent",t.fillText(H.toString(),L+i.barWidth/2,H>=0?R-4:R+Q+4),i.enableShadows&&(t.shadowColor=i.shadowColor))})}}t.restore()}renderPieChart(t,s){var y,m;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i={width:((y=s.geometry)==null?void 0:y.width)||180,height:((m=s.geometry)==null?void 0:m.height)||180,chartType:e.chartType||"donut",stylePreset:e.stylePreset||"default",slices:e.slices||[{id:"slice-1",label:"Item 1",value:45,color:"#6366f1"}],innerRadius:e.innerRadius!==void 0?e.innerRadius:.55,sliceGap:e.sliceGap!==void 0?e.sliceGap:3,showLabels:!!e.showLabels,labelColor:e.labelColor||"#ffffff",labelFontSize:e.labelFontSize||10,showLegend:e.showLegend!==void 0?!!e.showLegend:!0,legendColor:e.legendColor||"rgba(255,255,255,0.65)",legendFontSize:e.legendFontSize||9,showCenterText:e.showCenterText!==void 0?!!e.showCenterText:!0,centerLabel:e.centerLabel||"Total",centerTextColor:e.centerTextColor||"#ffffff",centerLabelColor:e.centerLabelColor||"rgba(255,255,255,0.4)",_getPreset:function(){return gs[this.stylePreset]||gs.default},_resolveSliceColor:function(b,v){const S=b.color,C=v,w=this._getPreset();return["#6366f1","#22d3ee","#f59e0b","#ec4899","#34d399","#a855f7","#f87171"].includes(S)?w.colors[C%w.colors.length]:typeof S=="string"?S:w.colors[C%w.colors.length]}},n=i.width,a=i.height;if(!i.slices||i.slices.length===0){t.save(),t.fillStyle="rgba(99,102,241,0.8)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO PIE DATA",0,0),t.restore();return}const r=i.slices.reduce((b,v)=>b+(v.value||0),0);if(r<=0){t.save(),t.fillStyle="rgba(99,102,241,0.8)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("EMPTY DATA",0,0),t.restore();return}const l=i._getPreset();t.save(),t.beginPath(),t.roundRect(-n/2,-a/2,n,a,10),t.fillStyle=l.cardBackground,t.fill(),t.strokeStyle=l.cardBorderColor,t.lineWidth=1,t.stroke();const h=i.showLegend?Math.ceil(i.slices.length/2):0,f=h>0?h*(i.legendFontSize+8)+10:0,p=a-f-16,c=Math.min(n-24,p)/2,d=0,u=-f/2;if(i.chartType==="rose"){const b=Math.max(...i.slices.map(C=>C.value||0)),v=Math.PI*2/i.slices.length,S=c>0?i.sliceGap/c:0;i.slices.forEach((C,w)=>{const M=C.value||0;if(M===0)return;const I=M/b*c,k=-Math.PI/2+w*v+S/2,T=k+v-S,O=i._resolveSliceColor(C,w);if(t.beginPath(),t.moveTo(d,u),t.arc(d,u,I,k,T),t.closePath(),t.fillStyle=O+"cc",t.fill(),t.strokeStyle=O,t.lineWidth=1.5,t.stroke(),i.showLabels){const _=k+(T-k)/2,P=d+I*.65*Math.cos(_),E=u+I*.65*Math.sin(_),A=Math.round(M/r*100);t.save(),t.font=`bold ${i.labelFontSize}px Inter, sans-serif`,t.fillStyle=l.labelColor,t.textAlign="center",t.textBaseline="middle",t.fillText(`${A}%`,P,E),t.restore()}})}else{const b=i.chartType==="pie"?0:i.innerRadius,v=c*Math.max(0,b),S=c>0?i.sliceGap/c:0;let C=-Math.PI/2;if(i.slices.forEach((w,M)=>{const I=w.value||0;if(I===0){C+=I/r*Math.PI*2;return}const k=I/r*Math.PI*2,T=C+S/2,O=C+k-S/2;if(O<=T){C+=k;return}const _=i._resolveSliceColor(w,M);if(t.beginPath(),t.fillStyle=_,v<=0?(t.moveTo(d,u),t.arc(d,u,c,T,O),t.lineTo(d,u)):(t.moveTo(d+c*Math.cos(T),u+c*Math.sin(T)),t.arc(d,u,c,T,O),t.arc(d,u,v,O,T,!0),t.closePath()),t.fill(),i.showLabels){const P=T+(O-T)/2,E=v+(c-v)/2,A=d+E*Math.cos(P),B=u+E*Math.sin(P),D=Math.round(I/r*100);t.save(),t.font=`bold ${i.labelFontSize}px Inter, sans-serif`,t.fillStyle=l.labelColor,t.textAlign="center",t.textBaseline="middle",t.fillText(`${D}%`,A,B),t.restore()}C+=k}),i.chartType==="donut"&&i.showCenterText&&v>14){const w=Math.round(r),M=Math.min(Math.floor(v*.52),20),I=Math.min(Math.floor(v*.26),10);t.textAlign="center",t.textBaseline="middle",t.font=`bold ${M}px Inter, sans-serif`,t.fillStyle=l.centerTextColor,t.fillText(w.toString(),d,u-I*.5),i.centerLabel&&(t.font=`${I}px Inter, sans-serif`,t.fillStyle=l.centerLabelColor,t.fillText(i.centerLabel,d,u+M*.6))}}if(i.showLegend&&i.slices.length>0){t.font=`${i.legendFontSize}px Inter, sans-serif`;const b=2,v=n/b,S=i.legendFontSize+8,C=a/2-f+10,w=-n/2+10;i.slices.forEach((M,I)=>{const k=I%b,T=Math.floor(I/b),O=w+k*v,_=C+T*S,P=i._resolveSliceColor(M,I),E=7;t.beginPath(),t.roundRect(O,_-E/2,E,E,2),t.fillStyle=P,t.fill(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=l.legendColor;const A=Math.round((M.value||0)/r*100),B=`${M.label||"Item"} ${A}%`,D=v-E-20;let W=B;for(;t.measureText(W).width>D&&W.length>4;)W=W.slice(0,-4)+"…";t.fillText(W,O+E+4,_)})}t.restore()}renderJoystick(t,s){var u,y,m,b,v;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.width)!==void 0?o.width:((u=s.geometry)==null?void 0:u.width)??s.width??100,i=(o==null?void 0:o.height)!==void 0?o.height:((y=s.geometry)==null?void 0:y.height)??s.height??100,n=Math.min(e,i)*.45,a=Math.min(e,i)*.15;let r=s.handleX||0,l=s.handleY||0;o&&o.handleX!==void 0&&(r=o.handleX),o&&o.handleY!==void 0&&(l=o.handleY),t.save();let h=0,f=0;s.handleOrigin==="top-left"?(h=e/2,f=i/2):s.handleOrigin==="bottom-right"&&(h=-e/2,f=-i/2),t.translate(h,f),t.beginPath(),s.boundsShape==="square"?t.rect(-n,-n,n*2,n*2):t.arc(0,0,n,0,Math.PI*2),t.fillStyle="rgba(0,0,0,0.2)",(m=s.style)!=null&&m.fill&&typeof s.style.fill=="string"?t.fillStyle=s.style.fill:(b=s.style)!=null&&b.fill&&s.style.fill.type==="solid"&&(t.fillStyle=s.style.fill.color),t.fill(),(v=s.style)!=null&&v.stroke&&s.style.stroke.isEnabled!==!1&&(t.lineWidth=s.style.stroke.width||1,t.strokeStyle=s.style.stroke.color||"#000",t.stroke());const p=n-a;let c=0,d=0;s.joystickType==="2D"?(c=r*p,d=l*p):s.joystickType==="1D_X"?(c=r*p,d=0):s.joystickType==="1D_Y"&&(c=0,d=l*p),t.beginPath(),t.arc(c,d,a,0,Math.PI*2),t.fillStyle="#fff",t.fill(),t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=1,t.stroke(),t.restore()}getRadioGroupItemIndexAtPointer(t,s,o){var I,k;const e=t.options||{},i=this.objectStates.get(t.id)||{},n=e.optionsList||[];if(n.length===0)return null;const a=i.width!==void 0?i.width:((I=t.geometry)==null?void 0:I.width)||180,r=i.height!==void 0?i.height:((k=t.geometry)==null?void 0:k.height)||100,l=e.orientation||"vertical",h=e.itemGap!==void 0?e.itemGap:16,f=e.fontSize||14,p=this.getWorldTransform(t.id),c=s-p.x,d=o-p.y,u=-p.rotation*(Math.PI/180),y=Math.cos(u),m=Math.sin(u),b=c*y-d*m,v=c*m+d*y,C=8*2,w=-a/2,M=-r/2;if(l==="vertical"){const T=Math.max(C,f)+h;for(let O=0;O<n.length;O++){const _=M+O*T;if(b>=w&&b<=w+a&&v>=_&&v<=_+T)return O}}else{let T=w;for(let O=0;O<n.length;O++){const P=n[O].length*8,E=C+6+P+h;if(b>=T&&b<=T+E&&v>=M&&v<=M+r)return O;T+=E}}return null}renderLineGraph(t,s,o,e){let i=s.datasets||[];if((!i||i.length===0)&&(s.data||s.graphData)&&(i=[{id:"line-1",label:"Series 1",data:s.data||s.graphData||[],lineColor:s.lineColor||"#3b82f6",lineWidth:s.lineWidth||2,showArea:s.showArea||!1,areaColor:s.areaColor||"rgba(139, 92, 246, 0.3)",smoothing:s.smoothing||!1,showPoints:s.showPoints!==void 0?s.showPoints:!0,pointSize:s.pointSize||6,pointFill:s.pointFill||"#ffffff",pointStrokeColor:s.pointStrokeColor||s.lineColor||"#3b82f6",pointStrokeWidth:s.pointStrokeWidth||2}]),!i||i.length===0||!i.some(u=>u.data&&u.data.length>=2)){t.save(),t.fillStyle="#6366f1",t.font="12px Inter, system-ui, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO DATA",0,0),t.restore();return}let n=1/0,a=-1/0,r=0;if(i.forEach(u=>{let y=u.data;if(u.isVarEnabled&&u.inputId){let m=this.inputs.get(u.inputId);if(m===void 0){const b=this.inputNameMap.get(u.inputId);b&&b.length>0&&(m=this.inputs.get(b[0]))}m&&Array.isArray(m)&&(y=m)}if(y&&y.length>0){const m=y.filter(b=>typeof b=="number"&&!isNaN(b));m.length>0&&(n=Math.min(n,...m),a=Math.max(a,...m),r=Math.max(r,y.length))}u._resolvedData=y}),r<2)return;const l=a-n,h=o/(r-1),f=u=>{const y=l===0?.5:(u-n)/l;return e/2-y*e},p=u=>u*h-o/2,c=s.axisColor||"#333333";if(s.showXAxis&&(t.beginPath(),t.strokeStyle=s.xAxisColor||c,t.lineWidth=1,t.moveTo(-o/2,e/2),t.lineTo(o/2,e/2),t.stroke()),s.showYAxis&&(t.beginPath(),t.strokeStyle=s.yAxisColor||c,t.lineWidth=1,t.moveTo(-o/2,-e/2),t.lineTo(-o/2,e/2),t.stroke()),t.fillStyle=s.axisLabelColor||"#333333",t.font=`${s.axisLabelFontSize||10}px Inter, sans-serif`,s.showXLabels){t.textAlign="center",t.textBaseline="top";for(let u=0;u<r;u++){const y=p(u);t.fillText(`${u+1}`,y,e/2+5)}}if(s.showYLabels){t.textAlign="right",t.textBaseline="middle";const u=-o/2-5,y=(a+n)/2;t.fillText(a.toFixed(1),u,f(a)),t.fillText(y.toFixed(1),u,f(y)),t.fillText(n.toFixed(1),u,f(n))}const d=10;if(i.forEach(u=>{const y=u._resolvedData;if(!(!y||y.length<2)){if(u.showArea){if(t.beginPath(),t.moveTo(p(0),e/2),t.lineTo(p(0),f(y[0])),u.smoothing&&y.length>2)for(let b=0;b<y.length-1;b++){const v=y[b===0?b:b-1],S=y[b],C=y[b+1],w=y[b+1===y.length-1?b+1:b+2];for(let M=1;M<=d;M++){const I=M/d,k=this._catmullRom(v,S,C,w,I);t.lineTo(p(b+I),f(k))}}else for(let b=1;b<y.length;b++)t.lineTo(p(b),f(y[b]));t.lineTo(p(y.length-1),e/2),t.closePath();const m=t.globalAlpha;t.globalAlpha=m*(s.areaOpacity??.3),t.fillStyle=u.areaColor||"rgba(139, 92, 246, 0.2)",t.fill(),t.globalAlpha=m}if(t.beginPath(),t.strokeStyle=u.lineColor||"#3b82f6",t.lineWidth=u.lineWidth||2,t.lineJoin="round",t.lineCap="round",t.moveTo(p(0),f(y[0])),u.smoothing&&y.length>2)for(let m=0;m<y.length-1;m++){const b=y[m===0?m:m-1],v=y[m],S=y[m+1],C=y[m+1===y.length-1?m+1:m+2];for(let w=1;w<=d;w++){const M=w/d,I=this._catmullRom(b,v,S,C,M);t.lineTo(p(m+M),f(I))}}else for(let m=1;m<y.length;m++)t.lineTo(p(m),f(y[m]));t.stroke(),u.showPoints&&y.forEach((m,b)=>{const v=p(b),S=f(m);t.beginPath(),t.arc(v,S,(u.pointSize||6)/2,0,Math.PI*2),t.fillStyle=u.pointFill||"#ffffff",t.fill(),t.strokeStyle=u.pointStrokeColor||u.lineColor||"#3b82f6",t.lineWidth=u.pointStrokeWidth||1,t.stroke()})}}),s.showLegend&&i.length>0){const u=o/2-10;let y=-e/2+15;const m=s.legendFontSize||10,b=m+5;t.font=`${m}px Inter, sans-serif`,t.textAlign="right",t.textBaseline="alphabetic",i.forEach(v=>{const C=v.label||"Series",w=t.measureText(C).width;t.beginPath(),t.rect(u-w-8-5,y-(8/2+2),8,8),t.fillStyle=v.lineColor||"#3b82f6",t.fill(),t.fillStyle=s.legendColor||"#333333",t.fillText(C,u,y),y+=b})}}_catmullRom(t,s,o,e,i){const n=(o-t)*.5,a=(e-s)*.5,r=i*i,l=i*r;return(2*s-2*o+n+a)*l+(-3*s+3*o-2*n-a)*r+n*i+s}normalizeOpacity(t){const s=typeof t=="number"?t:parseFloat(String(t));return isNaN(s)?1:s>1?Math.min(1,s/100):Math.max(0,Math.min(1,s))}createCanvasFill(t,s,o,e){var i,n,a;if(!s||s.type==="None")return null;if(typeof s=="string")return s;if(s.type==="Solid"&&s.color){const r=s.color,h=(((n=(i=this.artboard)==null?void 0:i.tokens)==null?void 0:n.colors)||{})[r]||r;return t.fillStyle=h,h}if((s.type==="LinearGradient"||s.type==="RadialGradient"||s.type==="AngularGradient"||s.type==="DiamondGradient")&&s.stops){const r=(l,h=100)=>{var S,C;const p=(((C=(S=this.artboard)==null?void 0:S.tokens)==null?void 0:C.colors)||{})[l]||l,c=this.normalizeOpacity(s.opacity??100),u=this.normalizeOpacity(h)*c;if(u>=1&&p.startsWith("#"))return p;const y=p.startsWith("#")?p.replace("#",""):"ffffff",m=parseInt(y.substring(0,2),16),b=parseInt(y.substring(2,4),16),v=parseInt(y.substring(4,6),16);return`rgba(${m}, ${b}, ${v}, ${u})`};if(s.type==="LinearGradient"){const l=(u,y,m)=>Array.isArray(u)?u[y]??(y===0?0:1):u&&typeof u=="object"?u[m]??(y===0?0:1):y===0?0:1,h=l(s.start,0,"x")*o-o/2,f=l(s.start,1,"y")*e-e/2,p=l(s.end,0,"x")*o-o/2,c=l(s.end,1,"y")*e-e/2,d=t.createLinearGradient(h,f,p,c);if(s.stops.forEach(u=>{const y=u.offset!==void 0?u.offset:u.pos!==void 0?u.pos:u.position!==void 0?u.position:0,m=r(u.color||"#000000",u.opacity??100);d.addColorStop(Math.max(0,Math.min(1,y)),m)}),s.gradientTransform&&d.setTransform){const[u,y,m,b,v,S]=s.gradientTransform;d.setTransform({a:u,b:y,c:m,d:b,e:v,f:S})}return d}else if(s.type==="RadialGradient"){const l=(d,u,y)=>Array.isArray(d)?d[u]??.5:d&&typeof d=="object"?d[y]??.5:.5,h=l(s.center,0,"x")*o-o/2,f=l(s.center,1,"y")*e-e/2,p=(s.radius??.5)*Math.max(o,e),c=t.createRadialGradient(h,f,0,h,f,p);if(s.stops.forEach(d=>{const u=d.offset!==void 0?d.offset:d.pos!==void 0?d.pos:d.position!==void 0?d.position:0,y=r(d.color||"#000000",d.opacity??100);c.addColorStop(Math.max(0,Math.min(1,u)),y)}),s.gradientTransform&&c.setTransform){const[d,u,y,m,b,v]=s.gradientTransform;c.setTransform({a:d,b:u,c:y,d:m,e:b,f:v})}return c}else if(s.type==="AngularGradient"){const l=(d,u,y)=>Array.isArray(d)?d[u]??.5:d&&typeof d=="object"?d[y]??.5:.5,h=l(s.center||[.5,.5],0,"x")*o-o/2,f=l(s.center||[.5,.5],1,"y")*e-e/2,p=(s.degree||s.angle||0)*(Math.PI/180),c=(a=t.createConicGradient)==null?void 0:a.call(t,p,h,f);if(c){if(s.stops.forEach(d=>{const u=d.offset!==void 0?d.offset:d.pos!==void 0?d.pos:d.position!==void 0?d.position:0,y=r(d.color||"#000000",d.opacity??100);c.addColorStop(Math.max(0,Math.min(1,u)),y)}),s.gradientTransform&&c.setTransform){const[d,u,y,m,b,v]=s.gradientTransform;c.setTransform({a:d,b:u,c:y,d:m,e:b,f:v})}return c}}else if(s.type==="DiamondGradient"){const l=(d,u,y)=>Array.isArray(d)?d[u]??.5:d&&typeof d=="object"?d[y]??.5:.5,h=l(s.center||[.5,.5],0,"x")*o-o/2,f=l(s.center||[.5,.5],1,"y")*e-e/2,p=(s.radius??.5)*Math.max(o,e);t.save(),t.translate(h,f),t.rotate(Math.PI/4);const c=t.createRadialGradient(0,0,0,0,0,p);if(s.stops.forEach(d=>{const u=d.offset!==void 0?d.offset:d.pos!==void 0?d.pos:d.position!==void 0?d.position:0,y=r(d.color||"#000000",d.opacity??100);c.addColorStop(Math.max(0,Math.min(1,u)),y)}),s.gradientTransform&&c.setTransform){const[d,u,y,m,b,v]=s.gradientTransform;c.setTransform({a:d,b:u,c:y,d:m,e:b,f:v})}return t.scale(1/Math.SQRT2,1/Math.SQRT2),t.fillStyle=c,t.restore(),c}}if(s.type==="Pattern"&&s.url){let r=this.imageCache.get(s.url);if(r||(r=new Image,r.src=s.url,this.imageCache.set(s.url,r)),r.complete&&r.naturalWidth>0){const l=t.createPattern(r,"repeat");if(l&&(s.scaleX!==void 0||s.offsetX!==void 0)){const h=new DOMMatrix,f=s.scaleX??1,p=s.scaleY??1,c=s.offsetX??0,d=s.offsetY??0,u=s.rotation??0;h.translateSelf(c,d),h.rotateSelf(u),h.scaleSelf(f,p),l.setTransform(h)}return l}}return s.color||null}drawRoundRect(t,s,o,e,i,n){if(n===0||n===void 0||n===null){t.rect(s,o,e,i);return}let a=n;if(typeof a=="string")try{a=JSON.parse(a)}catch{a=parseFloat(a)||0}let r=0,l=0,h=0,f=0;typeof a=="number"?r=l=h=f=a:Array.isArray(a)?a.length===1?r=l=h=f=a[0]:a.length===2?(r=h=a[0],l=f=a[1]):a.length===3?(r=a[0],l=f=a[1],h=a[2]):a.length>=4&&(r=a[0],l=a[1],h=a[2],f=a[3]):a&&typeof a=="object"&&(r=a.tl??a.corner_radius??a.cornerRadius??0,l=a.tr??a.corner_radius??a.cornerRadius??0,h=a.br??a.corner_radius??a.cornerRadius??0,f=a.bl??a.corner_radius??a.cornerRadius??0);const p=Math.min(Math.abs(e)/2,Math.abs(i)/2);if(r=Math.min(Math.max(0,r),p),l=Math.min(Math.max(0,l),p),h=Math.min(Math.max(0,h),p),f=Math.min(Math.max(0,f),p),t.roundRect){t.roundRect(s,o,e,i,[r,l,h,f]);return}t.moveTo(s+r,o),t.lineTo(s+e-l,o),t.arcTo(s+e,o,s+e,o+l,l),t.lineTo(s+e,o+i-h),t.arcTo(s+e,o+i,s+e-h,o+i,h),t.lineTo(s+f,o+i),t.arcTo(s,o+i,s,o+i-f,f),t.lineTo(s,o+r),t.arcTo(s,o,s+r,o,r),t.closePath()}renderListView(t,s){var A,B,D,W;const o=this.objectStates.get(s.id)||{},e=o.options||s.options||{},i=o.width!==void 0?o.width:((A=s.geometry)==null?void 0:A.width)||200,n=o.height!==void 0?o.height:((B=s.geometry)==null?void 0:B.height)||300,a=-i/2,r=-n/2,l=o.corner_radius!==void 0?o.corner_radius:e.corner_radius??0,h=e.orientation||"vertical",f=e.items||[],p=e.itemGap??10,c=e.itemHeight??50,d=e.itemWidth??200,u=e.scrollOffset??0,y=e.padding??0,m=e.glassEffect!==!1,b=e.accentColor||"#3b82f6",v=e.itemTextColor||"#333333",S=e.itemBackgroundColor||"#ffffff",C=e.hoveredIndex??null,w=e.activeItemIndex??null,M=e.glowIntensity??0,I=e.glowColor||"#3b82f6",k=typeof I=="string"?I:I.color||((W=(D=I.stops)==null?void 0:D[0])==null?void 0:W.color)||"#3b82f6",T=e.opacity!==void 0?e.opacity:s.opacity!==void 0?s.opacity:1;if(t.save(),t.globalAlpha*=T,M>0){const X=t.getTransform(),H=Math.sqrt(X.a*X.a+X.b*X.b)||1;t.shadowColor=k,t.shadowBlur=M*2*H,t.shadowOffsetX=0,t.shadowOffsetY=0}if(m){const X=e.listBackgroundColor||"rgba(31, 41, 55, 0.4)",H=this.createCanvasFill(t,X,i,n);t.fillStyle=H||"rgba(31, 41, 55, 0.4)",t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l)||t.fill();const L=t.createLinearGradient(a,r,a+i,r+n);L.addColorStop(0,"rgba(255, 255, 255, 0.15)"),L.addColorStop(.5,"rgba(255, 255, 255, 0.08)"),L.addColorStop(1,"rgba(255, 255, 255, 0.03)"),t.fillStyle=L,t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l)||t.fill(),t.strokeStyle="rgba(255, 255, 255, 0.25)",t.lineWidth=1,t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l)||t.stroke()}else{const X=e.backgroundColor||e.listBackgroundColor||"transparent",H=this.createCanvasFill(t,X,i,n);if(H){t.fillStyle=H,t.beginPath();const L=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l);t.fill()}const Q=e.borderWidth??0;if(Q>0){t.strokeStyle=e.borderColor||"#cccccc",t.lineWidth=Q,t.beginPath();const L=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l);t.stroke()}}t.shadowBlur=0,t.save(),t.beginPath();const O=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,l);if(e.listLayout!=="circular")if(O&&e.containerShape==="custom")try{const X=new Path2D(e.containerPath);t.translate(a,r),t.scale(i/100,n/100),t.clip(X),t.scale(100/i,100/n),t.translate(-a,-r)}catch{}else t.clip();const _=typeof y=="number"?y:h==="vertical"?y[0]:y[3];let P=(h==="vertical"?r:a)+u+_;if(t.textBaseline="middle",f.forEach((X,H)=>{const Q=e.listLayout||"linear",L=Q==="circular"?d:h==="vertical"?i:d,R=Q==="circular"||h==="vertical"?c:n;let et=0,U=0,lt=0;if(Q==="circular"){const Et=f.length||1,Ut=Math.PI*2/Et,re=e.circularStartAngle||0,he=e.circularRadius||100,nt=u*.01+re*Math.PI/180,yt=H*Ut+nt,Tt=a+i/2,_t=r+n/2;et=Tt+Math.cos(yt)*he-L/2,U=_t+Math.sin(yt)*he-R/2,lt=yt+(e.itemRotation||0)*Math.PI/180}else et=h==="vertical"?a:P,U=h==="vertical"?P:r,lt=(e.itemRotation||0)*Math.PI/180;const x=C===H,F=w===H,z=F&&e.activeItemShape?e.activeItemShape:e.itemShape||"rectangle",st=F&&e.activeItemShape?e.activeItemPath:e.itemPath||"",N=e.itemCornerRadius||0;if(t.save(),lt!==0&&(t.translate(et+L/2,U+R/2),t.rotate(lt),t.translate(-(et+L/2),-(U+R/2))),F){const Et=this.createCanvasFill(t,b,L,R);t.fillStyle=Et||b;const Ut=t.globalAlpha;t.globalAlpha=Ut*.8,t.beginPath(),this.drawCustomShape(t,z,st,et,U,L,R,N)||(t.rect(et,U,L,R),t.fill()),t.globalAlpha=Ut}else if(x)t.fillStyle=m?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)",t.beginPath(),this.drawCustomShape(t,z,st,et,U,L,R,N)||(t.rect(et,U,L,R),t.fill());else if(S!=="transparent"){const Et=this.createCanvasFill(t,S,L,R);t.fillStyle=Et||S,t.beginPath(),this.drawCustomShape(t,z,st,et,U,L,R,N)||(t.rect(et,U,L,R),t.fill())}if(F||x){const Et=this.createCanvasFill(t,b,h==="vertical"?3:L,h==="vertical"?R:3);t.fillStyle=Et||b,h==="vertical"?t.fillRect(et,U,3,R):t.fillRect(et,U+R-3,L,3)}const gt=F?"#ffffff":m?"rgba(255, 255, 255, 0.9)":v;t.fillStyle=gt,t.font=F||x?"600 14px Inter, sans-serif":"400 14px Inter, sans-serif";const mt=typeof X=="string"?X:(X==null?void 0:X.label)||`Item ${H+1}`,ut=et+(h==="vertical"?16:L/2),wt=U+R/2;h==="horizontal"||Q==="circular"?t.textAlign="center":t.textAlign="left";const Mt=Q==="circular"?et+L/2:ut;t.fillText(mt,Mt,wt),t.restore(),P+=(h==="vertical"?c:d)+p}),t.restore(),e.showScrollbar!==!1){const X=(f.length||0)*(h==="vertical"?c:d)+((f.length||0)-1)*p,H=h==="vertical"?n:i,Q=e.listLayout||"linear",L=e.containerShape==="circle"||Q==="circular";if(X>H||Q==="circular"&&f.length>0){const R=e.scrollbarColor||"rgba(255,255,255,0.3)",et=e.scrollbarWidth||4;if(L){const U=Math.min(i,n)/2-et/2-2,lt=a+i/2,x=r+n/2;if(t.strokeStyle=R,t.lineWidth=et,t.lineCap="round",t.beginPath(),Q==="circular"){const F=Math.PI/4,z=-(u*.01)-Math.PI/2;t.arc(lt,x,U,z,z+F)}else{const F=Math.PI/2,z=H/X,st=F*z,N=-u/X*F,mt=-Math.PI/4+N;t.arc(lt,x,U,mt,mt+st)}t.stroke()}else{const U=H/X,lt=H*U,x=-u/X*H;t.fillStyle=R,h==="vertical"?t.fillRect(a+i-et-2,r+x,et,lt):t.fillRect(a+x,r+n-et-2,lt,et)}}}t.restore()}drawCustomShape(t,s,o,e,i,n,a,r){if(s==="circle"){const l=Math.min(n,a)/2;return t.arc(e+n/2,i+a/2,l,0,Math.PI*2),!1}else if(s==="pill"){const l=Math.min(n,a)/2;return this.drawListViewRect(t,e,i,n,a,l),!1}else if(s==="custom"&&o)try{const l=new Path2D(o);return t.save(),t.translate(e,i),t.scale(n/100,a/100),t.fill(l),t.restore(),!0}catch{return this.drawListViewRect(t,e,i,n,a,r),!1}return this.drawListViewRect(t,e,i,n,a,r),!1}updateListViewScrollFromPointer(t){var m,b;if(!this._lastPointerPos||!this._prevPointerPos)return;const s=t.options||{},o=s.orientation||"vertical",e=this._lastPointerPos.x-this._prevPointerPos.x,i=this._lastPointerPos.y-this._prevPointerPos.y;o==="vertical"?s.scrollOffset=(s.scrollOffset||0)+i:s.scrollOffset=(s.scrollOffset||0)+e;const n=s.listLayout||"linear",a=this.objectStates.get(t.id)||{},r=s.items||[],l=s.itemGap??10,h=s.itemHeight??50,f=s.itemWidth??200,p=a.width!==void 0?a.width:((m=t.geometry)==null?void 0:m.width)||200,c=a.height!==void 0?a.height:((b=t.geometry)==null?void 0:b.height)||300;if(n==="circular")return;const d=(r.length||0)*(o==="vertical"?h:f)+((r.length||0)-1)*l,y=Math.max(0,d-(o==="vertical"?c:p)+(s.padding*2||0));s.scrollOffset>0&&(s.scrollOffset=0),s.scrollOffset<-y&&(s.scrollOffset=-y)}updateListViewHoverFromPointer(t,s,o){const e=this.getListViewItemIndexAtPointer(t,s,o),i=t.options||{};i.hoveredIndex!==e&&(i.hoveredIndex=e)}getListViewItemIndexAtPointer(t,s,o){var D,W;const e=t.options||{},i=this.objectStates.get(t.id)||{},n=e.items||[];if(n.length===0)return null;const a=i.width!==void 0?i.width:((D=t.geometry)==null?void 0:D.width)||200,r=i.height!==void 0?i.height:((W=t.geometry)==null?void 0:W.height)||300,l=e.orientation||"vertical",h=e.itemGap??10,f=e.itemHeight??50,p=e.itemWidth??200,c=e.scrollOffset??0,d=e.padding??0,u=this.getWorldTransform(t.id),y=s-u.x,m=o-u.y,b=-u.rotation*(Math.PI/180),v=Math.cos(b),S=Math.sin(b),C=y*v-m*S,w=y*S+m*v,M=-a/2,I=-r/2,k=typeof d=="number"?d:l==="vertical"?d[0]:d[3];let T=(l==="vertical"?I:M)+c+k;const O=e.listLayout||"linear",_=n.length||1,P=Math.PI*2/_,E=e.circularStartAngle||0,A=e.circularRadius||100,B=c*.01+E*Math.PI/180;for(let X=0;X<n.length;X++){const H=O==="circular"?p:l==="vertical"?a:p,Q=O==="circular"||l==="vertical"?f:r;let L=0,R=0,et=0;if(O==="circular"){const U=X*P+B,lt=M+a/2,x=I+r/2;L=lt+Math.cos(U)*A-H/2,R=x+Math.sin(U)*A-Q/2,et=U+(e.itemRotation||0)*Math.PI/180}else L=l==="vertical"?M:T,R=l==="vertical"?T:I,et=(e.itemRotation||0)*Math.PI/180;if(et!==0){const U=L+H/2,lt=R+Q/2,x=C-U,F=w-lt,z=-et,st=x*Math.cos(z)-F*Math.sin(z)+U,N=x*Math.sin(z)+F*Math.cos(z)+lt;if(st>=L&&st<=L+H&&N>=R&&N<=R+Q)return X}else if(C>=L&&C<=L+H&&w>=R&&w<=R+Q)return X;T+=(l==="vertical"?f:p)+h}return null}drawListViewRect(t,s,o,e,i,n){t.beginPath(),this.drawRoundRect(t,s,o,e,i,n),t.fill()}solveBehaviors(t){if(!this.artboard)return;if(!this._lastPointerPos){this.frameCount%60;return}const{x:s,y:o}=this._lastPointerPos;this.artboard.objects.forEach(e=>{if(!e.behaviors||e.behaviors.length===0)return;const i=this.objectStates.get(e.id);i&&e.behaviors.forEach(n=>{var p,c,d,u,y,m,b,v,S,C,w,M,I,k,T,O,_,P,E,A,B,D,W,X,H,Q,L,R,et,U,lt,x,F,z,st,N,gt,mt,ut,wt,Mt,Et,Ut,re,he,nt,yt,Tt,_t,St,Ft,Gt,Bt,Wt,Jt,Yt,we,Me,Zt,le,Ee,Ie,ke,de,pe,ot,ft,it,G,at,V,dt,vt,Pt,Ht,kt,At,$,Xt,ne,ie,zt,Rt,Ct,ht,j,bt,Y,rt,tt,qt,jt,Se,Vt,te,Qt,Te,Ae,Oe,Le,xe,Re,Ye,Kt,ae,ue,Fe,$e,me,ge,ye,Pe,Xe,Ue,qe,De,Ke,Je;if(!n.enabled)return;const a=n.startTime||0,r=n.endTime||1/0;if(this.currentTime<a||this.currentTime>r)return;const l=i.x-s,h=i.y-o,f=Math.sqrt(l*l+h*h);if(this.frameCount%240===0&&Math.random()<.1&&this.log(`[ExodeUI] Executing ${n.type} on ${e.name}`),n.type===q.Proximity){const K=((p=n.settings)==null?void 0:p.radius)||300,Z=((c=n.settings)==null?void 0:c.falloff)||"smooth";let J=0;f<K&&(Z==="linear"?J=1-f/K:J=Math.pow(1-f/K,2)),n.sensors.forEach(pt=>{this.applyBehaviorSensor(i,pt,J,t,n.settings,e,l,h,f)})}else if(n.type===q.Magnetic){const K=((d=n.settings)==null?void 0:d.radius)||400,Z=((u=n.settings)==null?void 0:u.strength)||.5;if(f<K&&f>5){const J=1-f/K,pt=l*J*Z,Ot=h*J*Z;i.x-=pt*t*10,i.y-=Ot*t*10}}else if(n.type===q.Repel){const K=((y=n.settings)==null?void 0:y.radius)||300,Z=((m=n.settings)==null?void 0:m.strength)||1;if(f<K){const J=Math.pow(1-f/K,2);i.x+=l/(f||1)*J*60*Z*t*5,i.y+=h/(f||1)*J*60*Z*t*5}}else if(n.type===q.Orbit){const K=((b=n.settings)==null?void 0:b.speed)||1,Z=((v=n.settings)==null?void 0:v.radius)||30,J=this.currentTime*K*Math.PI*2;i.x+=Math.cos(J)*Z*t*5,i.y+=Math.sin(J)*Z*t*5,i.rotation+=2*t*5}else if(n.type===q.Vortex){const K=((S=n.settings)==null?void 0:S.radius)||400,Z=((C=n.settings)==null?void 0:C.speed)||2,J=((w=n.settings)==null?void 0:w.strength)||1;if(f<K){const pt=Math.pow(1-f/K,1.5),Ot=this.currentTime*Z*Math.PI*2,xt=Math.cos(Ot)*30-l*.4,$t=Math.sin(Ot)*30-h*.4;i.x+=xt*pt*J*t*5,i.y+=$t*pt*J*t*5,i.rotation+=5*pt*J*t*5,i.scale_x*=1-pt*.1*J*t,i.scale_y*=1-pt*.1*J*t}}else if(n.type===q.Fluid){const K=((M=n.settings)==null?void 0:M.radius)||300,Z=((I=n.settings)==null?void 0:I.strength)||1;if(f<K){const J=Math.pow(1-f/K,1.2),pt=l/(f||1)*J*1.2*Z,Ot=h/(f||1)*J*1.2*Z;i.x+=pt*10*t*5,i.y+=Ot*10*t*5,i.scale_x*=1+J*.3*Z*t,i.scale_y*=1+J*.3*Z*t}}else if(n.type===q.Elastic){const K=((k=n.settings)==null?void 0:k.radius)||300,Z=((T=n.settings)==null?void 0:T.strength)||1;if(f<K){const J=1-f/K;i.scale_x*=1+J*.4*Z*t,i.scale_y*=1+J*.4*Z*t}}else if(n.type===q.Holographic){const K=i.x-this.canvasWidth/2,Z=i.y-this.canvasHeight/2,J=((O=n.settings)==null?void 0:O.factor)||25;if(i.x-=K/1e3*J*t*5,i.y-=Z/1e3*J*t*5,i.style){const pt=1-Math.min(1,f/400);i.style.exposure=(i.style.exposure||1)+pt*.5*t}}else if(n.type===q.Sticky){const K=((_=n.settings)==null?void 0:_.radius)||80,Z=((P=n.settings)==null?void 0:P.strength)||1;if(f<K){const J=Math.pow(1-f/K,2);i.x-=l*J*Z*t*10,i.y-=h*J*Z*t*10,i.scale_x*=1-J*.1*Z*t,i.scale_y*=1-J*.1*Z*t}}else if(n.type===q.Dilation){const K=((E=n.settings)==null?void 0:E.size)||120,Z=((A=n.settings)==null?void 0:A.strength)||1;if(f<K){const J=1-f/K;i.scale_x*=1+J*.5*Z*t,i.scale_y*=1+J*.5*Z*t}}else if(n.type===q.Parallax){const K=((B=n.settings)==null?void 0:B.factor)||15,Z=((D=n.settings)==null?void 0:D.strength)||1,J=this.canvasWidth/2,pt=this.canvasHeight/2,Ot=this._lastPointerPos||{x:J,y:pt},xt=(Ot.x-J)/J,$t=(Ot.y-pt)/pt,oe=(((W=e.transform)==null?void 0:W.x)??0)+xt*K*Z,be=(((X=e.transform)==null?void 0:X.y)??0)+$t*K*Z,_e=(((H=e.transform)==null?void 0:H.rotate_x)??0)-$t*K*1.5*Z,ce=(((Q=e.transform)==null?void 0:Q.rotate_y)??0)+xt*K*1.5*Z,Ce=Math.min(1,10*t);i.x=this.lerp(i.x??((L=e.transform)==null?void 0:L.x)??0,oe,Ce),i.y=this.lerp(i.y??((R=e.transform)==null?void 0:R.y)??0,be,Ce),i.rotate_x=this.lerp(i.rotate_x??((et=e.transform)==null?void 0:et.rotate_x)??0,_e,Ce),i.rotate_y=this.lerp(i.rotate_y??((U=e.transform)==null?void 0:U.rotate_y)??0,ce,Ce)}else if(n.type===q.Fold){if(f<300){const K=1-f/300,Z=(l>0?-1:1)*K*10,J=1-K*.1,pt=h/300*K*20,Ot=-(l/300)*K*20,xt=Math.min(1,10*t);i.skew_x=this.lerp(i.skew_x??((lt=e.transform)==null?void 0:lt.skew_x)??0,Z,xt),i.scale_y=this.lerp(i.scale_y??((x=e.transform)==null?void 0:x.scale_y)??1,(((F=e.transform)==null?void 0:F.scale_y)??1)*J,xt),i.rotate_x=this.lerp(i.rotate_x??((z=e.transform)==null?void 0:z.rotate_x)??0,pt,xt),i.rotate_y=this.lerp(i.rotate_y??((st=e.transform)==null?void 0:st.rotate_y)??0,Ot,xt),i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"fold_overlay",intensity:((N=n.settings)==null?void 0:N.opacity)??.5}}}else if(n.type===q.Crumple){if(f<300){const K=1-f/300,Z=K*(Math.random()-.5)*5,J=K*(Math.random()-.5)*.05,pt=Math.min(1,15*t);i.skew_x=this.lerp(i.skew_x??((gt=e.transform)==null?void 0:gt.skew_x)??0,Z,pt),i.scale_x=this.lerp(i.scale_x??((mt=e.transform)==null?void 0:mt.scale_x)??1,(((ut=e.transform)==null?void 0:ut.scale_x)??1)*(1+J),pt),i.scale_y=this.lerp(i.scale_y??((wt=e.transform)==null?void 0:wt.scale_y)??1,(((Mt=e.transform)==null?void 0:Mt.scale_y)??1)*(1+J),pt),i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"crumple_overlay",intensity:((Et=n.settings)==null?void 0:Et.intensity)??1,scale:((Ut=n.settings)==null?void 0:Ut.scale)??2}}}else if(n.type===q.Squash){const K=((re=n.settings)==null?void 0:re.strength)||.8;f<(e.width||100)&&this.isMouseDown?(i.scale_y=this.lerp(i.scale_y??1,(((he=e.transform)==null?void 0:he.scale_y)??1)*K,.3),i.scale_x=this.lerp(i.scale_x??1,(((nt=e.transform)==null?void 0:nt.scale_x)??1)*(1+(1-K)*.4),.3)):(i.scale_y=this.lerp(i.scale_y??1,((yt=e.transform)==null?void 0:yt.scale_y)??1,.2),i.scale_x=this.lerp(i.scale_x??1,((Tt=e.transform)==null?void 0:Tt.scale_x)??1,.2))}else if(n.type===q.TextCounter){const K=((_t=n.settings)==null?void 0:_t.duration)||2,Z=((St=n.settings)==null?void 0:St.from)||0,J=((Ft=n.settings)==null?void 0:Ft.to)||100;n._runtimeStart===void 0&&(n._runtimeStart=this.currentTime);const pt=this.currentTime-n._runtimeStart,Ot=Math.min(1,pt/K),xt=Math.floor(Z+(J-Z)*Ot);if(((Gt=e.geometry)==null?void 0:Gt.type)==="Text"){const $t=((Bt=n.settings)==null?void 0:Bt.prefix)||"",oe=((Wt=n.settings)==null?void 0:Wt.suffix)||"";i.geometry||(i.geometry={...e.geometry}),i.geometry.text=`${$t}${xt}${oe}`}}else if(n.type===q.Spotlight){const K=((Jt=n.settings)==null?void 0:Jt.radius)||250,Z=((Yt=n.settings)==null?void 0:Yt.strength)||1.5;if(f<K){const J=Math.pow(1-f/K,2);i.style||(i.style={...e.style}),i.style.adjustments||(i.style.adjustments={...(we=e.style)==null?void 0:we.adjustments}),i.style.adjustments.exposure=(((Zt=(Me=e.style)==null?void 0:Me.adjustments)==null?void 0:Zt.exposure)||0)+J*Z*50}else(le=i.style)!=null&&le.adjustments&&(i.style.adjustments.exposure=this.lerp(i.style.adjustments.exposure||0,((Ie=(Ee=e.style)==null?void 0:Ee.adjustments)==null?void 0:Ie.exposure)||0,.1))}else if(n.type===q.Noise||n.type===q.Float){const K=(((ke=n.settings)==null?void 0:ke.frequency)||((de=n.settings)==null?void 0:de.speed)||1)*.002,Z=(((pe=n.settings)==null?void 0:pe.amplitude)||((ot=n.settings)==null?void 0:ot.range)||50)*(((ft=n.settings)==null?void 0:ft.strength)||1),J=Date.now();i.x+=Math.sin(J*K)*Z*t,i.y+=Math.cos(J*K*.8)*Z*t,i.rotation+=Math.sin(J*K*.5)*5*t}else if(n.type===q.Pulse){const K=(((it=n.settings)==null?void 0:it.speed)||1)*.005,Z=(((G=n.settings)==null?void 0:G.scale)||1.2)-1,J=Math.sin(Date.now()*K),pt=((at=n.settings)==null?void 0:at.strength)||1;i.scale_x*=1+J*Z*pt*t,i.scale_y*=1+J*Z*pt*t,i.style&&(i.style.exposure=(i.style.exposure||1)+Math.max(0,J)*.1*pt*t)}else if(n.type===q.Draggable){const K=((V=n.settings)==null?void 0:V.radius)||150,Z=this.draggingBehaviors.has(e.id);if(f<K||Z){const J=((dt=n.settings)==null?void 0:dt.strength)||1,pt=Z?1:Math.max(0,1-f/K);this.applyBehaviorSensor(i,se.PositionX,pt*J,t,n.settings),this.applyBehaviorSensor(i,se.PositionY,pt*J,t,n.settings)}}else if(n.type===q.Scroll){const K=((vt=n.settings)==null?void 0:vt.axis)||"vertical",Z=((Pt=n.settings)==null?void 0:Pt.factor)||.5,J=((Ht=n.settings)==null?void 0:Ht.strength)||1,pt=((kt=n.settings)==null?void 0:kt.scaleFactor)||0;(K==="vertical"||K==="both")&&(i.y+=this.scrollOffset.y*Z*J*t),(K==="horizontal"||K==="both")&&(i.x+=this.scrollOffset.x*Z*J*t),pt!==0&&(i.scale_x*=1+this.scrollOffset.y*pt*t,i.scale_y*=1+this.scrollOffset.y*pt*t)}else if(n.type===q.LookAt){const K=((At=n.settings)==null?void 0:At.factor)||1,Z=(($=n.settings)==null?void 0:$.strength)||1,J=Math.atan2(-h,-l)*(180/Math.PI),pt=i.rotation,Ot=(J-pt+180)%360-180;i.rotation+=Ot*K*Z*t*10}else if(n.type===q.Scan){const K=(((Xt=n.settings)==null?void 0:Xt.speed)||1)*.004,Z=((ne=n.settings)==null?void 0:ne.strength)||1,J=(Math.sin(Date.now()*K)+1)/2;i.style&&(i.style.exposure=(i.style.exposure||1)+J*Z*t*5),i.x+=(J-.5)*20*Z*t}else if(n.type===q.Glint)i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"glint_overlay",intensity:((ie=n.settings)==null?void 0:ie.strength)??.8};else if(n.type===q.Ratchet){const K=((zt=n.settings)==null?void 0:zt.steps)||12,Z=(((Rt=n.settings)==null?void 0:Rt.speed)||1)*30,J=Math.floor(i.rotation/(360/K))*(360/K);i.rotation=this.lerp(i.rotation,J+Z*t,.1)}else if(n.type===q.Jitter&&f<300){const K=((Ct=n.settings)==null?void 0:Ct.strength)||1,Z=(((ht=n.settings)==null?void 0:ht.intensity)||5)*K;i.x+=(Math.random()-.5)*Z*t*60,i.y+=(Math.random()-.5)*Z*t*60,i.rotation+=(Math.random()-.5)*Z*t*120}else if(n.type===q.Follower){const K=(j=n.settings)==null?void 0:j.targetId;if(K){const Z=this.objectStates.get(K);if(Z){const J=((bt=n.settings)==null?void 0:bt.stiffness)||.1,pt=Z.x-i.x,Ot=Z.y-i.y;i.x+=pt*J*t*60,i.y+=Ot*J*t*60}}}else if(n.type===q.Wrap)i.x<0?i.x=this.canvasWidth:i.x>this.canvasWidth&&(i.x=0),i.y<0?i.y=this.canvasHeight:i.y>this.canvasHeight&&(i.y=0);else if(n.type===q.Gravity){const K=((Y=n.settings)==null?void 0:Y.strength)||9.8;i.y+=K*t*10}else if(n.type===q.Velocity){const K=((rt=n.settings)==null?void 0:rt.vx)||0,Z=((tt=n.settings)==null?void 0:tt.vy)||0;i.x+=K*t*10,i.y+=Z*t*10}else if(n.type===q.Shear){const K=((qt=n.settings)==null?void 0:qt.strength)||1,Z=((jt=n.settings)==null?void 0:jt.radius)||300;if(f<Z){const J=1-f/Z;i.skew_x=this.lerp(i.skew_x||0,(((Se=e.transform)==null?void 0:Se.skew_x)||0)+J*K*30,.1)}else i.skew_x=this.lerp(i.skew_x||0,((Vt=e.transform)==null?void 0:Vt.skew_x)||0,.05)}else if(n.type===q.Lens){const K=((te=n.settings)==null?void 0:te.radius)||200,Z=((Qt=n.settings)==null?void 0:Qt.strength)||.5;if(f<K){const J=Math.pow(1-f/K,2);i.scale_x=this.lerp(i.scale_x??1,(((Te=e.transform)==null?void 0:Te.scale_x)??1)*(1+J*Z),.2),i.scale_y=this.lerp(i.scale_y??1,(((Ae=e.transform)==null?void 0:Ae.scale_y)??1)*(1+J*Z),.2)}else i.scale_x=this.lerp(i.scale_x??1,((Oe=e.transform)==null?void 0:Oe.scale_x)??1,.1),i.scale_y=this.lerp(i.scale_y??1,((Le=e.transform)==null?void 0:Le.scale_y)??1,.1)}else if(n.type===q.LayoutAnimation){const K=((xe=n.settings)==null?void 0:xe.watchProperties)||["x","y","scale_x","scale_y","opacity","rotation"],Z=((Re=n.settings)==null?void 0:Re.duration)||.3;this._layoutAnimCache.has(e.id)||this._layoutAnimCache.set(e.id,new Map);const J=this._layoutAnimCache.get(e.id);for(const pt of K){const Ot=this.getObjectProperty(i,e,pt);if(Ot===void 0)continue;const xt=J.get(pt);if(!xt)J.set(pt,{from:Ot,to:Ot,startTime:this.currentTime,duration:0});else if(xt.to!==Ot){const oe=this.getObjectProperty(i,e,pt);J.set(pt,{from:oe??xt.from,to:Ot,startTime:this.currentTime,duration:((Ye=n.settings)==null?void 0:Ye.duration)??Z})}const $t=J.get(pt);if($t.duration>0&&$t.from!==$t.to){const oe=this.currentTime-$t.startTime,be=Math.min(1,oe/$t.duration),_e=this.applyEasing(be,((Kt=n.settings)==null?void 0:Kt.easing)||"easeOutCubic"),ce=$t.from+($t.to-$t.from)*_e;this.setObjectProperty(i,e,pt,ce)}}}else if(n.type===q.StateReactive){this._layoutAnimCache.has(e.id)||this._layoutAnimCache.set(e.id,new Map);const K=this._layoutAnimCache.get(e.id),Z=((ae=n.settings)==null?void 0:ae.defaultDuration)||.3,J=["x","y","scale_x","scale_y","opacity","rotation","style.fill.color","style.stroke.width","geometry.cornerRadius","style.blur.value","style.shadow.blur","style.shadow.offsetX","style.shadow.offsetY"];for(const pt of J){const Ot=this.getObjectProperty(i,e,pt);if(Ot===void 0||typeof Ot!="number")continue;const xt=K.get(pt);if(!xt)K.set(pt,{from:Ot,to:Ot,startTime:this.currentTime,duration:0});else if(xt.to!==Ot){const oe=this.getObjectProperty(i,e,pt);K.set(pt,{from:oe??xt.from,to:Ot,startTime:this.currentTime,duration:Z})}const $t=K.get(pt);if($t.duration>0&&$t.from!==$t.to){const oe=this.currentTime-$t.startTime,be=Math.min(1,oe/$t.duration),_e=this.applyEasing(be,((ue=n.settings)==null?void 0:ue.defaultEasing)||"easeOutCubic"),ce=$t.from+($t.to-$t.from)*_e;this.setObjectProperty(i,e,pt,ce)}}}else if(n.type===q.SpringChain){const K=((Fe=n.settings)==null?void 0:Fe.connections)||[],Z=(($e=n.settings)==null?void 0:$e.globalDamping)||.3;this._springChainState.has(e.id)||this._springChainState.set(e.id,new Map);const J=this._springChainState.get(e.id);for(const Ot of K){if(!J.has(Ot.targetId)){const xt=this.objectStates.get(Ot.targetId);J.set(Ot.targetId,{x:(xt==null?void 0:xt.x)??0,y:(xt==null?void 0:xt.y)??0,vx:0,vy:0})}J.has(e.id)||J.set(e.id,{x:i.x,y:i.y,vx:0,vy:0})}const pt=J.get(e.id);if(pt){pt.x=i.x,pt.y=i.y;for(const Ot of K){const xt=J.get(Ot.targetId);if(!xt)continue;const $t=xt.x-pt.x,oe=xt.y-pt.y,be=Math.sqrt($t*$t+oe*oe)||.001,ce=(be-(Ot.restLength||50))*(Ot.stiffness||.8),Ce=$t/be*ce,Qe=oe/be*ce;pt.vx+=Ce*t*10,pt.vy+=Qe*t*10,xt.vx-=Ce*t*10,xt.vy-=Qe*t*10,pt.vx*=1-Z*t*10,pt.vy*=1-Z*t*10,xt.vx*=1-Z*t*10,xt.vy*=1-Z*t*10;const ve=this.objectStates.get(Ot.targetId);ve&&(ve.x+=xt.vx*t,ve.y+=xt.vy*t)}i.x+=pt.vx*t,i.y+=pt.vy*t}}else if(n.type===q.ParticleEmitter){const K=((me=n.settings)==null?void 0:me.rate)||10,Z=((ge=n.settings)==null?void 0:ge.speed)||100,J=((ye=n.settings)==null?void 0:ye.size)||5,pt=((Pe=n.settings)==null?void 0:Pe.lifetime)||2,Ot=((Xe=n.settings)==null?void 0:Xe.gravity)||0,xt=((Ue=n.settings)==null?void 0:Ue.color)||"#ffffff",$t=((qe=n.settings)==null?void 0:qe.maxParticles)||200,oe=(De=n.settings)!=null&&De.rateInputId?this.inputs.get(n.settings.rateInputId)??K:K,be=(Ke=n.settings)!=null&&Ke.gravityInputId?this.inputs.get(n.settings.gravityInputId)??Ot:Ot,_e=(Je=n.settings)!=null&&Je.speedInputId?this.inputs.get(n.settings.speedInputId)??Z:Z;this._emitterPools.has(e.id)||this._emitterPools.set(e.id,[]);const ce=this._emitterPools.get(e.id);let Ce=0;n._pendingBurst&&n._pendingBurst>0&&(Ce=n._pendingBurst,n._pendingBurst=0);const Qe=Math.floor(oe*t)+(Ce||0);for(let ve=0;ve<Math.min(Qe,$t-ce.length);ve++){const fe=Math.random()*Math.PI*2,ms=_e*(.5+Math.random()*.5);ce.push({x:i.x,y:i.y,vx:Math.cos(fe)*ms,vy:Math.sin(fe)*ms,life:0,maxLife:pt*(.5+Math.random()*.5),size:J*(.5+Math.random()),color:xt,opacity:1})}for(let ve=ce.length-1;ve>=0;ve--){const fe=ce[ve];fe.vy+=be*t*10,fe.x+=fe.vx*t,fe.y+=fe.vy*t,fe.life+=t,fe.opacity=Math.max(0,1-fe.life/fe.maxLife),fe.life>=fe.maxLife&&ce.splice(ve,1)}}})})}applyBehaviorSensor(t,s,o,e,i,n,a=0,r=0,l=1){var d,u,y,m,b,v,S,C,w,M,I,k,T,O,_,P,E,A,B,D,W,X,H,Q;const h=(i==null?void 0:i.intensity)||(i==null?void 0:i.strength)||1,f=Math.min(1,15*e),p=l>0?a/l:0,c=l>0?r/l:0;switch(s){case se.Scale:{const L=((d=n==null?void 0:n.transform)==null?void 0:d.scale_x)??1,R=((u=n==null?void 0:n.transform)==null?void 0:u.scale_y)??1,et=L*(1+o*h*.4),U=R*(1+o*h*.4);t.scale_x=(t.scale_x??L)*(1-f)+et*f,t.scale_y=(t.scale_y??R)*(1-f)+U*f;break}case se.Opacity:{const L=((y=n==null?void 0:n.transform)==null?void 0:y.opacity)??100,R=Math.max(0,Math.min(100,L-o*h*100));t.opacity=(t.opacity??L)*(1-f)+R*f;break}case se.RotateZ:{const L=((m=n==null?void 0:n.transform)==null?void 0:m.rotation)??0,R=L+o*h*45;t.rotation=(t.rotation??L)*(1-f)+R*f;break}case se.RotateX:{const L=((b=n==null?void 0:n.transform)==null?void 0:b.rotate_x)??0,R=L-c*o*h*60;t.rotate_x=(t.rotate_x??L)*(1-f)+R*f;break}case se.RotateY:{const L=((v=n==null?void 0:n.transform)==null?void 0:v.rotate_y)??0,R=L+p*o*h*60;t.rotate_y=(t.rotate_y??L)*(1-f)+R*f;break}case se.PositionX:{const L=((S=n==null?void 0:n.transform)==null?void 0:S.x)??0,R=L-p*o*h*40;t.x=(t.x??L)*(1-f)+R*f;break}case se.PositionY:{const L=((C=n==null?void 0:n.transform)==null?void 0:C.y)??0,R=L-c*o*h*40;t.y=(t.y??L)*(1-f)+R*f;break}case se.SkewX:{const L=((w=n==null?void 0:n.transform)==null?void 0:w.skew_x)??0,R=L+p*o*h*45;t.skew_x=(t.skew_x??L)*(1-f)+R*f,t.skew_x>85&&(t.skew_x=85),t.skew_x<-85&&(t.skew_x=-85);break}case se.Blur:{t.style||(t.style={...n==null?void 0:n.style}),t.style.blur||(t.style.blur={...(M=n==null?void 0:n.style)==null?void 0:M.blur});const L=((k=(I=n==null?void 0:n.style)==null?void 0:I.blur)==null?void 0:k.amount)||0,R=L+o*((i==null?void 0:i.blur)||20)*h;t.style.blur.amount=(t.style.blur.amount??L)*(1-f)+R*f;break}case se.Exposure:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(T=n==null?void 0:n.style)==null?void 0:T.adjustments});const L=((_=(O=n==null?void 0:n.style)==null?void 0:O.adjustments)==null?void 0:_.exposure)||0,R=L+o*((i==null?void 0:i.exposure)||50)*h;t.style.adjustments.exposure=(t.style.adjustments.exposure??L)*(1-f)+R*f;break}case se.HueShift:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(P=n==null?void 0:n.style)==null?void 0:P.adjustments});const L=((A=(E=n==null?void 0:n.style)==null?void 0:E.adjustments)==null?void 0:A.hue)||0,R=L+o*((i==null?void 0:i.hue)||180)*h;t.style.adjustments.hue=(t.style.adjustments.hue??L)*(1-f)+R*f;break}case se.Negative:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(B=n==null?void 0:n.style)==null?void 0:B.adjustments});const L=((W=(D=n==null?void 0:n.style)==null?void 0:D.adjustments)==null?void 0:W.negative)||0,R=L+o*((i==null?void 0:i.negative)||100)*h;t.style.adjustments.negative=(t.style.adjustments.negative??L)*(1-f)+R*f;break}case se.CornerRadius:{const L=((X=n==null?void 0:n.transform)==null?void 0:X.corner_radius)||0,R=L+o*h*50;t.corner_radius=(t.corner_radius??L)*(1-f)+R*f;break}case se.StrokeWidth:{t.style||(t.style={...n==null?void 0:n.style});const L=((H=n==null?void 0:n.style)==null?void 0:H.borderWidth)||0,R=L+o*h*10;t.style.borderWidth=(t.style.borderWidth??L)*(1-f)+R*f;break}case se.LetterSpacing:{t.geometry||(t.geometry={});const L=((Q=n==null?void 0:n.geometry)==null?void 0:Q.letterSpacing)||0,R=L+o*h*10;t.geometry.letterSpacing=(t.geometry.letterSpacing??L)*(1-f)+R*f;break}}}getObjectProperty(t,s,o){const e=o.replace(/\[(\d+)\]/g,".$1").split(".");let i=t;for(const n of e){if(i==null||typeof i!="object")return;if(n==="style"&&t.style===void 0){i=s.style;continue}i=i[n]}return typeof i=="number"?i:void 0}setObjectProperty(t,s,o,e){const i=o.replace(/\[(\d+)\]/g,".$1").split(".");let n=t;for(let r=0;r<i.length-1;r++){const l=i[r];if(n[l]===void 0||n[l]===null){const h=s,f=i.slice(0,r+1).reduce((d,u)=>d==null?void 0:d[u],h),p=i[r+1],c=!isNaN(Number(p));n[l]=f!==void 0?Array.isArray(f)?[...f]:{...f}:c?[]:{}}n=n[l]}const a=i[i.length-1];n!=null&&(n[a]=e)}applyEasing(t,s){switch(s){case"easeOutCubic":return 1-Math.pow(1-t,3);case"easeInCubic":return t*t*t;case"easeInOutCubic":return t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;case"easeOutQuad":return t*(2-t);case"easeInQuad":return t*t;case"easeInOutQuad":return t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2;case"easeOutExpo":return t===1?1:1-Math.pow(2,-10*t);case"easeOutBack":return 1+2.70158*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2);case"easeOutElastic":{const o=2*Math.PI/3;return t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*o)+1}case"easeOutBounce":return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375;case"linear":return t;default:return 1-Math.pow(1-t,3)}}lerp(t,s,o){return t*(1-o)+s*o}deepMerge(t,s){if(!t)return s;if(!s)return t;if(typeof t!="object"||typeof s!="object"||t===null||s===null)return s;if(Array.isArray(s)){if(!Array.isArray(t))return s;const e=[...t];for(let i=0;i<s.length;i++)s[i]&&typeof s[i]=="object"&&!Array.isArray(s[i])&&t[i]&&typeof t[i]=="object"?e[i]=this.deepMerge(t[i],s[i]):e[i]=s[i];return e}const o={...t};for(const e in s)Object.prototype.hasOwnProperty.call(s,e)&&(s[e]&&typeof s[e]=="object"&&!Array.isArray(s[e])?o[e]=this.deepMerge(t[e],s[e]):Array.isArray(s[e])?o[e]=this.deepMerge(t[e],s[e]):o[e]=s[e]);return o}renderFittedImage(t,s,o,e,i,n,a="cover"){const r=s.naturalWidth,l=s.naturalHeight,h=r/l,f=i/n;let p=i,c=n,d=o,u=e;a==="cover"?h>f?(p=n*h,d=o-(p-i)/2):(c=i/h,u=e-(c-n)/2):a==="contain"&&(h>f?(c=i/h,u=e+(n-c)/2):(p=n*h,d=o+(i-p)/2)),t.drawImage(s,d,u,p,c)}}const ai=Lt.forwardRef(({artboard:g,src:t,style:s,autoPlay:o=!0,fit:e="Contain",alignment:i="Center",onReady:n,onTrigger:a,onInputUpdate:r,onComponentChange:l,onToggle:h,onInputChange:f,onInputFocus:p,onInputBlur:c,onLog:d,onLogicUpdate:u,onButtonClick:y,onGraphPointClick:m,currentTime:b,revision:v=0,scrollY:S,scrollX:C,mouseX:w,mouseY:M,isMouseDown:I,inputs:k,interactive:T=!0,onNavigation:O},_)=>{const P=Lt.useRef(null),E=Lt.useRef(null);E.current||(E.current=new ys);const A=Lt.useRef(void 0),B=Lt.useRef(0),D=Lt.useRef(null),W=Lt.useRef(v),X=Lt.useRef(null),[,H]=Lt.useState(g||null),Q=Lt.useRef(!0);Lt.useImperativeHandle(_,()=>P.current),Lt.useEffect(()=>(Q.current=!0,()=>{Q.current=!1,A.current&&cancelAnimationFrame(A.current)}),[]),Lt.useEffect(()=>{E.current.setLayout(e,i)},[e,i]),Lt.useEffect(()=>{const x=E.current;a&&x.setTriggerCallback(a),r&&x.setInputUpdateCallback((F,z)=>r({[F]:z})),l&&x.setComponentChangeCallback(F=>l(F)),h&&x.setToggleCallback(h),f&&x.setInputChangeCallback(f),p&&x.setInputFocusCallback(p),c&&x.setInputBlurCallback(c),d&&x.setOnLogCallback(F=>d(F,"info")),u&&x.setLogicUpdateCallback(u),y&&x.setButtonClickCallback(y),m&&x.setGraphPointClickCallback(F=>m(F.objectId,F)),O&&x.setNavigationCallback(O)},[a,r,l,h,f,p,c,d,u,y,m,O]),Lt.useEffect(()=>{(async()=>{let F=g;if(t&&!g)try{t.startsWith("{")?F=JSON.parse(t):F=await(await fetch(t)).json()}catch(z){console.error("[ExodeUI] Failed to load src:",z)}if(F){const z=E.current,st=F.id||F.name||"default";(D.current!==st||W.current!==v||X.current!==F)&&(z.load(F),D.current=st,W.current=v,X.current=F,H(F),B.current=0,z.advance(0)),n&&n(z)}})()},[g,t,v]),Lt.useEffect(()=>{const x=F=>{if(!E.current||!Q.current)return;const z=E.current,st=P.current;if(!st)return;const N=st.getContext("2d");if(!N)return;const gt=F/1e3;B.current===0&&(B.current=gt);let mt=gt-B.current;mt>.1&&(mt=.1),B.current=gt;const ut=st.getBoundingClientRect(),wt=window.devicePixelRatio||1,Mt=Math.round(ut.width*wt),Et=Math.round(ut.height*wt);(st.width!==Mt||st.height!==Et)&&(st.width=Mt,st.height=Et);try{o?z.advance(mt):b!==void 0&&z.seek(b),z.render(N,st.width,st.height)}catch(Ut){console.error("[ExodeUICanvas] Error in animation loop:",Ut),d&&d(`[Error] Animation loop crashed: ${Ut}`,"error")}A.current=requestAnimationFrame(x)};return A.current=requestAnimationFrame(x),()=>{A.current&&cancelAnimationFrame(A.current)}},[o,b]),Lt.useEffect(()=>{const x=E.current;S!==void 0&&x.updateInput("scrollY",S),C!==void 0&&x.updateInput("scrollX",C),w!==void 0&&x.updateInput("mouseX",w),M!==void 0&&x.updateInput("mouseY",M),I!==void 0&&x.updateInput("isMouseDown",I),k&&Object.entries(k).forEach(([F,z])=>x.updateInput(F,z))},[S,C,w,M,I,k]);const L=(x,F)=>{if(!T||!P.current)return;x.stopPropagation(),"nativeEvent"in x&&x.nativeEvent&&typeof x.nativeEvent.stopImmediatePropagation=="function"?x.nativeEvent.stopImmediatePropagation():typeof x.stopImmediatePropagation=="function"&&x.stopImmediatePropagation();const z=P.current,st=z.getBoundingClientRect(),N=x.clientX-st.left,gt=x.clientY-st.top,mt=window.devicePixelRatio||1;(F==="click"||F==="down"||F==="up")&&d&&d(`[Canvas] Pointer ${F} at rect(${Math.round(N)},${Math.round(gt)}) mapped to buffer(${Math.round(N*mt)},${Math.round(gt*mt)})`,"info"),E.current.handlePointerInput(F,N*mt,gt*mt,z.width,z.height)};Lt.useEffect(()=>{if(!T)return;const x=z=>{var st,N,gt;((st=document.activeElement)==null?void 0:st.tagName)==="INPUT"||((N=document.activeElement)==null?void 0:N.tagName)==="TEXTAREA"||(gt=E.current)==null||gt.handleKeyDown(z)},F=z=>{var st,N,gt;((st=document.activeElement)==null?void 0:st.tagName)==="INPUT"||((N=document.activeElement)==null?void 0:N.tagName)==="TEXTAREA"||(gt=E.current)==null||gt.handleKeyUp(z)};return window.addEventListener("keydown",x),window.addEventListener("keyup",F),()=>{window.removeEventListener("keydown",x),window.removeEventListener("keyup",F)}},[T]);const[R,et]=Lt.useState([]);Lt.useEffect(()=>{if(g&&g.objects){const x=g.objects.filter(F=>{var z,st;return F.type==="Joystick"&&((z=F.inputBinding)==null?void 0:z.type)==="keyboard"&&((st=F.inputBinding.keyboardConfig)==null?void 0:st.showVirtualKeyboard)});et(x)}},[g]);const[,U]=Lt.useState(0);Lt.useEffect(()=>{if(R.length===0)return;let x;const F=()=>{U(z=>z+1),x=requestAnimationFrame(F)};return x=requestAnimationFrame(F),()=>cancelAnimationFrame(x)},[R.length]);const lt=()=>R.map(x=>{const F=x.inputBinding.keyboardConfig,z=ut=>{var Mt;const wt={key:ut,code:ut,preventDefault:()=>{}};(Mt=E.current)==null||Mt.handleKeyDown(wt)},st=ut=>{var Mt;const wt={key:ut,code:ut,preventDefault:()=>{}};(Mt=E.current)==null||Mt.handleKeyUp(wt)},N=E.current,gt=ut=>N&&N.activeKeys?N.activeKeys.has(ut.toLowerCase()):!1,mt=ut=>({width:"50px",height:"50px",background:ut?"rgba(255, 255, 255, 0.4)":"rgba(0, 0, 0, 0.4)",border:"1px solid rgba(255, 255, 255, 0.2)",borderRadius:"12px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontWeight:"bold",fontSize:"18px",userSelect:"none",cursor:"pointer",backdropFilter:"blur(8px)",transition:"background 0.1s",boxShadow:ut?"none":"0 4px 6px rgba(0,0,0,0.1)"});return Dt.jsxs("div",{style:{position:"absolute",bottom:"40px",right:"40px",display:"flex",flexDirection:"column",alignItems:"center",gap:"8px",pointerEvents:"auto",zIndex:100},children:[Dt.jsx("div",{style:mt(gt(F.upKey)),onMouseDown:()=>z(F.upKey),onMouseUp:()=>st(F.upKey),onMouseLeave:()=>st(F.upKey),onTouchStart:ut=>{ut.preventDefault(),z(F.upKey)},onTouchEnd:ut=>{ut.preventDefault(),st(F.upKey)},children:F.upKey.toUpperCase()}),Dt.jsxs("div",{style:{display:"flex",gap:"8px"},children:[Dt.jsx("div",{style:mt(gt(F.leftKey)),onMouseDown:()=>z(F.leftKey),onMouseUp:()=>st(F.leftKey),onMouseLeave:()=>st(F.leftKey),onTouchStart:ut=>{ut.preventDefault(),z(F.leftKey)},onTouchEnd:ut=>{ut.preventDefault(),st(F.leftKey)},children:F.leftKey.toUpperCase()}),Dt.jsx("div",{style:mt(gt(F.downKey)),onMouseDown:()=>z(F.downKey),onMouseUp:()=>st(F.downKey),onMouseLeave:()=>st(F.downKey),onTouchStart:ut=>{ut.preventDefault(),z(F.downKey)},onTouchEnd:ut=>{ut.preventDefault(),st(F.downKey)},children:F.downKey.toUpperCase()}),Dt.jsx("div",{style:mt(gt(F.rightKey)),onMouseDown:()=>z(F.rightKey),onMouseUp:()=>st(F.rightKey),onMouseLeave:()=>st(F.rightKey),onTouchStart:ut=>{ut.preventDefault(),z(F.rightKey)},onTouchEnd:ut=>{ut.preventDefault(),st(F.rightKey)},children:F.rightKey.toUpperCase()})]})]},x.id)});return Dt.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[Dt.jsx("canvas",{ref:P,onPointerDown:x=>{var F;L(x,"down"),(F=P.current)==null||F.focus()},onPointerMove:x=>L(x,"move"),onPointerUp:x=>L(x,"up"),onPointerCancel:x=>L(x,"up"),onClick:x=>L(x,"click"),onWheel:x=>{E.current.handleWheel(x.deltaX,x.deltaY)},onKeyDown:x=>E.current.handleKeyDown(x.nativeEvent),onKeyUp:x=>E.current.handleKeyUp(x.nativeEvent),onContextMenu:x=>x.preventDefault(),tabIndex:0,style:{...s,width:"100%",height:"100%",outline:"none",display:"block",touchAction:"none",pointerEvents:T?"auto":"none"}}),lt()]})});function ri(){const[g,t]=Lt.useState(null),s=Lt.useCallback((f,p)=>{g==null||g.setInputBool(f,p)},[g]),o=Lt.useCallback((f,p)=>{g==null||g.setInputNumber(f,p)},[g]),e=Lt.useCallback(f=>{g==null||g.fireTrigger(f)},[g]),i=Lt.useCallback((f,p)=>{g==null||g.setInputText(f,p)},[g]),n=Lt.useCallback((f,p)=>{g==null||g.setInputNumberArray(f,p)},[g]),a=Lt.useCallback((f,p)=>{g==null||g.setInputStringArray(f,p)},[g]),r=Lt.useCallback((f,p)=>{g==null||g.updateObjectOptions(f,p)},[g]),l=Lt.useCallback((f,p,c)=>{g==null||g.updateConstraint(f,p,c)},[g]),h=Lt.useCallback((f,p)=>{g==null||g.updateGraphData(f,p)},[g]);return Lt.useCallback(f=>g==null?void 0:g.getInputValue(f),[g]),{setEngine:t,engine:g,setInputBool:s,setInputNumber:o,fireTrigger:e,setInputText:i,setInputNumberArray:n,setInputStringArray:a,updateConstraint:l,updateGraphData:h,updateObjectOptions:r}}const li=({artboard:g,config:t})=>{const s={...g.seo,...t},o=s.enableSmartExtraction!==!1;Lt.useEffect(()=>{const a=s.title||g.name;a&&(document.title=a);let r=s.description;if(!r&&o){const f=g.objects.filter(p=>{var c;return((c=p.geometry)==null?void 0:c.type)==="Text"}).sort((p,c)=>{var d,u;return(((d=c.geometry.text)==null?void 0:d.length)||0)-(((u=p.geometry.text)==null?void 0:u.length)||0)});f.length>0&&(r=f[0].geometry.text)}r&&(e("name","description",r),e("property","og:description",r)),s.keywords&&s.keywords.length>0&&e("name","keywords",s.keywords.join(", "));const l=s.ogImage||g.backgroundImage;l&&e("property","og:image",l),a&&e("property","og:title",a),e("property","og:type","website")},[s,g,o]);const e=(a,r,l)=>{let h=document.querySelector(`meta[${a}="${r}"]`);h||(h=document.createElement("meta"),h.setAttribute(a,r),document.head.appendChild(h)),h.setAttribute("content",l)},i=()=>{const a=[];return a.push(Dt.jsx("h1",{children:s.title||g.name},"artboard-title")),g.objects.forEach((l,h)=>{var f,p;if(!(l.visible===!1||l.isVisible===!1))if(((f=l.geometry)==null?void 0:f.type)==="Text"){const c=l.geometry.text;c&&(l.geometry.fontSize>24?a.push(Dt.jsx("h2",{children:c},l.id||h)):a.push(Dt.jsx("p",{children:c},l.id||h)))}else if(((p=l.geometry)==null?void 0:p.type)==="Image"){const c=l.geometry.src,d=l.altText||l.name||"Illustration";a.push(Dt.jsx("img",{src:c,alt:d},l.id||h))}else l.type==="Button"&&a.push(Dt.jsx("button",{children:l.name||"Button"},l.id||h))}),a},n=s.jsonLd||{"@context":"https://schema.org","@type":"VisualArtwork",name:s.title||g.name,description:s.description,image:s.ogImage||g.backgroundImage,abstract:"Animated interface created with ExodeUI"};return Dt.jsxs("div",{id:`exode-seo-${g.id||"default"}`,"aria-hidden":"false",style:{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:"0",zIndex:-1},children:[i(),Dt.jsx("script",{type:"application/ld+json",children:JSON.stringify(n)})]})},ci={version:"6.3.48"}.version;Nt.BehaviorSensor=se,Nt.BehaviorType=q,Nt.ConditionOp=je,Nt.ExodeSEO=li,Nt.ExodeUICanvas=ai,Nt.ExodeUIEngine=ys,Nt.LogicOp=It,Nt.RapierPhysics=is,Nt.VERSION=ci,Nt.useExodeUI=ri,Object.defineProperty(Nt,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(Ut,Vt){typeof exports=="object"&&typeof module<"u"?Vt(exports,require("react/jsx-runtime"),require("react"),require("@chenglou/pretext"),require("@dimforge/rapier2d-compat"),require("lz-string")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","@chenglou/pretext","@dimforge/rapier2d-compat","lz-string"],Vt):(Ut=typeof globalThis<"u"?globalThis:Ut||self,Vt(Ut.ExodeUIReact={},Ut.jsxRuntime,Ut.React,Ut.pretext,Ut.Rapier,Ut.LZString))})(this,(function(Ut,Vt,_t,He,ie,bs){"use strict";var fi=Object.defineProperty;var hi=(Ut,Vt,_t)=>Vt in Ut?fi(Ut,Vt,{enumerable:!0,configurable:!0,writable:!0,value:_t}):Ut[Vt]=_t;var nt=(Ut,Vt,_t)=>hi(Ut,typeof Vt!="symbol"?Vt+"":Vt,_t);function Ss(b){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(b){for(const s in b)if(s!=="default"){const o=Object.getOwnPropertyDescriptor(b,s);Object.defineProperty(t,s,o.get?o:{enumerable:!0,get:()=>b[s]})}}return t.default=b,Object.freeze(t)}const vs=Ss(bs);var H=(b=>(b.Proximity="Proximity",b.Magnetic="Magnetic",b.Repel="Repel",b.Orbit="Orbit",b.Vortex="Vortex",b.Fluid="Fluid",b.Elastic="Elastic",b.Holographic="Holographic",b.Sticky="Sticky",b.Dilation="Dilation",b.Parallax="Parallax",b.Noise="Noise",b.Float="Float",b.Pulse="Pulse",b.Draggable="Draggable",b.Scroll="Scroll",b.LookAt="LookAt",b.Glint="Glint",b.Scan="Scan",b.Ratchet="Ratchet",b.Jitter="Jitter",b.Follower="Follower",b.Wrap="Wrap",b.Typewriter="Typewriter",b.Scramble="Scramble",b.Wave="Wave",b.Bounce="Bounce",b.TextTrail="TextTrail",b.Reveal3D="Reveal3D",b.RevealSlide="RevealSlide",b.RevealBlur="RevealBlur",b.TextLiquid="TextLiquid",b.TextVortex="TextVortex",b.TextExplosion="TextExplosion",b.TextRain="TextRain",b.TextGravity="TextGravity",b.TextMatrix="TextMatrix",b.TextNeon="TextNeon",b.TextDissolve="TextDissolve",b.TextOrganic="TextOrganic",b.TextBreathe="TextBreathe",b.TextSpin="TextSpin",b.TextMagnet="TextMagnet",b.TextPerspective="TextPerspective",b.TextMirror="TextMirror",b.TextFloral="TextFloral",b.TextSmoke="TextSmoke",b.TextVariable="TextVariable",b.TextZing="TextZing",b.TextElastic="TextElastic",b.TextGlitch3D="TextGlitch3D",b.GlitchText="GlitchText",b.TextCounter="TextCounter",b.Squash="Squash",b.Spotlight="Spotlight",b.Lens="Lens",b.Gravity="Gravity",b.Velocity="Velocity",b.Shear="Shear",b.LayoutAnimation="LayoutAnimation",b.SpringChain="SpringChain",b.ParticleEmitter="ParticleEmitter",b.StateReactive="StateReactive",b.Fold="Fold",b.Crumple="Crumple",b))(H||{}),ne=(b=>(b.Scale="Scale",b.Opacity="Opacity",b.RotateZ="RotateZ",b.RotateX="RotateX",b.RotateY="RotateY",b.PositionX="PositionX",b.PositionY="PositionY",b.SkewX="SkewX",b.Blur="Blur",b.Exposure="Exposure",b.HueShift="HueShift",b.Negative="Negative",b.CornerRadius="CornerRadius",b.StrokeWidth="StrokeWidth",b.BoxShadow="BoxShadow",b.FontSize="FontSize",b.LetterSpacing="LetterSpacing",b))(ne||{}),je=(b=>(b.Equal="Equal",b.NotEqual="NotEqual",b.GreaterThan="GreaterThan",b.LessThan="LessThan",b.GreaterEqual="GreaterEqual",b.LessEqual="LessEqual",b.IsTrue="IsTrue",b.IsFalse="IsFalse",b))(je||{}),Ct=(b=>(b.AND="AND",b.OR="OR",b.NOT="NOT",b.XOR="XOR",b.OBJECT="OBJECT",b.PROPERTY="PROPERTY",b.GET_PROPERTY="GET_PROPERTY",b.SET_PROPERTY="SET_PROPERTY",b.ADD="ADD",b.SUB="SUB",b.MUL="MUL",b.DIV="DIV",b.MOD="MOD",b.POW="POW",b.ABS="ABS",b.ROUND="ROUND",b.FLOOR="FLOOR",b.CEIL="CEIL",b.SIN="SIN",b.COS="COS",b.TAN="TAN",b.CLAMP="CLAMP",b.REMAP="REMAP",b.EQ="EQ",b.NEQ="NEQ",b.GT="GT",b.LT="LT",b.GTE="GTE",b.LTE="LTE",b.IF_ELSE="IF_ELSE",b.VALUE="VALUE",b.INPUT="INPUT",b.LOG="LOG",b.SCROLL_X="SCROLL_X",b.SCROLL_Y="SCROLL_Y",b.MOUSE_X="MOUSE_X",b.MOUSE_Y="MOUSE_Y",b.IS_MOUSE_DOWN="IS_MOUSE_DOWN",b.EFFECTOR="EFFECTOR",b.MONITOR="MONITOR",b.DELAY="DELAY",b.SPRING_PULL="SPRING_PULL",b.SPRING_SETTLE="SPRING_SETTLE",b.EMIT="EMIT",b))(Ct||{});function Cs(b){if(b.length<5)return b;const t=new Set("aeiouyAEIOUY".split(""));if(/[\u4E00-\u9FFF\u3400-\u4DBF]/.test(b))return b;let o="";for(let e=0;e<b.length;e++){if(o+=b[e],e>=b.length-2)continue;const i=t.has(b[e]),n=t.has(b[e+1]),a=t.has(b[e+2]);i&&!n&&a&&(o+=""),i&&!n&&!a&&e>=1&&(o+="")}return o}function ws(b){return b.replace(/\b([a-zA-Z]{4,})\b/g,(t,s)=>Cs(s))}function Ms(b,t,s){return b}function Is(b,t,s){return b}const Ne=new Map;function ts(b){var I;const{text:t,fontFamily:s="Inter",fontSize:o=16,fontWeight:e=400,fontStyle:i="normal",lineHeight:n=1.2,width:a=200,letterSpacing:r=0,paragraphSpacing:c=0,paragraphIndent:d=0,textCase:u="none",segments:p=[],enableSegments:l=!1}=b;let h=String(t||"");u==="uppercase"?h=h.toUpperCase():u==="lowercase"?h=h.toLowerCase():u==="capitalize"&&(h=h.replace(/\b\w/g,T=>T.toUpperCase())),b.hyphenation===!0&&(h=ws(h));const f=`${i} ${e} ${o}px "${s}", sans-serif`,g=`${h}|${f}|${r}|${c}|${d}|${l}|${JSON.stringify(p)}|hyp:${!!b.hyphenation}|comp:${b.composer}|bal:${!!b.balanceRaggedLines}`;let y=Ne.get(g);const m=typeof CanvasRenderingContext2D<"u"?CanvasRenderingContext2D.prototype.measureText:null,S=function(T){if(!m)return{width:0,fontBoundingBoxAscent:0,fontBoundingBoxDescent:0};const k=m.call(this,T);return r!==0&&T&&T.length>0?{...k,width:k.width+(T.length-1)*r}:k};if(!y){try{if(r!==0&&typeof CanvasRenderingContext2D<"u"&&(CanvasRenderingContext2D.prototype.measureText=S),l&&p&&p.length>0){const T=p.map(k=>{let E=k.text||"";const P=k.textCase||u||"none";return P==="uppercase"?E.toUpperCase():P==="lowercase"?E.toLowerCase():P==="capitalize"?E.replace(/\b\w/g,_=>_.toUpperCase()):E}).join("");if(y=He.prepareWithSegments(T,f),y){let k=0,E=o;for(const P of p){let _=P.text||"";if(!_)continue;const L=P.textCase||u||"none";L==="uppercase"?_=_.toUpperCase():L==="lowercase"?_=_.toLowerCase():L==="capitalize"&&(_=_.replace(/\b\w/g,R=>R.toUpperCase()));const A=P.fontSize||o;A>E&&(E=A);const W=`${P.fontStyle||i} ${P.fontWeight||e} ${A}px "${P.fontFamily||s}", sans-serif`,B=He.prepareWithSegments(_,W);if(B&&B.widths)for(let R=0;R<B.widths.length;R++){const Y=k+R;if(Y<y.widths.length){y.widths[Y]=B.widths[R];const G=B.kinds[R];if(G===2){const z=_[R];z===`
|
|
2
|
+
`||z==="\r"?y.kinds[Y]=2:y.kinds[Y]=0}else y.kinds[Y]=G}}k+=_.length}y.fullText=T,y.maxFontSize=E}}else y=He.prepareWithSegments(h,f);y&&Ne.set(g,y)}catch(T){return console.error("[ExodeUI] Pretext prepare failed:",T),{width:a,height:0,lineCount:0,lines:[]}}finally{r!==0&&typeof CanvasRenderingContext2D<"u"&&m&&(CanvasRenderingContext2D.prototype.measureText=m)}if(Ne.size>500){const T=Ne.keys().next().value;T&&Ne.delete(T)}}if(d>0&&y&&y.widths&&!y.indentApplied){const T=[...y.widths],k=y.fullText||h;let E=!0;for(let P=0;P<k.length;P++)E&&T[P]!==void 0&&(T[P]+=d,E=!1),(k[P]===`
|
|
3
|
+
`||k[P]==="\r")&&(E=!0,k[P]==="\r"&&k[P+1]===`
|
|
4
|
+
`&&P++);y={...y,widths:T,indentApplied:!0}}if(!y)return{width:a,height:0,lineCount:0,lines:[]};let v=n;typeof v=="string"&&(v=parseFloat(v)),v>5&&o>0&&(v=v/o),r!==0&&(CanvasRenderingContext2D.prototype.measureText=S);let C;try{const T=y.maxFontSize||o;if(a>=1e5){const k=h.split(/\r\n|\r|\n/);C={lines:k.map(E=>({text:E,width:0})),height:k.length*(v*T),lineCount:k.length}}else C=He.layoutWithLines(y,a,v*T)}finally{r!==0&&m&&(CanvasRenderingContext2D.prototype.measureText=m)}let w=(C==null?void 0:C.height)!==void 0&&C.height>0?C.height:(((I=C==null?void 0:C.lines)==null?void 0:I.length)||0)*v*o;if(c>0&&C&&C.lines&&C.lines.length>1){let T=0;const k=y.fullText||t;for(let E=0;E<C.lines.length-1;E++)T+=C.lines[E].text.length,(k[T]===`
|
|
5
|
+
`||k[T]==="\r")&&(w+=c,T++,k[T-1]==="\r"&&k[T]===`
|
|
6
|
+
`&&T++)}let M=(C==null?void 0:C.lines)||[];return b.composer==="every-line"&&M.length>1&&(M=Ms(M)),b.balanceRaggedLines===!0&&M.length>1&&(M=Is(M)),{width:a,height:w,lineCount:M.length,lines:M}}function es(b,t,s){let o=String(b||"").trim();if(o&&!isNaN(Number(o))&&!o.includes(" ")&&!o.endsWith("fr")&&!o.endsWith("px")&&!o.endsWith("%")){const r=Math.max(1,parseInt(o));o=new Array(r).fill("1fr").join(" ")}const e=o.split(/\s+/).filter(Boolean),i=new Array(e.length).fill(0);let n=t-(e.length-1)*s,a=0;if(e.forEach((r,c)=>{if(r.endsWith("px")){const d=parseFloat(r);i[c]=d,n-=d}else r.endsWith("fr")?a+=parseFloat(r):r==="auto"&&(i[c]=100,n-=100)}),a>0&&n>0){const r=n/a;e.forEach((c,d)=>{c.endsWith("fr")&&(i[d]=r*parseFloat(c))})}return i}function ss(b,t,s){try{const o=b.autoLayout;return!o||!o.enabled?{childUpdates:[]}:(o.mode||"linear")==="grid"?Ts(b,t,s):ks(b,t,s)}catch(o){return console.error("Layout Engine Error:",o),{childUpdates:[]}}}function ks(b,t,s){var _,L;const o=b.autoLayout,{direction:e,spacing:i,padding:n,align:a,wrap:r}=o,c=e==="vertical",d=t.map(A=>{const W=s(A.id),B=A.geometry;let R=(W==null?void 0:W.width)??B.width??100,Y=(W==null?void 0:W.height)??B.height??100;if(B.type==="Ellipse"||B.type==="Polygon"||B.type==="Star"){const G=(W==null?void 0:W.radius)??B.radius??(W==null?void 0:W.outer_radius)??B.outer_radius??50;R=G*2,Y=G*2}else if(B.type==="Text"){const G=ts({text:(W==null?void 0:W.text)??B.text??"",fontFamily:B.fontFamily,fontSize:B.fontSize,fontWeight:B.fontWeight,fontStyle:B.fontStyle,lineHeight:B.lineHeight,width:B.width||200,letterSpacing:B.letterSpacing,paragraphSpacing:B.paragraphSpacing,paragraphIndent:B.paragraphIndent,textCase:B.textCase,segments:B.segments,enableSegments:B.enableSegments});Y=G.height,B.width||(R=G.width)}return R*=A.transform.scale_x||1,Y*=A.transform.scale_y||1,{id:A.id,w:R,h:Y,original:A}});let u=b.width,p=b.height;const l=((_=b.layoutProps)==null?void 0:_.width)==="hug",h=((L=b.layoutProps)==null?void 0:L.height)==="hug",f=[];let g=[],y=0,m=0;const S=u-n.left-n.right,v=p-n.top-n.bottom;d.forEach(A=>{r&&g.length>0&&(c?m+i+A.h>v:y+i+A.w>S)?(f.push({children:g,width:y,height:m}),g=[A],y=A.w,m=A.h):(g.push(A),c?(y=Math.max(y,A.w),m+=(g.length>1?i:0)+A.h):(y+=(g.length>1?i:0)+A.w,m=Math.max(m,A.h)))}),g.length>0&&f.push({children:g,width:y,height:m}),l&&!c&&(u=Math.max(...f.map(A=>A.width),0)+n.left+n.right),h&&c&&(p=Math.max(...f.map(A=>A.height),0)+n.top+n.bottom);const C=[];let w=n.left,M=n.top;const I=a.toLowerCase(),T=I==="center"||I.endsWith("-center"),k=I.endsWith("-right"),E=I==="center"||I.startsWith("center-"),P=I.startsWith("bottom-");return f.forEach(A=>{let W=w,B=M;c?E?B=n.top+(p-n.top-n.bottom-A.height)/2:P&&(B=p-n.bottom-A.height):T?W=n.left+(u-n.left-n.right-A.width)/2:k&&(W=u-n.right-A.width),A.children.forEach(R=>{var F,Z;let Y=W,G=B;c?T?Y+=(A.width-R.w)/2:k&&(Y+=A.width-R.w):E?G+=(A.height-R.h)/2:P&&(G+=A.height-R.h);const z=((F=R.original.layoutProps)==null?void 0:F.width)==="fill",O=((Z=R.original.layoutProps)==null?void 0:Z.height)==="fill";C.push({id:R.id,x:Y+R.w/2-u/2,y:G+R.h/2-p/2,width:z&&c?A.width:void 0,height:O?c?void 0:A.height:void 0}),c?B+=R.h+i:W+=R.w+i}),c?w+=A.width+i:M+=A.height+i}),{frameWidth:l?u:void 0,frameHeight:h?p:void 0,childUpdates:C}}function Ts(b,t,s){const o=b.autoLayout;if(!o)return{childUpdates:[]};const{gridColumns:e,gridRows:i,columnGap:n=0,rowGap:a=0,padding:r,align:c}=o;let d=b.width,u=b.height;const p=d-r.left-r.right,l=u-r.top-r.bottom,h=es(e||"1fr",p,n),f=es(i||"auto",l,a),g=h.length>0?h.reduce((k,E)=>k+E,0)+(h.length-1)*n:0,y=f.length>0?f.reduce((k,E)=>k+E,0)+(f.length-1)*a:0,m=c.toLowerCase(),S=m==="center"||m.endsWith("-center"),v=m.endsWith("-right"),C=m==="center"||m.startsWith("center-"),w=m.startsWith("bottom-");let M=0,I=0;S?M=(p-g)/2:v&&(M=p-g),C?I=(l-y)/2:w&&(I=l-y);const T=[];return t.forEach((k,E)=>{var Z,st;const P=E%h.length||0,_=Math.floor(E/h.length)||0;_>=f.length&&f.push(100);const L=h[P],A=f[_];let W=r.left+M+h.slice(0,P).reduce((at,ct)=>at+ct+n,0),B=r.top+I+f.slice(0,_).reduce((at,ct)=>at+ct+a,0);const R=s(k.id),Y=k.geometry;let G=(R==null?void 0:R.width)??Y.width??100,z=(R==null?void 0:R.height)??Y.height??100;if(Y.type==="Ellipse"||Y.type==="Polygon"||Y.type==="Star"){const at=(R==null?void 0:R.radius)??Y.radius??(R==null?void 0:R.outer_radius)??Y.outer_radius??50;G=at*2,z=at*2}G*=k.transform.scale_x||1,z*=k.transform.scale_y||1;let O=W,F=B;S?O+=(L-G)/2:v&&(O+=L-G),C?F+=(A-z)/2:w&&(F+=A-z),T.push({id:k.id,x:O+G/2-d/2,y:F+z/2-u/2,width:((Z=k.layoutProps)==null?void 0:Z.width)==="fill"?L:void 0,height:((st=k.layoutProps)==null?void 0:st.height)==="fill"?A:void 0})}),{childUpdates:T}}class is{constructor(){nt(this,"world",null);nt(this,"bodies",new Map);nt(this,"colliders",new Map);nt(this,"joints",new Map);nt(this,"initialized",!1);nt(this,"bodyIdByCollider",new Map);nt(this,"onCollisionCB",null);nt(this,"eventQueue",null)}setCollisionCallback(t){this.onCollisionCB=t}async init(t){this.initialized||(await ie.init(),this.world=new ie.World(new ie.Vector2(t.x*100,t.y*100)),this.eventQueue=new ie.EventQueue(!0),this.initialized=!0)}destroy(){this.bodies.clear(),this.colliders.clear(),this.joints.clear(),this.world&&(this.world.free(),this.world=null),this.initialized=!1}setGravity(t){this.world&&(this.world.gravity=new ie.Vector2(t.x*100,t.y*100))}createBody(t){if(!this.world){console.warn("[RapierPhysics] World not initialized");return}this.bodies.has(t.id)&&this.removeBody(t.id);const s=t.isStatic?ie.RigidBodyDesc.fixed():ie.RigidBodyDesc.dynamic();s.setTranslation(t.x,t.y),t.rotation!==void 0&&s.setRotation(t.rotation);const o=this.world.createRigidBody(s);let e;switch(t.type){case"Rectangle":e=ie.ColliderDesc.cuboid(t.width/2,t.height/2);break;case"Ellipse":e=ie.ColliderDesc.ball(Math.max(t.width,t.height)/2);break;case"Triangle":case"Star":case"Polygon":e=ie.ColliderDesc.cuboid(t.width/2,t.height/2);break;default:e=ie.ColliderDesc.cuboid(t.width/2,t.height/2)}if(t.friction!==void 0&&e.setFriction(t.friction),t.restitution!==void 0&&e.setRestitution(t.restitution),t.density!==void 0)e.setDensity(t.density);else if(t.mass!==void 0&&!t.isStatic){const n=t.width*t.height;e.setDensity(t.mass/n)}t.isSensor&&e.setSensor(!0);const i=this.world.createCollider(e,o);this.bodyIdByCollider.set(i.handle,t.id),t.frictionAir!==void 0&&o.setLinearDamping(t.frictionAir*10),this.bodies.set(t.id,o),this.colliders.set(t.id,i)}removeBody(t){const s=this.bodies.get(t),o=this.colliders.get(t);o&&this.bodyIdByCollider.delete(o.handle),s&&this.world&&(this.world.removeRigidBody(s),this.bodies.delete(t),this.colliders.delete(t))}step(t){if(!this.world)return;this.world.step(this.eventQueue);const s=this.onCollisionCB,o=this.eventQueue;s&&o&&o.drainContactEvents((e,i,n)=>{const a=this.bodyIdByCollider.get(e),r=this.bodyIdByCollider.get(i);a&&r&&s(a,r,n)})}getPosition(t){const s=this.bodies.get(t);if(!s)return null;const o=s.translation();return{x:o.x,y:o.y}}getRotation(t){const s=this.bodies.get(t);return s?s.rotation():null}getVelocity(t){const s=this.bodies.get(t);if(!s)return null;const o=s.linvel();return{x:o.x,y:o.y}}setPosition(t,s,o){const e=this.bodies.get(t);e&&e.setTranslation(new ie.Vector2(s,o),!0)}setRotation(t,s){const o=this.bodies.get(t);o&&o.setRotation(s,!0)}setVelocity(t,s,o){const e=this.bodies.get(t);e&&e.setLinvel(new ie.Vector2(s,o),!0)}setAngularVelocity(t,s){const o=this.bodies.get(t);o&&o.setAngvel(s,!0)}applyForce(t,s,o){const e=this.bodies.get(t);e&&e.addForce(new ie.Vector2(s,o),!0)}applyImpulse(t,s,o){const e=this.bodies.get(t);e&&e.applyImpulse(new ie.Vector2(s,o),!0)}createJoint(t){if(!this.world){console.warn("[RapierPhysics] World not initialized");return}this.joints.has(t.id)&&this.removeJoint(t.id);const s=this.bodies.get(t.bodyA),o=this.bodies.get(t.bodyB);if(!s||!o){console.warn(`[RapierPhysics] Cannot create joint ${t.id}: bodyA (${t.bodyA}) or bodyB (${t.bodyB}) not found`);return}const e=new ie.Vector2(t.anchorA.x,t.anchorA.y),i=new ie.Vector2(t.anchorB.x,t.anchorB.y);let n;if(t.type==="Distance"){const a=t.length??100,r=t.stiffness??100,c=t.damping??10;n=ie.JointData.spring(a,r,c,e,i)}else n=ie.JointData.revolute(e,i);try{const a=this.world.createImpulseJoint(n,s,o,!0);this.joints.set(t.id,a)}catch(a){console.error(`[RapierPhysics] Failed to create joint ${t.id}:`,a)}}removeJoint(t){const s=this.joints.get(t);if(s&&this.world){try{this.world.removeImpulseJoint(s,!0)}catch(o){console.error(`[RapierPhysics] Failed to remove joint ${t}:`,o)}this.joints.delete(t)}}}const ns=b=>b,Ps=b=>b>0?1:0,_s=b=>b<1?0:1,os=b=>b*b,as=b=>b*(2-b),rs=b=>b<.5?2*b*b:-1+(4-2*b)*b,Es=b=>b*b*b,As=b=>--b*b*b+1,Os=b=>b<.5?4*b*b*b:(b-1)*(2*b-2)*(2*b-2)+1,Ls=b=>b*b*b*b,xs=b=>1- --b*b*b*b,Rs=b=>b<.5?8*b*b*b*b:1-8*--b*b*b*b,Fs=b=>b*b*b*b*b,$s=b=>1+--b*b*b*b*b,Bs=b=>b<.5?16*b*b*b*b*b:1+16*--b*b*b*b*b,Ws=b=>1-Math.cos(b*Math.PI/2),Ys=b=>Math.sin(b*Math.PI/2),Xs=b=>-(Math.cos(Math.PI*b)-1)/2,Ds=b=>b===0?0:Math.pow(2,10*(b-1)),Gs=b=>b===1?1:1-Math.pow(2,-10*b),Ns=b=>b===0?0:b===1?1:b<.5?Math.pow(2,20*b-10)/2:(2-Math.pow(2,-20*b+10))/2,zs=b=>1-Math.sqrt(1-b*b),Vs=b=>Math.sqrt(1- --b*b),Hs=b=>b<.5?(1-Math.sqrt(1-4*b*b))/2:(Math.sqrt(1-(-2*b+2)*(-2*b+2))+1)/2,Ue=1.70158,qe=Ue*1.525,ls=Ue+1,Us=b=>ls*b*b*b-Ue*b*b,qs=b=>1+ls*Math.pow(b-1,3)+Ue*Math.pow(b-1,2),Ks=b=>b<.5?Math.pow(2*b,2)*((qe+1)*2*b-qe)/2:(Math.pow(2*b-2,2)*((qe+1)*(b*2-2)+qe)+2)/2,cs=2*Math.PI/3,fs=2*Math.PI/4.5,Js=b=>b===0?0:b===1?1:-Math.pow(2,10*b-10)*Math.sin((b*10-10.75)*cs),Qs=b=>b===0?0:b===1?1:Math.pow(2,-10*b)*Math.sin((b*10-.75)*cs)+1,Zs=b=>b===0?0:b===1?1:b<.5?-(Math.pow(2,20*b-10)*Math.sin((20*b-11.125)*fs))/2:Math.pow(2,-20*b+10)*Math.sin((20*b-11.125)*fs)/2+1,Ke=b=>b<1/2.75?7.5625*b*b:b<2/2.75?7.5625*(b-=1.5/2.75)*b+.75:b<2.5/2.75?7.5625*(b-=2.25/2.75)*b+.9375:7.5625*(b-=2.625/2.75)*b+.984375,js=b=>1-Ke(1-b),ti=Ke,ei=b=>b<.5?(1-Ke(1-2*b))/2:(1+Ke(2*b-1))/2,Ze=new Map,ze=(b,t,s,o)=>{const e=`${b},${t},${s},${o}`;if(Ze.has(e))return Ze.get(e);const i=d=>(1-3*s+3*b)*d*d*d+(3*s-6*b)*d*d+3*b*d,n=d=>(1-3*o+3*t)*d*d*d+(3*o-6*t)*d*d+3*t*d,a=d=>3*(1-3*s+3*b)*d*d+2*(3*s-6*b)*d+3*b,r=d=>{let u=d;for(let p=0;p<8;p++){const l=i(u)-d;if(Math.abs(l)<1e-6)return u;const h=a(u);if(Math.abs(h)<1e-6)break;u=u-l/h}return u},c=d=>d===0?0:d===1?1:n(r(d));return Ze.set(e,c),c},hs=b=>{const t=b.match(/cubic-bezier\s*\(\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*,\s*([-?\d.]+)\s*\)/);if(!t)return null;const[,s,o,e,i]=t.map(Number);return ze(s,o,e,i)},ds={ease:ze(.25,.1,.25,1),"ease-in":ze(.42,0,1,1),"ease-out":ze(0,0,.58,1),"ease-in-out":ze(.42,0,.58,1)},Je={Linear:ns,EaseInQuad:os,EaseOutQuad:as,EaseInOutQuad:rs,EaseInCubic:Es,EaseOutCubic:As,EaseInOutCubic:Os,EaseInQuart:Ls,EaseOutQuart:xs,EaseInOutQuart:Rs,EaseInQuint:Fs,EaseOutQuint:$s,EaseInOutQuint:Bs,EaseInSine:Ws,EaseOutSine:Ys,EaseInOutSine:Xs,EaseInExpo:Ds,EaseOutExpo:Gs,EaseInOutExpo:Ns,EaseInCirc:zs,EaseOutCirc:Vs,EaseInOutCirc:Hs,EaseInBack:Us,EaseOutBack:qs,EaseInOutBack:Ks,EaseInElastic:Js,EaseOutElastic:Qs,EaseInOutElastic:Zs,EaseInBounce:js,EaseOutBounce:ti,EaseInOutBounce:ei,EaseIn:os,EaseOut:as,EaseInOut:rs,StepStart:Ps,StepEnd:_s},si=b=>{const t=b.trim(),s=t.toLowerCase();if(Je[t])return Je[t];const o=Object.keys(Je).find(i=>i.toLowerCase()===s);if(o)return Je[o];const e=Object.keys(ps).find(i=>i.toLowerCase()===s);if(e){const i=hs(ps[e].value);if(i)return i}if(ds[s])return ds[s];if(s.startsWith("cubic-bezier")){const i=hs(t);if(i)return i}return ns},ps={Snappy:{label:"Snappy",description:"High energy, quick arrival.",value:"cubic-bezier(0.2, 1, 0.2, 1)"},Bouncy:{label:"Bouncy",description:"Springy with an overshoot.",value:"cubic-bezier(0.2, 0.9, 0.4, 1.3)"},Gentle:{label:"Gentle",description:"Smooth and organic flow.",value:"cubic-bezier(0.4, 0, 0.6, 1)"},Stiff:{label:"Stiff",description:"Solid and reliable movement.",value:"cubic-bezier(0.3, 1, 0.7, 1)"},Floating:{label:"Floating",description:"Weightless and airy transition.",value:"cubic-bezier(0.5, 0, 0.5, 1)"},Sudden:{label:"Sudden",description:"Instant, direct movement.",value:"cubic-bezier(1, 0, 1, 1)"},Elastic:{label:"Elastic",description:"Extreme overshoot and spring.",value:"cubic-bezier(0.5, 1.5, 0.5, 1.5)"},Sharp:{label:"Sharp",description:"Fast start, very hard stop.",value:"cubic-bezier(0.1, 0.9, 0.1, 1)"},Fluid:{label:"Fluid",description:"Natural high-end flow.",value:"cubic-bezier(0.4, 0, 0.2, 1)"},Heavy:{label:"Heavy",description:"Slow start, massive impact.",value:"cubic-bezier(0.6, 0, 1, 1)"}},ii=(b,t,s,o,e)=>{if(!b||!t||!s)return b;const i=o.scale_x??1,n=o.scale_y??1,a=(r,c,d)=>{let u=0,p=0;const l=o.rotation*Math.PI/180,h=Math.cos(l),f=Math.sin(l),g=r*i*h-c*n*f+o.x,y=r*i*f+c*n*h+o.y;d.forEach(I=>{const T=e(I.boneId);if(!T)return;const k={x:T.x,y:T.y,rotation:T.rotation,scaleX:T.scale_x??1,scaleY:T.scale_y??1},E=s[I.boneId]||[1,0,0,1,0,0],P=g*E[0]+y*E[2]+E[4],_=g*E[1]+y*E[3]+E[5],L=k.rotation*Math.PI/180,A=Math.cos(L),W=Math.sin(L),B=P*k.scaleX*A-_*k.scaleY*W+k.x,R=P*k.scaleX*W+_*k.scaleY*A+k.y;u+=B*I.amount,p+=R*I.amount});const m=[...d].sort((I,T)=>T.amount-I.amount);if(m.length>=2&&m[0].amount>0&&m[1].amount>0){const I=e(m[0].boneId),T=e(m[1].boneId);if(I&&T&&I.length!==void 0&&T.length!==void 0){const k=I.length*(I.scale_y??1),E=I.rotation*Math.PI/180,P=I.x-k*Math.sin(E),_=I.y+k*Math.cos(E),L=T.length*(T.scale_y??1),A=T.rotation*Math.PI/180,W=T.x-L*Math.sin(A),B=T.y+L*Math.cos(A);let R=null,Y=null,G=!1;const z=1;if(Math.hypot(I.x-T.x,I.y-T.y)<z||Math.hypot(I.x-W,I.y-B)<z?(R=I.x,Y=I.y):(Math.hypot(P-T.x,_-T.y)<z||Math.hypot(P-W,_-B)<z)&&(R=P,Y=_,G=!0),R!==null&&Y!==null){const O=s[m[0].boneId]||[1,0,0,1,0,0],F=O[0]*O[3]-O[1]*O[2];let Z=0,st=0;if(F!==0){const at=(O[2]*O[5]-O[3]*O[4])/F,ct=(O[1]*O[4]-O[0]*O[5])/F,dt=Math.atan2(-O[1],O[3]);if(!G)Z=at,st=ct;else{const N=-O[2]/F,ot=O[0]/F,bt=Math.hypot(N,ot),St=I.length*bt;Z=at-St*Math.sin(dt),st=ct+St*Math.cos(dt)}const $=Math.hypot(g-Z,y-st),X=Math.hypot(u-R,p-Y);if(X>0&&$>0){const N=Math.max(X,.01),ot=Math.min($/N,3),bt=R+(u-R)*ot,St=Y+(p-Y)*ot,Mt=m[0].amount,pt=m[1].amount,wt=Math.min(Mt,pt)*2,yt=1-Math.pow(1-wt,4);u=u*(1-yt)+bt*yt,p=p*(1-yt)+St*yt}}}}}const S=o.rotation*Math.PI/180,v=Math.cos(S),C=Math.sin(S),w=u-o.x,M=p-o.y;return{x:(w*v+M*C)/i,y:(-w*C+M*v)/n}};return b.map((r,c)=>{const d=t[c];if(!d||d.length===0)return{...r};const u={...r,...a(r.x,r.y,d)};if(r.in_x!==void 0&&r.in_y!==void 0){const p=a(r.in_x,r.in_y,d);u.in_x=p.x,u.in_y=p.y}if(r.out_x!==void 0&&r.out_y!==void 0){const p=a(r.out_x,r.out_y,d);u.out_x=p.x,u.out_y=p.y}return u})};function ni(b,t,s,o,e){const i=b*s*.01,n=t*s*.01,a=Math.sin(e*12.9898)*43758.5453%(Math.PI*2),r=Math.cos(e*78.233)*43758.5453%(Math.PI*2);return(Math.sin(i+a)*Math.cos(n+r)+.5*Math.sin(i*2.1-r)*Math.cos(n*2.3+a)+.25*Math.sin(i*4.5+a)*Math.cos(n*4.2-r))/1.75*o}function oi(b,t,s,o,e,i,n=0,a=0){const r=[];if(!b)return[];const c=b.type;if(c==="Rectangle"||c==="Image"||c==="Frame"){const h=Math.max(20,Math.floor((t+s)/10)),f=Math.max(2,Math.floor(h*(t/(t+s)))),g=Math.max(2,Math.floor(h*(s/(t+s))));for(let y=0;y<f;y++)r.push({x:-t/2+t/f*y,y:-s/2,nx:0,ny:-1});for(let y=0;y<g;y++)r.push({x:t/2,y:-s/2+s/g*y,nx:1,ny:0});for(let y=0;y<f;y++)r.push({x:t/2-t/f*y,y:s/2,nx:0,ny:1});for(let y=0;y<g;y++)r.push({x:-t/2,y:s/2-s/g*y,nx:-1,ny:0})}else if(c==="Ellipse"){const h=Math.max(60,Math.floor(Math.PI*Math.max(t,s)/5));for(let f=0;f<h;f++){const g=f/h*Math.PI*2,y=Math.cos(g),m=Math.sin(g);r.push({x:y*t/2,y:m*s/2,nx:y,ny:m})}}else if(c==="Triangle"){const h={x:0,y:-s/2},f={x:t/2,y:s/2},g={x:-t/2,y:s/2},y=20;let m=f.x-h.x,S=f.y-h.y,v=Math.hypot(m,S),C=-S/v,w=m/v;for(let M=0;M<y;M++)r.push({x:h.x+m*(M/y),y:h.y+S*(M/y),nx:C,ny:w});m=g.x-f.x,S=g.y-f.y,v=Math.hypot(m,S),C=-S/v,w=m/v;for(let M=0;M<y;M++)r.push({x:f.x+m*(M/y),y:f.y+S*(M/y),nx:C,ny:w});m=h.x-g.x,S=h.y-g.y,v=Math.hypot(m,S),C=-S/v,w=m/v;for(let M=0;M<y;M++)r.push({x:g.x+m*(M/y),y:g.y+S*(M/y),nx:C,ny:w})}else for(let f=0;f<80;f++){const g=f/80*Math.PI*2,y=Math.cos(g),m=Math.sin(g);r.push({x:y*t/2,y:m*s/2,nx:y,ny:m})}const d=n*Math.PI/180,u=Math.cos(d),p=Math.sin(d);return r.map(h=>{const f=ni(h.x,h.y,e,o,i),g=h.nx*(1-a)+u*a,y=h.ny*(1-a)+p*a;let m=Math.hypot(g,y);return m===0&&(m=1),{x:h.x+g/m*f,y:h.y+y/m*f}})}const us={default:{label:"Default",colors:["#6366f1","#f59e0b"],cardBackground:"rgba(255,255,255,0.04)",cardBorderColor:"rgba(255,255,255,0.08)",gridColor:"rgba(255,255,255,0.06)",axisLabelColor:"rgba(255,255,255,0.5)",legendColor:"rgba(255,255,255,0.7)",barGradient:!0},neon:{label:"Neon",colors:["#00f5ff","#ff00e5"],cardBackground:"rgba(0,0,0,0.5)",cardBorderColor:"rgba(0,245,255,0.2)",gridColor:"rgba(0,245,255,0.08)",axisLabelColor:"rgba(0,245,255,0.6)",legendColor:"rgba(0,245,255,0.8)",barGradient:!0},pastel:{label:"Pastel",colors:["#a5b4fc","#fcd34d"],cardBackground:"rgba(255,255,255,0.06)",cardBorderColor:"rgba(255,255,255,0.12)",gridColor:"rgba(255,255,255,0.08)",axisLabelColor:"rgba(255,255,255,0.45)",legendColor:"rgba(255,255,255,0.65)",barGradient:!1},warm:{label:"Warm",colors:["#f97316","#ef4444"],cardBackground:"rgba(30,10,0,0.4)",cardBorderColor:"rgba(249,115,22,0.2)",gridColor:"rgba(249,115,22,0.08)",axisLabelColor:"rgba(253,186,116,0.7)",legendColor:"rgba(253,186,116,0.85)",barGradient:!0},ocean:{label:"Ocean",colors:["#06b6d4","#0ea5e9"],cardBackground:"rgba(0,20,40,0.5)",cardBorderColor:"rgba(6,182,212,0.2)",gridColor:"rgba(6,182,212,0.06)",axisLabelColor:"rgba(125,211,252,0.6)",legendColor:"rgba(125,211,252,0.8)",barGradient:!0},mono:{label:"Mono",colors:["rgba(255,255,255,0.9)","rgba(255,255,255,0.4)"],cardBackground:"rgba(255,255,255,0.03)",cardBorderColor:"rgba(255,255,255,0.1)",gridColor:"rgba(255,255,255,0.05)",axisLabelColor:"rgba(255,255,255,0.4)",legendColor:"rgba(255,255,255,0.6)",barGradient:!1}},gs={default:{label:"Default",colors:["#6366f1","#22d3ee","#f59e0b","#ec4899","#34d399"],cardBackground:"rgba(255,255,255,0.04)",cardBorderColor:"rgba(255,255,255,0.08)",legendColor:"rgba(255,255,255,0.65)",labelColor:"#ffffff",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.4)"},neon:{label:"Neon",colors:["#00f5ff","#ff00e5","#00ff9f","#ff6b00","#b400ff"],cardBackground:"rgba(0,0,0,0.55)",cardBorderColor:"rgba(0,245,255,0.2)",legendColor:"rgba(0,245,255,0.75)",labelColor:"#ffffff",centerTextColor:"#00f5ff",centerLabelColor:"rgba(0,245,255,0.5)"},pastel:{label:"Pastel",colors:["#a5b4fc","#67e8f9","#fcd34d","#f9a8d4","#6ee7b7"],cardBackground:"rgba(255,255,255,0.06)",cardBorderColor:"rgba(255,255,255,0.12)",legendColor:"rgba(255,255,255,0.6)",labelColor:"#1a1a2e",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.45)"},warm:{label:"Warm",colors:["#f97316","#ef4444","#f59e0b","#dc2626","#fb923c"],cardBackground:"rgba(30,10,0,0.45)",cardBorderColor:"rgba(249,115,22,0.2)",legendColor:"rgba(253,186,116,0.8)",labelColor:"#ffffff",centerTextColor:"#fb923c",centerLabelColor:"rgba(253,186,116,0.5)"},ocean:{label:"Ocean",colors:["#06b6d4","#0ea5e9","#38bdf8","#7dd3fc","#0284c7"],cardBackground:"rgba(0,20,40,0.5)",cardBorderColor:"rgba(6,182,212,0.2)",legendColor:"rgba(125,211,252,0.75)",labelColor:"#ffffff",centerTextColor:"#38bdf8",centerLabelColor:"rgba(125,211,252,0.5)"},mono:{label:"Mono",colors:["rgba(255,255,255,0.9)","rgba(255,255,255,0.65)","rgba(255,255,255,0.45)","rgba(255,255,255,0.28)","rgba(255,255,255,0.15)"],cardBackground:"rgba(255,255,255,0.03)",cardBorderColor:"rgba(255,255,255,0.1)",legendColor:"rgba(255,255,255,0.55)",labelColor:"#000000",centerTextColor:"#ffffff",centerLabelColor:"rgba(255,255,255,0.4)"}};class ys{constructor(){nt(this,"artboard",null);nt(this,"objectStates",new Map);nt(this,"physicsEngine",null);nt(this,"activeStateMachine",null);nt(this,"inputs",new Map);nt(this,"inputNameMap",new Map);nt(this,"layerStates",new Map);nt(this,"pretextCache",new Map);nt(this,"pointerHistory",[]);nt(this,"MAX_HISTORY",200);nt(this,"imageCache",new Map);nt(this,"lastValidSvgImgMap",new Map);nt(this,"maskBuffer",null);nt(this,"maskCtx",null);nt(this,"lumaBuffer",null);nt(this,"lumaCtx",null);nt(this,"_noiseTileCanvas",null);nt(this,"layout",{fit:"Contain",alignment:"Center"});nt(this,"onTrigger");nt(this,"onInputUpdate");nt(this,"onComponentChange");nt(this,"onToggle");nt(this,"onInputChange");nt(this,"onInputFocus");nt(this,"onInputBlur");nt(this,"onLog");nt(this,"onButtonClick");nt(this,"onGraphPointClick");nt(this,"justFiredTriggers",new Set);nt(this,"rootTransform",null);nt(this,"canvasWidth",0);nt(this,"canvasHeight",0);nt(this,"lastHoveredObjectId",null);nt(this,"_lastPointerPos",null);nt(this,"_prevPointerPos",null);nt(this,"_mouseDelta",{dx:0,dy:0});nt(this,"focusedId",null);nt(this,"draggingSliderId",null);nt(this,"draggingJoystickId",null);nt(this,"activeDropdownId",null);nt(this,"activeObjectId",null);nt(this,"draggingListViewId",null);nt(this,"scrollOffset",{x:0,y:0});nt(this,"_totalScroll",{x:0,y:0});nt(this,"draggingBehaviors",new Set);nt(this,"dragStartPointer",null);nt(this,"dragStartPositions",new Map);nt(this,"isMouseDown",!1);nt(this,"activeKeys",new Set);nt(this,"_layoutAnimCache",new Map);nt(this,"_springChainState",new Map);nt(this,"_emitterPools",new Map);nt(this,"objectVelocities",new Map);nt(this,"currentTime",0);nt(this,"frameCount",0);nt(this,"fontLeadingFactors",{Inter:.35,Roboto:.45,Montserrat:.4,Outfit:.35,"Open Sans":.4,Poppins:.45,"Playfair Display":.35,Lora:.4,Lato:.35,"Bebas Neue":.45,Oswald:.4});nt(this,"onLogicUpdate");nt(this,"logicNodeValues",new Map);nt(this,"logicNodeState",new Map);nt(this,"pointerDownTimes",new Map);nt(this,"activeHoverIds",new Set);nt(this,"onNavigation");nt(this,"periodicTriggerTimes",new Map);nt(this,"wasInView",new Set);nt(this,"scrollProgressLastValue",new Map);nt(this,"debug_objectsRendered",0);nt(this,"debug_objectsTotal",0);nt(this,"lastRenderTime",0);nt(this,"debugMode",!1);nt(this,"activeTriggers",new Map);console.info("%c[ExodeUI Engine] Pixel-Perfect Parity Active (v6.3.10) - SVG Fill & Gradient Parity Active","color: #3b82f6; font-weight: bold; padding: 2px 4px; border-radius: 4px; background: rgba(59, 130, 246, 0.1)")}getInputValue(t){if(this.inputs.has(t))return this.inputs.get(t);const s=this.inputNameMap.get(t);if(s&&s.length>0)return this.inputs.get(s[0])}setTriggerCallback(t){this.onTrigger=t}setInputUpdateCallback(t){this.onInputUpdate=t}setComponentChangeCallback(t){this.onComponentChange=t}setToggleCallback(t){this.onToggle=t}setLogicUpdateCallback(t){this.onLogicUpdate=t}setInputChangeCallback(t){this.onInputChange=t}setButtonClickCallback(t){this.onButtonClick=t}setGraphPointClickCallback(t){this.onGraphPointClick=t}setNavigationCallback(t){this.onNavigation=t}ensurePathPoints(t){if(!t||t.type!=="Path"&&t.type!=="Subtract"&&t.type!=="Union"&&t.type!=="Intersect"&&t.type!=="Exclude"&&t.type!=="BooleanOperation")return;if(t.points&&t.points.length>0){if(t.is_closed===void 0&&t.isClosed===void 0&&t.data){const{isClosed:e}=this.svgPathToPoints(t.data);t.is_closed=e}return}if(!t.data)return;const{points:s,isClosed:o}=this.svgPathToPoints(t.data);t.points=s,t.is_closed===void 0&&(t.is_closed=o)}svgPathToPoints(t){const s=/([MLHVCSQTAZmlhvcsqtaz])([^MLHVCSQTAZmlhvcsqtaz]*)/g,o=/[-+]?(?:\d*\.\d+|\d+)(?:[eE][-+]?\d+)?/g,e=[];let i=!1,n=0,a=0,r=0,c=0,d=0,u=0,p;for(;(p=s.exec(t))!==null;){const l=p[1],h=(p[2].match(o)||[]).map(parseFloat),f=l===l.toLowerCase(),g=l.toUpperCase();let y=0;const m=v=>{let C=h[y++];return f&&(C+=v?n:a),C},S=()=>({x:m(!0),y:m(!1)});switch(g){case"M":{const v=S();for(d=n=v.x,u=a=v.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a,moveTo:!0});y<h.length;){const C=S();n=C.x,a=C.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break}case"L":for(;y<h.length;){const v=S();n=v.x,a=v.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break;case"H":for(;y<h.length;)n=m(!0),e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a});break;case"V":for(;y<h.length;)a=m(!1),e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a});break;case"C":for(;y<h.length;){const v=S(),C=S(),w=S();if(e.length>0){const M=e[e.length-1];M.out_x=v.x,M.out_y=v.y}n=w.x,a=w.y,e.push({x:n,y:a,in_x:C.x,in_y:C.y,out_x:n,out_y:a}),r=C.x,c=C.y}break;case"S":for(;y<h.length;){const v={x:2*n-r,y:2*a-c},C=S(),w=S();if(e.length>0){const M=e[e.length-1];M.out_x=v.x,M.out_y=v.y}n=w.x,a=w.y,e.push({x:n,y:a,in_x:C.x,in_y:C.y,out_x:n,out_y:a}),r=C.x,c=C.y}break;case"Q":for(;y<h.length;){const v=S(),C=S();if(e.length>0){const w=e[e.length-1];w.out_x=w.x+2/3*(v.x-w.x),w.out_y=w.y+2/3*(v.y-w.y)}n=C.x,a=C.y,e.push({x:n,y:a,in_x:n+2/3*(v.x-n),in_y:a+2/3*(v.y-a),out_x:n,out_y:a}),r=v.x,c=v.y}break;case"T":for(;y<h.length;){const v={x:2*n-r,y:2*a-c},C=S();if(e.length>0){const w=e[e.length-1];w.out_x=w.x+2/3*(v.x-w.x),w.out_y=w.y+2/3*(v.y-w.y)}n=C.x,a=C.y,e.push({x:n,y:a,in_x:n+2/3*(v.x-n),in_y:a+2/3*(v.y-a),out_x:n,out_y:a}),r=v.x,c=v.y}break;case"Z":if(i=!0,e.length>0){const v=e[e.length-1];v.closePath=!0;const C=[...e].reverse().find(w=>w.moveTo)||e[0];C&&Math.hypot(C.x-v.x,C.y-v.y)<.1&&(C.in_x=v.in_x,C.in_y=v.in_y,e.pop(),e.length>0&&(e[e.length-1].closePath=!0))}n=d,a=u;break;default:if(h.length>=2){const v=S();n=v.x,a=v.y,e.push({x:n,y:a,in_x:n,in_y:a,out_x:n,out_y:a})}break}}return{points:e,isClosed:i}}setOnLogCallback(t){this.onLog=t}debugLog(t){this.onLog&&this.onLog(t)}setInputFocusCallback(t){this.onInputFocus=t}setInputBlurCallback(t){this.onInputBlur=t}updateConstraint(t,s,o){var i;const e=(i=this.artboard)==null?void 0:i.objects.find(n=>n.id===t);e&&e.constraints&&e.constraints[s]&&(e.constraints[s]={...e.constraints[s],...o},o.useSpring===!1&&this.objectVelocities.delete(t))}log(...t){this.debugMode&&console.log(...t)}warn(...t){this.debugMode&&console.warn(...t)}setInternalInput(t,s){this.inputs.set(t,s),this.onInputUpdate&&this.onInputUpdate(t,s)}setLayout(t,s){this.layout={fit:t,alignment:s}}getActiveStateIds(t="Base Layer"){const s=this.layerStates.get(t);return s?s.currentStateIds:[]}getObjectState(t){return this.objectStates.get(t)}updateObjectOptions(t,s){const o=this.objectStates.get(t);o&&(o.options={...o.options,...s})}updateGraphData(t,s){var e,i;if(!this.artboard)return;const o=this.artboard.objects.find(n=>n.id===t||n.name===t);if(o&&((e=o.geometry)==null?void 0:e.type)==="LineGraph"){const n=o.geometry;!n.datasets||n.datasets.length===0?n.datasets=[{id:"default",label:"Runtime Data",data:s,lineColor:"#3b82f6",lineWidth:2,showArea:!1}]:n.datasets[0].data=s;const a=this.objectStates.get(o.id);a&&((i=a.geometry)==null?void 0:i.type)==="LineGraph"&&(!a.geometry.datasets||a.geometry.datasets.length===0?a.geometry.datasets=JSON.parse(JSON.stringify(n.datasets)):a.geometry.datasets[0].data=[...s]),n.datasets[0].inputId&&this.updateInput(n.datasets[0].inputId,s)}else this.updateInput(t,s)}load(t){var n,a;if(!t)return;let s=this.decompressStrings(t);const o=[],e=new Set,i=r=>{r&&r.forEach(c=>{if(e.has(c.id))return;const d={...c},u=d.childrenObjects||[];e.add(d.id),o.push(d),i(u)})};if(i(s.objects||[]),o.length>(s.objects||[]).length&&this.log(`[Engine] Flattened artboard from ${(s.objects||[]).length} to ${o.length} objects.`),s.objects=o,this.artboard=s,this.currentTime=0,this.objectStates.clear(),this.log(`[ExodeUIEngine] Loading artboard: "${(n=this.artboard)==null?void 0:n.name}" with ${(a=this.artboard)==null?void 0:a.objects.length} objects`),this.artboard&&this.artboard.objects){const r=new Map;this.artboard.objects.forEach(c=>{r.set(c.id,c),c.children||(c.children=[])}),this.artboard.objects.forEach(c=>{if(c.parentId){const d=r.get(c.parentId);d&&(d.children||(d.children=[]),d.children.includes(c.id)||d.children.push(c.id))}})}this.loadFonts(),this.preloadImages(this.artboard),this.reset(),this.advance(0)}preloadImages(t){if(!t||!t.objects)return;const s=o=>{if(!o||this.imageCache.has(o))return;const e=new Image;e.onload=()=>{this.log(`[ExodeUI Preload] loaded ${e.naturalWidth}x${e.naturalHeight}`)},e.onerror=i=>{console.error("[ExodeUI Preload] failed:",i,`Src: ${o.substring(0,80)}...`)},e.src=o,this.imageCache.set(o,e)};t.objects.forEach(o=>{var e,i,n;(e=o.geometry)!=null&&e.src&&s(o.geometry.src),(n=(i=o.style)==null?void 0:i.fill)!=null&&n.src&&s(o.style.fill.src)})}decompressStrings(t){if(t&&typeof t=="object"&&!Array.isArray(t)){if(t._compressed&&t._data)try{const o=vs.decompressFromBase64(t._data);if(o)return o}catch(o){return console.error("[ExodeUI] Failed to decompress string:",o),t._data}const s={};for(const[o,e]of Object.entries(t))s[o]=this.decompressStrings(e);return s}return Array.isArray(t)?t.map(s=>this.decompressStrings(s)):t}reset(){if(!this.artboard)return;if(this.objectStates.clear(),this.objectVelocities.clear(),this.currentTime=0,this.inputs.clear(),this.inputNameMap.clear(),this.layerStates.clear(),this.logicNodeValues.clear(),this.justFiredTriggers.clear(),this.inputs.set("mouseX",0),this.inputs.set("mouseY",0),this.inputs.set("scrollX",0),this.inputs.set("scrollY",0),this.inputs.set("isMouseDown",!1),this.physicsEngine&&(this.physicsEngine.destroy(),this.physicsEngine=null),this._layoutAnimCache.clear(),this._springChainState.clear(),this._emitterPools.clear(),this.artboard.objects.forEach(s=>{var n,a,r,c,d,u,p;const o=s.width??((n=s.geometry)==null?void 0:n.width)??0,e=s.height??((a=s.geometry)==null?void 0:a.height)??0,i=s.cornerRadius??s.corner_radius??((r=s.geometry)==null?void 0:r.corner_radius)??((c=s.geometry)==null?void 0:c.cornerRadius)??0;this.objectStates.set(s.id,{...s.transform||{},x:((d=s.transform)==null?void 0:d.x)??s.x??0,y:((u=s.transform)==null?void 0:u.y)??s.y??0,width:o,height:e,cornerRadius:i,corner_radius:i,clipContent:s.clipContent??!1,autoLayout:s.autoLayout?JSON.parse(JSON.stringify(s.autoLayout)):void 0,layoutProps:s.layoutProps?JSON.parse(JSON.stringify(s.layoutProps)):void 0,opacity:((p=s.transform)==null?void 0:p.opacity)!==void 0?s.transform.opacity:s.opacity!==void 0?s.opacity:100,visible:s.visible!==void 0?s.visible:s.isVisible!==void 0?s.isVisible:!0,blendMode:s.blendMode||"Normal",style:JSON.parse(JSON.stringify(s.style||{})),geometry:JSON.parse(JSON.stringify(s.geometry||{})),options:s.options?JSON.parse(JSON.stringify(s.options)):{},masks:s.masks?JSON.parse(JSON.stringify(s.masks)):[],zIndex:s.zIndex!==void 0?s.zIndex:void 0})}),this.artboard.objects.some(s=>{var o;return(o=s.physics)==null?void 0:o.enabled})){this.physicsEngine=new is;const s=this.artboard.physics?{x:this.artboard.physics.gravity.x,y:this.artboard.physics.gravity.y}:{x:0,y:1};this.physicsEngine.init(s).then(()=>{var o;this.physicsEngine&&((o=this.artboard)==null||o.objects.forEach(e=>{var i,n;if((i=e.physics)!=null&&i.enabled&&e.type==="Shape"){const a=this.objectStates.get(e.id);if(!a)return;const r=e.geometry.width||100,c=e.geometry.height||100;this.physicsEngine.createBody({id:e.id,type:((n=e.geometry)==null?void 0:n.type)||"Rectangle",x:a.x,y:a.y,width:r,height:c,rotation:a.rotation*(Math.PI/180),isStatic:e.physics.bodyType==="Static",mass:e.physics.mass,friction:e.physics.friction,restitution:e.physics.restitution,frictionAir:e.physics.frictionAir,density:e.physics.density,isSensor:e.physics.isSensor})}}))})}this.artboard.stateVariables&&this.artboard.stateVariables.forEach(s=>{var i,n;let o=s.value;if(s.type==="RandomNumber"||s.type==="random_number"||s.min!==void 0&&s.max!==void 0&&((i=s.type)!=null&&i.toLowerCase().includes("random"))){const a=s.min??0,r=s.max??100;o=Math.random()*(r-a)+a}else if(s.type==="RandomColor"||s.type==="random_color"||s.minAlpha!==void 0&&((n=s.type)!=null&&n.toLowerCase().includes("random"))){const a=Math.floor(Math.random()*256),r=Math.floor(Math.random()*256),c=Math.floor(Math.random()*256),d=s.minAlpha??0,u=s.maxAlpha??1,p=(Math.random()*(u-d)+d).toFixed(2);o=`rgba(${a}, ${r}, ${c}, ${p})`}this.inputs.set(s.id,o);const e=this.inputNameMap.get(s.name)||[];e.includes(s.id)||e.push(s.id),this.inputNameMap.set(s.name,e)}),this.artboard.stateMachine&&(this.activeStateMachine=this.artboard.stateMachine,this.activeStateMachine.inputs.forEach(s=>{this.inputs.set(s.id,s.value.value);const o=this.inputNameMap.get(s.name)||[];o.push(s.id),this.inputNameMap.set(s.name,o)}),this.activeStateMachine.layers.forEach(s=>{let o=s.states.find(e=>e.id===s.entryStateId);!o&&s.states.length>0&&(console.warn(`[ExodeUI] Invalid entryStateId "${s.entryStateId}" in layer "${s.name}". Falling back to first state.`),o=s.states[0]),o&&this.enterStates(s.name,[o.id])}),this.evaluateTransitions()),this.initGlobalAnimationTriggers(),this.updateAutoLayout(!0),this.loadFonts()}updateAutoLayout(t=!1){var i;if(!this.artboard)return;const s=new Map;this.artboard.objects.forEach(n=>s.set(n.id,n));const o=.15,e=n=>{n.forEach(a=>{const r=this.objectStates.get(a.id);if(r){const c=Math.abs(r.x-a.x),d=Math.abs(r.y-a.y);!t&&(c>20||d>20)?(r.x+=(a.x-r.x)*o,r.y+=(a.y-r.y)*o):(r.x=a.x,r.y=a.y),a.width!==void 0&&(r.width=a.width),a.height!==void 0&&(r.height=a.height)}})};if((i=this.artboard.autoLayout)!=null&&i.enabled){const n=this.artboard.objects.filter(r=>!r.parentId),a=ss(this.artboard,n,r=>this.objectStates.get(r));e(a.childUpdates)}this.artboard.objects.forEach(n=>{var a;if(n.type==="Frame"&&((a=n.autoLayout)!=null&&a.enabled)&&n.children&&n.children.length>0){const r=n.children.map(u=>s.get(u)).filter(u=>!!u),c=this.objectStates.get(n.id);if(!c)return;const d=ss(c,r,u=>this.objectStates.get(u));d.frameWidth!==void 0&&(c.width=d.frameWidth),d.frameHeight!==void 0&&(c.height=d.frameHeight),e(d.childUpdates)}})}loadFonts(){if(!this.artboard)return;const t=new Set;if(this.artboard.objects.forEach(n=>{n.geometry&&n.geometry.type==="Text"&&n.geometry.fontFamily&&t.add(n.geometry.fontFamily)}),this.artboard.animations.forEach(n=>{n.tracks.forEach(a=>{(a.property==="geometry.fontFamily"||a.property==="fontFamily")&&a.keyframes.forEach(r=>{r.value&&typeof r.value=="string"&&t.add(r.value)})})}),t.size===0)return;let s="";t.forEach(n=>{const a=n.replace(/ /g,"+");s+=`&family=${a}:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900`});const o="exodeui-google-fonts",e="exodeui-fontshare-fonts";if(s.length>0){const n=`https://fonts.googleapis.com/css2?display=swap${s}`;let a=document.getElementById(o);a||(a=document.createElement("link"),a.id=o,a.rel="stylesheet",document.head.appendChild(a)),a.href!==n&&(a.href=n)}const i=[];if(t.forEach(n=>{n.toLowerCase().includes("clash display")&&i.push("clash-display@200,300,400,500,600,700")}),i.length>0){const n=`https://api.fontshare.com/v2/css?f[]=${i.join("&f[]=")}&display=swap`;let a=document.getElementById(e);a||(a=document.createElement("link"),a.id=e,a.rel="stylesheet",document.head.appendChild(a)),a.href!==n&&(a.href=n)}document.fonts&&document.fonts.ready&&document.fonts.ready.then(()=>{this.pretextCache.clear(),this.advance(0)})}enterStates(t,s){var n;if(s.length===0)return;const o=this.layerStates.get(t);if(o&&o.currentStateIds.length===s.length&&s.every(r=>o.currentStateIds.includes(r))&&this.justFiredTriggers.size===0)return;const e=[];let i=0;if(this.artboard&&this.activeStateMachine){const a=this.activeStateMachine.layers.find(r=>r.name===t);if(a)for(const r of s){const c=a.states.find(d=>d.id===r);if(c)if(c.isBlendState&&c.blendAnimations&&c.blendAnimations.length>0)e.push({animation:null,state:c}),c.blendAnimations.forEach(d=>{const u=this.artboard.animations.find(p=>p.id===d.animationId);u&&(i=Math.max(i,this.getAnimationDuration(u)))});else{let d=null;c.animationId&&(d=this.artboard.animations.find(u=>u.id===c.animationId)||null),d||(d=this.artboard.animations.find(u=>{var p,l;return u.name===c.name||u.id===c.name||(c.name==="Entry"||c.id==="entry")&&(((p=u.name)==null?void 0:p.toLowerCase())==="onload"||((l=u.name)==null?void 0:l.toLowerCase())==="intro")})||null),d&&((n=this.artboard.animationFlow)!=null&&n.some(p=>(p.trigger==="on_load"||p.trigger==="after_delay")&&p.targetAnimationId===(d==null?void 0:d.id))||(e.push({animation:d,state:c}),i=Math.max(i,this.getAnimationDuration(d))))}}}this.layerStates.set(t,{currentStateIds:s,animations:e,time:0,duration:i})}setInputBool(t,s){this.updateInput(t,s)}setInputNumber(t,s){this.updateInput(t,s)}fireTrigger(t){this.updateInput(t,!0)}setInputText(t,s){this.updateInput(t,s)}setInputNumberArray(t,s){this.updateInput(t,s)}setInputStringArray(t,s){this.updateInput(t,s)}updateObjectProperty(t,s,o){const e=this.objectStates.get(t);if(e)if(s.includes(".")||s.includes("[")){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let n=e;for(let a=0;a<i.length-1;a++){if(typeof n[i[a]]!="object"||n[i[a]]===null){const r=i[a+1],c=!isNaN(Number(r));n[i[a]]=c?[]:{}}n=n[i[a]]}n[i[i.length-1]]=o}else e[s]=o}updateInput(t,s){var a,r,c,d,u;let o;if(this.inputs.has(t)){const p=(a=this.activeStateMachine)==null?void 0:a.inputs.find(l=>l.id===t);p&&typeof p.value=="object"&&(o=p.value.type)}else{const p=this.inputNameMap.get(t);if(p&&p.length>0){const l=(r=this.activeStateMachine)==null?void 0:r.inputs.find(h=>h.id===p[0]);l&&typeof l.value=="object"&&(o=l.value.type)}}let e=s;o==="Trigger"&&(s===1?e=!0:s===0&&(e=!1));const i=(d=(c=this.artboard)==null?void 0:c.stateVariables)==null?void 0:d.find(p=>p.id===t||p.name===t);if(i&&(i.type==="RandomNumber"||i.type==="RandomColor"||i.type&&String(i.type).toLowerCase().includes("random"))){if(i.type==="RandomNumber"||i.type==="random_number"||i.min!==void 0&&i.max!==void 0){const p=i.min??0,l=i.max??100;e=Math.random()*(l-p)+p}else if(i.type==="RandomColor"||i.type==="random_color"||i.minAlpha!==void 0){const p=Math.floor(Math.random()*256),l=Math.floor(Math.random()*256),h=Math.floor(Math.random()*256),f=i.minAlpha??0,g=i.maxAlpha??1,y=(Math.random()*(g-f)+f).toFixed(2);e=`rgba(${p}, ${l}, ${h}, ${y})`}}this.inputs.has(t)&&this.setInternalInput(t,e);const n=this.inputNameMap.get(t);n&&n.forEach(p=>this.setInternalInput(p,e)),o==="Trigger"&&e===!0&&(this.justFiredTriggers.add(t),n&&n.forEach(p=>this.justFiredTriggers.add(p))),Array.isArray(e)&&((u=this.artboard)==null||u.objects.forEach(p=>{if(p.inputId===t||p.name===t){const l=this.objectStates.get(p.id);l&&l.options&&(p.type==="ListView"||p.variant==="listview"?l.options.items=e:(p.type==="Dropdown"||p.variant==="dropdown")&&(l.options.optionsList=e))}})),this.evaluateTransitions(),this.evaluateVariableTriggers(t,e)}evaluateVariableTriggers(t,s){if(!this.artboard)return;const o=this.artboard.animationFlow||[],e=this.inputNameMap.get(t);o.forEach(i=>{if(i.trigger==="variable"&&i.conditionVariableId&&i.targetAnimationId&&(i.conditionVariableId===t||e&&e.includes(i.conditionVariableId))){const a=i.conditionOperator||"IsTrue",r=i.conditionValue;let c=!1;switch(a){case"Equal":case"==":c=s==r;break;case"NotEqual":case"!=":c=s!=r;break;case"GreaterThan":case">":c=s>r;break;case"LessThan":case"<":c=s<r;break;case"GreaterEqual":case">=":c=s>=r;break;case"LessEqual":case"<=":c=s<=r;break;case"IsTrue":c=!!s;break;case"IsFalse":c=!s;break}if(c){const d=i.delay||0;d<=0?this.triggerGlobalAnimation(i.targetAnimationId,i.subAnimationIds,i.loop,i.id):setTimeout(()=>this.triggerGlobalAnimation(i.targetAnimationId,i.subAnimationIds,i.loop,i.id),d)}}})}evaluateTransitions(){this.activeStateMachine&&(this.activeStateMachine.layers.forEach(t=>{const s=this.layerStates.get(t.name);if(!s||s.currentStateIds.length===0)return;const o=[];let e=!1;for(const i of s.currentStateIds){const n=t.states.find(r=>r.id===i);if(!n)continue;let a=!1;for(const r of n.transitions||[])this.checkConditions(r.conditions)&&(o.push(r.targetStateId),a=!0,e=!0);a||o.push(i)}if(!e){const i=this.findGlobalTransition(t,s.currentStateIds);i&&(o.length=0,o.push(i.targetStateId),e=!0,i.conditions&&(i.conditions||[]).forEach(n=>{var r;const a=(r=this.activeStateMachine)==null?void 0:r.inputs.find(c=>c.id===n.inputId);a&&typeof a.value=="object"&&a.value.type==="Trigger"&&this.setInternalInput(n.inputId,!1)}))}if(e){const i=Array.from(new Set(o));this.enterStates(t.name,i)}}),this.justFiredTriggers.size>0&&(this.justFiredTriggers.forEach(t=>{var o,e;this.setInternalInput(t,!1);const s=(o=this.activeStateMachine)==null?void 0:o.inputs.find(i=>i.id===t);s&&this.inputNameMap.has(s.name)&&((e=this.inputNameMap.get(s.name))==null||e.forEach(i=>this.setInternalInput(i,!1)))}),this.justFiredTriggers.clear()))}findGlobalTransition(t,s){for(const o of t.states)if(!(s.includes(o.id)&&this.justFiredTriggers.size===0)){for(const i of o.transitions||[])if(!(s.includes(i.targetStateId)&&this.justFiredTriggers.size===0)&&this.checkConditions(i.conditions))return i}return null}checkConditions(t){return!t||t.length===0?!0:t.every(s=>{const o=s.inputId,e=s.op;let i=s.value;const n=this.evaluateLogicTree(o);if(n===void 0)return this.log(`[Engine] Condition Check Failed: Input ${o} is undefined`),!1;typeof n=="boolean"?i==="true"||i==="1"||i===1?i=!0:(i==="false"||i==="0"||i===0)&&(i=!1):typeof n=="number"&&typeof i=="string"&&(i=parseFloat(i));let a=!1;switch(e){case"Equal":case"==":a=n==i;break;case"NotEqual":case"!=":a=n!=i;break;case"GreaterThan":case">":a=n>i;break;case"LessThan":case"<":a=n<i;break;case"GreaterEqual":case">=":a=n>=i;break;case"LessEqual":case"<=":a=n<=i;break;case"IsTrue":a=!!n;break;case"IsFalse":a=!n;break;default:a=!1}return a||this.justFiredTriggers.has(o),a})}evaluateLogicTree(t,s=null,o=new Set){var a,r,c,d,u,p;if(o.has(t))return this.inputs.get(t)??this.logicNodeValues.get(t)??0;o.add(t);const e=(r=(a=this.activeStateMachine)==null?void 0:a.logicNodes)==null?void 0:r.find(l=>l.id===t);if(e){const l=(f,g)=>{const y=e.inputs.find(m=>m.id===f);return y?y.sourceId?this.evaluateLogicTree(y.sourceId,y.sourceHandleId,o):y.value!==void 0?y.value:g:g};let h=0;switch(e.op){case Ct.AND:h=l("a",!1)&&l("b",!1);break;case Ct.OR:h=l("a",!1)||l("b",!1);break;case Ct.NOT:h=!l("in",!1);break;case Ct.XOR:h=!!l("a",!1)!=!!l("b",!1);break;case Ct.OBJECT:h=e.name;break;case Ct.PROPERTY:case Ct.GET_PROPERTY:{const f=l("id","");if(!f){h=0;break}const g=e.name;if(!g||g==="GET_PROPERTY"||g==="PROPERTY"){h=0;break}const y=this.objectStates.get(f);if(!y){h=0;break}g in y?h=y[g]:h=this.resolvePath(y,g);break}case Ct.SET_PROPERTY:{const f=l("id",""),g=l("value",void 0);if(!f||g===void 0){h=0;break}const y=e.name;if(!y||y==="SET_PROPERTY"){h=0;break}const m=this.objectStates.get(f);if(!m){h=0;break}if(["x","y","rotation","scale_x","scale_y","opacity","width","height","cornerRadius","visible","zIndex"].includes(y))m[y]=g,h=g;else{const v=y.replace(/\[(\d+)\]/g,".$1").split(".");let C=m;for(let M=0;M<v.length-1;M++){const I=v[M],T=v[M+1];C[I]===void 0&&(C[I]=isNaN(Number(T))?{}:[]),C=C[I]}const w=v[v.length-1];C[w]=g,h=g}break}case Ct.ADD:h=l("a",0)+l("b",0);break;case Ct.SUB:h=l("a",0)-l("b",0);break;case Ct.MUL:h=l("a",0)*l("b",0);break;case Ct.DIV:{const f=l("b",1);h=f===0?0:l("a",0)/f;break}case Ct.MOD:h=l("a",0)%l("b",1);break;case Ct.POW:h=Math.pow(l("a",0),l("b",1));break;case Ct.ABS:h=Math.abs(l("in",0));break;case Ct.ROUND:h=Math.round(l("in",0));break;case Ct.FLOOR:h=Math.floor(l("in",0));break;case Ct.CEIL:h=Math.ceil(l("in",0));break;case Ct.SIN:h=Math.sin(l("in",0));break;case Ct.COS:h=Math.cos(l("in",0));break;case Ct.TAN:h=Math.tan(l("in",0));break;case Ct.CLAMP:{const f=l("in",0),g=l("min",0),y=l("max",1);h=Math.max(g,Math.min(y,f));break}case Ct.REMAP:{const f=l("in",0),g=l("inMin",0),y=l("inMax",100),m=l("outMin",0),S=l("outMax",1);h=y===g?m:m+(f-g)*(S-m)/(y-g);break}case Ct.EQ:h=l("a",0)==l("b",0);break;case Ct.NEQ:h=l("a",0)!=l("b",0);break;case Ct.GT:h=l("a",0)>l("b",0);break;case Ct.LT:h=l("a",0)<l("b",0);break;case Ct.GTE:h=l("a",0)>=l("b",0);break;case Ct.LTE:h=l("a",0)<=l("b",0);break;case Ct.IF_ELSE:h=l("cond",!1)?l("then",0):l("else",0);break;case Ct.VALUE:h=e.value!==void 0?e.value:0;break;case Ct.INPUT:h=this.inputs.get(e.name)??0;break;case Ct.LOG:{const f=l("in","");this.debugLog(`[User Logic] ${f}`),h=f;break}case Ct.SCROLL_X:h=this.inputs.get("scrollX")??0;break;case Ct.SCROLL_Y:h=this.inputs.get("scrollY")??0;break;case Ct.MOUSE_X:h=this.inputs.get("mouseX")??0;break;case Ct.MOUSE_Y:h=this.inputs.get("mouseY")??0;break;case Ct.IS_MOUSE_DOWN:h=this.inputs.get("isMouseDown")??!1;break;case Ct.EFFECTOR:{const f=l("id",""),g=l("intensity",1),y=l("trigger",!0);if(!f||!y){h=0;break}const m=e.name;if(!m){h=0;break}const S=this.objectStates.get(f);if(!S){h=0;break}if(["glitch","halftone","pixelate","noise","acid_gradient","acid_rave","shimmer"].includes(m))S.style||(S.style={}),S.style.artEffect={enabled:!0,type:m,intensity:g},h=1;else{S.behaviors||(S.behaviors=[]);let C=S.behaviors.find(w=>w.type===m);C?(C.enabled=!0,C.settings||(C.settings={}),C.settings.intensity=g):(C={id:`eff_${Date.now()}_${m}`,type:m,enabled:!0,sensors:[],settings:{intensity:g}},S.behaviors.push(C)),h=1}break}case Ct.MONITOR:{h=l("in",0);break}case Ct.SPRING_PULL:{const f=l("objectId",""),g=l("forceX",0),y=l("forceY",0);f&&((c=this.artboard)==null||c.objects.forEach(m=>{m.behaviors&&m.behaviors.forEach(S=>{var v;if(S.type===H.SpringChain&&((v=S.settings)!=null&&v.connections)&&(S.settings.connections.some(w=>w.targetId===f)||m.id===f)){this._springChainState.has(m.id)||this._springChainState.set(m.id,new Map);const w=this._springChainState.get(m.id);if(!w.has(f)){const I=this.objectStates.get(f);w.set(f,{x:(I==null?void 0:I.x)??0,y:(I==null?void 0:I.y)??0,vx:0,vy:0})}const M=w.get(f);M&&(M.vx+=g,M.vy+=y)}})})),h=1;break}case Ct.SPRING_SETTLE:{const f=l("objectId","");let g=!0;if(f){const y=l("threshold",1);this._springChainState.forEach(m=>{const S=m.get(f);S&&(Math.abs(S.vx)>y||Math.abs(S.vy)>y)&&(g=!1)})}h=g;break}case Ct.EMIT:{const f=l("objectId",""),g=l("count",20);f&&((d=this.artboard)==null||d.objects.forEach(y=>{y.behaviors&&y.behaviors.forEach(m=>{m.type===H.ParticleEmitter&&y.id===f&&(m._pendingBurst=(m._pendingBurst||0)+g)})})),h=1;break}default:h=0;break}if(this.logicNodeValues.set(t,h),e.op===Ct.DELAY){const f=l("delay",0),g=l("in",0);let y=this.logicNodeState.get(t);for(y||(y={queue:[]},this.logicNodeState.set(t,y)),y.queue.push({time:this.currentTime+f,value:g});y.queue.length>0&&y.queue[0].time<=this.currentTime;)y.lastValue=y.queue.shift().value;h=y.lastValue??0}return h}const i=(u=this.activeStateMachine)==null?void 0:u.inputs.find(l=>l.id===t||l.name===t);if(i&&i.sourceId&&!o.has(i.sourceId)){const l=this.evaluateLogicTree(i.sourceId,i.sourceHandleId,o);return this.inputs.set(i.id,l),l}let n=this.inputs.get(t)??(i?this.inputs.get(i.id):void 0);if((this.justFiredTriggers.has(t)||i&&this.justFiredTriggers.has(i.id))&&(n=!0),s&&n!==void 0){const l=(p=this.activeStateMachine)==null?void 0:p.inputs.find(h=>h.id===t);if(l&&l.value.type==="Number"&&typeof n=="number"){const h=l.value.defaultValue??l.value.value;if(s==="source-greater")return n>h;if(s==="source-less")return n<h;if(s==="source-equal")return n===h}if(s==="source-true")return n===!0;if(s==="source-false")return n===!1;if(s==="source-fire")return this.justFiredTriggers.has(t)}return n!==void 0?n:0}runLogicNodes(){!this.activeStateMachine||!this.activeStateMachine.logicNodes||this.activeStateMachine.logicNodes.forEach(t=>{(t.op===Ct.SET_PROPERTY||t.op===Ct.EFFECTOR)&&this.evaluateLogicTree(t.id)})}resolvePath(t,s){const o=s.replace(/\[(\d+)\]/g,".$1").split(".");let e=t;for(const i of o)if(e&&typeof e=="object"&&i in e)e=e[i];else return;return e}processLogicProperties(){!this.artboard||!this.artboard.objects||this.artboard.objects.forEach(t=>{const s=t.logicProperties;if(s&&s.length>0){const o=this.objectStates.get(t.id);if(!o)return;s.forEach(e=>{let i;if(e.valueType==="variable"?i=this.getInputValue(e.variableId):e.valueType==="constant"&&(i=e.value),i!==void 0){const n=e.name;if(["x","y","rotation","scale_x","scale_y","opacity","width","height","cornerRadius","visible","zIndex"].includes(n))o[n]=i;else{const r=n.replace(/\[(\d+)\]/g,".$1").split(".");let c=o;for(let u=0;u<r.length-1;u++){const p=r[u],l=r[u+1];c[p]===void 0&&(c[p]=isNaN(Number(l))?{}:[]),c=c[p]}const d=r[r.length-1];c[d]=i}}})}})}seek(t){this.artboard&&(this.currentTime=t,this.layerStates.forEach(s=>{s.time=t,s.time>(s.duration||0)&&(s.animations.some(e=>{var i;return((i=e.state)==null?void 0:i.loop)===!0})?s.time%=s.duration||1:s.time=s.duration)}),this.advance(0))}advance(t){if(!this.artboard)return;this.currentTime+=t,this.isMouseDown&&this.pointerDownTimes.forEach((o,e)=>{e&&this.currentTime-o>=.5&&(this.log(`[Engine] onHold detected for ${e}`),this.fireEventForObject(e,"onHold"),this.pointerDownTimes.delete(e))}),this.frameCount++,this.physicsEngine&&(this.physicsEngine.step(t),this.artboard.objects.forEach(o=>{var e;if((e=o.physics)!=null&&e.enabled){const i=this.physicsEngine.getPosition(o.id),n=this.physicsEngine.getRotation(o.id),a=this.objectStates.get(o.id);a&&i!==null&&n!==null&&(a.x=i.x,a.y=i.y,a.rotation=n*(180/Math.PI))}})),this.activeStateMachine&&(this.runLogicNodes(),this.evaluateTransitions()),this.processLogicProperties();const s=[];this.layerStates.forEach((o,e)=>{if(o.animations.length>0){if(o.time+=t,this.frameCount%240===0&&this.debugLog(`Advancing Layer time: ${o.time.toFixed(3)} / ${o.duration.toFixed(3)}`),o.time>o.duration)if(o.animations.some(n=>{var a;return((a=n.state)==null?void 0:a.loop)===!0}))o.time%=o.duration;else{const n=o.time<o.duration+.1;o.time=o.duration,n&&(e.startsWith("global_")&&console.log(`[Engine] GLOBAL layer done: ${e}, duration=${o.duration}, currentStateIds=${JSON.stringify(o.currentStateIds)}, ruleId=${o.ruleId}`),o.currentStateIds.length>0&&this.handleAnimationFinished(o.currentStateIds[0],o.ruleId),e.startsWith("global_")&&s.push(e))}o.animations.forEach(i=>{var n;(n=i.state)!=null&&n.isBlendState&&i.state.blendAnimations?this.applyBlendState(i.state,o.time):i.animation&&this.applyAnimation(i.animation,o.time,i.filterObjectIds)})}}),s.forEach(o=>{this.layerStates.delete(o),this.debugLog(`[Engine] Cleaned up completed global layer: ${o}`)}),this.solveConstraints(t),this.solveBehaviors(t),this.activeTriggers.forEach((o,e)=>{var i,n,a,r,c,d,u;if(o.phase==="entry")o.time+=t,o.time>=this.getAnimationDuration(o.animation)&&((a=(n=(i=this.artboard)==null?void 0:i.objects.find(p=>p.id===e))==null?void 0:n.triggers)==null||a.find(p=>p.id===o.triggerId),o.phase="hold",o.elapsedHold=0,o.time=this.getAnimationDuration(o.animation)),this.applyAnimation(o.animation,o.time,o.filterObjectIds||o.filterObjectId||void 0);else if(o.phase==="hold"){const p=(d=(c=(r=this.artboard)==null?void 0:r.objects.find(f=>f.id===e))==null?void 0:c.triggers)==null?void 0:d.find(f=>f.id===o.triggerId),l=(p==null?void 0:p.duration)||0;o.elapsedHold+=t*1e3;let h=o.elapsedHold>=l;if((p==null?void 0:p.eventType)==="hover"&&!this.activeHoverIds.has(e)&&(h=!0),((p==null?void 0:p.eventType)==="onHold"||(p==null?void 0:p.eventType)==="pointerDown")&&!this.isMouseDown&&(h=!0),h)if(p!=null&&p.exitAnimationId){const f=(u=this.artboard)==null?void 0:u.animations.find(g=>g.id===p.exitAnimationId);f?(o.phase="exit",o.animation=f,o.time=0):this.activeTriggers.delete(e)}else this.activeTriggers.delete(e)}else o.phase==="exit"&&(o.time+=t,o.time>=this.getAnimationDuration(o.animation)?this.activeTriggers.delete(e):this.applyAnimation(o.animation,o.time,o.filterObjectIds||o.filterObjectId||void 0))}),this.evaluateContinuousInteractions(t),this.processJoysticks(t),this.activeStateMachine&&this.onLogicUpdate&&this.logicNodeValues.size>0&&this.onLogicUpdate(Object.fromEntries(this.logicNodeValues))}evaluateContinuousInteractions(t){this.artboard&&(this.artboard.objects.forEach(s=>{var e,i,n;const o=(e=s.style)==null?void 0:e.analytics;if(o&&o.isEnabled&&o.triggerType==="visible"){const a=this.objectStates.get(s.id);if(a&&a.visible!==!1){const r=this.getGlobalTransform(s.id),c=(((i=s.geometry)==null?void 0:i.width)||100)*(r.scale_x||1),d=(((n=s.geometry)==null?void 0:n.height)||100)*(r.scale_y||1),u=50,p=r.x+c/2>=-this.canvasWidth/2-u&&r.x-c/2<=this.canvasWidth/2+u&&r.y+d/2>=-this.canvasHeight/2-u&&r.y-d/2<=this.canvasHeight/2+u,l=`analytics_${s.id}`,h=this.wasInView.has(l);p&&!h&&this.fireAnalyticsEvent(s.id,"visible"),p?this.wasInView.add(l):this.wasInView.delete(l)}}}),this.artboard.objects.forEach(s=>{const o=s.interactions||[];o.length!==0&&o.forEach(e=>{const i=e.triggers||[e.event||e.trigger];i&&i.forEach(n=>{var r,c,d;const a=n.toLowerCase();if(a==="on interval"||a==="oninterval"){const u=e.intervalValue||2e3,p=this.periodicTriggerTimes.get(e.id)||0;this.currentTime*1e3-p>=u&&(!e.conditions||this.checkConditions(e.conditions))&&(this.fireEventForObject(s.id,"On Interval"),this.periodicTriggerTimes.set(e.id,this.currentTime*1e3))}if(a==="on delay"||a==="ondelay"){const u=e.delayValue||1e3;!this.periodicTriggerTimes.has(e.id)&&this.currentTime*1e3>=u&&(!e.conditions||this.checkConditions(e.conditions))&&(this.fireEventForObject(s.id,"On Delay"),this.periodicTriggerTimes.set(e.id,this.currentTime*1e3))}if(a==="scroll into view"||a==="scrollintoview"){const u=this.objectStates.get(s.id);if(u&&u.visible!==!1){const p=this.getGlobalTransform(s.id),l=(((r=s.geometry)==null?void 0:r.width)||100)*(p.scale_x||1),h=(((c=s.geometry)==null?void 0:c.height)||100)*(p.scale_y||1),f=50,g=p.x+l/2>=-this.canvasWidth/2-f&&p.x-l/2<=this.canvasWidth/2+f&&p.y+h/2>=-this.canvasHeight/2-f&&p.y-h/2<=this.canvasHeight/2+f,y=this.wasInView.has(s.id);g&&!y&&(!e.conditions||this.checkConditions(e.conditions))&&this.fireEventForObject(s.id,"Scroll Into View"),g?this.wasInView.add(s.id):this.wasInView.delete(s.id)}}if(a==="scroll progress"||a==="scrollprogress"){const u=Math.abs(this.scrollOffset.y)/(((d=this.artboard)==null?void 0:d.height)||1e3),p=this.scrollProgressLastValue.get(e.id)||0;Math.abs(u-p)>.001&&(this.scrollProgressLastValue.set(e.id,u),(e.action==="Set Input"||e.action==="setInput")&&this.updateInput(e.targetInputId,u))}})})}))}solveConstraints(t){this.artboard&&this.artboard.objects.forEach(s=>{if(!s.constraints||s.constraints.length===0)return;const o=this.objectStates.get(s.id);if(!o)return;const e=this.getGlobalTransform(s.id);if(s.constraints.forEach((i,n)=>{var d,u,p,l,h,f,g,y,m;const a=((d=o.constraints)==null?void 0:d[n])||{},r={...i,...a},c=r.strength??1;if(r.type==="Translation"){const S=this.getGlobalTransform(r.targetId);if(S){const v=r.offsetX||0,C=r.offsetY||0,w=S.x+v,M=S.y+C,I=r.useSpring;if(I){const E=this.objectVelocities.get(s.id)||{vx:0,vy:0},P=Math.max(0,Math.min(t,.05)),_=r.copyX!==!1,L=r.copyY!==!1,A=_?e.x+(w-e.x)*c:e.x,W=L?e.y+(M-e.y)*c:e.y,{x:B,y:R,vx:Y,vy:G}=this.computeSpring(e.x,e.y,E.vx,E.vy,A,W,r,P);_&&(e.x=B),L&&(e.y=R),this.objectVelocities.set(s.id,{vx:_?Y:0,vy:L?G:0})}else r.copyX!==!1&&(e.x=e.x+(w-e.x)*c),r.copyY!==!1&&(e.y=e.y+(M-e.y)*c);let T=!1,k=!1;if((u=r.limitX)!=null&&u.enabled){const E=e.x;e.x=Math.max(r.limitX.min,Math.min(r.limitX.max,e.x)),e.x!==E&&(T=!0)}if((p=r.limitY)!=null&&p.enabled){const E=e.y;e.y=Math.max(r.limitY.min,Math.min(r.limitY.max,e.y)),e.y!==E&&(k=!0)}if((T||k)&&I){const E=this.objectVelocities.get(s.id)||{vx:0,vy:0};this.objectVelocities.set(s.id,{vx:T?0:E.vx,vy:k?0:E.vy})}}}else if(r.type==="Rotation"){const S=this.getGlobalTransform(r.targetId);if(S){let C=(S.rotation+(r.offset||0)-e.rotation)%360;C>180&&(C-=360),C<-180&&(C+=360),e.rotation=e.rotation+C*c}}else if(r.type==="Scale"){const S=this.getGlobalTransform(r.targetId);S&&(r.copyX&&(e.scale_x=e.scale_x+(S.scale_x-e.scale_x)*c),r.copyY&&(e.scale_y=e.scale_y+(S.scale_y-e.scale_y)*c))}else if(r.type==="Transform"){const S=this.getGlobalTransform(r.targetId);if(S){e.x=e.x+(S.x-e.x)*c,e.y=e.y+(S.y-e.y)*c;let v=(S.rotation-e.rotation)%360;v>180&&(v-=360),v<-180&&(v+=360),e.rotation=e.rotation+v*c,e.scale_x=e.scale_x+(S.scale_x-e.scale_x)*c,e.scale_y=e.scale_y+(S.scale_y-e.scale_y)*c}}else if(r.type==="FollowPointer"){const S=((l=this._lastPointerPos)==null?void 0:l.x)??e.x,v=((h=this._lastPointerPos)==null?void 0:h.y)??e.y,C=r.useSpring;if(C){const M=this.objectVelocities.get(s.id)||{vx:0,vy:0},{x:I,y:T,vx:k,vy:E}=this.computeSpring(e.x,e.y,M.vx,M.vy,S,v,r,t);e.x=I,e.y=T,this.objectVelocities.set(s.id,{vx:k,vy:E})}else e.x=e.x+(S-e.x)*c,e.y=e.y+(v-e.y)*c;let w=!1;if((f=r.limitX)!=null&&f.enabled){const M=e.x;e.x=Math.max(r.limitX.min,Math.min(r.limitX.max,e.x)),e.x!==M&&(w=!0)}if((g=r.limitY)!=null&&g.enabled){const M=e.y;e.y=Math.max(r.limitY.min,Math.min(r.limitY.max,e.y)),e.y!==M&&(w=!0)}w&&C&&this.objectVelocities.set(s.id,{vx:0,vy:0})}else if(r.type==="Distance"){const S=this.getGlobalTransform(r.targetId);if(S){const v=e.x-S.x,C=e.y-S.y,w=Math.sqrt(v*v+C*C),M=r.distance||0;let I=w;switch(r.mode){case"exact":I=M;break;case"minimum":I=Math.max(M,w);break;case"maximum":I=Math.min(M,w);break;case"clamped":I=Math.max(0,Math.min(M,w));break}if(w>0){const T=e.x===S.x&&e.y===S.y?1:I/w;e.x=e.x+(S.x+v*T-e.x)*c,e.y=e.y+(S.y+C*T-e.y)*c}}}else if(r.type==="FollowPath"){const S=(y=this.artboard)==null?void 0:y.objects.find(v=>v.id===r.targetId);if(S){const v=this.getGlobalTransform(S.id);if(v){let C=S.geometry;if(S.type==="Frame"||S.type==="Group"||!C||C.type!=="Path"&&C.type!=="Ellipse"&&C.type!=="Rectangle"){const F=(m=this.artboard)==null?void 0:m.objects.find(Z=>Z.parentId===S.id&&Z.type==="Shape"&&Z.geometry&&(Z.geometry.type==="Path"||Z.geometry.type==="Ellipse"||Z.geometry.type==="Rectangle"));F&&(C=F.geometry)}if(!C)return;const w=Math.max(0,Math.min(1,(r.distance||0)/100)),M=v.width||C.width||0,I=v.height||C.height||0,T=this.getPointOnPath(C,M,I,w),k=v.rotation*Math.PI/180,E=Math.cos(k),P=Math.sin(k),_=T.x*v.scale_x*E-T.y*v.scale_y*P,L=T.x*v.scale_x*P+T.y*v.scale_y*E;let A=v.rotation+(r.offsetRotation||0);if(r.orient){const F=Math.cos(T.angle),Z=Math.sin(T.angle),st=F*v.scale_x*E-Z*v.scale_y*P,at=F*v.scale_x*P+Z*v.scale_y*E;A=Math.atan2(at,st)*180/Math.PI+(r.offsetRotation||0)}const W=A*Math.PI/180,B=Math.cos(W),R=Math.sin(W),Y=(r.offsetX||0)*B-(r.offsetY||0)*R,G=(r.offsetX||0)*R+(r.offsetY||0)*B,z=v.x+_+Y,O=v.y+L+G;if(e.x=e.x+(z-e.x)*c,e.y=e.y+(O-e.y)*c,r.orient){let F=(A-e.rotation)%360;F>180&&(F-=360),F<-180&&(F+=360),e.rotation=e.rotation+F*c}}}}else if(r.type==="IK"){const S=this.getGlobalTransform(r.targetId);S&&this.solveIK(s,S,r.boneCount||2,c)}}),s.constraints.some(i=>i.type!=="IK")){const i=this.globalToLocal(s.parentId,e);o.x=i.x,o.y=i.y,o.rotation=i.rotation,o.flip_x=i.scale_x<0,o.scale_x=Math.abs(i.scale_x),o.flip_y=i.scale_y<0,o.scale_y=Math.abs(i.scale_y)}})}getGlobalTransform(t){var u,p;const s=this.objectStates.get(t);if(!s)return{x:0,y:0,rotation:0,scale_x:1,scale_y:1};const o=(u=this.artboard)==null?void 0:u.objects.find(l=>l.id===t),e=(o==null?void 0:o.type)==="Bone"?(p=o.geometry)==null?void 0:p.length:void 0;if(!o||!o.parentId)return{x:s.x,y:s.y,rotation:s.rotation,scale_x:(s.scale_x??1)*(s.flip_x?-1:1),scale_y:(s.scale_y??1)*(s.flip_y?-1:1),length:e};const i=this.getGlobalTransform(o.parentId),n=i.rotation*Math.PI/180,a=Math.cos(n),r=Math.sin(n),c=i.x+(s.x*i.scale_x*a-s.y*i.scale_y*r),d=i.y+(s.x*i.scale_x*r+s.y*i.scale_y*a);return{x:c,y:d,rotation:i.rotation+s.rotation,scale_x:i.scale_x*(s.scale_x??1)*(s.flip_x?-1:1),scale_y:i.scale_y*(s.scale_y??1)*(s.flip_y?-1:1),length:e}}globalToLocal(t,s){if(!t)return s;const o=this.getGlobalTransform(t),e=o.scale_x===0?0:1/o.scale_x,i=o.scale_y===0?0:1/o.scale_y,n=-o.rotation*Math.PI/180,a=Math.cos(n),r=Math.sin(n),c=s.x-o.x,d=s.y-o.y,u=(c*a-d*r)*e,p=(c*r+d*a)*i;return{x:u,y:p,rotation:s.rotation-o.rotation,scale_x:s.scale_x/(o.scale_x||1),scale_y:s.scale_y/(o.scale_y||1)}}solveIK(t,s,o,e){var c;const i=[];let n=t.id;for(let d=0;d<o&&n;d++){const u=(c=this.artboard)==null?void 0:c.objects.find(p=>p.id===n);if(!u)break;i.push({id:n,local:this.objectStates.get(n),global:this.getGlobalTransform(n)}),n=u.parentId}if(i.length<2)return;const a=i.reverse(),r=5;for(let d=0;d<r;d++){const u=this.getGlobalTransform(t.id);for(let p=a.length-2;p>=0;p--){const l=a[p],h=this.getGlobalTransform(l.id),f=u.x-h.x,g=u.y-h.y,y=s.x-h.x,m=s.y-h.y,S=Math.sqrt(f*f+g*g),v=Math.sqrt(y*y+m*m);if(S>.001&&v>.001){const C=Math.atan2(g,f);let M=(Math.atan2(m,y)-C)*180/Math.PI;M*=e;const I=this.objectStates.get(l.id);I&&(I.rotation+=M)}}}}computeSpring(t,s,o,e,i,n,a,r){const c=a.stiffness??100,d=a.damping??10,u=a.mass??1,p=-c*(t-i),l=-c*(s-n),h=-d*o,f=-d*e,g=(p+h)/u,y=(l+f)/u,m=o+g*r,S=e+y*r,v=t+m*r,C=s+S*r;return{x:v,y:C,vx:m,vy:S}}handlePointerInput(t,s,o,e,i){if(!this.artboard)return;const n=this.calculateTransform(e,i,this.artboard.width,this.artboard.height,this.layout.fit,this.layout.alignment),a=(s-n.tx)/n.scaleX,r=(o-n.ty)/n.scaleY;this._prevPointerPos=this._lastPointerPos,this._lastPointerPos={x:a,y:r},this._prevPointerPos&&(this._mouseDelta.dx+=a-this._prevPointerPos.x,this._mouseDelta.dy+=r-this._prevPointerPos.y),this.updateInput("mouseX",a),this.updateInput("mouseY",r),this.handlePointerEvent(t,a,r)}handleScroll(t,s){const o=this.scrollOffset.x,e=this.scrollOffset.y;this.scrollOffset={x:t,y:s},this._totalScroll.x+=t-o,this._totalScroll.y+=s-e,this.updateInput("scrollX",this._totalScroll.x),this.updateInput("scrollY",this._totalScroll.y)}handleWheel(t,s){this._totalScroll.x+=t,this._totalScroll.y+=s,this.scrollOffset={x:this._totalScroll.x,y:this._totalScroll.y},this.updateInput("scrollX",this._totalScroll.x),this.updateInput("scrollY",this._totalScroll.y)}handlePointerEvent(t,s,o){var r,c,d,u,p;if(!this.artboard)return;t==="down"?(this.isMouseDown=!0,this.updateInput("isMouseDown",!0)):(t==="up"||t==="blur")&&(this.isMouseDown=!1,this.updateInput("isMouseDown",!1));let e=null;const i=(l,h)=>{var v;let f=h;h==="click"?f="onClick":h==="down"?f="onPointerDown":h==="up"?f="onPointerUp":h==="blur"&&(f="onPointerLeave");const g=new Set([f]);h==="move"&&(g.add("onPointerEnter").add("hover").add("onPointerLeave").add("blur"),g.add("Drag").add("drag").add("ondrag")),f==="onClick"&&g.add("click"),f==="onPointerDown"&&g.add("pointerDown"),f==="onPointerUp"&&g.add("pointerUp");const y=["button","toggle","toggle_button","dropdown","listview","inputbox","slider","checkbox","radiogroup","joystick"];if(l.type==="Component"&&y.includes(l.variant)||l.type==="Joystick"||y.includes((v=l.type)==null?void 0:v.toLowerCase()))return!0;const m=l.interactions||[];return!!(m.some(C=>g.has(C.event))||m.some(C=>Array.isArray(C.triggers)&&C.triggers.some(w=>g.has(String(w))))||(l.triggers||[]).some(C=>g.has(C.eventType)))};let n=null;for(let l=this.artboard.objects.length-1;l>=0;l--){const h=this.artboard.objects[l],f=this.objectStates.get(h.id);if(f&&f.visible!==!1&&f.opacity>0&&this.hitTest(h,s,o)&&(n||(n=h),i(h,t))){e=h;break}}!e&&n&&(e=n),this.pointerHistory.push({x:s,y:o,time:Date.now()}),this.pointerHistory.length>this.MAX_HISTORY&&this.pointerHistory.shift();const a=(e==null?void 0:e.id)||null;if(t==="move"){if(this.draggingSliderId){const l=this.artboard.objects.find(h=>h.id===this.draggingSliderId);l&&this.updateSliderValueFromPointer(l,s,o);return}if(this.draggingJoystickId){const l=this.artboard.objects.find(h=>h.id===this.draggingJoystickId);l&&this.updateJoystickValueFromPointer(l,s,o);return}if(this.draggingListViewId){const l=this.artboard.objects.find(h=>h.id===this.draggingListViewId);l&&this.updateListViewScrollFromPointer(l);return}if(e&&(e.type==="ListView"||e.type==="Component"&&e.variant==="listview")&&this.updateListViewHoverFromPointer(e,s,o),this.isMouseDown&&this.dragStartPointer&&this.draggingBehaviors.size>0){const l=s-this.dragStartPointer.x,h=o-this.dragStartPointer.y;this.draggingBehaviors.forEach(f=>{const g=this.dragStartPositions.get(f);if(!g)return;const y=this.artboard.objects.find(S=>S.id===f);if(!y||y.parentId)return;const m=this.objectStates.get(f);m&&(m.x=g.x+l,m.y=g.y+h)})}if(this.isMouseDown){const l=this.activeObjectId&&this.artboard.objects.some(f=>f.id===this.activeObjectId)?this.activeObjectId:a,h=l?this.artboard.objects.find(f=>f.id===l):null;h&&i(h,"move")&&this.fireEventForObject(h.id,"Drag")}!this.isMouseDown&&a!==this.lastHoveredObjectId&&(this.log(`[Engine] HOVER CHANGE: ${this.lastHoveredObjectId} -> ${a}`),this.lastHoveredObjectId&&this.fireEventForObject(this.lastHoveredObjectId,"onPointerLeave"),a&&this.fireEventForObject(a,"onPointerEnter"),this.lastHoveredObjectId=a);return}if((t==="up"||t==="blur")&&(this.draggingSliderId=null,this.draggingJoystickId=null,this.draggingListViewId=null,this.draggingBehaviors.clear(),this.dragStartPointer=null,this.dragStartPositions.clear(),this.pointerDownTimes.delete(a),this.activeObjectId=null),t==="down"&&(this.pointerDownTimes.set(a,this.currentTime),this.activeObjectId=a,e&&((r=e.behaviors)!=null&&r.some(l=>l.type===H.Draggable)||this.hasDragInteraction(e)))){this.draggingBehaviors.add(a);const l=this.objectStates.get(a);l&&(this.dragStartPointer={x:s,y:o},this.dragStartPositions.set(a,{x:l.x??0,y:l.y??0}))}if(t==="move"?(a&&!this.activeHoverIds.has(a)&&this.activeHoverIds.add(a),this.activeHoverIds.forEach(l=>{l!==a&&this.activeHoverIds.delete(l)})):t==="blur"&&this.activeHoverIds.clear(),this.activeDropdownId&&t==="down"){const l=this.artboard.objects.find(h=>h.id===this.activeDropdownId);if(l&&(l.type==="Dropdown"||l.variant==="dropdown")){const h=this.objectStates.get(l.id),f=(h==null?void 0:h.options)||l.options||{},g=l.geometry||{},y=g.width??l.width??200,m=g.height??l.height??40,S=f.optionsList||[],v=f.itemHeight||32,C=f.listPadding??4,w=S.length*v+C*2,M=this.getWorldTransform(l.id),I=y*Math.abs(M.scaleX),T=m*Math.abs(M.scaleY),k=M.y+T/2+4,E=Math.abs(s-M.x)<=I/2,P=o>=k&&o<=k+w*Math.abs(M.scaleY);if(E&&P){const _=Math.abs(M.scaleY),L=o-(k+C*_),A=Math.floor(L/(v*_));if(A>=0&&A<S.length){const W=S[A];f.selectedOption=W,f.isOpen=!1,this.activeDropdownId=null,l.inputId&&this.setInternalInput(l.inputId,W),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"dropdown",property:"selectedOption",value:W})}return}else a!==this.activeDropdownId&&(f.isOpen=!1,this.activeDropdownId=null)}}if(e){let l=e,h=e;for(;h&&h.parentId;){const g=this.artboard.objects.find(y=>y.id===h.parentId);if(g&&g.type==="Component"){l=g;break}h=g}let f=t;if(t==="click"?f="onClick":t==="down"?f="onPointerDown":t==="up"?f="onPointerUp":t==="blur"&&(f="onPointerLeave"),this.fireEventForObject(e.id,f),l!==e&&this.fireEventForObject(l.id,f),l.type==="Component"&&l.variant==="toggle_button"&&t==="down"){const g=this.objectStates.get(l.id),y=(g==null?void 0:g.options)||l.options||{};y.checked=!y.checked,l.inputId&&this.setInternalInput(l.inputId,y.checked),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"toggle_button",property:"checked",value:y.checked}),this.fireEventForObject(l.id,"Toggle"),this.fireEventForObject(l.id,y.checked?"Toggle True":"Toggle False")}if(l.type==="Component"&&l.variant==="toggle"&&t==="down"){const g=this.objectStates.get(l.id),y=(g==null?void 0:g.options)||l.options||{};y.checked=!y.checked,l.inputId&&this.setInternalInput(l.inputId,y.checked),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"toggle",property:"checked",value:y.checked}),this.onToggle&&this.onToggle(l.name,y.checked),this.fireEventForObject(l.id,"Toggle"),this.fireEventForObject(l.id,y.checked?"Toggle True":"Toggle False")}if(l.type==="Component"&&l.variant==="dropdown"&&t==="down"){const g=this.objectStates.get(l.id),y=(g==null?void 0:g.options)||l.options||{},m=!y.isOpen;if(m&&this.activeDropdownId&&this.activeDropdownId!==l.id){const S=this.artboard.objects.find(v=>v.id===this.activeDropdownId);S&&S.options&&(S.options.isOpen=!1)}y.isOpen=m,this.activeDropdownId=m?l.id:null}if(l.type==="Component"&&l.variant==="button"&&t==="down"&&(this.onButtonClick&&this.onButtonClick(l.name,l.id),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"button",property:"click",value:!0})),(l.type==="ListView"||l.type==="Component"&&l.variant==="listview")&&t==="down"){this.draggingListViewId=l.id;const g=this.getListViewItemIndexAtPointer(l,s,o);if(g!==null){const y=l.options||{};y.activeItemIndex=g;const m=this.objectStates.get(l.id);m&&m.options&&(m.options.activeItemIndex=g);const S=(y.items||[])[g],v=typeof S=="string"?S:S.label||S.value||g;m&&m.options&&(m.options.selectedValue=v),l.inputId&&this.setInternalInput(l.inputId,v),this.onComponentChange&&(this.onComponentChange({objectId:l.id,componentName:l.name,variant:"listview",property:"activeItemIndex",value:g}),this.onComponentChange({objectId:l.id,componentName:l.name,variant:"listview",property:"selected",value:v}))}}if(l.type==="Component"&&l.variant==="slider"&&t==="down"&&(this.draggingSliderId=l.id,this.updateSliderValueFromPointer(l,s,o)),l.type==="Joystick"||l.type==="Component"&&l.variant==="joystick"){if(t==="down")this.draggingJoystickId=l.id,this.updateJoystickValueFromPointer(l,s,o);else if(t==="up"||t==="blur"){const g=this.objectStates.get(l.id);g&&l.isSpringReturn!==!1&&(g.handleX=0,g.handleY=0),l.isSpringReturn!==!1&&(l.handleX=0,l.handleY=0)}}if(l.type==="Component"&&l.variant==="checkbox"&&t==="down"){const g=this.objectStates.get(l.id),y=(g==null?void 0:g.options)||l.options||{};y.checked=!y.checked,l.inputId&&this.setInternalInput(l.inputId,y.checked),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"checkbox",property:"checked",value:y.checked}),this.fireEventForObject(l.id,"Click"),this.fireEventForObject(l.id,y.checked?"Checked":"Unchecked")}if(l.type==="Component"&&l.variant==="radiogroup"&&t==="down"){const g=this.objectStates.get(l.id),y=(g==null?void 0:g.options)||l.options||{},m=y.optionsList||[],S=this.getRadioGroupItemIndexAtPointer(l,s,o);if(S!==null&&S>=0&&S<m.length){const v=m[S];y.selectedValue=v,l.inputId&&this.setInternalInput(l.inputId,v),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"radiogroup",property:"selectedValue",value:v}),this.fireEventForObject(l.id,"Click"),this.fireEventForObject(l.id,`Selected: ${v}`)}}if(l.type==="LineGraph"&&(t==="down"||t==="click")){const g=l.geometry,y=(g==null?void 0:g.datasets)||[],m=this.objectStates.get(l.id),S=(m==null?void 0:m.width)||(g==null?void 0:g.width)||200,v=(m==null?void 0:m.height)||(g==null?void 0:g.height)||150,C=this.getWorldTransform(l.id),w=30,M=20,I=S-w,T=v-M;let k=1;y.forEach(_=>{const L=Math.max(..._.data||[0]);L>k&&(k=L)});let E=1/0,P=null;y.forEach((_,L)=>{const A=_.data||[],W=I/Math.max(A.length-1,1);A.forEach((B,R)=>{const Y=C.x-S/2+w+R*W,G=C.y+v/2-M-B/k*T,z=Math.sqrt((s-Y)**2+(o-G)**2);z<E&&(E=z,P={dIdx:L,pIdx:R,val:B,label:_.label||`Dataset ${L+1}`})})}),P&&E<20&&this.onGraphPointClick&&this.onGraphPointClick({objectId:l.id,componentName:l.name,datasetIndex:P.dIdx,pointIndex:P.pIdx,value:P.val,label:P.label}),this.onComponentChange&&this.onComponentChange({objectId:l.id,componentName:l.name,variant:"linegraph",property:"click",value:(P==null?void 0:P.val)??null})}if(t==="click"){const g=(c=this.artboard)==null?void 0:c.objects.find(S=>S.id===e.id),y=this.focusedId,m=(g==null?void 0:g.type)==="InputBox"||(g==null?void 0:g.type)==="Component"&&g.variant==="inputbox";if(g&&m){if(this.focusedId=e.id,this.log(`[Engine] Focus set to: ${e.id}`),y!==this.focusedId){if(y){const S=(d=this.artboard)==null?void 0:d.objects.find(v=>v.id===y);S&&this.onInputBlur&&this.onInputBlur(S.name)}this.onInputFocus&&this.onInputFocus(g.name)}}else if(this.focusedId=null,y){const S=(u=this.artboard)==null?void 0:u.objects.find(v=>v.id===y);S&&this.onInputBlur&&this.onInputBlur(S.name)}}}else if(t==="click"){const l=this.focusedId;if(this.focusedId=null,l){const h=(p=this.artboard)==null?void 0:p.objects.find(f=>f.id===l);h&&this.onInputBlur&&this.onInputBlur(h.name)}}}handleKeyDown(t){if(!this.artboard||(this.activeKeys.add(t.key.toLowerCase()),this.activeKeys.add(t.code),!this.focusedId))return;const s=this.artboard.objects.find(a=>a.id===this.focusedId),o=(s==null?void 0:s.type)==="InputBox"||(s==null?void 0:s.type)==="Component"&&s.variant==="inputbox";if(!s||!o)return;const e=s.options||{};let i=e.text||"";if(t.key==="Backspace")i=i.slice(0,-1);else if(t.key==="Enter")if(e.multiline)i+=`
|
|
7
|
+
`;else{this.focusedId=null;return}else if(t.key.length===1)i+=t.key;else return;e.text=i;const n=s.geometry;n.textInputId&&this.updateInput(n.textInputId,i),this.onComponentChange&&this.onComponentChange({objectId:s.id,componentName:s.name,variant:"inputbox",property:"text",value:i}),this.onInputChange&&this.onInputChange(s.name,i),this.onInputUpdate&&this.onInputUpdate(this.focusedId,i)}handleKeyUp(t){this.artboard&&(this.activeKeys.delete(t.key.toLowerCase()),this.activeKeys.delete(t.code))}hasDragInteraction(t){return t?(t.interactions||[]).some(o=>{const e=o.triggers||[o.event||o.trigger];return Array.isArray(e)&&e.some(i=>String(i).toLowerCase()==="drag")}):!1}fireEventForObject(t,s){var d,u,p,l,h;const o=(d=this.artboard)==null?void 0:d.objects.find(f=>f.id===t);if(!o)return;const e=new Set([s,s.toLowerCase()]),i=s.toLowerCase();i==="onclick"||i==="click"||i==="onpointerdown"||i==="pointerdown"?this.fireAnalyticsEvent(t,"click"):(i==="onpointerenter"||i==="hover"||i==="move")&&this.fireAnalyticsEvent(t,"hover"),i==="onclick"||i==="click"?(e.add("click"),e.add("onclick")):i==="onpointerdown"||i==="pointerdown"?(e.add("pointerdown"),e.add("onpointerdown")):i==="onpointerup"||i==="pointerup"?(e.add("pointerup"),e.add("onpointerup")):i==="onpointerenter"||i==="hover"||i==="move"?(e.add("hover"),e.add("onpointerenter")):i==="onpointerleave"||i==="blur"?(e.add("onpointerleave"),e.add("blur")):i==="drag"||i==="ondrag"?(e.add("drag"),e.add("ondrag")):i==="toggle"||i==="ontoggle"?(e.add("toggle"),e.add("ontoggle")):i==="toggle true"||i==="toggle_true"||i==="toggletrue"?(e.add("toggle true"),e.add("toggle_true"),e.add("toggletrue")):(i==="toggle false"||i==="toggle_false"||i==="togglefalse")&&(e.add("toggle false"),e.add("toggle_false"),e.add("togglefalse"));const a=(o.interactions||[]).find(f=>{const g=f.triggers||[f.event||f.trigger||"click"];return((f.triggerLogic||"OR")==="AND"?g.every(S=>e.has(S.toLowerCase())):g.some(S=>e.has(S.toLowerCase())))?f.conditions&&f.conditions.length>0?this.checkConditions(f.conditions):!0:!1});if(a){if(this.log(`[Engine] Interaction matched: ${s} -> Action: ${a.action}`),a.action==="setInput"||a.action==="Set Input"){let f=a.value||a.inputValue;f==="toggle"&&(f=!this.inputs.get(a.targetInputId)),this.updateInput(a.targetInputId,f)}else if(a.action==="Toggle Boolean"){const f=this.inputs.get(a.targetInputId);this.updateInput(a.targetInputId,!f)}else if(a.action==="fireTrigger")this.updateInput(a.targetInputId,!0);else if(a.action==="setProperty"){const f=a.targetObjectId||o.id,g=a.targetProperty;g&&this.updateObjectProperty(f,g,a.value)}else if(a.action==="Navigate Artboard"||a.action==="navigate")this.onNavigation&&this.onNavigation({type:"artboard",value:a.targetArtboard||a.value});else if(a.action==="Navigate URL")this.onNavigation&&this.onNavigation({type:"url",value:a.navigateUrl});else if(a.action==="Play Animation"){const f=a.targetAnimationId,g=!a.playMode||a.playMode==="all"?void 0:a.subAnimationIds;f==="__all__"?(p=(u=this.artboard)==null?void 0:u.animations)==null||p.forEach(y=>{this.triggerGlobalAnimation(y.id,g)}):f&&this.triggerGlobalAnimation(f,g)}else if(a.action==="setState"||a.action==="Set State"){const f=a.targetObjectId||o.id,y={...this.objectStates.get(f)||{},...a.value||{}};this.objectStates.set(f,y),this.log(`[Engine] State updated for ${f}:`,y)}else if(a.action==="Stop Animation"||a.action==="Pause Animation"){const f=a.targetAnimationId;f==="__all__"?this.layerStates.forEach((g,y)=>{y.startsWith("global_")&&this.layerStates.delete(y)}):f&&this.layerStates.forEach((g,y)=>{y.startsWith(`global_${f}_`)&&this.layerStates.delete(y)})}else if(a.action==="Switch to State"&&this.activeStateMachine){const f=a.targetState,g=this.activeStateMachine.layers.find(y=>y.states.some(m=>m.id===f||m.name===f));g&&(this.log(`[Engine] Switching Layer ${g.name} to State ${f}`),this.enterStates(g.name,[f]))}this.onTrigger&&this.onTrigger(s,a.action)}const c=(o.triggers||[]).find(f=>{const g=f.eventType.toLowerCase();let y=!1;return(e.has(g)||g==="click"&&e.has("onclick")||g==="hover"&&(e.has("onpointerenter")||e.has("hover"))||g==="pointerdown"&&e.has("onpointerdown")||g==="pointerup"&&e.has("onpointerup"))&&(y=!0),y&&f.conditions&&f.conditions.length>0?this.checkConditions(f.conditions):y});if(c&&c.entryAnimationId){this.log(`[Engine] Trigger matched: ${s} (as ${c.eventType}) -> Animation ${c.entryAnimationId}`);const f=(h=(l=this.artboard)==null?void 0:l.animations)==null?void 0:h.find(g=>g.id===c.entryAnimationId);f&&(this.activeTriggers.set(o.id,{triggerId:c.id,animation:f,time:0,phase:"entry",elapsedHold:0,filterObjectId:c.targetObjectId}),this.onTrigger&&this.onTrigger(c.name,f.name))}}fireAnalyticsEvent(t,s){var r,c;const o=(r=this.artboard)==null?void 0:r.objects.find(d=>d.id===t);if(!o)return;const e=(c=o.style)==null?void 0:c.analytics;if(!e||!e.isEnabled||e.triggerType!==s)return;const i=e.eventName||`${o.name.toLowerCase().replace(/\s+/g,"_")}_interacted`,n={};e.parameters&&Array.isArray(e.parameters)&&e.parameters.forEach(d=>{if(d.type==="literal")n[d.key]=d.value;else if(d.type==="variable"){const u=this.inputs.get(d.value);n[d.key]=u!==void 0?u:""}}),this.log(`[ExodeUI Analytics] Dispatching event "${i}" via ${s} trigger:`,n);const a=e.platforms||{ga4:!0,meta:!0,mixpanel:!1};if(a.ga4){const d=window;typeof d.gtag=="function"?(d.gtag("event",i,n),this.log(`[ExodeUI Analytics] GA4: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] GA4: window.gtag is not a function. Event "${i}" skipped.`)}if(a.meta){const d=window;typeof d.fbq=="function"?(d.fbq("track",i,n),this.log(`[ExodeUI Analytics] Meta Pixel: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] Meta Pixel: window.fbq is not a function. Event "${i}" skipped.`)}if(a.mixpanel){const d=window;d.mixpanel&&typeof d.mixpanel.track=="function"?(d.mixpanel.track(i,n),this.log(`[ExodeUI Analytics] Mixpanel: Event "${i}" sent successfully.`)):this.warn(`[ExodeUI Analytics] Mixpanel: window.mixpanel.track is not a function. Event "${i}" skipped.`)}}getAnimationDuration(t){var o;if(!t)return 0;let s=t.duration||0;return s<=0&&((o=t.tracks)==null||o.forEach(e=>{var i;(i=e.keyframes)==null||i.forEach(n=>{n.time>s&&(s=n.time)})})),s>0?s:1}initGlobalAnimationTriggers(){if(!this.artboard)return;const t=this.artboard.animationFlow||[];let s=!1;t.forEach(o=>{if((o.trigger==="on_load"||o.trigger==="after_delay")&&o.targetAnimationId){s=!0;const e=o.delay||0;e<=0?this.triggerGlobalAnimation(o.targetAnimationId,o.subAnimationIds,o.loop,o.id):setTimeout(()=>this.triggerGlobalAnimation(o.targetAnimationId,o.subAnimationIds,o.loop,o.id),e)}}),!s&&this.artboard.startupAnimationId&&this.triggerGlobalAnimation(this.artboard.startupAnimationId,this.artboard.startupSubAnimationIds)}triggerGlobalAnimation(t,s,o=!1,e){var r;if(!this.artboard)return;const i=this.artboard.animations.find(c=>c.id===t);if(!i)return;let n=this.getAnimationDuration(i);const a=`global_${t}_${Math.random().toString(36).substr(2,5)}`;this.layerStates.set(a,{currentStateIds:[t],animations:[{animation:i,state:{loop:o},filterObjectIds:s}],time:0,duration:n,ruleId:e}),console.log(`[Engine] Triggered global animation: ${i.name} (AnimID: ${t}, RuleID: ${e}, Loop: ${o}, StoredDuration: ${n}, anim.duration: ${i.duration}, Tracks: ${((r=i.tracks)==null?void 0:r.length)||0})`),this.debugLog(`[Engine] Triggered global animation: ${i.name} (Loop: ${o}, Sub-Anims: ${(s==null?void 0:s.length)||"All"})`)}handleAnimationFinished(t,s){if(!this.artboard)return;console.log(`[Engine] Animation finished! AnimID: ${t}, RuleID: ${s}`);const o=this.artboard.animationFlow||[];o.forEach((e,i)=>{if(e.trigger==="after_anim"&&e.targetAnimationId){let n=e.afterAnim;!n&&i>0&&(n=o[i-1].id);const a=n===t||s&&n===s;if(console.log(`[Engine] Checking rule ${e.id} (Trigger: ${e.trigger}). ExpectedParent: ${n}. isMatch? ${a}`),a){const r=e.delay||0;console.log(`[Engine] Match found! Triggering target animation: ${e.targetAnimationId} after delay: ${r}`),r<=0?this.triggerGlobalAnimation(e.targetAnimationId,e.subAnimationIds,e.loop,e.id):setTimeout(()=>this.triggerGlobalAnimation(e.targetAnimationId,e.subAnimationIds,e.loop,e.id),r)}}})}getWorldTransform(t){var p;const s=this.objectStates.get(t);if(!s)return{x:0,y:0,scaleX:1,scaleY:1,rotation:0};const o=(p=this.artboard)==null?void 0:p.objects.find(l=>l.id===t);if(!o||!o.parentId)return{x:s.x,y:s.y,scaleX:s.scale_x??1,scaleY:s.scale_y??1,rotation:s.rotation??0};const e=this.getWorldTransform(o.parentId),i=e.rotation*(Math.PI/180),n=Math.cos(i),a=Math.sin(i),r=s.x*e.scaleX,c=s.y*e.scaleY,d=e.x+(r*n-c*a),u=e.y+(r*a+c*n);return{x:d,y:u,scaleX:(s.scale_x??1)*e.scaleX,scaleY:(s.scale_y??1)*e.scaleY,rotation:e.rotation+(s.rotation??0)}}hitTest(t,s,o){var S,v;if(!this.objectStates.get(t.id))return!1;const i=((S=t.geometry)==null?void 0:S.width)??t.width??100,n=((v=t.geometry)==null?void 0:v.height)??t.height??100,a=this.getWorldTransform(t.id),r=s-a.x,c=o-a.y,d=-a.rotation*(Math.PI/180),u=Math.cos(d),p=Math.sin(d),l=r*u-c*p,h=r*p+c*u,f=a.scaleX,g=a.scaleY,y=i*Math.abs(f),m=n*Math.abs(g);return Math.abs(l)<=y/2&&Math.abs(h)<=m/2}updateSliderValueFromPointer(t,s,o){var M;const e=this.objectStates.get(t.id);if(!e)return;const i=t.options||{},n=((M=t.geometry)==null?void 0:M.width)??t.width??200,a=this.getWorldTransform(t.id),r=s-a.x,c=o-a.y,d=-a.rotation*(Math.PI/180),u=Math.cos(d),p=Math.sin(d),l=r*u-c*p,h=i.thumbWidth??16,f=n-h;let y=(l+f/2)/f;y=Math.max(0,Math.min(1,y));const m=i.min??0,S=i.max??100,v=i.step||1;let C=m+y*(S-m);v>0&&(C=Math.round(C/v)*v),C=Math.max(m,Math.min(S,C));const w=e.options||{};w.value!==C&&(e.options={...w,value:C},t.inputId&&this.setInternalInput(t.inputId,C),this.onComponentChange&&this.onComponentChange({objectId:t.id,componentName:t.name,variant:"slider",property:"value",value:C}))}updateJoystickValueFromPointer(t,s,o){var M,I;const e=this.objectStates.get(t.id);if(!e)return;const i=(e==null?void 0:e.width)!==void 0?e.width:((M=t.geometry)==null?void 0:M.width)??t.width??100,n=(e==null?void 0:e.height)!==void 0?e.height:((I=t.geometry)==null?void 0:I.height)??t.height??100,a=this.getWorldTransform(t.id),r=s-a.x,c=o-a.y,d=-a.rotation*(Math.PI/180),u=Math.cos(d),p=Math.sin(d);let l=(r*u-c*p)/Math.max(.001,Math.abs(a.scaleX||1)),h=(r*p+c*u)/Math.max(.001,Math.abs(a.scaleY||1));t.handleOrigin==="top-left"?(l-=i/2,h-=n/2):t.handleOrigin==="bottom-right"&&(l+=i/2,h+=n/2);const f=Math.min(i,n)*.45,g=Math.min(i,n)*.15,y=f-g;let m=l/y,S=h/y;const v=Math.sqrt(m*m+S*S);t.boundsShape==="square"?(m=Math.max(-1,Math.min(1,m)),S=Math.max(-1,Math.min(1,S))):v>1&&(m/=v,S/=v),t.deadzone!==void 0&&v<t.deadzone?(m=0,S=0):(t.stepX!==void 0&&t.stepX>0&&(m=Math.round(m/t.stepX)*t.stepX),t.stepY!==void 0&&t.stepY>0&&(S=Math.round(S/t.stepY)*t.stepY)),t.joystickType==="1D_X"?S=0:t.joystickType==="1D_Y"&&(m=0);const C=e.handleX,w=e.handleY;(C!==m||w!==S)&&(e.handleX=m,e.handleY=S,t.handleX=m,t.handleY=S)}processJoysticks(t){this.artboard&&(this.artboard.objects.forEach(s=>{var c,d,u,p;if(s.type!=="Joystick"&&!(s.type==="Component"&&s.variant==="joystick"))return;const o=s,e=this.objectStates.get(o.id);if(!e)return;let i=e.handleX??o.handleX??0,n=e.handleY??o.handleY??0;const r=(o.globalInput??!1)||this.lastHoveredObjectId===o.id;if(r&&((c=o.inputBinding)==null?void 0:c.type)==="keyboard"&&o.inputBinding.keyboardConfig){const l=o.inputBinding.keyboardConfig;let h=i,f=n;const y=(l.speed||5)*t;let m=!1;this.activeKeys.has(l.upKey.toLowerCase())&&(f-=y,m=!0),this.activeKeys.has(l.downKey.toLowerCase())&&(f+=y,m=!0),this.activeKeys.has(l.leftKey.toLowerCase())&&(h-=y,m=!0),this.activeKeys.has(l.rightKey.toLowerCase())&&(h+=y,m=!0),o.joystickType==="1D_X"&&(f=0),o.joystickType==="1D_Y"&&(h=0);const S=Math.sqrt(h*h+f*f);S>1&&(h/=S,f/=S),!m&&o.isSpringReturn!==!1&&(h+=(0-h)*(10*t),f+=(0-f)*(10*t),Math.abs(h)<.01&&(h=0),Math.abs(f)<.01&&(f=0)),i=h,n=f}else if(r&&((d=o.inputBinding)==null?void 0:d.type)==="mouse"&&o.inputBinding.mouseConfig){const l=o.inputBinding.mouseConfig;let h=e._mouseTargetX??i,f=e._mouseTargetY??n;const g=l.sensitivity||.01;if(l.mode==="absolute"){const S=((u=this.artboard)==null?void 0:u.width)||window.innerWidth,v=((p=this.artboard)==null?void 0:p.height)||window.innerHeight,C=this.inputs.get("mouseX")||0,w=this.inputs.get("mouseY")||0;l.axisX&&(h=C/S*2-1),l.axisY&&(f=w/v*2-1)}else l.axisX&&(h+=this._mouseDelta.dx*g),l.axisY&&(f+=this._mouseDelta.dy*g);o.joystickType==="1D_X"&&(f=0),o.joystickType==="1D_Y"&&(h=0);const y=Math.sqrt(h*h+f*f);y>1&&(h/=y,f/=y),o.isSpringReturn!==!1&&(h+=(0-h)*(5*t),f+=(0-f)*(5*t),Math.abs(h)<.01&&(h=0),Math.abs(f)<.01&&(f=0)),e._mouseTargetX=h,e._mouseTargetY=f;const m=15*t;i+=(h-i)*Math.min(m,1),n+=(f-n)*Math.min(m,1)}if(e.handleX=i,e.handleY=n,o.handleX=i,o.handleY=n,o.bindings&&o.bindings.length>0){const l=Math.sqrt(i*i+n*n);let h=Math.atan2(n,i)*(180/Math.PI);h<0&&(h+=360),o.bindings.forEach(f=>{var m,S,v,C,w,M,I,T;let g=0;f.sourceAxis==="x"?g=o.invertX?-i:i:f.sourceAxis==="y"?g=o.invertY?-n:n:f.sourceAxis==="distance"?g=l:f.sourceAxis==="angle"&&(g=h);const y=(m=this.artboard)==null?void 0:m.objects.find(k=>k.id===f.targetObjectId);if(y){if(f.actionType==="bind"&&f.targetProperty&&f.isContinuous!==!1){const k=f.sourceMin??-1,E=f.sourceMax??1,P=f.targetMin??0,_=f.targetMax??100;let L=!!f.isContinuous,A=0,W=0;if(L){if((f.sourceAxis==="x"||f.sourceAxis==="y")&&P>=0){const R=Math.max(Math.abs(k),Math.abs(E))||1;W=g/R*_}else{let R=(g-k)/(E-k);R=Math.max(0,Math.min(1,R)),W=P+R*(_-P)}Math.abs(g)<.05&&(W=0)}else{const R=(g-k)/(E-k),Y=Math.max(0,Math.min(1,R));A=P+Y*(_-P),f.step&&f.step>0&&(A=Math.round(A/f.step)*f.step)}const B=this.objectStates.get(y.id);if(B){const R=f.isRelative!==!1,Y=R?((S=y.transform)==null?void 0:S.x)??0:0,G=R?((v=y.transform)==null?void 0:v.y)??0:0,z=R?((C=y.transform)==null?void 0:C.rotation)??0:0,O=R?((w=y.transform)==null?void 0:w.scale_x)??1:0,F=R?((M=y.transform)==null?void 0:M.scale_y)??1:0,Z=R?((I=y.style)==null?void 0:I.opacity)??100:0,st=Math.min(t*60,3),at=(ct,dt)=>{let $=A;if(L){const X=`_internal_${ct}_${f.id}`;let N=B[X];N===void 0&&(N=B[ct]??dt),$=N+W*st,B[X]=$,f.step&&f.step>0&&($=Math.round($/f.step)*f.step)}else{$=dt+A;const X=`_internal_smooth_${ct}_${f.id}`;let N=B[X];if(N===void 0)N=$;else{const ot=Math.min(15*t,1);N+=($-N)*ot}B[X]=N,$=N}B[ct]=$};f.targetProperty==="x"||f.targetProperty==="transform.x"?at("x",Y):f.targetProperty==="y"||f.targetProperty==="transform.y"?at("y",G):f.targetProperty==="rotation"||f.targetProperty==="r"||f.targetProperty==="transform.rotation"?at("rotation",z):f.targetProperty==="scaleX"||f.targetProperty==="transform.scale_x"?at("scale_x",O):f.targetProperty==="scaleY"||f.targetProperty==="transform.scale_y"?at("scale_y",F):(f.targetProperty==="opacity"||f.targetProperty==="transform.opacity")&&at("opacity",Z)}(T=y.physics)!=null&&T.enabled&&this.physicsEngine&&(f.targetProperty==="x"||f.targetProperty==="transform.x"||f.targetProperty==="y"||f.targetProperty==="transform.y")&&(f.targetProperty==="x"||f.targetProperty==="transform.x"?this.physicsEngine.applyForce(y.id,(A-((B==null?void 0:B.x)||0))*10,0):(f.targetProperty==="y"||f.targetProperty==="transform.y")&&this.physicsEngine.applyForce(y.id,0,(A-((B==null?void 0:B.y)||0))*10))}else if(f.actionType==="playAnimation"||f.actionType==="stopAnimation"||f.actionType==="pauseAnimation"){let k=!1;const E=f.threshold??0;f.condition==="always"?k=!0:f.condition===">"?k=g>E:f.condition==="<"?k=g<E:f.condition==="=="&&(k=Math.abs(g-E)<.01);const P=e[`_prev_src_${f.id}`]??g;let _=!1;f.condition==="always"?_=!0:f.condition===">"?_=P>E:f.condition==="<"?_=P<E:f.condition==="=="&&(_=Math.abs(P-E)<.01),e[`_prev_src_${f.id}`]=g,k&&!_&&f.targetAnimationId&&(f.actionType==="playAnimation"||f.actionType)}}})}}),this._mouseDelta.dx=0,this._mouseDelta.dy=0)}applyBlendState(t,s){var c,d,u,p,l,h,f,g;if(!t.blendAnimations||t.blendAnimations.length===0)return;let o=0,e=0;t.blendInputX&&(o=this.inputs.get(t.blendInputX)??0),t.blendInputY&&(e=this.inputs.get(t.blendInputY)??0);const i=[];let n=0;if(t.blendType==="1D"){const y=[...t.blendAnimations].sort((m,S)=>m.position[0]-S.position[0]);if(y.length===1){const m=(d=(c=this.artboard)==null?void 0:c.animations)==null?void 0:d.find(S=>S.id===y[0].animationId);m&&(i.push({anim:m,weight:1}),n=1)}else{let m=0;for(;m<y.length-1&&y[m+1].position[0]<o;)m++;if(m===y.length-1&&o>y[m].position[0]){const S=(p=(u=this.artboard)==null?void 0:u.animations)==null?void 0:p.find(v=>v.id===y[m].animationId);S&&(i.push({anim:S,weight:1}),n=1)}else{const S=y[m].position[0],v=y[m+1].position[0],C=(h=(l=this.artboard)==null?void 0:l.animations)==null?void 0:h.find(k=>k.id===y[m].animationId),w=(g=(f=this.artboard)==null?void 0:f.animations)==null?void 0:g.find(k=>k.id===y[m+1].animationId),M=Math.max(.001,v-S);let I=(o-S)/M;I=Math.max(0,Math.min(1,I));const T=1-I;C&&(i.push({anim:C,weight:T}),n+=T),w&&(i.push({anim:w,weight:I}),n+=I)}}}else t.blendAnimations.forEach(y=>{var w,M;const m=(M=(w=this.artboard)==null?void 0:w.animations)==null?void 0:M.find(I=>I.id===y.animationId);if(!m)return;const S=y.position[0]-o,v=y.position[1]-e,C=S*S+v*v;if(C<1e-4)i.push({anim:m,weight:1e4}),n+=1e4;else{const I=1/C;i.push({anim:m,weight:I}),n+=I}});if(n===0)return;i.forEach(y=>y.weight/=n);const a=new Map,r=y=>{let m=y.startsWith("#")?y.substring(1):y;return m.length===3&&(m=[m[0],m[0],m[1],m[1],m[2],m[2]].join("")),m="0x"+m,{r:m>>16&255,g:m>>8&255,b:m&255,a:1}};i.forEach(({anim:y,weight:m})=>{y.tracks&&y.tracks.forEach(S=>{var E,P;const v=S.object_id||S.objectId,C=S.property,w=(E=this.artboard)==null?void 0:E.objects.find(_=>_.id===v);if(((P=w==null?void 0:w.physics)==null?void 0:P.enabled)&&w.physics.bodyType!=="Static"&&(C==="x"||C==="y"||C==="rotation"))return;const I=this.interpolate(S.keyframes,s);if(I===void 0)return;let T=a.get(v);T||(T=new Map,a.set(v,T));let k=T.get(C);if(!k){if(typeof I=="number")k={type:"number",value:0};else if(typeof I=="string"&&I.startsWith("#"))k={type:"color",value:I,colorAcc:{r:0,g:0,b:0,a:0}};else if(k={type:"number",value:I},m<.5)return;T.set(C,k)}if(k.type==="number"&&typeof I=="number")k.value+=I*m;else if(k.type==="color"&&typeof I=="string"&&k.colorAcc){const _=r(I);_&&(k.colorAcc.r+=_.r*m,k.colorAcc.g+=_.g*m,k.colorAcc.b+=_.b*m,k.colorAcc.a+=_.a*m)}else m>.5&&(k.value=I)})}),a.forEach((y,m)=>{var C;const S=this.objectStates.get(m),v=(C=this.artboard)==null?void 0:C.objects.find(w=>w.id===m);!S||!v||y.forEach((w,M)=>{let I=w.value;if(w.type==="color"&&w.colorAcc){const T=Math.round(w.colorAcc.r).toString(16).padStart(2,"0"),k=Math.round(w.colorAcc.g).toString(16).padStart(2,"0"),E=Math.round(w.colorAcc.b).toString(16).padStart(2,"0");I=`#${T}${k}${E}`}if(M.includes(".")||M.includes("[")){const T=(M||"").replace(/\[(\d+)\]/g,".$1").split(".");let k=S;for(let E=0;E<T.length-1;E++){if(typeof k[T[E]]!="object"||k[T[E]]===null){let P=v;for(let _=0;_<=E;_++)P=P?P[T[_]]:null;if(T[E]==="corner_radius"||T[E]==="cornerRadius"){const _=typeof k[T[E]]=="number"?k[T[E]]:typeof P=="number"?P:0;k[T[E]]={tl:_,tr:_,bl:_,br:_}}else{const _=T[E+1],L=!isNaN(Number(_));k[T[E]]=P?JSON.parse(JSON.stringify(P)):L?[]:{}}}k=k[T[E]]}k[T[T.length-1]]=I,T[T.length-1]==="color"&&(T[T.length-2]==="fill"||T[T.length-2]==="stroke")&&(k.type="Solid")}else M==="fill"?(S.style||(S.style={}),S.style.fill=I):M==="stroke"?(S.style||(S.style={}),S.style.stroke=I):S[M]=I})})}applyAnimation(t,s,o){!t||!t.tracks||t.tracks.forEach(e=>{var u,p,l;const i=e.object_id||e.objectId;if(o){if(Array.isArray(o)){if(!o.includes(i))return}else if(i!==o)return}const n=(u=this.artboard)==null?void 0:u.objects.find(h=>h.id===i),a=((p=n==null?void 0:n.physics)==null?void 0:p.enabled)&&n.physics.bodyType!=="Static";let r=e.property;if(a&&(r==="x"||r==="y"||r==="rotation"))return;const c=this.objectStates.get(i);if(!c){this.frameCount%600===0&&this.debugLog(`Skipping track: Object ${i} not found in state`);return}const d=this.interpolate(e.keyframes,s);if(d!==void 0){if(this.frameCount%240===0){const h=(n==null?void 0:n.name)||i,f=typeof d=="object"?JSON.stringify(d).slice(0,50):d;this.debugLog(`[Anim] Applying ${r} = ${f} to ${h}`)}if(r.includes(".")||r.includes("[")){const h=(r||"").replace(/\[(\d+)\]/g,".$1").split(".");let f=c;for(let g=0;g<h.length-1;g++){if(typeof f[h[g]]!="object"||f[h[g]]===null){let y=n;for(let m=0;m<=g;m++)y=y?y[h[m]]:null;if(h[g]==="corner_radius"||h[g]==="cornerRadius"){let m=0,S=0,v=0,C=0;const w=f[h[g]]??y;typeof w=="number"?m=S=v=C=w:Array.isArray(w)?w.length===1?m=S=v=C=w[0]:w.length===2?(m=v=w[0],S=C=w[1]):w.length===3?(m=w[0],S=C=w[1],v=w[2]):w.length>=4&&(m=w[0],S=w[1],v=w[2],C=w[3]):w&&typeof w=="object"&&(m=w[0]??w.tl??w.corner_radius??w.cornerRadius??0,S=w[1]??w.tr??w.corner_radius??w.cornerRadius??0,v=w[2]??w.br??w.corner_radius??w.cornerRadius??0,C=w[3]??w.bl??w.corner_radius??w.cornerRadius??0),f[h[g]]={tl:m,tr:S,bl:C,br:v,0:m,1:S,2:v,3:C}}else{const m=h[g+1],S=!isNaN(Number(m));f[h[g]]=y?JSON.parse(JSON.stringify(y)):S?[]:{}}}f=f[h[g]]}f[h[h.length-1]]=d,h[h.length-1]==="color"&&(h[h.length-2]==="fill"||h[h.length-2]==="stroke")&&(f.type="Solid")}else r==="fill"?(c.style||(c.style={}),c.style.fill=d):r==="stroke"?(c.style||(c.style={}),c.style.stroke=d):c[r]=d;if(this.physicsEngine&&((l=n==null?void 0:n.physics)!=null&&l.enabled)&&n.physics.bodyType==="Static")if(r==="x"){const h=this.physicsEngine.getPosition(i);h&&this.physicsEngine.setPosition(i,d,h.y)}else if(r==="y"){const h=this.physicsEngine.getPosition(i);h&&this.physicsEngine.setPosition(i,h.x,d)}else r==="rotation"&&this.physicsEngine.setRotation(i,d*(Math.PI/180))}})}interpolate(t,s){if(t.length===0)return;let o=t[0],e=t[t.length-1];if(s<=o.time)return o.value;if(s>=e.time)return e.value;for(let a=0;a<t.length-1;a++)if(s>=t[a].time&&s<t[a+1].time){o=t[a],e=t[a+1];break}const i=e.time-o.time;let n=(s-o.time)/i;return o.easing&&(n=si(o.easing)(n)),this.interpolateValue(o.value,e.value,n)}interpolateValue(t,s,o){if(t===void 0)return s;if(s===void 0)return t;if(typeof t=="string"&&typeof s=="string"){if(t.startsWith("#"))return this.interpolateColor(t,s,o);const e=parseFloat(t),i=parseFloat(s);return!isNaN(e)&&!isNaN(i)?Math.round(e+(i-e)*o).toString():o<.5?t:s}if(Array.isArray(t)&&Array.isArray(s))return t.length===s.length?t.map((e,i)=>this.interpolateValue(e,s[i],o)):o<.5?t:s;if(typeof t=="object"&&typeof s=="object"&&t!==null&&s!==null){if(t.width!==void 0&&t.color!==void 0&&typeof t.width=="number")return this.interpolateStroke(t,s,o);if(t.type&&s.type&&(t.type==="Solid"||t.type==="LinearGradient"||t.type==="RadialGradient"||t.type==="Image"))return this.interpolateFill(t,s,o);const e={};return new Set([...Object.keys(t),...Object.keys(s)]).forEach(n=>{e[n]=this.interpolateValue(t[n],s[n],o)}),e}return typeof t=="number"&&typeof s=="number"?t+(s-t)*o:o<.5?t:s}interpolateColor(t,s,o){var h,f;const e=((f=(h=this.artboard)==null?void 0:h.tokens)==null?void 0:f.colors)||{},i=e[t]||t,n=e[s]||s,a=g=>{if(!g)return{r:0,g:0,b:0};const y=g.startsWith("#")?g.replace("#",""):"000000";return y.length===3?{r:parseInt(y[0]+y[0],16),g:parseInt(y[1]+y[1],16),b:parseInt(y[2]+y[2],16)}:{r:parseInt(y.substring(0,2),16),g:parseInt(y.substring(2,4),16),b:parseInt(y.substring(4,6),16)}},r=a(i),c=a(n),d=Math.round(r.r+(c.r-r.r)*o),u=Math.round(r.g+(c.g-r.g)*o),p=Math.round(r.b+(c.b-r.b)*o),l=g=>{const y=Math.max(0,Math.min(255,g)).toString(16);return y.length===1?"0"+y:y};return`#${l(d)}${l(u)}${l(p)}`}interpolateStops(t,s,o){return!t||!s||t.length!==s.length?o<.5?t:s:t.map((e,i)=>{const n=s[i];return{offset:e.offset+(n.offset-e.offset)*o,color:this.interpolateColor(e.color,n.color,o),opacity:(e.opacity??1)+((n.opacity??1)-(e.opacity??1))*o}})}interpolateFill(t,s,o){if(!t||!s||t.type!==s.type)return o<.5?t:s;const e={...t,opacity:(t.opacity??1)+((s.opacity??1)-(t.opacity??1))*o};return t.type==="Solid"?e.color=this.interpolateColor(t.color,s.color,o):(t.type==="LinearGradient"||t.type==="RadialGradient")&&(t.start&&s.start&&(e.start=[t.start[0]+(s.start[0]-t.start[0])*o,t.start[1]+(s.start[1]-t.start[1])*o]),t.end&&s.end&&(e.end=[t.end[0]+(s.end[0]-t.end[0])*o,t.end[1]+(s.end[1]-t.end[1])*o]),t.center&&s.center&&(e.center=[t.center[0]+(s.center[0]-t.center[0])*o,t.center[1]+(s.center[1]-t.center[1])*o]),t.radius!==void 0&&s.radius!==void 0&&(e.radius=t.radius+(s.radius-t.radius)*o),e.stops=this.interpolateStops(t.stops,s.stops,o)),e}interpolateStroke(t,s,o){if(!t||!s)return o<.5?t:s;const e={...t};return e.width=(t.width??0)+((s.width??0)-(t.width??0))*o,e.opacity=(t.opacity??1)+((s.opacity??1)-(t.opacity??1))*o,t.fill&&s.fill?e.fill=this.interpolateFill(t.fill,s.fill,o):t.color&&s.color&&t.color.startsWith("#")&&s.color.startsWith("#")&&(e.color=this.interpolateColor(t.color,s.color,o)),e.trimStart=(t.trimStart??0)+((s.trimStart??0)-(t.trimStart??0))*o,e.trimEnd=(t.trimEnd??1)+((s.trimEnd??1)-(t.trimEnd??1))*o,e.trimOffset=(t.trimOffset??0)+((s.trimOffset??0)-(t.trimOffset??0))*o,e.dashOffset=(t.dashOffset??0)+((s.dashOffset??0)-(t.dashOffset??0))*o,e}render(t,s,o){var u;this.debug_objectsTotal=((u=this.artboard)==null?void 0:u.objects.length)||0,this.debug_objectsRendered=0;const e=performance.now();if(this.canvasWidth=s,this.canvasHeight=o,!this.artboard)return;t.clearRect(0,0,s,o);const i=this.artboard.width,n=this.artboard.height,a=this.calculateTransform(s,o,i,n,this.layout.fit,this.layout.alignment);if(t.save(),t.translate(Math.round(a.tx),Math.round(a.ty)),t.scale(a.scaleX,a.scaleY),this.rootTransform=t.getTransform(),this.artboard.backgroundVisible!==!1&&(t.fillStyle=this.artboard.backgroundColor||"#000000",t.fillRect(0,0,i,n)),this.artboard.backgroundImage){const p=this.artboard.backgroundImage;let l=this.imageCache.get(p);if(l||(l=new Image,l.src=p,this.imageCache.set(p,l)),l.complete&&l.naturalWidth>0){t.save(),t.globalAlpha=this.normalizeOpacity(this.artboard.backgroundOpacity??100);const h=l.naturalWidth/l.naturalHeight,f=i/n;let g,y,m,S;f>h?(g=i,y=i/h):(y=n,g=n*h),m=(i-g)/2,S=(n-y)/2,t.drawImage(l,m,S,g,y),t.restore()}}this.artboard.clipContent!==!1&&this.artboard.clip_content!==!1&&(t.beginPath(),t.rect(0,0,i,n),t.clip());const c=new Map;this.artboard.objects.forEach(p=>c.set(p.id,p)),this.artboard.objects.filter(p=>!p.parentId).map((p,l)=>{const h=this.objectStates.get(p.id),f=(h==null?void 0:h.zIndex)??l;return{obj:p,zIndex:f}}).sort((p,l)=>p.zIndex-l.zIndex).forEach(({obj:p})=>{this.renderObject(t,p,c)}),this._emitterPools.forEach((p,l)=>{if(!(p.length===0||!c.get(l)))for(const f of p)t.save(),t.globalAlpha=f.opacity,t.fillStyle=f.color,t.beginPath(),t.arc(f.x,f.y,Math.max(1,f.size*f.opacity),0,Math.PI*2),t.fill(),t.restore()}),this.lastRenderTime=performance.now()-e,this.debugMode&&this.frameCount%60===0&&this.log(`[Engine Debug] Rendered ${this.debug_objectsRendered}/${this.debug_objectsTotal} objects in ${this.lastRenderTime.toFixed(2)}ms`),t.restore()}isObjectInView(t,s,o,e,i,n=0){const a=t.getTransform(),r=s*a.a+o*a.c+a.e,c=s*a.b+o*a.d+a.f,d=Math.sqrt(a.a*a.a+a.b*a.b),u=Math.sqrt(a.c*a.c+a.d*a.d),p=(e/2+n)*d,l=(i/2+n)*u;return r+p>=0&&r-p<=this.canvasWidth&&c+l>=0&&c-l<=this.canvasHeight}calculateTransform(t,s,o,e,i,n){let a=1,r=1,c=1;const d=o/e,u=t/s;switch(i){case"Contain":u>d?c=s/e:c=t/o,a=r=c;break;case"Cover":u>d?c=t/o:c=s/e,a=r=c;break;case"Fill":a=t/o,r=s/e;break;case"FitWidth":c=t/o,a=r=c;break;case"FitHeight":c=s/e,a=r=c;break;case"None":a=r=1;break;case"ScaleDown":c=Math.min(t/o,s/e),c>1&&(c=1),a=r=c;break;default:a=r=1;break}const p=o*a,l=e*r;let h=0,f=0;return n.includes("Left")?h=0:n.includes("Right")?h=t-p:h=(t-p)/2,n.includes("Top")?f=0:n.includes("Bottom")?f=s-l:f=(s-l)/2,{scaleX:a,scaleY:r,tx:h,ty:f}}mapFontWeight(t){const s=t.toLowerCase();return s==="thin"||s==="100"?"100":s==="extralight"||s==="200"?"200":s==="light"||s==="300"?"300":s==="regular"||s==="normal"||s==="400"?"400":s==="medium"||s==="500"?"500":s==="semibold"||s==="600"?"600":s==="bold"||s==="700"?"700":s==="extrabold"||s==="800"?"800":s==="black"||s==="900"?"900":t}drawTextDecoration(t,s,o,e,i,n){t.beginPath();const a=Math.max(1,n/14);let r=e;s==="underline"?r=e+n*.12:s==="line-through"&&(r=e-n*.3),t.lineWidth=a,t.strokeStyle=t.fillStyle,t.moveTo(o-i/2,r),t.lineTo(o+i/2,r),t.stroke()}renderObject(t,s,o,e=!1,i=!1){var S,v,C,w,M,I,T,k,E,P,_,L,A,W,B,R,Y,G,z,O,F,Z,st,at,ct,dt,$,X,N,ot,bt,St,Mt,pt,wt;const n=this.objectStates.get(s.id);if(!n){this.warn("No state for object:",s.id);return}this.frameCount%60,t.roundRect||(t.roundRect=(yt,qt,Kt,j,ft)=>(this.drawRoundRect(t,yt,qt,Kt,j,ft),t));const a=n.geometry?this.deepMerge(s.geometry,n.geometry):s.geometry;let r=n.style?this.deepMerge(s.style,n.style):s.style,c=(a==null?void 0:a.width)||((S=s.geometry)==null?void 0:S.width)||s.width||0,d=(a==null?void 0:a.height)||((v=s.geometry)==null?void 0:v.height)||s.height||0;if((c===0||d===0)&&(a!=null&&a.points)&&Array.isArray(a.points)&&a.points.length>0){let yt=1/0,qt=-1/0,Kt=1/0,j=-1/0;a.points.forEach(ft=>{yt=Math.min(yt,ft.x),qt=Math.max(qt,ft.x),Kt=Math.min(Kt,ft.y),j=Math.max(j,ft.y)}),c===0&&(c=qt-yt),d===0&&(d=j-Kt)}const u=yt=>{if(yt)return yt.corner_radius??yt.cornerRadius},p=u(a)??u(n)??u(r)??u(s.geometry)??u(s.style)??u(s)??0;let l={...a,width:c,height:d};if(delete l.cornerRadius,l.corner_radius=p,!l.type&&(s.type==="Frame"||s.type==="Component"||s.type==="Group")&&(l.type="Rectangle"),l.type==="Path"&&s.weights&&s.bindMatrices&&l.points){const yt=this.getGlobalTransform(s.id);if(yt){const qt=ii(l.points,s.weights,s.bindMatrices,yt,Kt=>this.getGlobalTransform(Kt));l={...l,points:qt}}}if(n.visible===!1)return;const f=(r.effects||((C=s.style)==null?void 0:C.effects)||[]).find(yt=>yt.isEnabled!==!1&&yt.type==="PathDistortion");if(f){const yt=oi(l,c,d,f.amplitude||5,f.frequency||10,f.seed||0,f.direction||0,f.directionStrength||0);l={...l,type:"Path",points:yt}}const g=s.repeaterConfig,y=g&&g.isEnabled&&g.count>1,m=y?g.count:1;for(let yt=0;yt<m;yt++){let qt=n.x!==void 0?n.x:((w=n.transform)==null?void 0:w.x)??0,Kt=n.y!==void 0?n.y:((M=n.transform)==null?void 0:M.y)??0,j=n.rotation!==void 0?n.rotation:((I=n.transform)==null?void 0:I.rotation)??0,ft=n.scale_x!==void 0?n.scale_x:((T=n.transform)==null?void 0:T.scale_x)??1,Rt=n.scale_y!==void 0?n.scale_y:((k=n.transform)==null?void 0:k.scale_y)??1;if(y&&yt>0){if(g.type==="Linear"){const J=g.offsetX||0,et=g.offsetY||0,q=g.rotation||0,D=g.scale!==void 0?g.scale:1;qt+=yt*J,Kt+=yt*et,j+=yt*q,ft*=Math.pow(D,yt),Rt*=Math.pow(D,yt)}else if(g.type==="Grid"){const J=g.cols||Math.ceil(Math.sqrt(g.count)),et=g.gapX||0,q=g.gapY||0,D=Math.floor(yt/J),it=yt%J,tt=c+et,ut=d+q;qt+=it*tt,Kt+=D*ut}else if(g.type==="Radial"){const J=g.radius||100,et=g.startAngle||0,D=(g.endAngle||360)-et,it=g.count>1?D/(D===360?g.count:g.count-1):0,tt=et+yt*it,ut=tt*Math.PI/180;qt=n.x+J*Math.cos(ut),Kt=n.y+J*Math.sin(ut),j+=tt}}const At=s.type==="Group"||s.type==="Frame"||s.type==="Component",Pt=c>0&&d>0;if(!At&&Pt&&!e){const J=(((E=r.shadow)==null?void 0:E.isEnabled)!==!1?(((P=r.shadow)==null?void 0:P.blur)||0)+10:0)+(((_=r.blur)==null?void 0:_.isEnabled)!==!1&&((L=r.blur)==null?void 0:L.radius)||0)+20;if(!this.isObjectInView(t,qt,Kt,c,d,J))continue}this.debug_objectsRendered++,t.save();const Ot=[],Gt=r.blur||((A=s.style)==null?void 0:A.blur);Gt&&Gt.amount>0&&Ot.push(`blur(${Gt.amount}px)`);const Ht=r.effects||((W=s.style)==null?void 0:W.effects)||[];let Nt=Ht.find(J=>J.isEnabled!==!1&&(J.type==="BackgroundBlur"||J.type==="LayerBlur"));Nt||(Nt=r.effect||((B=s.style)==null?void 0:B.effect)||Ht.find(J=>J.isEnabled!==!1));const Bt=Nt,le=(Bt==null?void 0:Bt.isEnabled)!==!1,ae=Bt==null?void 0:Bt.type,ye=(Bt==null?void 0:Bt.radius)??10;le&&ae==="LayerBlur"?Ot.push(`blur(${ye}px)`):le&&ae==="BackgroundBlur"&&(r===s.style&&(r={...r}),r.fill={type:"None"});const Pe=(l==null?void 0:l.adjustments)||(a==null?void 0:a.adjustments)||((R=s.geometry)==null?void 0:R.adjustments),Le=(r==null?void 0:r.adjustments)||((Y=s.style)==null?void 0:Y.adjustments),me=((G=r==null?void 0:r.fill)==null?void 0:G.adjustments)||((O=(z=s.style)==null?void 0:z.fill)==null?void 0:O.adjustments),xe=s==null?void 0:s.adjustments,Zt=Pe||Le||me||xe;if(n&&Zt&&(n.geometry=n.geometry||{},n.geometry.adjustments={...Zt}),Zt){const J=(Zt.exposure||0)/100,et=(Zt.contrast||0)/100,q=(Zt.saturation||0)/100,D=(Zt.temperature||0)/200,it=(Zt.tint||0)/200,tt=(Zt.highlights||0)/500,ut=(Zt.shadows||0)/500,Wt=Zt.hue||0,Dt=(Zt.negative||0)/100,Qt=Zt.blur||0;if(J!==0&&Ot.push(`brightness(${1+J})`),et!==0){const Xt=et>0?1+et*2:1+et;Ot.push(`contrast(${Number(Xt.toFixed(2))})`)}if(q!==0){const Xt=q>0?1+q*1.5:1+q;Ot.push(`saturate(${Number(Xt.toFixed(2))})`)}const zt=Wt+it*30-D*20;zt!==0&&Ot.push(`hue-rotate(${Math.round(zt)}deg)`),D>0&&Ot.push(`sepia(${Math.round(D*40)}%)`),Dt!==0&&Ot.push(`invert(${Math.abs(Dt)})`),tt!==0&&Ot.push(`brightness(${1+tt})`),ut!==0&&Ot.push(`contrast(${1+ut})`),Qt>0&&Ot.push(`blur(${Qt}px)`)}Ot.length>0?(t.filter=Ot.join(" "),(!this._lastLoggedAdjustments||this._lastLoggedAdjustments!==t.filter)&&(this._lastLoggedAdjustments=t.filter,this.log(`[ExodeUI Engine] Applied Canvas Filter for (${s.name||s.id}): "${t.filter}" (Adjustments: ${JSON.stringify(Zt)})`),console.log(`[ExodeUI Engine Log] Applied Canvas Filter for (${s.name||s.id}):`,{filter:t.filter,adjustments:Zt}))):t.filter="none",t.imageSmoothingEnabled=!0,t.imageSmoothingQuality="high";const _e=t.globalAlpha,Fe=this.normalizeOpacity(n.opacity!==void 0?n.opacity:100);t.globalAlpha=_e*Fe;const Ee=n.compositeOperation||n.blendMode;if(Ee&&Ee!=="Normal"){const J=Ee.toLowerCase();["multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","source-over","source-in","source-out","source-atop","destination-over","destination-in","destination-out","destination-atop","lighter","copy","xor","multiply","screen"].includes(J)&&(t.globalCompositeOperation=J)}const pe=t,Ce=n.masks||(s.maskedBy?[{maskId:s.maskedBy,inverted:s.maskInverted===!0,type:s.maskType||"alpha",opacity:s.maskOpacity!==void 0?s.maskOpacity/100:1,feather:s.maskFeather||0,isVisible:!0}]:[]);let Re=!1;const he=Ce.filter(J=>J.isVisible!==!1&&o.has(J.maskId));if(he.length>0){const J=he[0],et=o.get(J.maskId),q=this.objectStates.get(et.id);q&&q.visible!==!1&&(Re=!0,(!this.maskBuffer||this.maskBuffer.width!==this.canvasWidth||this.maskBuffer.height!==this.canvasHeight)&&(this.maskBuffer=document.createElement("canvas"),this.maskBuffer.width=this.canvasWidth,this.maskBuffer.height=this.canvasHeight,this.maskCtx=this.maskBuffer.getContext("2d",{willReadFrequently:!0}),this.maskCtx&&(this.maskCtx.imageSmoothingEnabled=!0,this.maskCtx.imageSmoothingQuality="high")),this.maskCtx.setTransform(1,0,0,1,0,0),this.maskCtx.globalCompositeOperation="source-over",this.maskCtx.globalAlpha=1,this.maskCtx.filter="none",this.maskCtx.clearRect(0,0,this.maskBuffer.width,this.maskBuffer.height),this.rootTransform&&this.maskCtx.setTransform(this.rootTransform),s.parentId&&this.applyAbsoluteTransform(this.maskCtx,s.parentId,o),this.maskCtx.save(),this.maskCtx.globalAlpha=1,t=this.maskCtx,t.filter=pe.filter)}if(!i){t.translate(qt,Kt),t.rotate(j*Math.PI/180);const J=n.skew_x||0,et=n.skew_y||0;if(J!==0||et!==0){const Dt=Math.tan(J*Math.PI/180),Qt=Math.tan(et*Math.PI/180);t.transform(1+Dt*Qt,Qt,Dt,1,0,0)}const q=n.rotate_x!==void 0?n.rotate_x:((F=n.transform)==null?void 0:F.rotate_x)??0,D=n.rotate_y!==void 0?n.rotate_y:((Z=n.transform)==null?void 0:Z.rotate_y)??0,tt=1+(n.translate_z!==void 0?n.translate_z:((st=n.transform)==null?void 0:st.translate_z)??0)/1e3,ut=(n.flip_x===!0?-1:1)*Math.cos(D*Math.PI/180)*tt,Wt=(n.flip_y===!0?-1:1)*Math.cos(q*Math.PI/180)*tt;t.scale(ft*ut,Rt*Wt)}r.shadow&&r.shadow.isEnabled===void 0&&((r.shadow.blur||0)>0||Math.abs(r.shadow.offsetX||0)>0||Math.abs(r.shadow.offsetY||0)>0)&&(r.shadow.isEnabled=!0);const de=r.shadow;if(de&&de.isEnabled!==!1&&!e){let J=de.color||"#000000";(ct=(at=this.artboard)==null?void 0:at.tokens)!=null&&ct.colors&&this.artboard.tokens.colors[J]&&(J=this.artboard.tokens.colors[J]);const et=this.normalizeOpacity(de.opacity??100)*.75,q=de.spread||0,it=(de.blur||0)+q*1.5;let tt=J;if(J.startsWith("#")){const Dt=J.replace("#",""),Qt=parseInt(Dt.substring(0,2),16),zt=parseInt(Dt.substring(2,4),16),Xt=parseInt(Dt.substring(4,6),16);tt=`rgba(${Qt}, ${zt}, ${Xt}, ${et})`}else if(J.startsWith("rgba")){const Dt=J.match(/[\d.]+/g);if(Dt&&Dt.length>=4){const Qt=Dt[0],zt=Dt[1],Xt=Dt[2],x=Dt[3];tt=`rgba(${Qt}, ${zt}, ${Xt}, ${parseFloat(x)*et})`}}const ut=t.getTransform(),Wt=Math.sqrt(ut.a*ut.a+ut.b*ut.b)||1;t.shadowColor=tt,t.shadowBlur=it*Wt,t.shadowOffsetX=(de.offsetX||0)*Wt,t.shadowOffsetY=(de.offsetY||0)*Wt}const Et=s.liquidFill||((dt=s.style)==null?void 0:dt.liquidFill);if(Et&&Et.enabled){t.save();const J=Et.fillLevel??.5;t.beginPath();const et=d/2-d*J;t.rect(-c/2,et,c,d*J),t.clip(),t.fillStyle=Et.color||"#3b82f6",t.globalAlpha=t.globalAlpha*(Et.opacity??1)}if(e||this.applyOuterGlowUnderlay(t,s,l,c,d,p,r,o),(a==null?void 0:a.type)==="Text")this._renderText(t,s,l,r,n,c,d,!1,!1);else if((a==null?void 0:a.type)==="Image"||(($=r.fill)==null?void 0:$.type)==="Image"||s.type==="Image"&&(a!=null&&a.src||(X=r.fill)!=null&&X.src)){const J=(a==null?void 0:a.originalSrc)||(a==null?void 0:a.src)||((N=r.fill)==null?void 0:N.originalSrc)||((ot=r.fill)==null?void 0:ot.src)||(s==null?void 0:s.src);if(J){let et=this.imageCache.get(J);et||(et=new Image,et.onload=()=>{this.log(`[ExodeUI] Image loaded successfully, size: ${et.naturalWidth}x${et.naturalHeight}`)},et.onerror=it=>{console.error("[ExodeUI] Image load failed:",it,`Src preview: ${J.substring(0,100)}...`)},et.src=J,this.imageCache.set(J,et));const q=r.stroke&&r.stroke.width>0&&r.stroke.isEnabled!==!1,D=(((bt=r.stroke)==null?void 0:bt.alignment)||"center").toLowerCase();if(q&&D==="outside"&&this.applyStrokeAlignment(t,r,l,c,d,p),r.fill&&r.fill.type!=="None"){t.save();const it=t.globalAlpha,tt=this.createCanvasFill(t,r.fill,c,d);t.fillStyle=tt||r.fill.color||"transparent",t.globalAlpha=it*this.normalizeOpacity(r.fill.opacity??100),p!==0?(this.drawRoundRect(t,-c/2,-d/2,c,d,p),t.fill()):t.fillRect(-c/2,-d/2,c,d),t.globalAlpha=it,t.restore()}if(et.complete&&et.naturalWidth>0){const it=Zt?this.processFabricAdjustmentsCanvas(et,c,d,Zt):et;p!==0?(t.save(),this.drawRoundRect(t,-c/2,-d/2,c,d,p),t.clip(),t.drawImage(it,-c/2,-d/2,c,d),t.restore()):t.drawImage(it,-c/2,-d/2,c,d),q&&(D==="inside"||D==="center")&&this.applyStrokeAlignment(t,r,l,c,d,p)}else q&&(D==="inside"||D==="center")&&this.applyStrokeAlignment(t,r,l,c,d,p)}}else if(a.type==="SVG"){const J=a.svgContent;if(J){const et=r.palette||[],q=r.fill,D=r.stroke,it=q?this.normalizeOpacity(q.opacity??100):1,tt=D&&D.isEnabled!==!1?this.normalizeOpacity(D.opacity??100):1,ut=(q==null?void 0:q.type)==="Solid"&&(!D||D.isEnabled===!1||D.type==="Solid"&&D.color===q.color&&tt===it),Wt=q&&q.type!=="None"?ut?"monochrome":q.type==="Solid"?(q.color||"")+"|opacity:"+it:JSON.stringify(q.stops||[])+"|opacity:"+it:"",Dt=D&&D.isEnabled!==!1&&(D.width||0)>0?ut?["monochrome",D.width||0,D.trimStart??0,D.trimEnd??1,D.trimOffset??0,D.dashOffset??0].join("|"):[D.width||0,D.fill?D.fill.type==="Solid"?D.fill.color||"":JSON.stringify(D.fill.stops||[]):D.color||"",D.opacity??1,D.lineCap||"",D.lineJoin||"",(D.dashArray||[]).join(","),D.trimStart??0,D.trimEnd??1,D.trimOffset??0,D.dashOffset??0].join("|"):"nostroke",Qt=[s.id,et.join("_"),Wt,Dt,n.opacity??100,n.visible!==!1?"v":"h"].join("_");let zt=this.imageCache.get(Qt);if(!zt){zt=new Image,zt.crossOrigin="anonymous";let x=J;x.match(/xmlns=["']http:\/\/www\.w3\.org\/2000\/svg["']/i)||(x=x.replace(/<svg([^>]*)>/i,(mt,$t)=>`<svg xmlns="http://www.w3.org/2000/svg"${$t}>`));let rt=a.width||c||100,It=a.height||d||100;const Ft=x.match(/viewBox=["']\s*0\s+0\s+([\d.]+)\s+([\d.]+)\s*["']/i);if(Ft&&(rt=parseFloat(Ft[1]),It=parseFloat(Ft[2])),x=x.replace(/<svg([^>]*)>/i,(mt,$t)=>{let vt=$t.replace(/\b(?:width|height)=["'][^"']*["']/gi," ");return vt.match(/\bviewBox=/i)||(vt+=` viewBox="0 0 ${rt} ${It}"`),vt.match(/\bpreserveAspectRatio=/i)||(vt+=' preserveAspectRatio="none"'),vt+=' width="100%" height="100%"',`<svg${vt}>`}),a.colors&&a.colors.length>0&&et.length>0&&a.colors.forEach((mt,$t)=>{if(et[$t]){const vt=mt.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),xt=new RegExp(vt,"gi");x=x.replace(xt,et[$t])}}),q&&q.type&&q.type!=="None"){if(q.type==="Solid"&&q.color){const mt=ut?"#FFFFFF":q.color,$t=ut?1:this.normalizeOpacity(q.opacity??100);x=x.replace(/\bfill\s*=\s*["'][^"']*["']/gi,vt=>/fill\s*=\s*["']\s*(none|transparent)\s*["']/i.test(vt)?vt:`fill="${mt}"`),x=x.replace(/fill\s*:\s*[^;"')]+/gi,vt=>/fill\s*:\s*(none|transparent)/i.test(vt)?vt:`fill:${mt}`),$t<1&&(x=x.replace(/\bfill-opacity\s*=\s*["'][^"']*["']/gi,`fill-opacity="${$t}"`),x=x.replace(/fill-opacity\s*:\s*[^;"')]+/gi,`fill-opacity:${$t}`),x.match(/\bfill-opacity\s*=/i)||(x=x.replace(/(<svg[^>]*>)/i,`$1<g fill-opacity="${$t}">`),x=x.replace(/<\/svg>/i,"</g></svg>")))}else if(q.type==="LinearGradient"||q.type==="RadialGradient"||q.type==="Linear"||q.type==="Radial"){const mt="exode-fill",$t=this.normalizeOpacity(q.opacity??100),vt=(q.stops||[]).map(kt=>{const oe=kt.offset!==void 0?kt.offset:kt.pos??0,re=this.normalizeOpacity(kt.opacity??100)*$t;return`<stop offset="${oe*100}%" stop-color="${kt.color||"#000"}" stop-opacity="${re}"/>`}).join("");let xt="";if(q.type==="LinearGradient"||q.type==="Linear"){const kt=(se,ee)=>Array.isArray(se)?se[ee]??(ee===0?0:1):se&&typeof se=="object"?se[ee===0?"x":"y"]??(ee===0?0:1):ee===0?0:1,oe=kt(q.start,0)*100,re=kt(q.start,1)*100,ke=kt(q.end,0)*100,Jt=kt(q.end,1)*100;xt=`<linearGradient id="${mt}" x1="${oe}%" y1="${re}%" x2="${ke}%" y2="${Jt}%" gradientUnits="objectBoundingBox">${vt}</linearGradient>`}else{const kt=(Jt,se)=>Array.isArray(Jt)?Jt[se]??.5:Jt&&typeof Jt=="object"?Jt[se===0?"x":"y"]??.5:.5,oe=kt(q.center,0)*100,re=kt(q.center,1)*100,ke=(q.radius??.5)*100;xt=`<radialGradient id="${mt}" cx="${oe}%" cy="${re}%" r="${ke}%" gradientUnits="objectBoundingBox">${vt}</radialGradient>`}/<defs>/i.test(x)?x=x.replace(/<defs>/i,`<defs>${xt}`):x=x.replace(/<svg([^>]*)>/i,`<svg$1><defs>${xt}</defs>`),x=x.replace(/\bfill\s*=\s*["'][^"']*["']/gi,kt=>/fill\s*=\s*["']\s*(none|transparent)\s*["']/i.test(kt)?kt:`fill="url(#${mt})"`),x=x.replace(/fill\s*:\s*[^;"')]+/gi,kt=>/fill\s*:\s*(none|transparent)/i.test(kt)?kt:`fill:url(#${mt})`)}}const K=(mt,$t,vt=1)=>{const xt=(mt.stops||[]).map(Jt=>{const se=Jt.offset!==void 0?Jt.offset:Jt.pos??0,ee=this.normalizeOpacity(Jt.opacity??100)*vt;return`<stop offset="${se*100}%" stop-color="${Jt.color||"#000"}" stop-opacity="${ee}"/>`}).join(""),kt=(Jt,se,ee=.5)=>Array.isArray(Jt)?Jt[se]??ee:Jt&&typeof Jt=="object"?Jt[se===0?"x":"y"]??ee:ee;if(mt.type==="LinearGradient"||mt.type==="Linear"){const Jt=kt(mt.start,0,0)*100,se=kt(mt.start,1,0)*100,ee=kt(mt.end,0,1)*100,Ae=kt(mt.end,1,1)*100;return`<linearGradient id="${$t}" x1="${Jt}%" y1="${se}%" x2="${ee}%" y2="${Ae}%" gradientUnits="objectBoundingBox">${xt}</linearGradient>`}const oe=kt(mt.center,0,.5)*100,re=kt(mt.center,1,.5)*100,ke=(mt.radius??.5)*100;return`<radialGradient id="${$t}" cx="${oe}%" cy="${re}%" r="${ke}%" gradientUnits="objectBoundingBox">${xt}</radialGradient>`},ht=(mt,$t)=>/<defs>/i.test(mt)?mt.replace(/<defs>/i,`<defs>${$t}`):mt.replace(/(<svg[^>]*>)/i,`$1<defs>${$t}</defs>`);if(D&&D.isEnabled!==!1&&(D.width||0)>0){const mt=ut?1:this.normalizeOpacity(D.opacity??100),$t=ut?"#FFFFFF":D.color||(q==null?void 0:q.color)||"#000000";let vt="";const xt=D.fill;if(xt&&xt.type){if(xt.type==="Solid")vt=xt.color||D.color||"#000000";else if(xt.type==="LinearGradient"||xt.type==="RadialGradient"||xt.type==="Linear"||xt.type==="Radial"){const te="exode-stroke";x=ht(x,K(xt,te,mt)),vt=`url(#${te})`}}vt||(vt=$t),x.match(/\bstroke\s*=\s*["']/i)?x=x.replace(/\bstroke\s*=\s*["'][^"']*["']/gi,te=>/stroke\s*=\s*["']\s*(none|transparent)\s*["']/i.test(te)?te:`stroke="${vt}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke="${vt}"`),x=x.replace(new RegExp(`(?<![a-z-])stroke\\s*:\\s*(?!none|transparent)[^;"')]+`,"gi"),`stroke:${vt}`);let kt=a.width||c||100,oe=a.height||d||100;const re=J.match(/viewBox=["']\s*0\s+0\s+([\d.]+)\s+([\d.]+)\s*["']/i);if(re){const te=parseFloat(re[1]),fe=parseFloat(re[2]);!isNaN(te)&&!isNaN(fe)&&(kt=te,oe=fe)}const ke=Math.max(.001,c/kt),Jt=Math.max(.001,d/oe),se=(ke+Jt)/2,ee=(D.width||1)/se;x.match(/\bstroke-width\s*=\s*["']/i)?x=x.replace(/\bstroke-width\s*=\s*["'][^"']*["']/gi,`stroke-width="${ee}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-width="${ee}"`),x=x.replace(/stroke-width\s*:\s*[^;"')]+/gi,`stroke-width:${ee}`),x.match(/\bstroke-opacity\s*=\s*["']/i)?x=x.replace(/\bstroke-opacity\s*=\s*["'][^"']*["']/gi,`stroke-opacity="${mt}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-opacity="${mt}"`),x=x.replace(/stroke-opacity\s*:\s*[^;"')]+/gi,`stroke-opacity:${mt}`);const Ae=D.lineCap||"round";x.match(/\bstroke-linecap\s*=\s*["']/i)?x=x.replace(/\bstroke-linecap\s*=\s*["'][^"']*["']/gi,`stroke-linecap="${Ae}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-linecap="${Ae}"`),x=x.replace(/stroke-linecap\s*:\s*[^;"')]+/gi,`stroke-linecap:${Ae}`);const $e=D.lineJoin||"round";x.match(/\bstroke-linejoin\s*=\s*["']/i)?x=x.replace(/\bstroke-linejoin\s*=\s*["'][^"']*["']/gi,`stroke-linejoin="${$e}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-linejoin="${$e}"`),x=x.replace(/stroke-linejoin\s*:\s*[^;"')]+/gi,`stroke-linejoin:${$e}`);const Be=D.trimStart??0,We=D.trimEnd??1,Ye=D.trimOffset??0,Xe=D.dashOffset??0,Ve=Be!==0||We!==1||Ye!==0||Xe!==0;if(Ve){const te=Math.max(0,Math.min(1,Be)),fe=Math.max(0,Math.min(1,We));this.frameCount%600===0&&this.debugLog(`SVG Trim - Object: ${s.name||s.id}, Start: ${te}, End: ${fe}`);const be=(kt+oe)*2,De=(Ye%1+1)%1,Ge=(Xe%1+1)%1;let we="",Se=0;if(te>=fe)we=`0 ${be}`,Se=0;else{const ve=be*(fe-te),V=be-ve;Se=-(be*(te+De+Ge)),we=`${ve} ${V}`}x.match(/\bstroke-dasharray\s*=/i)?x=x.replace(/\bstroke-dasharray\s*=\s*["'][^"']*["']/gi,`stroke-dasharray="${we}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-dasharray="${we}"`),x=x.replace(/stroke-dasharray\s*:\s*[^;"')]+/gi,`stroke-dasharray:${we}`),x.match(/\bstroke-dashoffset\s*=/i)?x=x.replace(/\bstroke-dashoffset\s*=\s*["'][^"']*["']/gi,`stroke-dashoffset="${Se}"`):x=x.replace(/<(path|circle|rect|ellipse|polygon|polyline)/gi,`<$1 stroke-dashoffset="${Se}"`),x=x.replace(/stroke-dashoffset\s*:\s*[^;"')]+/gi,`stroke-dashoffset:${Se}`)}else if(D.dashArray&&D.dashArray.length>0){const te=D.dashArray.join(" ");if(x=x.replace(/\bstroke-dasharray\s*=\s*["'][^"']*["']/gi,`stroke-dasharray="${te}"`),x=x.replace(/stroke-dasharray\s*:\s*[^;"')]+/gi,`stroke-dasharray:${te}`),D.dashOffset){const fe=(kt+oe)*2,be=-(D.dashOffset*fe);x=x.replace(/\bstroke-dashoffset\s*=\s*["'][^"']*["']/gi,`stroke-dashoffset="${be}"`),x=x.replace(/stroke-dashoffset\s*:\s*[^;"')]+/gi,`stroke-dashoffset:${be}`)}}if(!/\bstroke\s*=\s*["']/i.test(J)&&!new RegExp("(?<![a-z-])stroke\\s*:","i").test(J)){let te="",fe="";if(Ve){const we=a.width||c||100,Se=a.height||d||100,ve=(we+Se)*2,V=Math.max(0,Math.min(1,Be)),Q=Math.max(0,Math.min(1,We)),U=(Ye%1+1)%1,lt=(Xe%1+1)%1;if(V>=Q)te=` stroke-dasharray="0 ${ve}"`,fe=' stroke-dashoffset="0"';else{const Tt=ve*(Q-V),Lt=ve-Tt,Yt=-(ve*(V+U+lt));te=` stroke-dasharray="${Tt} ${Lt}"`,fe=` stroke-dashoffset="${Yt}"`}}else(St=D.dashArray)!=null&&St.length&&(te=` stroke-dasharray="${D.dashArray.join(" ")}"`,D.dashOffset&&(fe=` stroke-dashoffset="${D.dashOffset}"`));const be=` stroke-linecap="${D.lineCap||"round"}"`,De=` stroke-linejoin="${D.lineJoin||"round"}"`,Ge=`stroke="${vt}" stroke-width="${ee}" stroke-opacity="${mt}"${be}${De}${te}${fe}`;x=x.replace(/(<svg[^>]*>)(\s*(?:<defs>[\s\S]*?<\/defs>)?)/i,(we,Se,ve)=>`${Se}${ve}<g ${Ge}>`),x=x.replace(/<\/svg>/i,"</g></svg>")}}else D&&D.isEnabled===!1&&(x=x.replace(/\bstroke\s*=\s*["'][^"']*["']/gi,'stroke="none"'),x=x.replace(new RegExp(`(?<![a-z-])stroke\\s*:\\s*(?!none|transparent)[^;"')]+`,"gi"),"stroke:none"));const gt=new Blob([x],{type:"image/svg+xml"}),jt=URL.createObjectURL(gt);zt.onload=()=>{if(URL.revokeObjectURL(jt),this.frameCount%900===0){const mt=this.imageCache.get(Qt);mt&&this.debugLog(`SVG Payload Ready: ${s.name||s.id} (${mt.naturalWidth}x${mt.naturalHeight})`)}},zt.onerror=()=>{URL.revokeObjectURL(jt),this.debugLog(`SVG Error: Failed to load payload for ${s.name||s.id}`)},zt.src=jt,this.imageCache.set(Qt,zt)}let Xt=null;if(zt.complete&&zt.naturalWidth>0?(Xt=zt,this.lastValidSvgImgMap.set(s.id,zt)):Xt=this.lastValidSvgImgMap.get(s.id)||null,Xt&&Xt.complete&&Xt.naturalWidth>0){const x=Math.max(1,c),rt=Math.max(1,d);if(ut&&(q==null?void 0:q.type)==="Solid"){this.maskBuffer||(this.maskBuffer=document.createElement("canvas"),this.maskCtx=this.maskBuffer.getContext("2d")),this.maskBuffer.width=x,this.maskBuffer.height=rt,this.maskCtx.setTransform(1,0,0,1,0,0),this.maskCtx.globalCompositeOperation="source-over",this.maskCtx.globalAlpha=1,this.maskCtx.filter="none",this.maskCtx.clearRect(0,0,x,rt),this.maskCtx.drawImage(Xt,0,0,x,rt),this.maskCtx.globalCompositeOperation="source-in";const It=q.color||"#000000",Ft=this.normalizeOpacity(q.opacity??100);this.maskCtx.fillStyle=It,this.maskCtx.globalAlpha=Ft,this.maskCtx.fillRect(0,0,x,rt),t.drawImage(this.maskBuffer,-x/2,-rt/2,x,rt)}else p!==0?(t.save(),this.drawRoundRect(t,-x/2,-rt/2,x,rt,p),t.clip(),t.drawImage(Xt,-x/2,-rt/2,x,rt),t.restore()):t.drawImage(Xt,-x/2,-rt/2,x,rt)}}}else if(l.type==="LineGraph")this.renderLineGraph(t,l,c,d);else if(s.type==="Shape"){if(this.applyPath(t,l,c,d,p),t.save(),r.blur&&r.blur.amount>0&&(t.filter=`blur(${r.blur.amount}px)`),le&&ae==="BackgroundBlur")if(e)t.fillStyle="#000000",t.globalAlpha=1,this.applyPath(t,l,c,d,p),t.fill();else{if(t.shadowColor&&t.shadowColor!=="rgba(0, 0, 0, 0)"&&t.shadowColor!=="transparent"){const q=t.getTransform(),D=t.shadowOffsetX,it=t.shadowOffsetY;t.shadowOffsetX=D+1e4*q.a,t.shadowOffsetY=it+1e4*q.b,t.save(),t.translate(-1e4,0),this.applyPath(t,l,c,d,p),t.fillStyle="white",t.fill(),t.restore(),t.shadowOffsetX=D,t.shadowOffsetY=it,t.shadowColor="transparent"}this.applyBackgroundBlurGlass(t,l,c,d,p,Bt,r)}else if(r.fill){const et=t.globalAlpha;if(((Mt=r.fill)==null?void 0:Mt.type)==="Image"&&(r.fill.originalSrc||r.fill.src)){const q=r.fill.originalSrc||r.fill.src;let D=this.imageCache.get(q);D||(D=new Image,D.src=q,this.imageCache.set(q,D)),D.complete&&D.naturalWidth>0&&(t.save(),this.applyPath(t,l,c,d,p),t.clip(),this.renderFittedImage(t,D,-c/2,-d/2,c,d,r.fill.fillMode),t.restore())}else{const q=this.createCanvasFill(t,r.fill,c,d);t.fillStyle=q||(typeof r.fill=="string"?r.fill:r.fill.color||"transparent"),t.globalAlpha=et*this.normalizeOpacity(r.fill.opacity??100),this.applyPath(t,l,c,d,p),t.fill()}t.globalAlpha=et}t.restore(),r.stroke&&r.stroke.width>0&&(this.applyPath(t,l,c,d,p),this.applyStrokeAlignment(t,r,l,c,d,p))}else if(s.type==="Frame"||s.type==="Component"&&!s.variant||s.type==="Group"&&!s.isStructuralGroup){const J=n.width??a.width??s.width??c,et=n.height??a.height??s.height??d,q=p;if(t.save(),t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),le&&ae==="BackgroundBlur")if(e)t.fillStyle="#000000",t.globalAlpha=1,t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),t.fill();else{if(t.shadowColor&&t.shadowColor!=="rgba(0, 0, 0, 0)"&&t.shadowColor!=="transparent"){const tt=t.getTransform(),ut=t.shadowOffsetX,Wt=t.shadowOffsetY;t.shadowOffsetX=ut+1e4*tt.a,t.shadowOffsetY=Wt+1e4*tt.b,t.save(),t.translate(-1e4,0),t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),t.fillStyle="white",t.fill(),t.restore(),t.shadowOffsetX=ut,t.shadowOffsetY=Wt,t.shadowColor="transparent"}this.applyBackgroundBlurGlass(t,l,J,et,q,Bt,r)}else if(r.fill&&r.fill.type!=="None"){const it=t.globalAlpha;if(((pt=r.fill)==null?void 0:pt.type)==="Image"&&(r.fill.originalSrc||r.fill.src)){const tt=r.fill.originalSrc||r.fill.src;let ut=this.imageCache.get(tt);ut||(ut=new Image,ut.src=tt,this.imageCache.set(tt,ut)),ut.complete&&ut.naturalWidth>0&&(t.save(),t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),t.clip(),this.renderFittedImage(t,ut,-J/2,-et/2,J,et,r.fill.fillMode),t.restore())}else{const tt=this.createCanvasFill(t,r.fill,J,et);t.fillStyle=tt||r.fill.color||"transparent",t.globalAlpha=it*this.normalizeOpacity(r.fill.opacity??100),t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),t.fill(),t.globalAlpha=it}}if(t.restore(),!e&&(le&&ae==="BackgroundBlur"||r.fill&&r.fill.type!=="None")&&(t.shadowColor="transparent"),r.stroke&&r.stroke.width>0&&r.stroke.isEnabled!==!1){const it={type:"Rectangle"};t.beginPath(),this.drawRoundRect(t,-J/2,-et/2,J,et,q),this.applyStrokeAlignment(t,r,it,J,et,q)}}else s.type==="Group"&&s.isStructuralGroup||(s.type==="Component"&&s.variant==="inputbox"?this.renderInputBox(t,s):s.type==="Component"&&s.variant==="button"?this.renderButton(t,s):s.type==="Component"&&s.variant==="toggle_button"?this.renderToggleButton(t,s):s.type==="Toggle"||s.type==="Component"&&s.variant==="toggle"?this.renderToggle(t,s):s.type==="Slider"||s.type==="Component"&&s.variant==="slider"?this.renderSlider(t,s):s.type==="Dropdown"||s.type==="Component"&&s.variant==="dropdown"?this.renderDropdown(t,s):s.type==="ListView"||s.type==="Component"&&s.variant==="listview"?this.renderListView(t,s):s.type==="Checkbox"||s.type==="Component"&&s.variant==="checkbox"?this.renderCheckbox(t,s):s.type==="RadioGroup"||s.type==="Component"&&s.variant==="radiogroup"?this.renderRadioGroup(t,s):s.type==="BarChart"||s.type==="Component"&&s.variant==="barchart"?this.renderBarChart(t,s):s.type==="PieChart"||s.type==="Component"&&s.variant==="piechart"?this.renderPieChart(t,s):s.type==="Joystick"||s.type==="Component"&&s.variant==="joystick"?this.renderJoystick(t,s):this.frameCount%300===0&&this.warn("[Engine] Unhandled object type in renderObject:",s.type,"Geo:",(wt=s.geometry)==null?void 0:wt.type));if(e||(this.applyInnerGlowOverlay(t,s,l,c,d,p,r),this.applyArtEffectOverlay(t,s,l,c,d,p)),Et&&Et.enabled&&t.restore(),s.children&&s.children.length>0){const et=s.type==="Frame",q=s.clipsContent!==void 0?s.clipsContent:s.clipContent!==void 0?s.clipContent:et;if(t.save(),q){t.beginPath();const it=n.width??(a==null?void 0:a.width)??s.width??0,tt=n.height??(a==null?void 0:a.height)??s.height??0,ut=n.cornerRadius??(a==null?void 0:a.corner_radius)??s.cornerRadius??0;this.drawRoundRect(t,-it/2,-tt/2,it,tt,ut),t.clip()}let D=0;for(s.children.forEach(it=>{const tt=o.get(it);if(!tt)return;const ut=this.objectStates.get(it),Wt=(ut==null?void 0:ut.geometry)||tt.geometry;if(Wt&&Wt.isMask&&(ut==null?void 0:ut.visible)!==!1){const Dt=Wt.width||0,Qt=Wt.height||0;this.applyObjectTransform(t,it);const zt=(ut==null?void 0:ut.corner_radius)??(Wt==null?void 0:Wt.corner_radius)??0;this.applyPath(t,Wt,Dt,Qt,zt),t.clip(),D++}else this.renderObject(t,tt,o,e)});D>0;)t.restore(),D--;t.restore()}if(Re){this.maskCtx.restore(),(n.masks||(s.maskedBy?[{maskId:s.maskedBy,inverted:s.maskInverted===!0,type:s.maskType||"alpha",opacity:s.maskOpacity!==void 0?s.maskOpacity/100:1,feather:s.maskFeather||0,isVisible:!0}]:[])).filter(D=>D.isVisible!==!1&&o.has(D.maskId)).forEach(D=>{var zt,Xt,x,rt,It,Ft;const it=o.get(D.maskId),tt=this.objectStates.get(it.id),ut=D.feather||0,Wt=D.inverted===!0,Dt=D.opacity!==void 0?typeof D.opacity=="number"?D.opacity:D.opacity/100:1;if((D.type||"alpha")==="luma"){(!this.lumaBuffer||this.lumaBuffer.width!==this.maskBuffer.width||this.lumaBuffer.height!==this.maskBuffer.height)&&(this.lumaBuffer=document.createElement("canvas"),this.lumaBuffer.width=this.maskBuffer.width,this.lumaBuffer.height=this.maskBuffer.height,this.lumaCtx=this.lumaBuffer.getContext("2d",{willReadFrequently:!0}),this.lumaCtx&&(this.lumaCtx.imageSmoothingEnabled=!0,this.lumaCtx.imageSmoothingQuality="high")),this.lumaCtx.setTransform(1,0,0,1,0,0),this.lumaCtx.globalCompositeOperation="source-over",this.lumaCtx.globalAlpha=1,this.lumaCtx.filter="none",this.lumaCtx.clearRect(0,0,this.lumaBuffer.width,this.lumaBuffer.height),this.lumaCtx.save(),this.rootTransform&&this.lumaCtx.setTransform(this.rootTransform),this.applyAbsoluteTransform(this.lumaCtx,it.id,o),ut>0&&(this.lumaCtx.filter=`blur(${ut}px)`),this.lumaCtx.globalAlpha=Dt;const K=(tt==null?void 0:tt.width)||it.geometry.width||0,ht=(tt==null?void 0:tt.height)||it.geometry.height||0,gt=(tt==null?void 0:tt.corner_radius)??it.corner_radius??0;if(((zt=it.geometry)==null?void 0:zt.type)==="Text"){const vt=tt!=null&&tt.geometry?this.deepMerge(it.geometry,tt.geometry):it.geometry,xt=tt!=null&&tt.style?this.deepMerge(it.style,tt.style):it.style;this._renderText(this.lumaCtx,it,{...vt,width:K,height:ht,corner_radius:gt},xt,tt,K,ht,!0,!1)}else if(((Xt=it.geometry)==null?void 0:Xt.type)==="Image"){const vt=it.geometry.src;if(vt){let xt=this.imageCache.get(vt);xt||(xt=new Image,xt.src=vt,this.imageCache.set(vt,xt)),xt.complete&&xt.naturalWidth>0?this.lumaCtx.drawImage(xt,-K/2,-ht/2,K,ht):(this.applyPath(this.lumaCtx,it.geometry,K,ht,gt),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill())}}else if(((x=it.geometry)==null?void 0:x.type)==="SVG"){const vt=it.geometry.svgContent;if(vt){const xt=`__lumamask_${it.id}`;let kt=this.imageCache.get(xt);if(!kt){kt=new Image;const oe=new Blob([vt],{type:"image/svg+xml"});kt.src=URL.createObjectURL(oe),kt.onload=()=>{this.artboard&&this.reset()},this.imageCache.set(xt,kt)}kt.complete&&kt.naturalWidth>0?this.lumaCtx.drawImage(kt,-K/2,-ht/2,K,ht):(this.applyPath(this.lumaCtx,it.geometry,K,ht,gt),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill())}}else this.applyPath(this.lumaCtx,it.geometry,K,ht,gt),this.lumaCtx.fillStyle="#ffffff",this.lumaCtx.fill();this.lumaCtx.restore();const jt=this.maskCtx.getImageData(0,0,this.canvasWidth,this.canvasHeight),mt=this.lumaCtx.getImageData(0,0,this.canvasWidth,this.canvasHeight).data,$t=jt.data;for(let vt=0;vt<$t.length;vt+=4){const xt=mt[vt],kt=mt[vt+1],oe=mt[vt+2];let re=(.299*xt+.587*kt+.114*oe)/255;Wt&&(re=1-re),$t[vt+3]*=re}this.maskCtx.putImageData(jt,0,0)}else{this.maskCtx.save(),this.rootTransform&&this.maskCtx.setTransform(this.rootTransform),this.maskCtx.globalCompositeOperation=Wt?"destination-out":"destination-in",ut>0&&(this.maskCtx.filter=`blur(${ut}px)`),this.maskCtx.globalAlpha=Dt,this.applyAbsoluteTransform(this.maskCtx,it.id,o);const K=(tt==null?void 0:tt.width)||it.geometry.width||0,ht=(tt==null?void 0:tt.height)||it.geometry.height||0,gt=(tt==null?void 0:tt.corner_radius)??it.corner_radius??0;if(((rt=it.geometry)==null?void 0:rt.type)==="Text"){const jt=tt!=null&&tt.geometry?this.deepMerge(it.geometry,tt.geometry):it.geometry,mt=tt!=null&&tt.style?this.deepMerge(it.style,tt.style):it.style;this._renderText(this.maskCtx,it,{...jt,width:K,height:ht,corner_radius:gt},mt,tt,K,ht,!0,!1)}else if(((It=it.geometry)==null?void 0:It.type)==="Image"){const jt=it.geometry.src;if(jt){let mt=this.imageCache.get(jt);mt||(mt=new Image,mt.src=jt,this.imageCache.set(jt,mt)),mt.complete&&mt.naturalWidth>0?this.maskCtx.drawImage(mt,-K/2,-ht/2,K,ht):(this.applyPath(this.maskCtx,it.geometry,K,ht,gt),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill())}}else if(((Ft=it.geometry)==null?void 0:Ft.type)==="SVG"){const jt=it.geometry.svgContent;if(jt){const mt=`__alphamask_${it.id}`;let $t=this.imageCache.get(mt);if(!$t){$t=new Image;const vt=new Blob([jt],{type:"image/svg+xml"});$t.src=URL.createObjectURL(vt),$t.onload=()=>{this.artboard&&this.reset()},this.imageCache.set(mt,$t)}$t.complete&&$t.naturalWidth>0?this.maskCtx.drawImage($t,-K/2,-ht/2,K,ht):(this.applyPath(this.maskCtx,it.geometry,K,ht,gt),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill())}}else this.applyPath(this.maskCtx,it.geometry,K,ht,gt),this.maskCtx.fillStyle="#ffffff",this.maskCtx.fill();this.maskCtx.restore()}}),pe.save(),pe.setTransform(1,0,0,1,0,0);const q=s.maskBlendMode||s.blendMode;q&&q!=="Normal"&&(pe.globalCompositeOperation=q.toLowerCase()),pe.drawImage(this.maskBuffer,0,0),pe.restore(),pe.restore()}else t.restore()}}applyOuterGlowUnderlay(t,s,o,e,i,n,a,r){var I,T,k;const c=a||s.style||{},d=c.effect,u=c.effects||(d?[d]:[]),p=u.find(E=>E.isEnabled!==!1&&E.type==="Glow"&&(E.mode==="outer"||E.mode==="Outer Glow"||!E.mode));if(!p)return;const l=p.blur||10,h=1e4;let f=p.color||"white";(T=(I=this.artboard)==null?void 0:I.tokens)!=null&&T.colors&&this.artboard.tokens.colors[f]&&(f=this.artboard.tokens.colors[f]),t.save();const g=c.fill&&c.fill.type!=="None",y=u.some(E=>E.isEnabled!==!1&&E.type==="BackgroundBlur"),m=s.type==="Text",S=s.type==="Group";!m&&!S&&(g||y)&&(t.beginPath(),t.rect(-1e6,-1e6,2e6,2e6),s.type==="Frame"||s.type==="Component"?this.drawRoundRect(t,-e/2,-i/2,e,i,n):this._tracePath(t,o,e,i,n),t.clip("evenodd"));const v=t.getTransform();t.shadowColor=f,t.shadowBlur=l,t.shadowOffsetX=h*v.a,t.shadowOffsetY=h*v.b,t.translate(-h,0);let C="black";c.fill&&c.fill.type!=="None"&&(C=this.createCanvasFill(t,c.fill,e,i)||c.fill.color||"black");let w="black";c.stroke&&c.stroke.width>0&&(w=this.createCanvasFill(t,c.stroke.fill||{type:"Solid",color:c.stroke.color},e,i)||c.stroke.color||"black"),t.fillStyle=C,t.strokeStyle=w,t.lineWidth=((k=c.stroke)==null?void 0:k.width)||0;const M=Math.min(p.intensity||1,10);for(let E=0;E<M;E++)if(r)this.renderObject(t,s,r,!0,!0);else if(o.type==="Text")c.fill&&c.fill.type!=="None"&&t.fillText(s.text||"",0,0),c.stroke&&c.stroke.width>0&&t.strokeText(s.text||"",0,0);else if(o.points&&o.type==="Path")this.applyPath(t,o,e,i,n),c.fill&&c.fill.type!=="None"&&t.fill(),c.stroke&&c.stroke.width>0&&t.stroke();else{if(t.beginPath(),o.type==="circle"||o.type==="Ellipse"){const L=e/2,A=i/2;t.ellipse(0,0,L,A,0,0,Math.PI*2)}else n!==0?this.drawRoundRect(t,-e/2,-i/2,e,i,n):t.rect(-e/2,-i/2,e,i);const P=c.fill&&c.fill.type!=="None",_=c.stroke&&c.stroke.width>0;(P||!P&&!_)&&t.fill(),_&&t.stroke()}t.restore()}_renderText(t,s,o,e,i,n,a,r=!1,c=!1){var ot,bt,St,Mt,pt,wt,yt,qt,Kt;let d=o.text||"";if(o.textInputId&&!r){const j=this.inputs.get(o.textInputId);j!==void 0&&(d=String(j),i.geometry&&i.geometry.type==="Text"&&(i.geometry.text=d))}if(o.svgPath){const j=o.svgPath;t.save();const ft=((ot=e==null?void 0:e.fill)==null?void 0:ot.color)||"#000000",Rt=((bt=e==null?void 0:e.fill)==null?void 0:bt.opacity)!==void 0?(St=e==null?void 0:e.fill)==null?void 0:St.opacity:1;t.fillStyle=ft,t.globalAlpha*=Rt;const At=new Path2D(j);t.fill(At),t.restore();return}let u=d||"";o.enableSegments===!0&&o.segments&&Array.isArray(o.segments)&&(u=o.segments.map(j=>j&&j.text?j.text:"").join(""));const p=o.textCase||"none";p==="uppercase"?u=u.toUpperCase():p==="lowercase"?u=u.toLowerCase():p==="capitalize"&&(u=u.replace(/\b\w/g,j=>j.toUpperCase()));let l=((Mt=o.fontWeight)==null?void 0:Mt.toString())||"400",h=o.fontStyle||"normal";l.toLowerCase().includes("italic")&&(h="italic",l=l.replace(/italic/gi,"").trim()||"400");const f=this.mapFontWeight(l),g=Math.max(1,o.fontSize||32);let y=o.fontFamily||"Inter";const m=["Bold","SemiBold","Medium","Regular","Light","Thin","ExtraBold","Black","Italic"];m.forEach(j=>{const ft=new RegExp(`[\\s-]${j}$`,"i");ft.test(y)&&(y=y.replace(ft,"").trim())});const S=o.smallCaps===!0,C=`${S?"small-caps ":""}${h} ${f} ${g}px "${y}", sans-serif`;t.font=C;const w=o.textVerticalAlign||"top";t.textBaseline="top";const M=o.textAlign||"left";t.textAlign=M;let I=0;if(typeof o.letterSpacing=="number")I=o.letterSpacing;else if(typeof o.letterSpacing=="object"&&o.letterSpacing.value!==void 0){const j=o.letterSpacing;I=j.unit==="PERCENT"?j.value/100*g:j.value}t.letterSpacing!==void 0&&(t.letterSpacing=`${I}px`);const T=o.kerning||"auto",k=o.kerningValue||0;T==="manual"&&k!==0&&(t.letterSpacing=`${I+k}px`);const E=o.paragraphSpacing||0;let P=o.lineHeight??1.2;typeof P=="string"&&(P=parseFloat(P)),P>5&&g>0&&(P=P/g);const _=(P||1.2)*g,L=o.isPointText===!0||!o.width||o.width<=0,A=((pt=o.padding)==null?void 0:pt.left)||((wt=o.padding)==null?void 0:wt.right)||0,W=L?1e5:o.width&&o.width>0?Math.ceil(o.width)-A*2:1e5;o.autoHeight;const B=ts({text:u,fontFamily:y,fontSize:g,fontWeight:f,fontStyle:h,lineHeight:P,width:W,letterSpacing:I,paragraphSpacing:E,paragraphIndent:o.paragraphIndent||0,segments:o.segments,enableSegments:o.enableSegments,textCase:p,hyphenation:o.hyphenation,composer:o.composer,balanceRaggedLines:o.balanceRaggedLines}),R=B.lines||[],Y=B.maxFontSize||g,G=this.fontLeadingFactors[y]??.5,z=(_-g)*G;let O=B.height,F=n,Z=a;if(F===0||Z===0||F>=1e5||L){let j=0,ft=0;const Rt=B.fullText||u;(R||[]).forEach(At=>{const Pt=At.text||"",Ot=t.measureText(Pt).width+(Pt.length>0?(Pt.length-1)*I:0);Ot>j&&(j=Ot),ft+=Pt.length,ft<Rt.length&&(Rt[ft]===`
|
|
8
|
+
`||Rt[ft]==="\r")&&(ft++,Rt[ft-1]==="\r"&&Rt[ft]===`
|
|
9
|
+
`&&ft++)}),(F===0||F>=1e5)&&(F=j),Z===0&&(Z=O||0)}let st=-O/2;a>0&&a>O&&(w==="top"?st=-a/2:w==="middle"||w==="center"?st=-O/2:w==="bottom"&&(st=a/2-O));const at=w==="top"&&a>0?0:z;let ct=st+at+z,dt=null,$=0;if(o.pathId&&this.artboard){const j=this.artboard.objects.find(ft=>ft.id===o.pathId);if(j&&j.type==="Shape"&&((yt=j.geometry)==null?void 0:yt.type)==="Path"){const ft=this.objectStates.get(j.id),Rt=ft!=null&&ft.geometry?this.deepMerge(j.geometry,ft.geometry):j.geometry,At=(ft==null?void 0:ft.scale_x)!==void 0?(j.width||0)*ft.scale_x:j.width||0,Pt=(ft==null?void 0:ft.scale_y)!==void 0?(j.height||0)*ft.scale_y:j.height||0;dt={geo:Rt,obj:j,w:At,h:Pt},$=this.getPerimeter(Rt,At,Pt)}}const X=(j,ft)=>{var At,Pt;if(!I&&!S&&!r&&(!o.enableSegments||!((At=o.segments)!=null&&At.length)))return t.measureText(j).width;let Rt=0;for(let Ot=0;Ot<j.length;Ot++){const Gt=ft+Ot;let Ht=0;if(o.enableSegments===!0&&((Pt=o.segments)==null?void 0:Pt.length)>0){let Nt=0,Bt=null;for(const le of o.segments){if(Gt<Nt+(le.text||"").length){Bt=le;break}Nt+=(le.text||"").length}if(Bt){t.save();let le=Bt.fontFamily||o.fontFamily||"Inter";const ae=this.mapFontWeight((Bt.fontWeight||o.fontWeight||"400").toString()),ye=Bt.fontStyle||h,Pe=Bt.fontSize||g;t.font=`${ye} ${ae} ${Pe}px "${le}", sans-serif`,Ht=t.measureText(j[Ot]).width,t.restore()}else Ht=t.measureText(j[Ot]).width}else Ht=t.measureText(j[Ot]).width;Rt+=Ht+I}return Rt-(j.length>0?I:0)},N=(j,ft,Rt,At,Pt)=>{var Pe,Le;const Gt=(Pt===0||u[Pt-1]===`
|
|
10
|
+
`||u[Pt-1]==="\r")&&o.paragraphIndent?o.paragraphIndent:0,Ht=(!r||c)&&(s.behaviors||[]).some(me=>me.enabled&&(me.type.toString().includes("Text")||["Typewriter","Scramble","Wave","Bounce","GlitchText","Reveal3D","RevealSlide","RevealBlur"].includes(me.type))),Nt=!o.pathId&&!Ht&&(o.enableSegments!==!0||!o.segments||o.segments.length===0),Bt=o.baselineShift||0,le=Rt+Bt,ae=X(j,Pt);let ye=ft+Gt;if(M==="center"?ye-=ae/2:M==="right"&&(ye-=ae),Nt){t.font=C;const me=t.textAlign;t.textAlign="left",At?t.strokeText(j,ye,le):t.fillText(j,ye,le),t.textAlign=me}else{const me=t.textAlign;t.textAlign="left";const xe=Pt+j.length>=u.length||u[Pt+j.length]===`
|
|
11
|
+
`||u[Pt+j.length]==="\r";let Zt=0,_e=0;const Fe=o.justifyMinWordSpacing,Ee=o.justifyMaxWordSpacing;if(M==="justify"&&!xe&&ae>0&&!o.pathId){const he=L?ae:W-A*2+0,de=Math.max(0,he-ae);for(let Et=0;Et<j.length;Et++)j[Et]===" "&&_e++;if(_e>0){const Et=t.measureText(" ").width;let J=Fe||Et*.5,et=Ee||Et*2.5;Zt=Math.max(0,Math.min(de/_e,et-J))}}let pe=o.pathOffset||0;o.pathId&&$>0&&dt&&(M==="center"?pe+=$/2-ae/2:M==="right"&&(pe+=$-ae));let Ce=ye;const Re=r&&!c?[]:((Pe=s.behaviors)==null?void 0:Pe.filter(he=>[H.Typewriter,H.Scramble,H.Wave,H.Bounce,H.GlitchText,H.TextTrail,H.Reveal3D,H.RevealSlide,H.RevealBlur,H.TextLiquid,H.TextVortex,H.TextExplosion,H.TextRain,H.TextGravity,H.TextElastic,H.TextMatrix,H.TextNeon,H.TextGlitch3D,H.TextDissolve,H.TextOrganic,H.TextBreathe,H.TextFloral,H.TextSmoke,H.TextVariable,H.TextMagnet,H.TextSpin,H.TextZing,H.TextPerspective,H.TextMirror].includes(he.type)&&he.enabled))||[];for(let he=0;he<j.length;he++){let de=j[he];const Et=Pt+he;let J=0,et=0,q=1,D=1,it=0,tt=1,ut=de;Re.forEach(x=>{const rt=x.settings||{},It=rt.strength||1,Ft=Date.now();if(x.type===H.Typewriter)this.currentTime*(rt.speed||1)-Et*(rt.stagger||.05)<0&&(tt=0);else if(x.type===H.Scramble)Math.max(0,Math.min(1,this.currentTime/(rt.duration||1.5))-Et*.02)<1&&Math.random()<.3&&(ut="$%#@!*&"[Math.floor(Math.random()*7)]);else if(x.type===H.Wave)et+=Math.sin(this.currentTime*5*(rt.speed||1)+Et*(rt.frequency||1))*(rt.amplitude||20)*It;else if(x.type===H.Bounce){const K=Math.max(0,this.currentTime%2-Et*(rt.stagger||.1));K<1&&(et-=Math.abs(Math.sin(K*Math.PI))*(rt.height||50)*It)}else if(x.type===H.TextTrail){const K=this.pointerHistory[Math.max(0,this.pointerHistory.length-1-Et*(rt.delay||5))];K&&(J+=(K.x-(i.x+Ce))*It*.2,et+=(K.y-(i.y+Rt+et))*It*.2)}else if(x.type===H.Reveal3D){const K=Math.max(0,Math.min(1,this.currentTime*(rt.speed||1)-Et*(rt.stagger||.1)));q*=K,D*=K,tt=K}else if(x.type===H.RevealSlide){const K=Math.max(0,Math.min(1,this.currentTime*1.5-Et*.05)),ht=(1-K)*(rt.distance||40)*It,gt=rt.direction||"up";gt==="up"?et-=ht:gt==="down"?et+=ht:gt==="left"?J-=ht:gt==="right"&&(J+=ht),tt=K}else if(x.type===H.RevealBlur){const K=Math.max(0,Math.min(1,this.currentTime*1.2-Et*.1));tt=K,J+=(1-K)*5}else if(x.type===H.TextLiquid){const K=Math.max(0,Math.sin(Ft*.001*(rt.speed||1)+Et*.5));et+=K*(rt.amplitude||10)*It,D*=1+K*.2}else if(x.type===H.TextVortex){const K=Ft*.002*(rt.speed||1)+Et*.2,ht=(1-(Math.sin(Ft*.001)*.5+.5))*(rt.radius||50);J+=Math.cos(K)*ht*It,et+=Math.sin(K)*ht*It}else if(x.type===H.TextExplosion){const K=rt.force||1,ht=this.currentTime%2;if(ht<1){const gt=(Et/j.length-.5)*Math.PI*2,jt=ht*100*K;J+=Math.cos(gt)*jt*It,et+=Math.sin(gt)*jt*It,tt=1-ht}}else if(x.type===H.TextRain){const K=rt.speed||1,ht=rt.height||100,gt=(Ft*.001*K+Et*.1)%1;et-=(1-gt)*ht*It,tt=gt>.1?1:gt*10}else if(x.type===H.TextGravity){const K=rt.gravity||9.8,ht=this.currentTime%3/3,gt=.5*K*Math.pow(ht*10,2);gt<100?et+=gt*It:et+=100*It}else if(x.type===H.TextMatrix){const K=rt.speed||1;if(Math.random()<.1*K){const gt="0123456789ABCDEF!@#$%^&*";ut=gt[Math.floor(Math.random()*gt.length)]}tt=.3+(Math.sin(Ft*.01*K+Et)+1)/2*.7}else if(x.type===H.TextNeon){const K=Math.random()>.95?.5:1;tt=(.7+(Math.sin(Ft*.005)+1)/2*.3)*K}else if(x.type===H.TextDissolve)Math.sin(Et*1.5+Ft*.002*(rt.speed||1))>.5&&(tt=0);else if(x.type===H.TextOrganic){const K=rt.speed||1,ht=rt.amplitude||10;J+=Math.sin(Ft*.002*K+Et)*ht*It,et+=Math.cos(Ft*.0015*K+Et*.7)*ht*It}else if(x.type===H.TextBreathe){const ht=1+(Math.sin(Ft*.003+Et*.2)+1)/2*.2*It;q*=ht,D*=ht}else if(x.type===H.TextSpin){const K=rt.speed||1;it+=Ft*.01*K+Et}else if(x.type===H.TextMagnet){const K=this.pointerHistory[this.pointerHistory.length-1];if(K){const ht=K.x-(i.x+Ce),gt=K.y-(i.y+Rt);it=Math.atan2(gt,ht)}}else if(x.type===H.TextPerspective){const K=j.length/2,ht=(Et-K)/K,gt=1-Math.abs(ht)*.3*It;q*=gt,D*=gt,J+=ht*20*It}else if(x.type===H.TextMirror)tt*=.8;else if(x.type===H.TextFloral){const K=rt.speed||1,ht=rt.stagger||.1,gt=(Ft*.001*K+Et*ht)%2;gt<1&&(q*=gt,D*=gt,it+=gt*Math.PI)}else if(x.type===H.TextSmoke){const K=rt.speed||1,ht=rt.height||50,gt=(Ft*5e-4*K+Et*.2)%1;et-=gt*ht*It,J+=Math.sin(Ft*.002+Et)*5*It,tt=1-gt}else if(x.type===H.TextVariable){const K=rt.speed||1,ht=rt.intensity||1.5,gt=(Math.sin(Ft*.004*K+Et*.3)+1)/2;q*=1+gt*(ht-1)*It}else if(x.type===H.TextZing){const K=rt.speed||2,ht=rt.distance||100,gt=(Ft*.002*K+Et*.05)%1;J+=(1-gt)*ht*It,tt=gt}else if(x.type===H.TextElastic){const K=rt.stiffness||.2,ht=rt.damping||.1,gt=Math.sin(Ft*.01)*Math.exp(-Ft*.001*ht);D*=1+gt*K*It}else if(x.type===H.TextGlitch3D){const K=rt.intensity||5;Math.random()<.2&&(J+=(Math.random()-.5)*K,et+=(Math.random()-.5)*K,tt=.8)}else if(x.type===H.GlitchText){const K=rt.intensity||5;Math.random()<.1&&(J+=(Math.random()-.5)*K,et+=(Math.random()-.5)*K,Math.random()<.05&&(tt=.5))}});let Wt=null,Dt=o.textDecoration||"none",Qt=g;if(o.enableSegments===!0&&((Le=o.segments)==null?void 0:Le.length)>0){let x=0,rt=null;for(const It of o.segments){if(Et<x+(It.text||"").length){rt=It;break}x+=(It.text||"").length}if(rt){let It=rt.fontFamily||o.fontFamily||"Inter";m.forEach(ht=>{const gt=new RegExp(`[\\s-]${ht}$`,"i");gt.test(It)&&(It=It.replace(gt,"").trim())});const Ft=this.mapFontWeight((rt.fontWeight||o.fontWeight||"400").toString()),K=rt.fontStyle||h;Qt=rt.fontSize||g,t.font=`${K} ${Ft} ${Qt}px "${It}", sans-serif`,rt.fill&&(Wt=rt.fill),rt.textDecoration&&(Dt=rt.textDecoration),Qt<Y&&(et+=(Y-Qt)*.85)}}else t.font=C;const zt=t.globalAlpha;t.globalAlpha*=tt,t.save();const Xt=t.measureText(ut).width;if(dt&&$>0){const x=Ce-ye+Xt/2,It=(pe+x)/$,Ft=this.getPointOnPath(dt.geo,dt.w,dt.h,Math.abs(It%1)),K=Ft.angle,ht=Rt+et+(o.pathOffsetY||0),gt=o.pathSide==="right"?-1:1,jt=Math.cos(K+Math.PI/2)*ht*gt,mt=Math.sin(K+Math.PI/2)*ht*gt;t.translate(Ft.x+jt+J,Ft.y+mt),t.rotate(K+it+(gt===-1?Math.PI:0))}else t.translate(Ce+J+Xt/2,Rt+et),it!==0&&t.rotate(it);if(t.scale(q,D),Wt&&!r&&!c){const x=this.createCanvasFill(t,Wt,F,Z);t.fillStyle=x||Wt.color||"#000000"}else if(!r&&!c){const x=this.createCanvasFill(t,e.fill,F,Z);t.fillStyle=x||e.fill.color||"#000000"}if(tt>0)if(r||c){const x=c?"#000000":this.createCanvasFill(t,e.fill,F,Z);t.fillStyle=x||e.fill.color||"#ffffff",t.fillText(ut,-Xt/2,0)}else At?t.strokeText(ut,-Xt/2,0):t.fillText(ut,-Xt/2,0);Dt!=="none"&&!r&&this.drawTextDecoration(t,Dt,0,0,Xt,Qt),t.restore(),t.globalAlpha=zt,M==="justify"&&Zt>0&&ut===" "&&!xe?Ce+=Xt+I+Zt:Ce+=Xt+I}t.textAlign=me}};if(r){let j=0,ft=ct;(R||[]).forEach(Rt=>{const At=Rt.text||"",Pt=u.indexOf(At,j);Pt!==-1&&(j=Pt);let Ot=-F/2;M==="center"?Ot=0:M==="right"&&(Ot=F/2),N(At,Ot,ft,!1,j),j+=At.length,ft+=_})}else if(c){let j=0,ft=ct;(R||[]).forEach(Rt=>{const At=Rt.text||"";let Pt=-F/2;M==="center"?Pt=0:M==="right"&&(Pt=F/2),N(At,Pt,ft,!1,j),j+=At.length,j<u.length&&(u[j]===`
|
|
12
|
+
`||u[j]==="\r")&&(j++,u[j-1]==="\r"&&u[j]===`
|
|
13
|
+
`&&j++),ft+=_})}else{if(e.fill){const ft=t.globalAlpha,Rt=this.createCanvasFill(t,e.fill,F,Z);t.fillStyle=Rt||e.fill.color||"#000000",t.globalAlpha=ft*this.normalizeOpacity(e.fill.opacity??100);const At=B.fullText||(o.enableSegments?(o.segments||[]).map(Gt=>{let Ht=Gt.text||"";const Nt=Gt.textCase||o.textCase||"none";return Nt==="uppercase"?Ht.toUpperCase():Nt==="lowercase"?Ht.toLowerCase():Nt==="capitalize"?Ht.replace(/\b\w/g,Bt=>Bt.toUpperCase()):Ht}).join(""):u);let Pt=0,Ot=ct;(R||[]).forEach(Gt=>{const Ht=Gt.text||"";let Nt=-F/2;M==="center"?Nt=0:M==="right"&&(Nt=F/2),N(Ht,Nt,Ot,!1,Pt),Pt+=Ht.length,Ot+=_,Pt<At.length&&(At[Pt]===`
|
|
14
|
+
`||At[Pt]==="\r")&&(E>0&&(Ot+=E),Pt++,At[Pt-1]==="\r"&&At[Pt]===`
|
|
15
|
+
`&&Pt++)}),t.globalAlpha=ft}const j=o.paragraphRule;if(j&&(((qt=j.top)==null?void 0:qt.width)>0||((Kt=j.bottom)==null?void 0:Kt.width)>0)){let ft=0;(R||[]).forEach((Rt,At)=>{var Gt,Ht;const Ot=ft===0||ft<u.length&&(u[ft]===`
|
|
16
|
+
`||u[ft]==="\r");if(Ot&&At>0&&ft++,Ot){if(((Gt=j.top)==null?void 0:Gt.width)>0){const Nt=ct+At*_-j.top.offset;t.strokeStyle=j.top.color||"#000000",t.lineWidth=j.top.width,t.beginPath();const Bt=-n/2+_*.2;t.moveTo(Bt,Nt),t.lineTo(n/2-_*.2,Nt),t.stroke()}if(((Ht=j.bottom)==null?void 0:Ht.width)>0){const Nt=ct+(At+1)*_-j.bottom.offset;t.strokeStyle=j.bottom.color||"#000000",t.lineWidth=j.bottom.width,t.beginPath();const Bt=-n/2+_*.2;t.moveTo(Bt,Nt),t.lineTo(n/2-_*.2,Nt),t.stroke()}}ft+=(Rt.text||"").length})}if(e.stroke&&e.stroke.width>0){const ft=t.globalAlpha;e.fill&&e.fill.type!=="None"&&e.fill.isEnabled!==!1&&e.fill.opacity!==0&&e.fill.color!=="transparent"&&e.fill.color!=="rgba(0,0,0,0)"&&(t.shadowColor="transparent",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0),t.strokeStyle=e.stroke.color;const At=t.getTransform(),Pt=Math.sqrt(At.a*At.a+At.b*At.b)||1,Ot=window.devicePixelRatio||1;t.lineWidth=(e.stroke.width||1)*Ot/Pt,t.globalAlpha=ft*this.normalizeOpacity(e.stroke.opacity??100);let Gt=0,Ht=ct;(R||[]).forEach(Nt=>{let Bt=-F/2;M==="center"?Bt=0:M==="right"&&(Bt=F/2),N(Nt.text,Bt,Ht,!0,Gt),Gt+=(Nt.text||"").length,Ht+=_,Gt<u.length&&(u[Gt]===`
|
|
17
|
+
`||u[Gt]==="\r")&&(E>0&&(Ht+=E),Gt++,u[Gt-1]==="\r"&&u[Gt]===`
|
|
18
|
+
`&&Gt++)}),t.globalAlpha=ft}}}applyStrokeAlignment(t,s,o,e,i,n){if(!s.stroke||s.stroke.width<=0||s.stroke.isEnabled===!1)return;const a=s.stroke,r=t.getTransform(),c=Math.sqrt(r.a*r.a+r.b*r.b)||1,d=window.devicePixelRatio||1,u=(a.width||1)*d/c,p=(a.alignment||"center").toLowerCase();if(t.save(),s.fill&&s.fill.type!=="None"&&s.fill.isEnabled!==!1&&s.fill.opacity!==0&&s.fill.color!=="transparent"&&s.fill.color!=="rgba(0,0,0,0)"&&(t.shadowColor="transparent",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0),a.fill){const v=this.createCanvasFill(t,a.fill,e,i);v?t.strokeStyle=v:t.strokeStyle=a.color||"#000000"}else t.strokeStyle=a.color||"#000000";const h=t.globalAlpha;t.globalAlpha=h*this.normalizeOpacity(a.opacity??100),t.lineWidth=u,t.lineCap=a.lineCap||"round",t.lineJoin=a.lineJoin||"round",a.miterLimit!==void 0&&(t.miterLimit=a.miterLimit);const f=a.trimStart??0,g=a.trimEnd??1,y=a.trimOffset??0,m=a.dashOffset??0,S=a.dashArray||[];if(f!==0||g!==1||y!==0){const v=this.getPerimeter(o,e,i);if(v>0){const C=Math.max(0,Math.min(1,f)),w=Math.max(0,Math.min(1,g));if(C<w){const M=v*(w-C),I=v-M,T=-(v*(C+y%1));t.setLineDash([M,I]),t.lineDashOffset=T-m*v}else if(C===w)t.setLineDash([0,v]);else{const M=v*(1-C+w),I=v-M,T=-(v*C);t.setLineDash([M,I]),t.lineDashOffset=T-m*v}}}else if(S.length>0||m!==0){S.length>0&&t.setLineDash(S);const v=this.getPerimeter(o,e,i);t.lineDashOffset=-(m*v)}if((o==null?void 0:o.type)==="Line"||e===0||i===0)this.applyPath(t,o,e,i,n),t.stroke();else if(p==="inside")t.lineWidth=u*2,t.save(),this.applyPath(t,o,e,i,n),t.clip(),t.stroke(),t.restore();else if(p==="outside"){t.save(),t.beginPath();const v=Math.max(e,i,2e4);t.rect(-v,-v,v*2,v*2),this._tracePath(t,o,e,i,n),t.clip("evenodd"),t.lineWidth=u*2,t.beginPath(),this.applyPath(t,o,e,i,n),t.stroke(),t.restore()}else t.lineWidth=u,this.applyPath(t,o,e,i,n),t.stroke();t.restore()}getPerimeter(t,s,o){switch(this.ensurePathPoints(t),t==null?void 0:t.type){case"Rectangle":return(s+o)*2;case"Ellipse":{const e=Math.abs(s)/2,i=Math.abs(o)/2,n=Math.abs(t.sweepAngle??360),a=t.ratio||0,r=Math.PI*(3*(e+i)-Math.sqrt((3*e+i)*(e+3*i)));if(n>=360&&a<=0)return r;let c=n/360*r;if(a>0){const d=Math.PI*(3*(e*a+i*a)-Math.sqrt((3*e*a+i*a)*(e*a+3*i*a)));c+=n/360*d,n<360&&(c+=2*Math.sqrt((e-e*a)**2+(i-i*a)**2))}else n<360&&(c+=2*Math.max(e,i));return isNaN(c)?0:c}case"Line":return t.length||Math.sqrt(s*s+o*o);case"Triangle":return s+Math.sqrt((s/2)**2+o**2)*2;case"Polygon":{const e=t.sides||3,i=t.radius||Math.min(s,o)/2;return 2*e*i*Math.sin(Math.PI/e)}case"Star":{const e=t.points||5,i=t.outer_radius||Math.min(s,o)/2,n=t.inner_radius||i/2,a=Math.PI/e;return Math.sqrt(i*i+n*n-2*i*n*Math.cos(a))*e*2}case"Path":{const e=t.points||[];if(e.length<2)return t.length||0;let i=0,n=e[0].x,a=e[0].y;for(let r=1;r<e.length;r++){const c=e[r];if(c.moveTo){n=c.x,a=c.y;continue}const d=n,u=a,p=e[r-1].out_x,l=e[r-1].out_y;if(p!==void 0||c.in_x!==void 0?i+=this.getBezierLength(d,u,p??d,l??u,c.in_x??c.x,c.in_y??c.y,c.x,c.y):i+=Math.sqrt((c.x-d)**2+(c.y-u)**2),n=c.x,a=c.y,c.closePath||r===e.length-1&&(t.is_closed||t.isClosed)){const h=n,f=a,g=[...e.slice(0,r+1)].reverse().find(M=>M.moveTo)||e[0],y=g.x,m=g.y,S=e[r].out_x,v=e[r].out_y,C=g.in_x,w=g.in_y;S!==void 0||C!==void 0?i+=this.getBezierLength(h,f,S??h,v??f,C??y,w??m,y,m):i+=Math.sqrt((y-h)**2+(m-f)**2)}}return i}default:return(s+o)*2}}getBezierLength(t,s,o,e,i,n,a,r,c=10){let d=0,u=t,p=s;for(let l=1;l<=c;l++){const h=l/c,f=1-h,g=h*h,y=f*f,m=y*f,S=g*h,v=m*t+3*y*h*o+3*f*g*i+S*a,C=m*s+3*y*h*e+3*f*g*n+S*r,w=v-u,M=C-p;d+=Math.sqrt(w*w+M*M),u=v,p=C}return d}getBezierTAtLength(t,s,o,e,i,n,a,r,c,d=20){if(t<=0)return 0;let u=0,p=s,l=o;for(let h=1;h<=d;h++){const f=h/d,g=1-f,y=f*f,m=g*g,S=m*g,v=y*f,C=S*s+3*m*f*e+3*g*y*n+v*r,w=S*o+3*m*f*i+3*g*y*a+v*c,M=C-p,I=w-l,T=Math.sqrt(M*M+I*I);if(u+T>=t){const k=t-u,E=T===0?0:k/T;return(h-1+E)/d}u+=T,p=C,l=w}return 1}getPointOnPath(t,s,o,e){if(this.ensurePathPoints(t),(t==null?void 0:t.type)==="Path"){const i=t.points||[];if(i.length<2)return{x:0,y:0,angle:0};let n=1/0,a=-1/0,r=1/0,c=-1/0;i.forEach(m=>{typeof m.x=="number"&&typeof m.y=="number"&&(n=Math.min(n,m.x),a=Math.max(a,m.x),r=Math.min(r,m.y),c=Math.max(c,m.y),m.out_x!==void 0&&(n=Math.min(n,m.out_x),a=Math.max(a,m.out_x)),m.out_y!==void 0&&(r=Math.min(r,m.out_y),c=Math.max(c,m.out_y)),m.in_x!==void 0&&(n=Math.min(n,m.in_x),a=Math.max(a,m.in_x)),m.in_y!==void 0&&(r=Math.min(r,m.in_y),c=Math.max(c,m.in_y)))});const d=(n+a)/2,u=(r+c)/2,l=this.getPerimeter(t,s,o)*e;let h=0;const f=[];let g=i[0],y=i[0];for(let m=1;m<i.length;m++){const S=i[m];if(S.moveTo){g=S,y=S;continue}f.push({p0:g,p1:S}),(S.closePath||m===i.length-1&&(t.is_closed||t.isClosed))&&f.push({p0:S,p1:y}),g=S}for(const m of f){const S=m.p0,v=m.p1;let C=0;const w=S.out_x!==void 0||v.in_x!==void 0;if(w?C=this.getBezierLength(S.x,S.y,S.out_x??S.x,S.out_y??S.y,v.in_x??v.x,v.in_y??v.y,v.x,v.y):C=Math.sqrt((v.x-S.x)**2+(v.y-S.y)**2),h+C>=l||m===f[f.length-1]){let M=0;if(w)return M=this.getBezierTAtLength(l-h,S.x,S.y,S.out_x??S.x,S.out_y??S.y,v.in_x??v.x,v.in_y??v.y,v.x,v.y,20),this.getBezierPointAndAngle(M,S,v,d,u);{M=C===0?0:(l-h)/C;const I=S.x+(v.x-S.x)*M-d,T=S.y+(v.y-S.y)*M-u,k=Math.atan2(v.y-S.y,v.x-S.x);return{x:I,y:T,angle:k}}}h+=C}}else if(t.type==="Ellipse"){const i=Math.abs(s)/2,n=Math.abs(o)/2,a=t.sweepAngle??360,c=((t.startAngle??0)+a*e)*Math.PI/180,d=i*Math.cos(c),u=n*Math.sin(c),p=-i*Math.sin(c),l=n*Math.cos(c),h=Math.atan2(l,p);return{x:d,y:u,angle:h}}else if((t==null?void 0:t.type)==="Rectangle"){const i=Math.abs(s),n=Math.abs(o),r=(i+n)*2*e;let c=0,d=0,u=0;return r<i?(c=-i/2+r,d=-n/2,u=0):r<i+n?(c=i/2,d=-n/2+(r-i),u=Math.PI/2):r<2*i+n?(c=i/2-(r-(i+n)),d=n/2,u=Math.PI):(c=-i/2,d=n/2-(r-(2*i+n)),u=-Math.PI/2),{x:c,y:d,angle:u}}return{x:0,y:0,angle:0}}getBezierPointAndAngle(t,s,o,e,i){const n=s.x,a=s.y,r=s.out_x??s.x,c=s.out_y??s.y,d=o.in_x??o.x,u=o.in_y??o.y,p=o.x,l=o.y,h=1-t,f=t*t,g=h*h,y=g*h,m=f*t,S=y*n+3*g*t*r+3*h*f*d+m*p-e,v=y*a+3*g*t*c+3*h*f*u+m*l-i,C=3*g*(r-n)+6*h*t*(d-r)+3*f*(p-d),w=3*g*(c-a)+6*h*t*(u-c)+3*f*(l-u),M=Math.atan2(w,C);return{x:S,y:v,angle:M}}applyAbsoluteTransform(t,s,o){if(!o.get(s))return;const i=[];let n=s;for(;n;){i.unshift(n);const a=o.get(n);n=a==null?void 0:a.parentId}i.forEach(a=>{this.applyObjectTransform(t,a)})}applyObjectTransform(t,s){var h,f,g;const o=this.objectStates.get(s);if(!o)return;t.translate(o.x,o.y),t.rotate((o.rotation??0)*Math.PI/180);const e=o.skew_x||0,i=o.skew_y||0;if(e!==0||i!==0){const y=Math.tan(e*Math.PI/180),m=Math.tan(i*Math.PI/180);t.transform(1+y*m,m,y,1,0,0)}const n=o.rotate_x!==void 0?o.rotate_x:((h=o.transform)==null?void 0:h.rotate_x)??0,a=o.rotate_y!==void 0?o.rotate_y:((f=o.transform)==null?void 0:f.rotate_y)??0,c=1+(o.translate_z!==void 0?o.translate_z:((g=o.transform)==null?void 0:g.translate_z)??0)/1e3,d=(o.flip_x===!0?-1:1)*Math.cos(a*Math.PI/180)*c,u=(o.flip_y===!0?-1:1)*Math.cos(n*Math.PI/180)*c,p=(o.scale_x??1)*d,l=(o.scale_y??1)*u;t.scale(p,l)}applyInnerGlowOverlay(t,s,o,e,i,n,a){var y,m;const r=a||s.style||{},c=r==null?void 0:r.effect,u=((r==null?void 0:r.effects)||(c?[c]:[])).find(S=>S.isEnabled!==!1&&S.type==="Glow"&&(S.mode==="inner"||S.mode==="Inner Glow"));if(!u)return;t.save(),t.beginPath(),this.applyPath(t,o,e,i,n),t.clip();const p=u.blur||10,l=1e4,h=t.getTransform();let f=u.color||"white";(m=(y=this.artboard)==null?void 0:y.tokens)!=null&&m.colors&&this.artboard.tokens.colors[f]&&(f=this.artboard.tokens.colors[f]),t.shadowColor=f,t.shadowBlur=p,t.shadowOffsetX=l*h.a,t.shadowOffsetY=l*h.b,t.translate(-l,0),t.lineWidth=p+5,t.strokeStyle=f;const g=Math.min(u.intensity||1,5);for(let S=0;S<g;S++)t.beginPath(),this.applyPath(t,o,e,i,n),t.stroke();t.restore()}applyArtEffectOverlay(t,s,o,e,i,n){var l,h,f,g,y;const a=this.objectStates.get(s.id),r=((l=a==null?void 0:a.style)==null?void 0:l.artEffect)||s.artEffect||((h=s.style)==null?void 0:h.artEffect);if(!r||!r.enabled)return;const c=r.type,d=r.intensity??.5,u=r.speed??1,p=r.scale??10;if(c==="acid_gradient"||c==="acid_rave"||c==="shimmer"||c==="glint_overlay"||c==="halftone"||c==="noise"||c==="scanlines"||c==="chromatic_aberration"||c==="pixelate"||c==="glitch"||c==="fold_overlay"||c==="crumple_overlay"){if(t.save(),this.applyPath(t,o,e,i,n),t.clip(),c==="shimmer"){const S=this.currentTime*u%2/2,v=t.createLinearGradient(-e,-i,e,i);v.addColorStop(Math.max(0,S-.2),"rgba(255,255,255,0)"),v.addColorStop(S,`rgba(255,255,255,${d*.8})`),v.addColorStop(Math.min(1,S+.2),"rgba(255,255,255,0)"),t.fillStyle=v,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over"}else if(c==="glint_overlay"){let v=((this._lastPointerPos||{x:0}).x-(((f=s.transform)==null?void 0:f.x)??0)+300)/600;v=Math.max(-.2,Math.min(1.2,v));const C=t.createLinearGradient(-e,-i,e,i);C.addColorStop(Math.max(0,v-.15),"rgba(255,255,255,0)"),C.addColorStop(Math.max(0,Math.min(1,v)),`rgba(255,255,255,${d})`),C.addColorStop(Math.min(1,v+.15),"rgba(255,255,255,0)"),t.fillStyle=C,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over"}else if(c==="fold_overlay"){const m=this._lastPointerPos||{x:0,y:0},S=m.x-(((g=s.transform)==null?void 0:g.x)??0),v=m.y-(((y=s.transform)==null?void 0:y.y)??0),C=t.createLinearGradient(S>0?-e/2:e/2,v>0?-i/2:i/2,S>0?e/2:-e/2,v>0?i/2:-i/2);C.addColorStop(0,`rgba(0,0,0,${d*.6})`),C.addColorStop(.4,"rgba(0,0,0,0)"),C.addColorStop(.5,`rgba(255,255,255,${d*.4})`),C.addColorStop(1,`rgba(0,0,0,${d*.2})`),t.fillStyle=C,t.globalCompositeOperation="overlay",t.fillRect(-e/2,-i/2,e,i),t.globalCompositeOperation="source-over",t.beginPath(),S>0&&v>0?(t.moveTo(e/2-40,i/2),t.lineTo(e/2,i/2-40),t.lineTo(e/2-40,i/2-40)):S<0&&v>0?(t.moveTo(-e/2+40,i/2),t.lineTo(-e/2,i/2-40),t.lineTo(-e/2+40,i/2-40)):S>0&&v<0?(t.moveTo(e/2-40,-i/2),t.lineTo(e/2,-i/2+40),t.lineTo(e/2-40,-i/2+40)):(t.moveTo(-e/2+40,-i/2),t.lineTo(-e/2,-i/2+40),t.lineTo(-e/2+40,-i/2+40)),t.closePath(),t.fillStyle="#ffffff",t.shadowColor="rgba(0,0,0,0.5)",t.shadowBlur=10,t.shadowOffsetX=S>0?-2:2,t.shadowOffsetY=v>0?-2:2,t.fill()}else if(c==="crumple_overlay"){const m=Math.floor(e/p),S=document.createElement("canvas");S.width=m,S.height=Math.floor(i/p);const v=S.getContext("2d"),C=v.createImageData(S.width,S.height);for(let w=0;w<C.data.length;w+=4){const M=Math.random()>.95?150:255;C.data[w]=M,C.data[w+1]=M,C.data[w+2]=M,C.data[w+3]=255*d}v.putImageData(C,0,0),t.globalCompositeOperation="multiply",t.imageSmoothingEnabled=!1,t.drawImage(S,-e/2,-i/2,e,i)}else if(c==="acid_gradient"||c==="acid_rave"){const m=this.currentTime*u,S=r.color1,v=r.color2,C=t.createLinearGradient(-e/2,-i/2,e/2,i/2);if(S&&v){const w=m*60%360;C.addColorStop(0,this._shiftHue(S,w,d*.7)),C.addColorStop(1,this._shiftHue(v,(w+180)%360,d*.7))}else{const w=m*100%360,M=(w+180)%360;C.addColorStop(0,`hsla(${w}, 80%, 50%, ${d*.5})`),C.addColorStop(1,`hsla(${M}, 80%, 50%, ${d*.5})`)}t.fillStyle=C,t.globalCompositeOperation="screen",t.fillRect(-e/2,-i/2,e,i)}else if(c==="halftone"){const m=Math.max(2,p*(1-d*.8)),S=document.createElement("canvas");S.width=m,S.height=m;const v=S.getContext("2d");if(v){v.fillStyle="black",v.beginPath(),v.arc(m/2,m/2,m/2*d,0,Math.PI*2),v.fill();const C=t.createPattern(S,"repeat");C&&(t.globalAlpha=.3*d,t.fillStyle=C,t.fillRect(-e/2,-i/2,e,i))}}else if(c==="noise"){const m=Math.floor(e*i*d*.02);t.globalAlpha=.4*d;for(let S=0;S<m;S++){const v=Math.random()>.5?255:0;t.fillStyle=`rgba(${v}, ${v}, ${v}, ${.5+Math.random()*.5})`,t.fillRect(-e/2+Math.random()*e,-i/2+Math.random()*i,2,2)}}else if(c==="scanlines"){t.globalAlpha=.2*d,t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=1;for(let m=-i/2;m<i/2;m+=4)t.beginPath(),t.moveTo(-e/2,m),t.lineTo(e/2,m),t.stroke()}else if(c==="chromatic_aberration"){const m=5*d;t.globalCompositeOperation="screen",t.globalAlpha=.5,t.fillStyle="cyan",t.fillRect(-e/2-m,-i/2,e,i),t.fillStyle="magenta",t.fillRect(-e/2+m,-i/2,e,i)}else if(c==="pixelate"){const m=Math.max(2,Math.round(p*(1-d*.5))),S=document.createElement("canvas"),v=Math.max(1,Math.ceil(e/m)),C=Math.max(1,Math.ceil(i/m));S.width=v,S.height=C;const w=S.getContext("2d");if(w){w.imageSmoothingEnabled=!1;const M=t.getTransform(),I=M.e-e/2,T=M.f-i/2;w.drawImage(t.canvas,I,T,e,i,0,0,v,C),t.imageSmoothingEnabled=!1,t.drawImage(S,0,0,v,C,-e/2,-i/2,e,i),t.imageSmoothingEnabled=!0}}else if(c==="glitch"){const m=this.currentTime*u,S=r.chaosAmount??.2,v=Math.max(3,Math.floor(8*d)),C=d*e*.15;t.globalCompositeOperation="screen",t.globalAlpha=d*.4;const w=C*.3;t.fillStyle="rgba(255, 0, 0, 0.4)",t.fillRect(-e/2+w,-i/2,e,i),t.fillStyle="rgba(0, 255, 255, 0.4)",t.fillRect(-e/2-w,-i/2,e,i),t.globalCompositeOperation="source-over",t.globalAlpha=1;const M=i/v;for(let I=0;I<v;I++){const T=Math.sin(I*127.1+m*311.7*u)*43758.5,k=T-Math.floor(T);if(k>1-S){const E=(k-(1-S))/S*C*(Math.random()>.5?1:-1),P=-i/2+I*M,_=t.getTransform(),L=_.e-e/2+E,A=_.f+P;t.save(),t.beginPath(),t.rect(-e/2,P,e,M),t.clip(),t.globalAlpha=.8,t.drawImage(t.canvas,L,A,e,M,-e/2+E,P,e,M),t.restore()}}}t.restore()}}_shiftHue(t,s,o){let e=0,i=0,n=0;if(t.startsWith("#")){const l=t.replace("#","");e=parseInt(l.substring(0,2),16)/255,i=parseInt(l.substring(2,4),16)/255,n=parseInt(l.substring(4,6),16)/255}const a=Math.max(e,i,n),r=Math.min(e,i,n);let c=0,d=0,u=(a+r)/2;if(a!==r){const l=a-r;switch(d=u>.5?l/(2-a-r):l/(a+r),a){case e:c=((i-n)/l+(i<n?6:0))/6;break;case i:c=((n-e)/l+2)/6;break;case n:c=((e-i)/l+4)/6;break}}return`hsla(${(((c*360+s)%360+360)%360).toFixed(0)}, ${(d*100).toFixed(0)}%, ${(u*100).toFixed(0)}%, ${o})`}applyBackgroundBlurGlass(t,s,o,e,i,n,a){const r=n.radius??10,c=n.opacity!==void 0?this.normalizeOpacity(n.opacity):.5,d=n.noise??0,u=n.color??"rgba(255,255,255,0.2)";t.save(),this.applyPath(t,s,o,e,i),t.clip();const p=t.getTransform(),l=t.canvas;try{const g=document.createElement("canvas");g.width=Math.max(1,Math.ceil(o)),g.height=Math.max(1,Math.ceil(e));const y=g.getContext("2d");if(y){y.save(),y.translate(o/2,e/2);const m=n.magnification||1;if(m!==1&&y.scale(m,m),typeof p.inverse=="function"){const C=p.inverse();y.transform(C.a,C.b,C.c,C.d,C.e,C.f)}else{const C=p.a*p.d-p.b*p.c;C!==0&&y.transform(p.d/C,-p.b/C,-p.c/C,p.a/C,(p.c*p.f-p.d*p.e)/C,(p.b*p.e-p.a*p.f)/C)}y.drawImage(l,0,0),y.restore();const S=document.createElement("canvas");S.width=g.width,S.height=g.height;const v=S.getContext("2d");v.filter=`blur(${r}px)`,v.drawImage(g,0,0),t.globalCompositeOperation="destination-out",t.fillRect(-o/2,-e/2,o,e),t.globalCompositeOperation="source-over",t.globalAlpha=1,t.drawImage(S,-o/2,-e/2,o,e)}}catch(g){console.error("Background blur failed:",g)}t.globalCompositeOperation="source-over",t.globalAlpha=c,t.fillStyle=u,t.fillRect(-o/2,-e/2,o,e),t.globalAlpha=1;const h=t.createLinearGradient(-o/2,-e/2,o/2,e/2);if(h.addColorStop(0,"rgba(255,255,255,0.12)"),h.addColorStop(.3,"rgba(255,255,255,0.04)"),h.addColorStop(.5,"rgba(255,255,255,0.0)"),h.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=h,t.fillRect(-o/2,-e/2,o,e),d>0){if(t.globalAlpha=d/100,!this._noiseTileCanvas){const y=document.createElement("canvas");y.width=64,y.height=64;const m=y.getContext("2d"),S=m.createImageData(64,64),v=S.data;for(let C=0;C<v.length;C+=4){const w=Math.floor(Math.random()*255);v[C]=w,v[C+1]=w,v[C+2]=w,v[C+3]=18}m.putImageData(S,0,0),this._noiseTileCanvas=y}const g=t.createPattern(this._noiseTileCanvas,"repeat");g&&(t.fillStyle=g,t.fillRect(-o/2,-e/2,o,e))}t.restore(),t.save(),t.globalAlpha=1,(a==null?void 0:a.stroke)&&a.stroke.width>0&&a.stroke.isEnabled!==!1?(this.applyPath(t,s,o,e,i),this.applyStrokeAlignment(t,a,s,o,e,i)):(t.strokeStyle="rgba(255, 255, 255, 0.25)",t.lineWidth=1.5,this.applyPath(t,s,o,e,i),t.stroke()),t.restore()}applyPath(t,s,o,e,i){s!=null&&s.data&&(s.type==="Path"||s.type==="Subtract"||s.type==="Union"||s.type==="Intersect"||s.type==="Exclude"||s.type),t.beginPath(),this._tracePath(t,s,o,e,i)}_tracePath(t,s,o,e,i){if(s){if(this.ensurePathPoints(s),(s==null?void 0:s.type)==="Rectangle"||s.type==="Image"){const n=i!==void 0?i:s.corner_radius??0;this.drawRoundRect(t,-o/2,-e/2,o,e,n)}else if(s.type==="Line")t.moveTo(-o/2,0),t.lineTo(o/2,0);else if(s.type==="Ellipse"||s.type==="circle"){const{startAngle:n=0,sweepAngle:a=360,ratio:r=0}=s,c=o/2,d=e/2,u=n*Math.PI/180,p=a*Math.PI/180,l=u+p;a>=360&&r<=0?t.ellipse(0,0,c,d,0,0,Math.PI*2):(t.ellipse(0,0,c,d,0,u,l,!1),r>0?t.ellipse(0,0,c*r,d*r,0,l,u,!0):t.lineTo(0,0),t.closePath())}else if(s.type==="Triangle")t.moveTo(0,-e/2),t.lineTo(o/2,e/2),t.lineTo(-o/2,e/2),t.closePath();else if(s.type==="Polygon"){const n=s.sides||3,a=s.radius||Math.min(o,e)/2;for(let r=0;r<n;r++){const c=r*2*Math.PI/n-Math.PI/2,d=a*Math.cos(c),u=a*Math.sin(c);r===0?t.moveTo(d,u):t.lineTo(d,u)}t.closePath()}else if(s.type==="Star"){const n=s.points||5,a=s.outer_radius||Math.min(o,e)/2;let r=s.inner_radius;r==null?r=a*.382:r<=1&&(r=a*r);for(let c=0;c<n*2;c++){const d=c*Math.PI/n-Math.PI/2,u=c%2===0?a:r,p=u*Math.cos(d),l=u*Math.sin(d);c===0?t.moveTo(p,l):t.lineTo(p,l)}t.closePath()}else if(((s==null?void 0:s.type)==="Path"||s.type==="Subtract"||s.type==="Union"||s.type==="Intersect"||s.type==="Exclude"||s.type==="BooleanOperation")&&s.points){this.frameCount%300===0&&this.log("[Engine] Tracing Path:",s.points.length,"points");let n=1/0,a=-1/0,r=1/0,c=-1/0;if(s.points.forEach(p=>{typeof p.x=="number"&&typeof p.y=="number"&&(n=Math.min(n,p.x),a=Math.max(a,p.x),r=Math.min(r,p.y),c=Math.max(c,p.y),p.out_x!==void 0&&(n=Math.min(n,p.out_x),a=Math.max(a,p.out_x)),p.out_y!==void 0&&(r=Math.min(r,p.out_y),c=Math.max(c,p.out_y)),p.in_x!==void 0&&(n=Math.min(n,p.in_x),a=Math.max(a,p.in_x)),p.in_y!==void 0&&(r=Math.min(r,p.in_y),c=Math.max(c,p.in_y)))}),n===1/0)return;let d=(n+a)/2,u=(r+c)/2;if(isNaN(d)||isNaN(u)){this.warn("[Engine] Invalid path center:",d,u);return}s.points.forEach((p,l)=>{if(l===0||p.moveTo)t.moveTo(p.x-d,p.y-u);else{const h=s.points[l-1];if(!h)return;const f=(h.out_x??h.x)-d,g=(h.out_y??h.y)-u,y=(p.in_x??p.x)-d,m=(p.in_y??p.y)-u;isNaN(f)||isNaN(y)||isNaN(p.x)?t.lineTo(p.x-d,p.y-u):t.bezierCurveTo(f,g,y,m,p.x-d,p.y-u)}if(p.closePath||l===s.points.length-1&&(s.is_closed||s.isClosed)){const h=[...s.points.slice(0,l+1)].reverse().find(f=>f.moveTo)||s.points[0];h&&(p.out_x!==void 0||h.in_x!==void 0)&&t.bezierCurveTo((p.out_x??p.x)-d,(p.out_y??p.y)-u,(h.in_x??h.x)-d,(h.in_y??h.y)-u,h.x-d,h.y-u),t.closePath()}})}else if(s.points&&Array.isArray(s.points)){let n=1/0,a=-1/0,r=1/0,c=-1/0;s.points.forEach(p=>{n=Math.min(n,p.x),a=Math.max(a,p.x),r=Math.min(r,p.y),c=Math.max(c,p.y)});const d=(n+a)/2,u=(r+c)/2;s.points.forEach((p,l)=>{if(l===0)t.moveTo(p.x-d,p.y-u);else{const h=s.points[l-1];h.out_x!==void 0||p.in_x!==void 0?t.bezierCurveTo((h.out_x??h.x)-d,(h.out_y??h.y)-u,(p.in_x??p.x)-d,(p.in_y??p.y)-u,p.x-d,p.y-u):t.lineTo(p.x-d,p.y-u)}(p.closePath||l===s.points.length-1&&(s.is_closed||s.isClosed))&&t.closePath()})}}}renderInputBox(t,s){var ct,dt;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((ct=s.geometry)==null?void 0:ct.width)||250,n=((dt=s.geometry)==null?void 0:dt.height)||45,a=this.focusedId===s.id,r=this.lastHoveredObjectId===s.id,c=e.previewState||"default",d=c!=="default"?c:a?"focused":r?"hovered":"default",u=e.label||{visible:!0,text:"Label"},p=e.helperText||{visible:!1,text:"Helper text"},l=e.leftIcon||{visible:!1},h=e.rightIcon||{visible:!1},f=e.multiline===!0,g=e.corner_radius??8,y=e.corners||{tl:g,tr:g,bl:g,br:g},m=[y.tl,y.tr,y.br,y.bl];let S=e.backgroundColor||"rgba(31, 41, 55, 1)",v=e.borderColor||"rgba(55, 65, 81, 1)",C=e.borderWidth??1.5,w=e.color||"#ffffff",M=e.placeholderColor||"rgba(156, 163, 175, 1)",I=e.fontSize||14;const T=`${d}Style`,k=e[T];k?(k.backgroundColor!==void 0&&(S=k.backgroundColor),k.borderColor!==void 0&&(v=k.borderColor),k.borderWidth!==void 0&&(C=k.borderWidth),k.color!==void 0&&(w=k.color),k.placeholderColor!==void 0&&(M=k.placeholderColor),k.fontSize!==void 0&&(I=k.fontSize)):d==="focused"?(v=e.focusBorderColor||"rgba(59, 130, 246, 1)",C=Math.max(C,2)):d==="hovered"||d==="hover"?(v=e.hoverBorderColor||v,S=e.hoverBackgroundColor||S):d==="disabled"?(S=e.disabledBackgroundColor||"rgba(31, 41, 55, 0.6)",v=e.disabledBorderColor||"rgba(55, 65, 81, 0.4)"):d==="error"&&(v="rgba(239, 68, 68, 1)",C=Math.max(C,2)),t.beginPath(),this.drawRoundRect(t,-i/2,-n/2,i,n,m);const E=this.createCanvasFill(t,S,i,n);if(E&&(t.fillStyle=E,t.fill()),C>0){const $=this.createCanvasFill(t,v,i,n);if($&&(t.strokeStyle=$,t.lineWidth=C,t.stroke()),d==="focused"||d==="focus"){t.save(),t.beginPath();const X=m.map(N=>N+2);this.drawRoundRect(t,-i/2-2,-n/2-2,i+4,n+4,X),t.strokeStyle="rgba(59, 130, 246, 0.3)",t.lineWidth=2,t.stroke(),t.restore()}}const P=($,X)=>{if(!$.visible||!$.svgPath)return;const N=$.size||14,ot=$.offset??16,bt=$.color||"#ffffff",St=X?-(i/2)+ot:i/2-ot,Mt=$.svgPath;if(t.save(),t.translate(St,0),!Mt.startsWith("<svg")){const pt=new Path2D(Mt),wt=N/24;t.scale(wt,wt),t.translate(-12,-12),t.fillStyle=bt,t.fill(pt)}t.restore()};P(l,!0),P(h,!1);const _=e.text||"",L=e.placeholder||"Enter text...",A=!_,W=_||L,B=A?M:w,R=I,Y=e.fontFamily||"Inter",G=e.fontWeight||400;t.font=`${G} ${R}px "${Y}", sans-serif`,t.fillStyle=B,t.textAlign="left",t.textBaseline=f?"top":"middle";const z=e.inputPadding??16,O=l.visible?(l.offset??16)+(l.size||14)/2+8:z,F=h.visible?(h.offset??16)+(h.size||14)/2+8:z,Z=-(i/2)+O,st=i-O-F,at=e.inputType==="password"?"•".repeat(W.length):W;if(t.save(),t.beginPath(),t.rect(Z-2,-n/2+4,st+4,n-8),t.clip(),f){const $=at.split(`
|
|
19
|
+
`);let X=-n/2+z;const N=R*1.2;let ot=0;$.forEach((bt,St)=>{const Mt=bt.split(" ");let pt="";for(let wt=0;wt<Mt.length;wt++){const yt=pt+Mt[wt]+" ";t.measureText(yt).width>st&&wt>0?(t.fillText(pt,Z,X),pt=Mt[wt]+" ",X+=N):pt=yt}t.fillText(pt,Z,X),ot=t.measureText(pt).width,St<$.length-1&&(X+=N,ot=0)}),a&&!A&&Math.floor(performance.now()/500)%2===0&&t.fillRect(Z+ot,X,1.5,R)}else{const X=t.measureText(at).width;let N=0;if(X>st&&(N=X-st),t.fillText(at,Z-N,0),a&&!A&&Math.floor(performance.now()/500)%2===0){const bt=Z+X-N;t.fillRect(bt,-(R/2),1.5,R)}}if(t.restore(),u.visible!==!1){const $=u.text||"Label",X=u.fontSize||12,N=u.color||"rgba(156, 163, 175, 1)",ot=u.offset??8;t.font=`600 ${X}px "${Y}", sans-serif`,t.fillStyle=N,t.textAlign="left",t.textBaseline="bottom";const bt=-(i/2),St=-(n/2)-ot;t.fillText($,bt,St)}if(p.visible===!0){const $=p.text||"Helper text",X=p.fontSize||11,N=d==="error"?"rgba(239, 68, 68, 1)":p.color||"rgba(156, 163, 175, 1)",ot=p.offset??6;t.font=`400 ${X}px "${Y}", sans-serif`,t.fillStyle=N,t.textAlign="left",t.textBaseline="top";const bt=-(i/2),St=n/2+ot;t.fillText($,bt,St)}}renderSlider(t,s){const o=this.objectStates.get(s.id),e=(o==null?void 0:o.geometry)||s.geometry,i=(o==null?void 0:o.options)||s.options||{},n=e.width||200,a=i.value??50,r=i.min??0,d=(i.max??100)-r,u=d===0?0:(a-r)/d,p=i.trackHeight||4,l=i.trackRoundedness??2,h=i.trackShape??"Rectangle",f=i.trackPath||"",g=i.accentColor||"#3b82f6",y=i.inactiveColor||"#374151",m=i.thumbShape||"Ellipse",S=i.thumbWidth??16,v=i.thumbHeight??16,C=i.thumbRoundedness??0,w=i.thumbColor||"#ffffff",M=i.thumbPath||"",I=i.thumbIcon||"",T=i.showValueTooltip??!1,k=i.tooltipBgColor||"#333333",E=i.tooltipColor||"#ffffff",P=i.tooltipOffsetX??0,_=i.tooltipOffsetY??-25,L=(st,at,ct,dt,$,X,N)=>{if((st==="Custom"||st==="Icon")&&N)try{const ot=new Path2D(N);if(t.save(),t.translate(at,ct),st==="Icon"){const bt=Math.min(dt,$)/24;t.scale(bt,bt),t.translate(-12,-12)}t.fill(ot),t.restore();return}catch(ot){console.error("Error drawing slider shape in engine:",ot)}if(t.beginPath(),st==="Ellipse")t.ellipse(at,ct,dt/2,$/2,0,0,Math.PI*2);else if(st==="Rectangle")this.drawRoundRect(t,at-dt/2,ct-$/2,dt,$,X);else if(st==="Triangle")t.moveTo(at,ct-$/2),t.lineTo(at+dt/2,ct+$/2),t.lineTo(at-dt/2,ct+$/2),t.closePath();else if(st==="Diamond")t.moveTo(at,ct-$/2),t.lineTo(at+dt/2,ct),t.lineTo(at,ct+$/2),t.lineTo(at-dt/2,ct),t.closePath();else if(st==="Polygon"){const ot=s.geometry.sides||3,bt=s.geometry.radius||Math.min(dt,$)/2;for(let St=0;St<ot;St++){const Mt=St*2*Math.PI/ot-Math.PI/2,pt=at+bt*Math.cos(Mt),wt=ct+bt*Math.sin(Mt);St===0?t.moveTo(pt,wt):t.lineTo(pt,wt)}t.closePath()}else if(st==="Star"){const bt=Math.min(dt,$)/2,St=bt/2;for(let Mt=0;Mt<10;Mt++){const pt=Mt%2===0?bt:St,wt=Mt*Math.PI/5-Math.PI/2;t.lineTo(at+pt*Math.cos(wt),ct+pt*Math.sin(wt))}t.closePath()}else st==="Line"&&(t.moveTo(at-dt/2,ct),t.lineTo(at+dt/2,ct));t.fill()},A=this.createCanvasFill(t,y,n,p);A&&(t.fillStyle=A,t.strokeStyle=A),h==="Line"?(t.lineWidth=p,t.beginPath(),t.moveTo(-n/2,0),t.lineTo(n/2,0),t.stroke()):L(h,0,0,n,p,l,f);const W=n-S,B=-n/2+S/2+u*W,R=B- -n/2;if(R>0){const st=this.createCanvasFill(t,g,n,p);st&&(t.fillStyle=st,t.strokeStyle=st),h==="Line"?(t.lineWidth=p,t.beginPath(),t.moveTo(-n/2,0),t.lineTo(B,0),t.stroke()):h==="Rectangle"&&(t.beginPath(),this.drawRoundRect(t,-n/2,-p/2,R,p,l),t.fill())}t.save(),t.translate(B,0);const Y=t.getTransform(),G=Math.sqrt(Y.a*Y.a+Y.b*Y.b)||1;t.shadowColor="rgba(0,0,0,0.2)",t.shadowBlur=4*G,t.shadowOffsetY=1*G;const z=this.createCanvasFill(t,w,S,v);if(z&&(t.fillStyle=z),L(m,0,0,S,v,C,m==="Icon"?I:M),t.restore(),T){t.save(),t.translate(B+P,_);const st=Math.round(a).toString();t.font="10px Inter, sans-serif";const at=t.measureText(st),ct=6,dt=4,$=at.width+ct*2,X=14+dt;t.beginPath(),this.drawRoundRect(t,-$/2,-X/2,$,X,4),t.fillStyle=k,t.fill(),t.fillStyle=E,t.textAlign="center",t.textBaseline="middle",t.fillText(st,0,0),t.restore()}const O=i.label||{},F=i.helperText||{},Z=i.fontFamily||"Inter";if(O.visible!==!1){const st=O.text||"Label",at=O.fontSize||12,ct=O.color||"rgba(156, 163, 175, 1)",dt=O.offset??8;t.font=`600 ${at}px "${Z}", sans-serif`,t.fillStyle=ct,t.textAlign="left",t.textBaseline="bottom";const $=-(n/2),X=-(p/2)-dt;t.fillText(st,$,X)}if(F.visible===!0){const st=F.text||"Helper text",at=F.fontSize||11,ct=F.color||"rgba(156, 163, 175, 1)",dt=F.offset??6;t.font=`400 ${at}px "${Z}", sans-serif`,t.fillStyle=ct,t.textAlign="left",t.textBaseline="top";const $=-(n/2),X=p/2+dt;t.fillText(st,$,X)}}renderDropdown(t,s){var _;const o=this.objectStates.get(s.id);if(!o)return;const e=o.options||s.options||{},i=s.geometry.width||160,n=s.geometry.height||40,a=-i/2,r=-n/2,c=e.corner_radius??6,d=e.disabled||e.previewState==="disabled",u=this.lastHoveredObjectId===s.id||e.previewState==="hover",p=(e.isOpen||e.previewState==="active")&&!d;let l=e.backgroundColor,h=e.borderColor,f=e.color||"#333333";d?(l=e.disabledBackgroundColor||"#f3f4f6",h=e.disabledBorderColor||"#e5e7eb",f=e.disabledColor||"#9ca3af"):p?(l=e.activeBackgroundColor||l,h=e.activeBorderColor||h,f=e.activeColor||f):u&&(l=e.hoverBackgroundColor||l,h=e.hoverBorderColor||h,f=e.hoverColor||f),l||(l="#ffffff"),h||(h="#e5e7eb");const g=t.globalAlpha;t.globalAlpha=g*(e.opacity??1),this.drawRoundRect(t,a,r,i,n,c),t.fillStyle=this.createCanvasFill(t,typeof l=="string"?{type:"Solid",color:l}:l,i,n)||"#ffffff",t.fill();const y=e.borderWidth??1;y>0&&(t.strokeStyle=this.createCanvasFill(t,typeof h=="string"?{type:"Solid",color:h}:h,i,n)||"#e5e7eb",t.lineWidth=y,t.stroke());const m=12,S=e.chevronType||"chevron",v=e.chevronSize||16,C=(p?e.openIconColor:e.closedIconColor)||e.chevronColor||"#6b7280";if(S!=="none"){const L=a+i-m-v/2;t.save(),t.translate(L,0);const A=p?e.openIconAngle??180:e.closedIconAngle??0;if(t.rotate(A*Math.PI/180),t.strokeStyle=C,t.fillStyle=C,t.lineWidth=1.5,t.lineCap="round",t.lineJoin="round",S==="chevron")t.beginPath(),t.moveTo(-v/2,-v*.2),t.lineTo(0,v*.2),t.lineTo(v/2,-v*.2),t.stroke();else if(S==="custom"||S==="path"){const W=p&&e.openIconPath||e.closedIconPath;if(W){const B=new Path2D(W);t.save();const R=v/24;t.scale(R,R),t.translate(-12,-12),t.fill(B),t.restore()}}t.restore()}const w=e.selectedOption||e.placeholder||"Select...",M=e.fontSize||14,I=e.fontWeight||400,T=e.fontFamily||"Inter, sans-serif";t.font=`${I} ${M}px ${T}`;const k=d?e.disabledColor||"#9ca3af":!e.selectedOption&&e.placeholder?"#9ca3af":f;t.fillStyle=this.createCanvasFill(t,typeof k=="string"?{type:"Solid",color:k}:k,i,n)||"#333333",t.textAlign="left",t.textBaseline="middle";const E=S==="none"?0:v+8,P=i-m*2-E;if(t.save(),t.beginPath(),t.rect(a+m,r,P,n),t.clip(),t.fillText(w,a+m,0),t.restore(),p&&!d){const L=r+n+4,A=e.optionsList||[],W=e.itemHeight||32,B=e.listPadding??4,R=A.length*W+B*2,Y=e.listCornerRadius??c;t.save();const G=e.listShadow||{},z=t.getTransform(),O=Math.sqrt(z.a*z.a+z.b*z.b)||1;t.shadowColor=typeof G.color=="string"?G.color:((_=G.color)==null?void 0:_.color)||"rgba(0,0,0,0.15)",t.shadowBlur=(G.blur??12)*O,t.shadowOffsetY=(G.offsetY??6)*O,t.shadowOffsetX=(G.offsetX??0)*O,t.beginPath(),this.drawRoundRect(t,a,L,i,R,Y),t.fillStyle=this.createCanvasFill(t,typeof e.listBackgroundColor=="string"?{type:"Solid",color:e.listBackgroundColor}:e.listBackgroundColor||{type:"Solid",color:"#ffffff"},i,R)||"#ffffff",t.fill();const F=e.listBorderWidth??1;F>0&&(t.shadowColor="transparent",t.strokeStyle=this.createCanvasFill(t,typeof e.listBorderColor=="string"?{type:"Solid",color:e.listBorderColor}:e.listBorderColor||{type:"Solid",color:h},i,R)||"#e5e7eb",t.lineWidth=F,t.stroke()),t.restore();const Z=e.itemFontSize||M,st=e.itemFontFamily||T;t.font=`${I} ${Z}px ${st}`,A.forEach((at,ct)=>{const dt=L+B+ct*W;if(at===e.selectedOption)t.fillStyle=this.createCanvasFill(t,typeof e.itemSelectedBackgroundColor=="string"?{type:"Solid",color:e.itemSelectedBackgroundColor}:e.itemSelectedBackgroundColor||{type:"Solid",color:"#f3f4f6"},i,W)||"#f3f4f6",t.fillRect(a+F,dt,i-F*2,W),t.fillStyle=e.itemSelectedColor||e.accentColor||f||"#374151";else if(t.fillStyle=e.listTextColor||f||"#333333",this.activeDropdownId===s.id&&this._lastPointerPos){const X=this._lastPointerPos.y-(L+B),N=Math.floor(X/W);ct===N&&(t.fillStyle=this.createCanvasFill(t,typeof e.itemHoverBackgroundColor=="string"?{type:"Solid",color:e.itemHoverBackgroundColor}:e.itemHoverBackgroundColor||{type:"Solid",color:"#f9fafb"},i,W)||"#f9fafb",t.fillRect(a+F,dt,i-F*2,W),t.fillStyle=e.itemHoverColor||f)}t.fillText(at,a+m,dt+W/2)})}t.globalAlpha=g}renderButton(t,s){if(s.children&&s.children.length>0)return;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=s.geometry||{},n=i.width||120,a=i.height||40,r=this.lastHoveredObjectId===s.id,c=this.activeObjectId===s.id,d=e.label||{},u=e.hoverStyle||{},p=e.activeStyle||{},l=e.icon||{enabled:!1};let h=e.backgroundColor||"#3b82f6",f=d.color||"#ffffff",g=d.text||"Button",y=i.cornerRadius??8,m=e.borderColor||"transparent",S=e.borderWidth||0,v=1;c&&p?(h=p.backgroundColor||h,f=p.color||f,g=p.text||g,v=p.scale??.95,y=p.cornerRadius??y):r&&u&&(h=u.backgroundColor||h,f=u.color||f,g=u.text||g,v=u.scale??1,y=u.cornerRadius??y,m=u.borderColor||m);const C=-n/2,w=-a/2;t.save(),t.scale(v,v),t.beginPath(),this.drawRoundRect(t,C,w,n,a,y);const M=this.createCanvasFill(t,h,n,a);M&&(t.fillStyle=M,t.fill()),(S>0||r&&u.borderColor)&&(t.strokeStyle=m,t.lineWidth=S||(r?1:0),t.stroke());const I=d.fontSize||14,T=d.fontFamily||"Inter",k=d.fontWeight||600;t.font=`${k} ${I}px "${T}", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,t.fillStyle=f,t.textAlign="center",t.textBaseline="middle";let E=0;if(l.enabled&&l.svgPath){const P=I*1.1,_=l.gap||8,L=t.measureText(g),W=-(L.width+P+_)/2,B=l.position==="left"?W+P/2:W+L.width+_+P/2;E=l.position==="left"?W+P+_+L.width/2:W+L.width/2,t.save(),t.translate(B,0);const R=new Path2D(l.svgPath),Y=P/24;t.scale(Y,Y),t.translate(-12,-12),t.fillStyle=f,t.fill(R),t.restore()}t.fillText(g,E,0),t.restore()}renderToggleButton(t,s){var g,y;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=e.checked??!1,n=((g=s.geometry)==null?void 0:g.width)||120,a=((y=s.geometry)==null?void 0:y.height)||40,r=-n/2,c=-a/2,d=e.corner_radius??8,u=e.label||{},p=i?e.accentColor||"#3b82f6":e.inactiveColor||"#374151",l=i?e.activeTextColor||"#ffffff":e.inactiveTextColor||"#9ca3af";t.save(),t.beginPath(),this.drawRoundRect(t,r,c,n,a,d),t.fillStyle=p,t.fill();const h=u.fontSize||14,f=u.fontFamily||"Inter";t.font=`${u.fontWeight||600} ${h}px "${f}", sans-serif`,t.fillStyle=l,t.textAlign="center",t.textBaseline="middle",t.fillText(u.text||"Toggle",0,0),t.restore()}renderToggle(t,s){var Y,G,z,O,F,Z,st,at,ct,dt,$,X;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((Y=s.geometry)==null?void 0:Y.width)||52,n=((G=s.geometry)==null?void 0:G.height)||30,a=-i/2,r=-n/2,c=e.checked??!1,d=e.cornerRadius??e.corner_radius??n/2,u=e.toggleStyle||{},p=u.backgroundColor||e.activeColor||"#10b981",l=u.borderColor||e.borderColor||"transparent",h=u.borderWidth??e.borderWidth??0,f=u.knobColor||e.knobColor||"#ffffff",g=c?p:e.inactiveColor||"#374151",y=c?l:e.borderColor||"transparent",m=c?h:e.borderWidth??0,S=c?f:e.knobColor||"#ffffff";e.disabled&&(t.globalAlpha*=.5),t.beginPath(),this.drawRoundRect(t,a,r,i,n,d);const v=this.createCanvasFill(t,g,i,n);if(v&&(t.fillStyle=v,t.fill()),m>0){t.lineWidth=m;const N=this.createCanvasFill(t,y,i,n);N&&(t.strokeStyle=N,t.stroke())}const C=2,w=n-C*2,M=w/2,I=a+C,T=a+i-C-w,k=c?T:I,E=r+C;t.beginPath(),t.arc(k+M,E+M,M,0,Math.PI*2);const P=this.createCanvasFill(t,S,w,w);P&&(t.fillStyle=P,t.fill()),e.disabled&&(t.globalAlpha*=2);let _=!1,L=!1;const A=(c?(z=u.leftLabel)==null?void 0:z.text:null)||((O=e.leftLabel)==null?void 0:O.text)||"",W=(c?(F=u.leftLabel)==null?void 0:F.color:null)||((Z=e.leftLabel)==null?void 0:Z.color)||"#f3f4f6";if((st=e.leftLabel)!=null&&st.enabled&&A){const N=e.leftLabel;t.font=`${N.fontWeight||400} ${N.fontSize||12}px "${N.fontFamily||"Inter"}", sans-serif`,t.fillStyle=W,t.textBaseline="middle",t.textAlign="right",t.fillText(A,a-(N.gap||8),0),_=!0}const B=(c?(at=u.rightLabel)==null?void 0:at.text:null)||((ct=e.rightLabel)==null?void 0:ct.text)||"",R=(c?(dt=u.rightLabel)==null?void 0:dt.color:null)||(($=e.rightLabel)==null?void 0:$.color)||"#f3f4f6";if((X=e.rightLabel)!=null&&X.enabled&&B){const N=e.rightLabel;t.font=`${N.fontWeight||400} ${N.fontSize||12}px "${N.fontFamily||"Inter"}", sans-serif`,t.fillStyle=R,t.textBaseline="middle",t.textAlign="left",t.fillText(B,a+i+(N.gap||8),0),L=!0}if(!_&&!L&&e.label&&e.label.text){const N=e.label,ot=N.fontSize||14,bt=N.fontWeight||400,St=N.fontFamily||"Inter";t.font=`${bt} ${ot}px "${St}", sans-serif`,t.fillStyle=N.color||"#f3f4f6",t.textBaseline="middle";const Mt=N.gap||10;let pt=0,wt=0;N.position==="left"?(t.textAlign="right",pt=a-Mt,wt=0):N.position==="right"?(t.textAlign="left",pt=a+i+Mt,wt=0):N.position==="top"?(t.textAlign="center",pt=0,wt=r-Mt,t.textBaseline="bottom"):N.position==="bottom"?(t.textAlign="center",pt=0,wt=r+n+Mt,t.textBaseline="top"):(t.textAlign="left",pt=a+i+Mt,wt=0),t.fillText(N.text,pt,wt)}}renderCheckbox(t,s){var v,C;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((v=s.geometry)==null?void 0:v.width)||20,n=((C=s.geometry)==null?void 0:C.height)||20,a=-i/2,r=-n/2,c=e.cornerRadius??4,d=e.checked??!1,u=e.activeColor||"#3b82f6",p=e.inactiveColor||"transparent",l=e.checkColor||"#ffffff",h=e.borderColor||"#4b5563",f=e.borderWidth??2,g=d?u:p,y=d?"transparent":h,m=d?0:f;e.disabled&&(t.globalAlpha*=.5),t.beginPath(),this.drawRoundRect(t,a,r,i,n,c);const S=this.createCanvasFill(t,g,i,n);if(S&&(t.fillStyle=S,t.fill()),m>0){t.lineWidth=m;const w=this.createCanvasFill(t,y,i,n);w&&(t.strokeStyle=w,t.stroke())}else if(d){t.lineWidth=1;const w=this.createCanvasFill(t,u,i,n);w&&(t.strokeStyle=w,t.stroke())}if(d){t.save(),t.beginPath();const w=this.createCanvasFill(t,l,i,n);t.strokeStyle=w||l,t.lineWidth=Math.max(2,i*.12),t.lineCap="round",t.lineJoin="round";const M=a+i*.25,I=r+n*.5,T=a+i*.45,k=r+n*.7,E=a+i*.75,P=r+n*.25;t.moveTo(M,I),t.lineTo(T,k),t.lineTo(E,P),t.stroke(),t.restore()}if(e.disabled&&(t.globalAlpha*=2),e.label&&e.label.text){const w=e.label;t.save(),t.font=`${w.fontWeight||400} ${w.fontSize||14}px "${w.fontFamily||"Inter"}", sans-serif`,t.fillStyle=w.color||"#f3f4f6",t.textBaseline="middle";const M=w.gap||8;let I=0,T=0;w.position==="left"?(t.textAlign="right",I=a-M,T=0):w.position==="right"?(t.textAlign="left",I=a+i+M,T=0):w.position==="top"?(t.textAlign="center",I=0,T=r-M,t.textBaseline="bottom"):w.position==="bottom"&&(t.textAlign="center",I=0,T=r+n+M,t.textBaseline="top"),t.fillText(w.text,I,T),t.restore()}}renderRadioGroup(t,s){var C,w;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i=((C=s.geometry)==null?void 0:C.width)||180,n=((w=s.geometry)==null?void 0:w.height)||100,a=-i/2,r=-n/2,c=e.selectedValue,d=e.optionsList||["Option 1","Option 2","Option 3"],u=e.orientation||"vertical",p=e.itemGap!==void 0?e.itemGap:16,l=e.activeColor||"#3b82f6",h=e.inactiveColor||"#4b5563",f=e.textColor||"#ffffff",g=e.fontSize||14,y=e.fontFamily||"Inter",m=e.fontWeight||400;e.disabled&&(t.globalAlpha*=.5);const S=8,v=S*2;if(t.save(),t.font=`${m} ${g}px "${y}", sans-serif`,t.textBaseline="middle",t.textAlign="left",u==="vertical"){const M=Math.max(v,g)+p;d.forEach((I,T)=>{const k=r+T*M+S;t.beginPath(),t.arc(a+S,k,S,0,Math.PI*2);const E=c===I,P=this.createCanvasFill(t,l,v,v),_=this.createCanvasFill(t,h,v,v);E?(t.strokeStyle=P||l,t.lineWidth=2,t.stroke(),t.beginPath(),t.arc(a+S,k,S/2,0,Math.PI*2),t.fillStyle=P||l,t.fill()):(t.strokeStyle=_||h,t.lineWidth=1.5,t.stroke()),t.fillStyle=f,t.fillText(I,a+v+8,k)})}else{let M=a;d.forEach(I=>{const T=c===I,k=t.measureText(I).width;t.beginPath(),t.arc(M+S,0,S,0,Math.PI*2);const E=this.createCanvasFill(t,l,v,v),P=this.createCanvasFill(t,h,v,v);T?(t.strokeStyle=E||l,t.lineWidth=2,t.stroke(),t.beginPath(),t.arc(M+S,0,S/2,0,Math.PI*2),t.fillStyle=E||l,t.fill()):(t.strokeStyle=P||h,t.lineWidth=1.5,t.stroke()),t.fillStyle=f,t.fillText(I,M+v+6,0),M+=v+6+k+p})}if(t.restore(),e.disabled&&(t.globalAlpha*=2),e.label&&e.label.text){const M=e.label;t.save(),t.font=`${M.fontWeight||400} ${M.fontSize||14}px "${M.fontFamily||"Inter"}", sans-serif`,t.fillStyle=M.color||"#9ca3af",t.textBaseline="middle";const I=M.gap||8;let T=0,k=0;M.position==="left"?(t.textAlign="right",T=a-I,k=0):M.position==="right"?(t.textAlign="left",T=a+i+I,k=0):M.position==="top"?(t.textAlign="center",T=0,k=r-I,t.textBaseline="bottom"):M.position==="bottom"&&(t.textAlign="center",T=0,k=r+n+I,t.textBaseline="top"),t.fillText(M.text,T,k),t.restore()}}renderBarChart(t,s){var k,E;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i={width:((k=s.geometry)==null?void 0:k.width)||300,height:((E=s.geometry)==null?void 0:E.height)||180,chartType:e.chartType||"grouped",stylePreset:e.stylePreset||"default",datasets:e.datasets||[{id:"ds-1",label:"Revenue",data:[42,67,31,55,78,48],color:"#6366f1"}],categories:e.categories||["Jan","Feb","Mar","Apr","May","Jun"],orientation:e.orientation||"vertical",barWidth:e.barWidth!==void 0?e.barWidth:14,barGap:e.barGap!==void 0?e.barGap:4,barCornerRadius:e.barCornerRadius!==void 0?e.barCornerRadius:5,showXAxis:!!e.showXAxis,showYAxis:!!e.showYAxis,xAxisColor:e.xAxisColor||"rgba(255,255,255,0.12)",yAxisColor:e.yAxisColor||"rgba(255,255,255,0.12)",showXLabels:e.showXLabels!==void 0?!!e.showXLabels:!0,showYLabels:!!e.showYLabels,axisLabelColor:e.axisLabelColor||"rgba(255,255,255,0.5)",axisLabelFontSize:e.axisLabelFontSize||9,showLegend:e.showLegend!==void 0?!!e.showLegend:!0,legendColor:e.legendColor||"rgba(255,255,255,0.7)",legendFontSize:e.legendFontSize||9,showGridLines:e.showGridLines!==void 0?!!e.showGridLines:!0,gridColor:e.gridColor||"rgba(255,255,255,0.06)",cardBackground:e.cardBackground||"rgba(255,255,255,0.04)",cardBorderColor:e.cardBorderColor||"rgba(255,255,255,0.08)",barGradient:e.barGradient!==void 0?!!e.barGradient:!0,showValueOnTop:!!e.showValueOnTop,chartBackground:e.chartBackground||"transparent",barStyle:e.barStyle||"solid",barBorderWidth:e.barBorderWidth!==void 0?e.barBorderWidth:1,barBorderColor:e.barBorderColor||"auto",enableShadows:!!e.enableShadows,shadowColor:e.shadowColor||"rgba(0,0,0,0.5)",shadowBlur:e.shadowBlur!==void 0?e.shadowBlur:4,shadowOffsetY:e.shadowOffsetY!==void 0?e.shadowOffsetY:2,valueFontSize:e.valueFontSize||10,valueColor:e.valueColor||"auto",valueFontWeight:e.valueFontWeight||"bold",xAxisLineWidth:e.xAxisLineWidth!==void 0?e.xAxisLineWidth:1,yAxisLineWidth:e.yAxisLineWidth!==void 0?e.yAxisLineWidth:1,gridLineWidth:e.gridLineWidth!==void 0?e.gridLineWidth:1,gridLineDash:e.gridLineDash||[3,4],_getPreset:function(){return us[this.stylePreset]||us.default},_resolveColor:function(P,_){const L=this._getPreset();return["#6366f1","#f59e0b","#10b981","#3b82f6","#a855f7"].includes(P)?L.colors[_%L.colors.length]:typeof P=="string"?P:L.colors[_%L.colors.length]},_makeGradient:function(P,_,L,A,W,B){if(!this._getPreset().barGradient&&!this.barGradient)return _;const Y=P.createLinearGradient(L,A,W,B);return Y.addColorStop(0,_),Y.addColorStop(1,_+"44"),Y},_drawRoundedBar:function(P,_,L,A,W,B,R){if(B=Math.min(B,Math.min(Math.abs(A),Math.abs(W))/2),B<=0||A===0||W===0){P.rect(_,L,A,W);return}P.beginPath(),R?(P.moveTo(_,L+W),P.lineTo(_,L+B),P.quadraticCurveTo(_,L,_+B,L),P.lineTo(_+A-B,L),P.quadraticCurveTo(_+A,L,_+A,L+B),P.lineTo(_+A,L+W),P.lineTo(_,L+W)):(P.moveTo(_,L),P.lineTo(_+A-B,L),P.quadraticCurveTo(_+A,L,_+A,L+B),P.lineTo(_+A,L+W-B),P.quadraticCurveTo(_+A,L+W,_+A-B,L+W),P.lineTo(_,L+W),P.lineTo(_,L)),P.closePath()}},n=i.width,a=i.height,r=-n/2,c=-a/2;if(!i.datasets||i.datasets.length===0||i.categories.length===0){t.save(),t.fillStyle="rgba(99,102,241,0.7)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO CHART DATA",0,0),t.restore();return}const d=i._getPreset();let u=-1/0,p=1/0;const l=i.categories.length,h=i.datasets.length;if(i.chartType==="stacked")for(let P=0;P<l;P++){let _=0,L=0;i.datasets.forEach(A=>{const W=A.data[P]??0;W>=0?_+=W:L+=W}),_>u&&(u=_),L<p&&(p=L)}else i.datasets.forEach(P=>{P.data&&P.data.forEach(_=>{_>u&&(u=_),_<p&&(p=_)})});isFinite(u)||(u=10),isFinite(p)||(p=0),u=Math.max(u,0),p=Math.min(p,0);const f=u-p||10;t.save(),i.enableShadows&&(t.shadowColor=i.shadowColor,t.shadowBlur=i.shadowBlur,t.shadowOffsetY=i.shadowOffsetY),t.font=i.axisLabelFontSize+"px Inter, sans-serif";const g=i.showYLabels?t.measureText(u.toFixed(0)).width+14:10,y=i.showXLabels?i.axisLabelFontSize+12:8,S=(i.showLegend&&h>0?i.legendFontSize+10:0)+8,v=10,C=r+g,w=c+S,M=n-g-v,I=a-S-y;if(i.enableShadows&&(t.shadowColor="transparent"),t.beginPath(),t.roundRect(r,c,n,a,10),t.fillStyle=d.cardBackground,t.fill(),t.strokeStyle=d.cardBorderColor,t.lineWidth=1,t.stroke(),i.chartBackground&&i.chartBackground!=="transparent"&&(t.beginPath(),t.rect(C,w,M,I),t.fillStyle=i.chartBackground,t.fill()),i.showLegend&&h>0){t.font=i.legendFontSize+"px Inter, sans-serif",t.textBaseline="middle";const P=c+12;let _=C;i.datasets.forEach((L,A)=>{const W=i._resolveColor(L.color,A),B=L.label||"Series "+(A+1),R=7;t.beginPath(),t.roundRect(_,P-R/2,R,R,2),t.fillStyle=W,t.fill(),t.fillStyle=d.legendColor,t.textAlign="left",t.fillText(B,_+R+4,P),_+=t.measureText(B).width+R+16})}const T=4;if(i.showGridLines){t.setLineDash(i.gridLineDash||[]),t.lineWidth=i.gridLineWidth||1,t.strokeStyle=d.gridColor;for(let P=0;P<=T;P++)if(i.orientation==="horizontal"){const _=C+P/T*M;t.beginPath(),t.moveTo(_,w),t.lineTo(_,w+I),t.stroke()}else{const _=w+P/T*I;t.beginPath(),t.moveTo(C,_),t.lineTo(C+M,_),t.stroke()}t.setLineDash([])}if(i.showYLabels){t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=d.axisLabelColor;for(let P=0;P<=T;P++)if(i.orientation==="horizontal"){const _=p+P/T*f,L=C+P/T*M;t.textAlign="center",t.fillText(_.toFixed(0),L,w+I+i.axisLabelFontSize)}else{const _=u-P/T*f,L=w+P/T*I;t.textAlign="right",t.fillText(_.toFixed(0),C-6,L)}}if(t.setLineDash([]),i.showXAxis&&(t.lineWidth=i.xAxisLineWidth||1,t.strokeStyle=i.xAxisColor,t.beginPath(),t.moveTo(C,w+I),t.lineTo(C+M,w+I),t.stroke()),i.showYAxis&&(t.lineWidth=i.yAxisLineWidth||1,t.strokeStyle=i.yAxisColor,t.beginPath(),t.moveTo(C,w),t.lineTo(C,w+I),t.stroke()),i.enableShadows&&(t.shadowColor=i.shadowColor),i.chartType==="stacked")if(i.orientation==="horizontal"){const P=I/l;for(let _=0;_<l;_++){const L=w+_*P+P/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=d.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[_]||"",C-5,L),i.enableShadows&&(t.shadowColor=i.shadowColor));let A=C;i.datasets.forEach((W,B)=>{const R=W.data[_]??0;if(R===0)return;const Y=R/f*M,G=Math.min(i.barWidth*h+i.barGap,P-8),z=L-G/2,O=A;A+=Y;const F=i._resolveColor(W.color,B);t.beginPath(),t.fillStyle=i._makeGradient(t,F,O,z,O+Y,z),i._drawRoundedBar(t,O,z,Y,G,B===h-1?i.barCornerRadius:0,!1),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?F:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill()})}}else{const P=M/l;for(let _=0;_<l;_++){const L=C+_*P+P/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="center",t.textBaseline="top",t.fillStyle=d.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[_]||"",L,w+I+5),i.enableShadows&&(t.shadowColor=i.shadowColor));let A=w+I;i.datasets.forEach((W,B)=>{const R=W.data[_]??0;if(R===0)return;const Y=R/f*I,G=Math.min(i.barWidth*h+i.barGap,P-8),z=L-G/2,O=A-Y;A-=Y;const F=i._resolveColor(W.color,B);t.beginPath(),t.fillStyle=i._makeGradient(t,F,z,O,z,O+Y),i._drawRoundedBar(t,z,O,G,Y,B===h-1?i.barCornerRadius:0,!0),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?F:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill()})}}else if(i.orientation==="horizontal"){const P=I/l,_=h*i.barWidth+Math.max(0,(h-1)*i.barGap),L=C+(0-p)/f*M;for(let A=0;A<l;A++){const W=w+A*P+P/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="right",t.textBaseline="middle",t.fillStyle=d.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[A]||"",C-5,W),i.enableShadows&&(t.shadowColor=i.shadowColor));const B=W-_/2;i.datasets.forEach((R,Y)=>{const G=R.data[A]??0,z=Math.abs(G/f*M);if(z<1)return;const O=B+Y*(i.barWidth+i.barGap),F=G>=0?L:L-z,Z=i._resolveColor(R.color,Y);t.beginPath(),t.fillStyle=i._makeGradient(t,Z,F,O,F+z,O),i._drawRoundedBar(t,F,O,z,i.barWidth,i.barCornerRadius,!1),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?Z:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill(),i.showValueOnTop&&G!==0&&(t.font=(i.valueFontWeight||"bold")+" "+(i.valueFontSize||10)+"px Inter, sans-serif",t.textAlign=G>=0?"left":"right",t.textBaseline="middle",t.fillStyle=i.valueColor==="auto"?Z:i.valueColor||"#fff",t.shadowColor="transparent",t.fillText(G.toString(),G>=0?F+z+4:F-4,O+i.barWidth/2),i.enableShadows&&(t.shadowColor=i.shadowColor))})}}else{const P=M/l,_=h*i.barWidth+Math.max(0,(h-1)*i.barGap),L=w+I-(0-p)/f*I;for(let A=0;A<l;A++){const W=C+A*P+P/2;i.showXLabels&&(t.font=i.axisLabelFontSize+"px Inter, sans-serif",t.textAlign="center",t.textBaseline="top",t.fillStyle=d.axisLabelColor,t.shadowColor="transparent",t.fillText(i.categories[A]||"",W,w+I+5),i.enableShadows&&(t.shadowColor=i.shadowColor));const B=W-_/2;i.datasets.forEach((R,Y)=>{const G=R.data[A]??0,z=Math.abs(G/f*I);if(z<1)return;const O=B+Y*(i.barWidth+i.barGap),F=G>=0?L-z:L,Z=i._resolveColor(R.color,Y);t.beginPath(),t.fillStyle=i._makeGradient(t,Z,O,F,O,F+z),i._drawRoundedBar(t,O,F,i.barWidth,z,i.barCornerRadius,!0),i.barStyle==="outline"||i.barStyle==="dashed"?(t.fillStyle="transparent",t.strokeStyle=i.barBorderColor==="auto"?Z:i.barBorderColor,t.lineWidth=i.barBorderWidth,i.barStyle==="dashed"&&t.setLineDash([4,4]),t.stroke(),t.setLineDash([])):t.fill(),i.showValueOnTop&&G!==0&&(t.font=(i.valueFontWeight||"bold")+" "+(i.valueFontSize||10)+"px Inter, sans-serif",t.textAlign="center",t.textBaseline=G>=0?"bottom":"top",t.fillStyle=i.valueColor==="auto"?Z:i.valueColor||"#fff",t.shadowColor="transparent",t.fillText(G.toString(),O+i.barWidth/2,G>=0?F-4:F+z+4),i.enableShadows&&(t.shadowColor=i.shadowColor))})}}t.restore()}renderPieChart(t,s){var g,y;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.options)||s.options||{},i={width:((g=s.geometry)==null?void 0:g.width)||180,height:((y=s.geometry)==null?void 0:y.height)||180,chartType:e.chartType||"donut",stylePreset:e.stylePreset||"default",slices:e.slices||[{id:"slice-1",label:"Item 1",value:45,color:"#6366f1"}],innerRadius:e.innerRadius!==void 0?e.innerRadius:.55,sliceGap:e.sliceGap!==void 0?e.sliceGap:3,showLabels:!!e.showLabels,labelColor:e.labelColor||"#ffffff",labelFontSize:e.labelFontSize||10,showLegend:e.showLegend!==void 0?!!e.showLegend:!0,legendColor:e.legendColor||"rgba(255,255,255,0.65)",legendFontSize:e.legendFontSize||9,showCenterText:e.showCenterText!==void 0?!!e.showCenterText:!0,centerLabel:e.centerLabel||"Total",centerTextColor:e.centerTextColor||"#ffffff",centerLabelColor:e.centerLabelColor||"rgba(255,255,255,0.4)",_getPreset:function(){return gs[this.stylePreset]||gs.default},_resolveSliceColor:function(m,S){const v=m.color,C=S,w=this._getPreset();return["#6366f1","#22d3ee","#f59e0b","#ec4899","#34d399","#a855f7","#f87171"].includes(v)?w.colors[C%w.colors.length]:typeof v=="string"?v:w.colors[C%w.colors.length]}},n=i.width,a=i.height;if(!i.slices||i.slices.length===0){t.save(),t.fillStyle="rgba(99,102,241,0.8)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO PIE DATA",0,0),t.restore();return}const r=i.slices.reduce((m,S)=>m+(S.value||0),0);if(r<=0){t.save(),t.fillStyle="rgba(99,102,241,0.8)",t.font="bold 11px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("EMPTY DATA",0,0),t.restore();return}const c=i._getPreset();t.save(),t.beginPath(),t.roundRect(-n/2,-a/2,n,a,10),t.fillStyle=c.cardBackground,t.fill(),t.strokeStyle=c.cardBorderColor,t.lineWidth=1,t.stroke();const d=i.showLegend?Math.ceil(i.slices.length/2):0,u=d>0?d*(i.legendFontSize+8)+10:0,p=a-u-16,l=Math.min(n-24,p)/2,h=0,f=-u/2;if(i.chartType==="rose"){const m=Math.max(...i.slices.map(C=>C.value||0)),S=Math.PI*2/i.slices.length,v=l>0?i.sliceGap/l:0;i.slices.forEach((C,w)=>{const M=C.value||0;if(M===0)return;const I=M/m*l,T=-Math.PI/2+w*S+v/2,k=T+S-v,E=i._resolveSliceColor(C,w);if(t.beginPath(),t.moveTo(h,f),t.arc(h,f,I,T,k),t.closePath(),t.fillStyle=E+"cc",t.fill(),t.strokeStyle=E,t.lineWidth=1.5,t.stroke(),i.showLabels){const P=T+(k-T)/2,_=h+I*.65*Math.cos(P),L=f+I*.65*Math.sin(P),A=Math.round(M/r*100);t.save(),t.font=`bold ${i.labelFontSize}px Inter, sans-serif`,t.fillStyle=c.labelColor,t.textAlign="center",t.textBaseline="middle",t.fillText(`${A}%`,_,L),t.restore()}})}else{const m=i.chartType==="pie"?0:i.innerRadius,S=l*Math.max(0,m),v=l>0?i.sliceGap/l:0;let C=-Math.PI/2;if(i.slices.forEach((w,M)=>{const I=w.value||0;if(I===0){C+=I/r*Math.PI*2;return}const T=I/r*Math.PI*2,k=C+v/2,E=C+T-v/2;if(E<=k){C+=T;return}const P=i._resolveSliceColor(w,M);if(t.beginPath(),t.fillStyle=P,S<=0?(t.moveTo(h,f),t.arc(h,f,l,k,E),t.lineTo(h,f)):(t.moveTo(h+l*Math.cos(k),f+l*Math.sin(k)),t.arc(h,f,l,k,E),t.arc(h,f,S,E,k,!0),t.closePath()),t.fill(),i.showLabels){const _=k+(E-k)/2,L=S+(l-S)/2,A=h+L*Math.cos(_),W=f+L*Math.sin(_),B=Math.round(I/r*100);t.save(),t.font=`bold ${i.labelFontSize}px Inter, sans-serif`,t.fillStyle=c.labelColor,t.textAlign="center",t.textBaseline="middle",t.fillText(`${B}%`,A,W),t.restore()}C+=T}),i.chartType==="donut"&&i.showCenterText&&S>14){const w=Math.round(r),M=Math.min(Math.floor(S*.52),20),I=Math.min(Math.floor(S*.26),10);t.textAlign="center",t.textBaseline="middle",t.font=`bold ${M}px Inter, sans-serif`,t.fillStyle=c.centerTextColor,t.fillText(w.toString(),h,f-I*.5),i.centerLabel&&(t.font=`${I}px Inter, sans-serif`,t.fillStyle=c.centerLabelColor,t.fillText(i.centerLabel,h,f+M*.6))}}if(i.showLegend&&i.slices.length>0){t.font=`${i.legendFontSize}px Inter, sans-serif`;const m=2,S=n/m,v=i.legendFontSize+8,C=a/2-u+10,w=-n/2+10;i.slices.forEach((M,I)=>{const T=I%m,k=Math.floor(I/m),E=w+T*S,P=C+k*v,_=i._resolveSliceColor(M,I),L=7;t.beginPath(),t.roundRect(E,P-L/2,L,L,2),t.fillStyle=_,t.fill(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=c.legendColor;const A=Math.round((M.value||0)/r*100),W=`${M.label||"Item"} ${A}%`,B=S-L-20;let R=W;for(;t.measureText(R).width>B&&R.length>4;)R=R.slice(0,-4)+"…";t.fillText(R,E+L+4,P)})}t.restore()}renderJoystick(t,s){var g,y,m,S,v,C,w,M,I,T,k,E;const o=this.objectStates.get(s.id),e=(o==null?void 0:o.width)!==void 0?o.width:((g=s.geometry)==null?void 0:g.width)??s.width??100,i=(o==null?void 0:o.height)!==void 0?o.height:((y=s.geometry)==null?void 0:y.height)??s.height??100,n=Math.min(e,i)*(((m=s.style)==null?void 0:m.baseSize)??.45),a=Math.min(e,i)*(((S=s.style)==null?void 0:S.handleSize)??.14);let r=s.handleX||0,c=s.handleY||0;o&&o.handleX!==void 0&&(r=o.handleX),o&&o.handleY!==void 0&&(c=o.handleY),t.save();let d=0,u=0;s.handleOrigin==="top-left"?(d=e/2,u=i/2):s.handleOrigin==="bottom-right"&&(d=-e/2,u=-i/2),t.translate(d,u);const p=t.globalAlpha;if(t.globalAlpha=p*(((v=s.style)==null?void 0:v.baseOpacity)??1),t.beginPath(),s.boundsShape==="square"){const P=s.joystickType==="2D"?12:18;t.roundRect(-n,-n,n*2,n*2,P)}else t.arc(0,0,n,0,Math.PI*2);t.fillStyle=((C=s.style)==null?void 0:C.baseColor)||"rgba(0,0,0,0.04)",t.fill(),(w=s.style)!=null&&w.baseBorderWidth?(t.lineWidth=s.style.baseBorderWidth,t.strokeStyle=s.style.baseBorderColor||"rgba(0,0,0,0.1)",t.stroke()):(t.lineWidth=1,t.strokeStyle=((M=s.style)==null?void 0:M.baseBorderColor)||"rgba(0,0,0,0.08)",t.stroke());const l=s.overflowHandle?n:Math.max(.1,n-a);let h=0,f=0;s.joystickType==="2D"?(h=r*l,f=c*l):s.joystickType==="1D_X"?(h=r*l,f=0):s.joystickType==="1D_Y"&&(h=0,f=c*l),t.globalAlpha=p*(((I=s.style)==null?void 0:I.handleOpacity)??1),t.beginPath(),t.arc(h,f,a,0,Math.PI*2),t.fillStyle=((T=s.style)==null?void 0:T.handleColor)||"#3b82f6",t.fill(),(k=s.style)!=null&&k.handleBorderWidth?(t.lineWidth=s.style.handleBorderWidth,t.strokeStyle=s.style.handleBorderColor||"rgba(255,255,255,0.5)",t.stroke()):(t.lineWidth=1,t.strokeStyle=((E=s.style)==null?void 0:E.handleBorderColor)||"rgba(255,255,255,0.5)",t.stroke()),t.globalAlpha=p,t.restore()}getRadioGroupItemIndexAtPointer(t,s,o){var I,T;const e=t.options||{},i=this.objectStates.get(t.id)||{},n=e.optionsList||[];if(n.length===0)return null;const a=i.width!==void 0?i.width:((I=t.geometry)==null?void 0:I.width)||180,r=i.height!==void 0?i.height:((T=t.geometry)==null?void 0:T.height)||100,c=e.orientation||"vertical",d=e.itemGap!==void 0?e.itemGap:16,u=e.fontSize||14,p=this.getWorldTransform(t.id),l=s-p.x,h=o-p.y,f=-p.rotation*(Math.PI/180),g=Math.cos(f),y=Math.sin(f),m=l*g-h*y,S=l*y+h*g,C=8*2,w=-a/2,M=-r/2;if(c==="vertical"){const k=Math.max(C,u)+d;for(let E=0;E<n.length;E++){const P=M+E*k;if(m>=w&&m<=w+a&&S>=P&&S<=P+k)return E}}else{let k=w;for(let E=0;E<n.length;E++){const _=n[E].length*8,L=C+6+_+d;if(m>=k&&m<=k+L&&S>=M&&S<=M+r)return E;k+=L}}return null}renderLineGraph(t,s,o,e){let i=s.datasets||[];if((!i||i.length===0)&&(s.data||s.graphData)&&(i=[{id:"line-1",label:"Series 1",data:s.data||s.graphData||[],lineColor:s.lineColor||"#3b82f6",lineWidth:s.lineWidth||2,showArea:s.showArea||!1,areaColor:s.areaColor||"rgba(139, 92, 246, 0.3)",smoothing:s.smoothing||!1,showPoints:s.showPoints!==void 0?s.showPoints:!0,pointSize:s.pointSize||6,pointFill:s.pointFill||"#ffffff",pointStrokeColor:s.pointStrokeColor||s.lineColor||"#3b82f6",pointStrokeWidth:s.pointStrokeWidth||2}]),!i||i.length===0||!i.some(f=>f.data&&f.data.length>=2)){t.save(),t.fillStyle="#6366f1",t.font="12px Inter, system-ui, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText("NO DATA",0,0),t.restore();return}let n=1/0,a=-1/0,r=0;if(i.forEach(f=>{let g=f.data;if(f.isVarEnabled&&f.inputId){let y=this.inputs.get(f.inputId);if(y===void 0){const m=this.inputNameMap.get(f.inputId);m&&m.length>0&&(y=this.inputs.get(m[0]))}y&&Array.isArray(y)&&(g=y)}if(g&&g.length>0){const y=g.filter(m=>typeof m=="number"&&!isNaN(m));y.length>0&&(n=Math.min(n,...y),a=Math.max(a,...y),r=Math.max(r,g.length))}f._resolvedData=g}),r<2)return;const c=a-n,d=o/(r-1),u=f=>{const g=c===0?.5:(f-n)/c;return e/2-g*e},p=f=>f*d-o/2,l=s.axisColor||"#333333";if(s.showXAxis&&(t.beginPath(),t.strokeStyle=s.xAxisColor||l,t.lineWidth=1,t.moveTo(-o/2,e/2),t.lineTo(o/2,e/2),t.stroke()),s.showYAxis&&(t.beginPath(),t.strokeStyle=s.yAxisColor||l,t.lineWidth=1,t.moveTo(-o/2,-e/2),t.lineTo(-o/2,e/2),t.stroke()),t.fillStyle=s.axisLabelColor||"#333333",t.font=`${s.axisLabelFontSize||10}px Inter, sans-serif`,s.showXLabels){t.textAlign="center",t.textBaseline="top";for(let f=0;f<r;f++){const g=p(f);t.fillText(`${f+1}`,g,e/2+5)}}if(s.showYLabels){t.textAlign="right",t.textBaseline="middle";const f=-o/2-5,g=(a+n)/2;t.fillText(a.toFixed(1),f,u(a)),t.fillText(g.toFixed(1),f,u(g)),t.fillText(n.toFixed(1),f,u(n))}const h=10;if(i.forEach(f=>{const g=f._resolvedData;if(!(!g||g.length<2)){if(f.showArea){if(t.beginPath(),t.moveTo(p(0),e/2),t.lineTo(p(0),u(g[0])),f.smoothing&&g.length>2)for(let m=0;m<g.length-1;m++){const S=g[m===0?m:m-1],v=g[m],C=g[m+1],w=g[m+1===g.length-1?m+1:m+2];for(let M=1;M<=h;M++){const I=M/h,T=this._catmullRom(S,v,C,w,I);t.lineTo(p(m+I),u(T))}}else for(let m=1;m<g.length;m++)t.lineTo(p(m),u(g[m]));t.lineTo(p(g.length-1),e/2),t.closePath();const y=t.globalAlpha;t.globalAlpha=y*(s.areaOpacity??.3),t.fillStyle=f.areaColor||"rgba(139, 92, 246, 0.2)",t.fill(),t.globalAlpha=y}if(t.beginPath(),t.strokeStyle=f.lineColor||"#3b82f6",t.lineWidth=f.lineWidth||2,t.lineJoin="round",t.lineCap="round",t.moveTo(p(0),u(g[0])),f.smoothing&&g.length>2)for(let y=0;y<g.length-1;y++){const m=g[y===0?y:y-1],S=g[y],v=g[y+1],C=g[y+1===g.length-1?y+1:y+2];for(let w=1;w<=h;w++){const M=w/h,I=this._catmullRom(m,S,v,C,M);t.lineTo(p(y+M),u(I))}}else for(let y=1;y<g.length;y++)t.lineTo(p(y),u(g[y]));t.stroke(),f.showPoints&&g.forEach((y,m)=>{const S=p(m),v=u(y);t.beginPath(),t.arc(S,v,(f.pointSize||6)/2,0,Math.PI*2),t.fillStyle=f.pointFill||"#ffffff",t.fill(),t.strokeStyle=f.pointStrokeColor||f.lineColor||"#3b82f6",t.lineWidth=f.pointStrokeWidth||1,t.stroke()})}}),s.showLegend&&i.length>0){const f=o/2-10;let g=-e/2+15;const y=s.legendFontSize||10,m=y+5;t.font=`${y}px Inter, sans-serif`,t.textAlign="right",t.textBaseline="alphabetic",i.forEach(S=>{const C=S.label||"Series",w=t.measureText(C).width;t.beginPath(),t.rect(f-w-8-5,g-(8/2+2),8,8),t.fillStyle=S.lineColor||"#3b82f6",t.fill(),t.fillStyle=s.legendColor||"#333333",t.fillText(C,f,g),g+=m})}}_catmullRom(t,s,o,e,i){const n=(o-t)*.5,a=(e-s)*.5,r=i*i,c=i*r;return(2*s-2*o+n+a)*c+(-3*s+3*o-2*n-a)*r+n*i+s}normalizeOpacity(t){const s=typeof t=="number"?t:parseFloat(String(t));return isNaN(s)?1:s>1?Math.min(1,s/100):Math.max(0,Math.min(1,s))}createCanvasFill(t,s,o,e){var i,n,a;if(!s||s.type==="None")return null;if(typeof s=="string")return s;if(s.type==="Solid"&&s.color){const r=s.color,d=(((n=(i=this.artboard)==null?void 0:i.tokens)==null?void 0:n.colors)||{})[r]||r;return t.fillStyle=d,d}if((s.type==="LinearGradient"||s.type==="RadialGradient"||s.type==="AngularGradient"||s.type==="DiamondGradient")&&s.stops){const r=(c,d=100)=>{var v,C;const p=(((C=(v=this.artboard)==null?void 0:v.tokens)==null?void 0:C.colors)||{})[c]||c,l=this.normalizeOpacity(s.opacity??100),f=this.normalizeOpacity(d)*l;if(f>=1&&p.startsWith("#"))return p;const g=p.startsWith("#")?p.replace("#",""):"ffffff",y=parseInt(g.substring(0,2),16),m=parseInt(g.substring(2,4),16),S=parseInt(g.substring(4,6),16);return`rgba(${y}, ${m}, ${S}, ${f})`};if(s.type==="LinearGradient"){const c=(f,g,y)=>Array.isArray(f)?f[g]??(g===0?0:1):f&&typeof f=="object"?f[y]??(g===0?0:1):g===0?0:1,d=c(s.start,0,"x")*o-o/2,u=c(s.start,1,"y")*e-e/2,p=c(s.end,0,"x")*o-o/2,l=c(s.end,1,"y")*e-e/2,h=t.createLinearGradient(d,u,p,l);if(s.stops.forEach(f=>{const g=f.offset!==void 0?f.offset:f.pos!==void 0?f.pos:f.position!==void 0?f.position:0,y=r(f.color||"#000000",f.opacity??100);h.addColorStop(Math.max(0,Math.min(1,g)),y)}),s.gradientTransform&&h.setTransform){const[f,g,y,m,S,v]=s.gradientTransform;h.setTransform({a:f,b:g,c:y,d:m,e:S,f:v})}return h}else if(s.type==="RadialGradient"){const c=(h,f,g)=>Array.isArray(h)?h[f]??.5:h&&typeof h=="object"?h[g]??.5:.5,d=c(s.center,0,"x")*o-o/2,u=c(s.center,1,"y")*e-e/2,p=(s.radius??.5)*Math.max(o,e),l=t.createRadialGradient(d,u,0,d,u,p);if(s.stops.forEach(h=>{const f=h.offset!==void 0?h.offset:h.pos!==void 0?h.pos:h.position!==void 0?h.position:0,g=r(h.color||"#000000",h.opacity??100);l.addColorStop(Math.max(0,Math.min(1,f)),g)}),s.gradientTransform&&l.setTransform){const[h,f,g,y,m,S]=s.gradientTransform;l.setTransform({a:h,b:f,c:g,d:y,e:m,f:S})}return l}else if(s.type==="AngularGradient"){const c=(h,f,g)=>Array.isArray(h)?h[f]??.5:h&&typeof h=="object"?h[g]??.5:.5,d=c(s.center||[.5,.5],0,"x")*o-o/2,u=c(s.center||[.5,.5],1,"y")*e-e/2,p=(s.degree||s.angle||0)*(Math.PI/180),l=(a=t.createConicGradient)==null?void 0:a.call(t,p,d,u);if(l){if(s.stops.forEach(h=>{const f=h.offset!==void 0?h.offset:h.pos!==void 0?h.pos:h.position!==void 0?h.position:0,g=r(h.color||"#000000",h.opacity??100);l.addColorStop(Math.max(0,Math.min(1,f)),g)}),s.gradientTransform&&l.setTransform){const[h,f,g,y,m,S]=s.gradientTransform;l.setTransform({a:h,b:f,c:g,d:y,e:m,f:S})}return l}}else if(s.type==="DiamondGradient"){const c=(h,f,g)=>Array.isArray(h)?h[f]??.5:h&&typeof h=="object"?h[g]??.5:.5,d=c(s.center||[.5,.5],0,"x")*o-o/2,u=c(s.center||[.5,.5],1,"y")*e-e/2,p=(s.radius??.5)*Math.max(o,e);t.save(),t.translate(d,u),t.rotate(Math.PI/4);const l=t.createRadialGradient(0,0,0,0,0,p);if(s.stops.forEach(h=>{const f=h.offset!==void 0?h.offset:h.pos!==void 0?h.pos:h.position!==void 0?h.position:0,g=r(h.color||"#000000",h.opacity??100);l.addColorStop(Math.max(0,Math.min(1,f)),g)}),s.gradientTransform&&l.setTransform){const[h,f,g,y,m,S]=s.gradientTransform;l.setTransform({a:h,b:f,c:g,d:y,e:m,f:S})}return t.scale(1/Math.SQRT2,1/Math.SQRT2),t.fillStyle=l,t.restore(),l}}if(s.type==="Pattern"&&s.url){let r=this.imageCache.get(s.url);if(r||(r=new Image,r.src=s.url,this.imageCache.set(s.url,r)),r.complete&&r.naturalWidth>0){const c=t.createPattern(r,"repeat");if(c&&(s.scaleX!==void 0||s.offsetX!==void 0)){const d=new DOMMatrix,u=s.scaleX??1,p=s.scaleY??1,l=s.offsetX??0,h=s.offsetY??0,f=s.rotation??0;d.translateSelf(l,h),d.rotateSelf(f),d.scaleSelf(u,p),c.setTransform(d)}return c}}return s.color||null}drawRoundRect(t,s,o,e,i,n){if(n===0||n===void 0||n===null){t.rect(s,o,e,i);return}let a=n;if(typeof a=="string")try{a=JSON.parse(a)}catch{a=parseFloat(a)||0}let r=0,c=0,d=0,u=0;typeof a=="number"?r=c=d=u=a:Array.isArray(a)?a.length===1?r=c=d=u=a[0]:a.length===2?(r=d=a[0],c=u=a[1]):a.length===3?(r=a[0],c=u=a[1],d=a[2]):a.length>=4&&(r=a[0],c=a[1],d=a[2],u=a[3]):a&&typeof a=="object"&&(r=a[0]??a.tl??a.corner_radius??a.cornerRadius??0,c=a[1]??a.tr??a.corner_radius??a.cornerRadius??0,d=a[2]??a.br??a.corner_radius??a.cornerRadius??0,u=a[3]??a.bl??a.corner_radius??a.cornerRadius??0);const p=Math.min(Math.abs(e)/2,Math.abs(i)/2);if(r=Math.min(Math.max(0,r),p),c=Math.min(Math.max(0,c),p),d=Math.min(Math.max(0,d),p),u=Math.min(Math.max(0,u),p),t.roundRect){t.roundRect(s,o,e,i,[r,c,d,u]);return}t.moveTo(s+r,o),t.lineTo(s+e-c,o),t.arcTo(s+e,o,s+e,o+c,c),t.lineTo(s+e,o+i-d),t.arcTo(s+e,o+i,s+e-d,o+i,d),t.lineTo(s+u,o+i),t.arcTo(s,o+i,s,o+i-u,u),t.lineTo(s,o+r),t.arcTo(s,o,s+r,o,r),t.closePath()}renderListView(t,s){var A,W,B,R;const o=this.objectStates.get(s.id)||{},e=o.options||s.options||{},i=o.width!==void 0?o.width:((A=s.geometry)==null?void 0:A.width)||200,n=o.height!==void 0?o.height:((W=s.geometry)==null?void 0:W.height)||300,a=-i/2,r=-n/2,c=o.corner_radius!==void 0?o.corner_radius:e.corner_radius??0,d=e.orientation||"vertical",u=e.items||[],p=e.itemGap??10,l=e.itemHeight??50,h=e.itemWidth??200,f=e.scrollOffset??0,g=e.padding??0,y=e.glassEffect!==!1,m=e.accentColor||"#3b82f6",S=e.itemTextColor||"#333333",v=e.itemBackgroundColor||"#ffffff",C=e.hoveredIndex??null,w=e.activeItemIndex??null,M=e.glowIntensity??0,I=e.glowColor||"#3b82f6",T=typeof I=="string"?I:I.color||((R=(B=I.stops)==null?void 0:B[0])==null?void 0:R.color)||"#3b82f6",k=e.opacity!==void 0?e.opacity:s.opacity!==void 0?s.opacity:1;if(t.save(),t.globalAlpha*=k,M>0){const Y=t.getTransform(),G=Math.sqrt(Y.a*Y.a+Y.b*Y.b)||1;t.shadowColor=T,t.shadowBlur=M*2*G,t.shadowOffsetX=0,t.shadowOffsetY=0}if(y){const Y=e.listBackgroundColor||"rgba(31, 41, 55, 0.4)",G=this.createCanvasFill(t,Y,i,n);t.fillStyle=G||"rgba(31, 41, 55, 0.4)",t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c)||t.fill();const O=t.createLinearGradient(a,r,a+i,r+n);O.addColorStop(0,"rgba(255, 255, 255, 0.15)"),O.addColorStop(.5,"rgba(255, 255, 255, 0.08)"),O.addColorStop(1,"rgba(255, 255, 255, 0.03)"),t.fillStyle=O,t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c)||t.fill(),t.strokeStyle="rgba(255, 255, 255, 0.25)",t.lineWidth=1,t.beginPath(),this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c)||t.stroke()}else{const Y=e.backgroundColor||e.listBackgroundColor||"transparent",G=this.createCanvasFill(t,Y,i,n);if(G){t.fillStyle=G,t.beginPath();const O=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c);t.fill()}const z=e.borderWidth??0;if(z>0){t.strokeStyle=e.borderColor||"#cccccc",t.lineWidth=z,t.beginPath();const O=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c);t.stroke()}}t.shadowBlur=0,t.save(),t.beginPath();const E=this.drawCustomShape(t,e.containerShape||"rectangle",e.containerPath||"",a,r,i,n,c);if(e.listLayout!=="circular")if(E&&e.containerShape==="custom")try{const Y=new Path2D(e.containerPath);t.translate(a,r),t.scale(i/100,n/100),t.clip(Y),t.scale(100/i,100/n),t.translate(-a,-r)}catch{}else t.clip();const P=typeof g=="number"?g:d==="vertical"?g[0]:g[3];let _=(d==="vertical"?r:a)+f+P;if(t.textBaseline="middle",u.forEach((Y,G)=>{const z=e.listLayout||"linear",O=z==="circular"?h:d==="vertical"?i:h,F=z==="circular"||d==="vertical"?l:n;let Z=0,st=0,at=0;if(z==="circular"){const wt=u.length||1,yt=Math.PI*2/wt,qt=e.circularStartAngle||0,Kt=e.circularRadius||100,j=f*.01+qt*Math.PI/180,ft=G*yt+j,Rt=a+i/2,At=r+n/2;Z=Rt+Math.cos(ft)*Kt-O/2,st=At+Math.sin(ft)*Kt-F/2,at=ft+(e.itemRotation||0)*Math.PI/180}else Z=d==="vertical"?a:_,st=d==="vertical"?_:r,at=(e.itemRotation||0)*Math.PI/180;const ct=C===G,dt=w===G,$=dt&&e.activeItemShape?e.activeItemShape:e.itemShape||"rectangle",X=dt&&e.activeItemShape?e.activeItemPath:e.itemPath||"",N=e.itemCornerRadius||0;if(t.save(),at!==0&&(t.translate(Z+O/2,st+F/2),t.rotate(at),t.translate(-(Z+O/2),-(st+F/2))),dt){const wt=this.createCanvasFill(t,m,O,F);t.fillStyle=wt||m;const yt=t.globalAlpha;t.globalAlpha=yt*.8,t.beginPath(),this.drawCustomShape(t,$,X,Z,st,O,F,N)||(t.rect(Z,st,O,F),t.fill()),t.globalAlpha=yt}else if(ct)t.fillStyle=y?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)",t.beginPath(),this.drawCustomShape(t,$,X,Z,st,O,F,N)||(t.rect(Z,st,O,F),t.fill());else if(v!=="transparent"){const wt=this.createCanvasFill(t,v,O,F);t.fillStyle=wt||v,t.beginPath(),this.drawCustomShape(t,$,X,Z,st,O,F,N)||(t.rect(Z,st,O,F),t.fill())}if(dt||ct){const wt=this.createCanvasFill(t,m,d==="vertical"?3:O,d==="vertical"?F:3);t.fillStyle=wt||m,d==="vertical"?t.fillRect(Z,st,3,F):t.fillRect(Z,st+F-3,O,3)}const ot=dt?"#ffffff":y?"rgba(255, 255, 255, 0.9)":S;t.fillStyle=ot,t.font=dt||ct?"600 14px Inter, sans-serif":"400 14px Inter, sans-serif";const bt=typeof Y=="string"?Y:(Y==null?void 0:Y.label)||`Item ${G+1}`,St=Z+(d==="vertical"?16:O/2),Mt=st+F/2;d==="horizontal"||z==="circular"?t.textAlign="center":t.textAlign="left";const pt=z==="circular"?Z+O/2:St;t.fillText(bt,pt,Mt),t.restore(),_+=(d==="vertical"?l:h)+p}),t.restore(),e.showScrollbar!==!1){const Y=(u.length||0)*(d==="vertical"?l:h)+((u.length||0)-1)*p,G=d==="vertical"?n:i,z=e.listLayout||"linear",O=e.containerShape==="circle"||z==="circular";if(Y>G||z==="circular"&&u.length>0){const F=e.scrollbarColor||"rgba(255,255,255,0.3)",Z=e.scrollbarWidth||4;if(O){const st=Math.min(i,n)/2-Z/2-2,at=a+i/2,ct=r+n/2;if(t.strokeStyle=F,t.lineWidth=Z,t.lineCap="round",t.beginPath(),z==="circular"){const dt=Math.PI/4,$=-(f*.01)-Math.PI/2;t.arc(at,ct,st,$,$+dt)}else{const dt=Math.PI/2,$=G/Y,X=dt*$,N=-f/Y*dt,bt=-Math.PI/4+N;t.arc(at,ct,st,bt,bt+X)}t.stroke()}else{const st=G/Y,at=G*st,ct=-f/Y*G;t.fillStyle=F,d==="vertical"?t.fillRect(a+i-Z-2,r+ct,Z,at):t.fillRect(a+ct,r+n-Z-2,at,Z)}}}t.restore()}drawCustomShape(t,s,o,e,i,n,a,r){if(s==="circle"){const c=Math.min(n,a)/2;return t.arc(e+n/2,i+a/2,c,0,Math.PI*2),!1}else if(s==="pill"){const c=Math.min(n,a)/2;return this.drawListViewRect(t,e,i,n,a,c),!1}else if(s==="custom"&&o)try{const c=new Path2D(o);return t.save(),t.translate(e,i),t.scale(n/100,a/100),t.fill(c),t.restore(),!0}catch{return this.drawListViewRect(t,e,i,n,a,r),!1}return this.drawListViewRect(t,e,i,n,a,r),!1}updateListViewScrollFromPointer(t){var y,m;if(!this._lastPointerPos||!this._prevPointerPos)return;const s=t.options||{},o=s.orientation||"vertical",e=this._lastPointerPos.x-this._prevPointerPos.x,i=this._lastPointerPos.y-this._prevPointerPos.y;o==="vertical"?s.scrollOffset=(s.scrollOffset||0)+i:s.scrollOffset=(s.scrollOffset||0)+e;const n=s.listLayout||"linear",a=this.objectStates.get(t.id)||{},r=s.items||[],c=s.itemGap??10,d=s.itemHeight??50,u=s.itemWidth??200,p=a.width!==void 0?a.width:((y=t.geometry)==null?void 0:y.width)||200,l=a.height!==void 0?a.height:((m=t.geometry)==null?void 0:m.height)||300;if(n==="circular")return;const h=(r.length||0)*(o==="vertical"?d:u)+((r.length||0)-1)*c,g=Math.max(0,h-(o==="vertical"?l:p)+(s.padding*2||0));s.scrollOffset>0&&(s.scrollOffset=0),s.scrollOffset<-g&&(s.scrollOffset=-g)}updateListViewHoverFromPointer(t,s,o){const e=this.getListViewItemIndexAtPointer(t,s,o),i=t.options||{};i.hoveredIndex!==e&&(i.hoveredIndex=e)}getListViewItemIndexAtPointer(t,s,o){var B,R;const e=t.options||{},i=this.objectStates.get(t.id)||{},n=e.items||[];if(n.length===0)return null;const a=i.width!==void 0?i.width:((B=t.geometry)==null?void 0:B.width)||200,r=i.height!==void 0?i.height:((R=t.geometry)==null?void 0:R.height)||300,c=e.orientation||"vertical",d=e.itemGap??10,u=e.itemHeight??50,p=e.itemWidth??200,l=e.scrollOffset??0,h=e.padding??0,f=this.getWorldTransform(t.id),g=s-f.x,y=o-f.y,m=-f.rotation*(Math.PI/180),S=Math.cos(m),v=Math.sin(m),C=g*S-y*v,w=g*v+y*S,M=-a/2,I=-r/2,T=typeof h=="number"?h:c==="vertical"?h[0]:h[3];let k=(c==="vertical"?I:M)+l+T;const E=e.listLayout||"linear",P=n.length||1,_=Math.PI*2/P,L=e.circularStartAngle||0,A=e.circularRadius||100,W=l*.01+L*Math.PI/180;for(let Y=0;Y<n.length;Y++){const G=E==="circular"?p:c==="vertical"?a:p,z=E==="circular"||c==="vertical"?u:r;let O=0,F=0,Z=0;if(E==="circular"){const st=Y*_+W,at=M+a/2,ct=I+r/2;O=at+Math.cos(st)*A-G/2,F=ct+Math.sin(st)*A-z/2,Z=st+(e.itemRotation||0)*Math.PI/180}else O=c==="vertical"?M:k,F=c==="vertical"?k:I,Z=(e.itemRotation||0)*Math.PI/180;if(Z!==0){const st=O+G/2,at=F+z/2,ct=C-st,dt=w-at,$=-Z,X=ct*Math.cos($)-dt*Math.sin($)+st,N=ct*Math.sin($)+dt*Math.cos($)+at;if(X>=O&&X<=O+G&&N>=F&&N<=F+z)return Y}else if(C>=O&&C<=O+G&&w>=F&&w<=F+z)return Y;k+=(c==="vertical"?u:p)+d}return null}drawListViewRect(t,s,o,e,i,n){t.beginPath(),this.drawRoundRect(t,s,o,e,i,n),t.fill()}solveBehaviors(t){if(!this.artboard)return;if(!this._lastPointerPos){this.frameCount%60;return}const{x:s,y:o}=this._lastPointerPos;this.artboard.objects.forEach(e=>{if(!e.behaviors||e.behaviors.length===0)return;const i=this.objectStates.get(e.id);i&&e.behaviors.forEach(n=>{var p,l,h,f,g,y,m,S,v,C,w,M,I,T,k,E,P,_,L,A,W,B,R,Y,G,z,O,F,Z,st,at,ct,dt,$,X,N,ot,bt,St,Mt,pt,wt,yt,qt,Kt,j,ft,Rt,At,Pt,Ot,Gt,Ht,Nt,Bt,le,ae,ye,Pe,Le,me,xe,Zt,_e,Fe,Ee,pe,Ce,Re,he,de,Et,J,et,q,D,it,tt,ut,Wt,Dt,Qt,zt,Xt,x,rt,It,Ft,K,ht,gt,jt,mt,$t,vt,xt,kt,oe,re,ke,Jt,se,ee,Ae,$e,Be,We,Ye,Xe,Ve,te,fe,be,De,Ge,we,Se,ve;if(!n.enabled)return;const a=n.startTime||0,r=n.endTime||1/0;if(this.currentTime<a||this.currentTime>r)return;const c=i.x-s,d=i.y-o,u=Math.sqrt(c*c+d*d);if(this.frameCount%240===0&&Math.random()<.1&&this.log(`[ExodeUI] Executing ${n.type} on ${e.name}`),n.type===H.Proximity){const V=((p=n.settings)==null?void 0:p.radius)||300,Q=((l=n.settings)==null?void 0:l.falloff)||"smooth";let U=0;u<V&&(Q==="linear"?U=1-u/V:U=Math.pow(1-u/V,2)),n.sensors.forEach(lt=>{this.applyBehaviorSensor(i,lt,U,t,n.settings,e,c,d,u)})}else if(n.type===H.Magnetic){const V=((h=n.settings)==null?void 0:h.radius)||400,Q=((f=n.settings)==null?void 0:f.strength)||.5;if(u<V&&u>5){const U=1-u/V,lt=c*U*Q,Tt=d*U*Q;i.x-=lt*t*10,i.y-=Tt*t*10}}else if(n.type===H.Repel){const V=((g=n.settings)==null?void 0:g.radius)||300,Q=((y=n.settings)==null?void 0:y.strength)||1;if(u<V){const U=Math.pow(1-u/V,2);i.x+=c/(u||1)*U*60*Q*t*5,i.y+=d/(u||1)*U*60*Q*t*5}}else if(n.type===H.Orbit){const V=((m=n.settings)==null?void 0:m.speed)||1,Q=((S=n.settings)==null?void 0:S.radius)||30,U=this.currentTime*V*Math.PI*2;i.x+=Math.cos(U)*Q*t*5,i.y+=Math.sin(U)*Q*t*5,i.rotation+=2*t*5}else if(n.type===H.Vortex){const V=((v=n.settings)==null?void 0:v.radius)||400,Q=((C=n.settings)==null?void 0:C.speed)||2,U=((w=n.settings)==null?void 0:w.strength)||1;if(u<V){const lt=Math.pow(1-u/V,1.5),Tt=this.currentTime*Q*Math.PI*2,Lt=Math.cos(Tt)*30-c*.4,Yt=Math.sin(Tt)*30-d*.4;i.x+=Lt*lt*U*t*5,i.y+=Yt*lt*U*t*5,i.rotation+=5*lt*U*t*5,i.scale_x*=1-lt*.1*U*t,i.scale_y*=1-lt*.1*U*t}}else if(n.type===H.Fluid){const V=((M=n.settings)==null?void 0:M.radius)||300,Q=((I=n.settings)==null?void 0:I.strength)||1;if(u<V){const U=Math.pow(1-u/V,1.2),lt=c/(u||1)*U*1.2*Q,Tt=d/(u||1)*U*1.2*Q;i.x+=lt*10*t*5,i.y+=Tt*10*t*5,i.scale_x*=1+U*.3*Q*t,i.scale_y*=1+U*.3*Q*t}}else if(n.type===H.Elastic){const V=((T=n.settings)==null?void 0:T.radius)||300,Q=((k=n.settings)==null?void 0:k.strength)||1;if(u<V){const U=1-u/V;i.scale_x*=1+U*.4*Q*t,i.scale_y*=1+U*.4*Q*t}}else if(n.type===H.Holographic){const V=i.x-this.canvasWidth/2,Q=i.y-this.canvasHeight/2,U=((E=n.settings)==null?void 0:E.factor)||25;if(i.x-=V/1e3*U*t*5,i.y-=Q/1e3*U*t*5,i.style){const lt=1-Math.min(1,u/400);i.style.exposure=(i.style.exposure||1)+lt*.5*t}}else if(n.type===H.Sticky){const V=((P=n.settings)==null?void 0:P.radius)||80,Q=((_=n.settings)==null?void 0:_.strength)||1;if(u<V){const U=Math.pow(1-u/V,2);i.x-=c*U*Q*t*10,i.y-=d*U*Q*t*10,i.scale_x*=1-U*.1*Q*t,i.scale_y*=1-U*.1*Q*t}}else if(n.type===H.Dilation){const V=((L=n.settings)==null?void 0:L.size)||120,Q=((A=n.settings)==null?void 0:A.strength)||1;if(u<V){const U=1-u/V;i.scale_x*=1+U*.5*Q*t,i.scale_y*=1+U*.5*Q*t}}else if(n.type===H.Parallax){const V=((W=n.settings)==null?void 0:W.factor)||15,Q=((B=n.settings)==null?void 0:B.strength)||1,U=this.canvasWidth/2,lt=this.canvasHeight/2,Tt=this._lastPointerPos||{x:U,y:lt},Lt=(Tt.x-U)/U,Yt=(Tt.y-lt)/lt,ce=(((R=e.transform)==null?void 0:R.x)??0)+Lt*V*Q,Me=(((Y=e.transform)==null?void 0:Y.y)??0)+Yt*V*Q,Oe=(((G=e.transform)==null?void 0:G.rotate_x)??0)-Yt*V*1.5*Q,ue=(((z=e.transform)==null?void 0:z.rotate_y)??0)+Lt*V*1.5*Q,Te=Math.min(1,10*t);i.x=this.lerp(i.x??((O=e.transform)==null?void 0:O.x)??0,ce,Te),i.y=this.lerp(i.y??((F=e.transform)==null?void 0:F.y)??0,Me,Te),i.rotate_x=this.lerp(i.rotate_x??((Z=e.transform)==null?void 0:Z.rotate_x)??0,Oe,Te),i.rotate_y=this.lerp(i.rotate_y??((st=e.transform)==null?void 0:st.rotate_y)??0,ue,Te)}else if(n.type===H.Fold){if(u<300){const V=1-u/300,Q=(c>0?-1:1)*V*10,U=1-V*.1,lt=d/300*V*20,Tt=-(c/300)*V*20,Lt=Math.min(1,10*t);i.skew_x=this.lerp(i.skew_x??((at=e.transform)==null?void 0:at.skew_x)??0,Q,Lt),i.scale_y=this.lerp(i.scale_y??((ct=e.transform)==null?void 0:ct.scale_y)??1,(((dt=e.transform)==null?void 0:dt.scale_y)??1)*U,Lt),i.rotate_x=this.lerp(i.rotate_x??(($=e.transform)==null?void 0:$.rotate_x)??0,lt,Lt),i.rotate_y=this.lerp(i.rotate_y??((X=e.transform)==null?void 0:X.rotate_y)??0,Tt,Lt),i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"fold_overlay",intensity:((N=n.settings)==null?void 0:N.opacity)??.5}}}else if(n.type===H.Crumple){if(u<300){const V=1-u/300,Q=V*(Math.random()-.5)*5,U=V*(Math.random()-.5)*.05,lt=Math.min(1,15*t);i.skew_x=this.lerp(i.skew_x??((ot=e.transform)==null?void 0:ot.skew_x)??0,Q,lt),i.scale_x=this.lerp(i.scale_x??((bt=e.transform)==null?void 0:bt.scale_x)??1,(((St=e.transform)==null?void 0:St.scale_x)??1)*(1+U),lt),i.scale_y=this.lerp(i.scale_y??((Mt=e.transform)==null?void 0:Mt.scale_y)??1,(((pt=e.transform)==null?void 0:pt.scale_y)??1)*(1+U),lt),i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"crumple_overlay",intensity:((wt=n.settings)==null?void 0:wt.intensity)??1,scale:((yt=n.settings)==null?void 0:yt.scale)??2}}}else if(n.type===H.Squash){const V=((qt=n.settings)==null?void 0:qt.strength)||.8;u<(e.width||100)&&this.isMouseDown?(i.scale_y=this.lerp(i.scale_y??1,(((Kt=e.transform)==null?void 0:Kt.scale_y)??1)*V,.3),i.scale_x=this.lerp(i.scale_x??1,(((j=e.transform)==null?void 0:j.scale_x)??1)*(1+(1-V)*.4),.3)):(i.scale_y=this.lerp(i.scale_y??1,((ft=e.transform)==null?void 0:ft.scale_y)??1,.2),i.scale_x=this.lerp(i.scale_x??1,((Rt=e.transform)==null?void 0:Rt.scale_x)??1,.2))}else if(n.type===H.TextCounter){const V=((At=n.settings)==null?void 0:At.duration)||2,Q=((Pt=n.settings)==null?void 0:Pt.from)||0,U=((Ot=n.settings)==null?void 0:Ot.to)||100;n._runtimeStart===void 0&&(n._runtimeStart=this.currentTime);const lt=this.currentTime-n._runtimeStart,Tt=Math.min(1,lt/V),Lt=Math.floor(Q+(U-Q)*Tt);if(((Gt=e.geometry)==null?void 0:Gt.type)==="Text"){const Yt=((Ht=n.settings)==null?void 0:Ht.prefix)||"",ce=((Nt=n.settings)==null?void 0:Nt.suffix)||"";i.geometry||(i.geometry={...e.geometry}),i.geometry.text=`${Yt}${Lt}${ce}`}}else if(n.type===H.Spotlight){const V=((Bt=n.settings)==null?void 0:Bt.radius)||250,Q=((le=n.settings)==null?void 0:le.strength)||1.5;if(u<V){const U=Math.pow(1-u/V,2);i.style||(i.style={...e.style}),i.style.adjustments||(i.style.adjustments={...(ae=e.style)==null?void 0:ae.adjustments}),i.style.adjustments.exposure=(((Pe=(ye=e.style)==null?void 0:ye.adjustments)==null?void 0:Pe.exposure)||0)+U*Q*50}else(Le=i.style)!=null&&Le.adjustments&&(i.style.adjustments.exposure=this.lerp(i.style.adjustments.exposure||0,((xe=(me=e.style)==null?void 0:me.adjustments)==null?void 0:xe.exposure)||0,.1))}else if(n.type===H.Noise||n.type===H.Float){const V=(((Zt=n.settings)==null?void 0:Zt.frequency)||((_e=n.settings)==null?void 0:_e.speed)||1)*.002,Q=(((Fe=n.settings)==null?void 0:Fe.amplitude)||((Ee=n.settings)==null?void 0:Ee.range)||50)*(((pe=n.settings)==null?void 0:pe.strength)||1),U=Date.now();i.x+=Math.sin(U*V)*Q*t,i.y+=Math.cos(U*V*.8)*Q*t,i.rotation+=Math.sin(U*V*.5)*5*t}else if(n.type===H.Pulse){const V=(((Ce=n.settings)==null?void 0:Ce.speed)||1)*.005,Q=(((Re=n.settings)==null?void 0:Re.scale)||1.2)-1,U=Math.sin(Date.now()*V),lt=((he=n.settings)==null?void 0:he.strength)||1;i.scale_x*=1+U*Q*lt*t,i.scale_y*=1+U*Q*lt*t,i.style&&(i.style.exposure=(i.style.exposure||1)+Math.max(0,U)*.1*lt*t)}else if(n.type===H.Draggable){if(!this.draggingBehaviors.has(e.id)){const Q=((de=n.settings)==null?void 0:de.radius)||150;if(u<Q){const U=((Et=n.settings)==null?void 0:Et.strength)||1,lt=Math.max(0,1-u/Q);this.applyBehaviorSensor(i,ne.PositionX,lt*U,t,n.settings,e,c,d,u),this.applyBehaviorSensor(i,ne.PositionY,lt*U,t,n.settings,e,c,d,u)}}}else if(n.type===H.Scroll){const V=((J=n.settings)==null?void 0:J.axis)||"vertical",Q=((et=n.settings)==null?void 0:et.factor)||.5,U=((q=n.settings)==null?void 0:q.strength)||1,lt=((D=n.settings)==null?void 0:D.scaleFactor)||0;(V==="vertical"||V==="both")&&(i.y+=this.scrollOffset.y*Q*U*t),(V==="horizontal"||V==="both")&&(i.x+=this.scrollOffset.x*Q*U*t),lt!==0&&(i.scale_x*=1+this.scrollOffset.y*lt*t,i.scale_y*=1+this.scrollOffset.y*lt*t)}else if(n.type===H.LookAt){const V=((it=n.settings)==null?void 0:it.factor)||1,Q=((tt=n.settings)==null?void 0:tt.strength)||1,U=Math.atan2(-d,-c)*(180/Math.PI),lt=i.rotation,Tt=(U-lt+180)%360-180;i.rotation+=Tt*V*Q*t*10}else if(n.type===H.Scan){const V=(((ut=n.settings)==null?void 0:ut.speed)||1)*.004,Q=((Wt=n.settings)==null?void 0:Wt.strength)||1,U=(Math.sin(Date.now()*V)+1)/2;i.style&&(i.style.exposure=(i.style.exposure||1)+U*Q*t*5),i.x+=(U-.5)*20*Q*t}else if(n.type===H.Glint)i.style=i.style||{...e.style},i.style.artEffect={enabled:!0,type:"glint_overlay",intensity:((Dt=n.settings)==null?void 0:Dt.strength)??.8};else if(n.type===H.Ratchet){const V=((Qt=n.settings)==null?void 0:Qt.steps)||12,Q=(((zt=n.settings)==null?void 0:zt.speed)||1)*30,U=Math.floor(i.rotation/(360/V))*(360/V);i.rotation=this.lerp(i.rotation,U+Q*t,.1)}else if(n.type===H.Jitter&&u<300){const V=((Xt=n.settings)==null?void 0:Xt.strength)||1,Q=(((x=n.settings)==null?void 0:x.intensity)||5)*V;i.x+=(Math.random()-.5)*Q*t*60,i.y+=(Math.random()-.5)*Q*t*60,i.rotation+=(Math.random()-.5)*Q*t*120}else if(n.type===H.Follower){const V=(rt=n.settings)==null?void 0:rt.targetId;if(V){const Q=this.objectStates.get(V);if(Q){const U=((It=n.settings)==null?void 0:It.stiffness)||.1,lt=Q.x-i.x,Tt=Q.y-i.y;i.x+=lt*U*t*60,i.y+=Tt*U*t*60}}}else if(n.type===H.Wrap)i.x<0?i.x=this.canvasWidth:i.x>this.canvasWidth&&(i.x=0),i.y<0?i.y=this.canvasHeight:i.y>this.canvasHeight&&(i.y=0);else if(n.type===H.Gravity){const V=((Ft=n.settings)==null?void 0:Ft.strength)||9.8;i.y+=V*t*10}else if(n.type===H.Velocity){const V=((K=n.settings)==null?void 0:K.vx)||0,Q=((ht=n.settings)==null?void 0:ht.vy)||0;i.x+=V*t*10,i.y+=Q*t*10}else if(n.type===H.Shear){const V=((gt=n.settings)==null?void 0:gt.strength)||1,Q=((jt=n.settings)==null?void 0:jt.radius)||300;if(u<Q){const U=1-u/Q;i.skew_x=this.lerp(i.skew_x||0,(((mt=e.transform)==null?void 0:mt.skew_x)||0)+U*V*30,.1)}else i.skew_x=this.lerp(i.skew_x||0,(($t=e.transform)==null?void 0:$t.skew_x)||0,.05)}else if(n.type===H.Lens){const V=((vt=n.settings)==null?void 0:vt.radius)||200,Q=((xt=n.settings)==null?void 0:xt.strength)||.5;if(u<V){const U=Math.pow(1-u/V,2);i.scale_x=this.lerp(i.scale_x??1,(((kt=e.transform)==null?void 0:kt.scale_x)??1)*(1+U*Q),.2),i.scale_y=this.lerp(i.scale_y??1,(((oe=e.transform)==null?void 0:oe.scale_y)??1)*(1+U*Q),.2)}else i.scale_x=this.lerp(i.scale_x??1,((re=e.transform)==null?void 0:re.scale_x)??1,.1),i.scale_y=this.lerp(i.scale_y??1,((ke=e.transform)==null?void 0:ke.scale_y)??1,.1)}else if(n.type===H.LayoutAnimation){const V=((Jt=n.settings)==null?void 0:Jt.watchProperties)||["x","y","scale_x","scale_y","opacity","rotation"],Q=((se=n.settings)==null?void 0:se.duration)||.3;this._layoutAnimCache.has(e.id)||this._layoutAnimCache.set(e.id,new Map);const U=this._layoutAnimCache.get(e.id);for(const lt of V){const Tt=this.getObjectProperty(i,e,lt);if(Tt===void 0)continue;const Lt=U.get(lt);if(!Lt)U.set(lt,{from:Tt,to:Tt,startTime:this.currentTime,duration:0});else if(Lt.to!==Tt){const ce=this.getObjectProperty(i,e,lt);U.set(lt,{from:ce??Lt.from,to:Tt,startTime:this.currentTime,duration:((ee=n.settings)==null?void 0:ee.duration)??Q})}const Yt=U.get(lt);if(Yt.duration>0&&Yt.from!==Yt.to){const ce=this.currentTime-Yt.startTime,Me=Math.min(1,ce/Yt.duration),Oe=this.applyEasing(Me,((Ae=n.settings)==null?void 0:Ae.easing)||"easeOutCubic"),ue=Yt.from+(Yt.to-Yt.from)*Oe;this.setObjectProperty(i,e,lt,ue)}}}else if(n.type===H.StateReactive){this._layoutAnimCache.has(e.id)||this._layoutAnimCache.set(e.id,new Map);const V=this._layoutAnimCache.get(e.id),Q=(($e=n.settings)==null?void 0:$e.defaultDuration)||.3,U=["x","y","scale_x","scale_y","opacity","rotation","style.fill.color","style.stroke.width","geometry.cornerRadius","style.blur.value","style.shadow.blur","style.shadow.offsetX","style.shadow.offsetY"];for(const lt of U){const Tt=this.getObjectProperty(i,e,lt);if(Tt===void 0||typeof Tt!="number")continue;const Lt=V.get(lt);if(!Lt)V.set(lt,{from:Tt,to:Tt,startTime:this.currentTime,duration:0});else if(Lt.to!==Tt){const ce=this.getObjectProperty(i,e,lt);V.set(lt,{from:ce??Lt.from,to:Tt,startTime:this.currentTime,duration:Q})}const Yt=V.get(lt);if(Yt.duration>0&&Yt.from!==Yt.to){const ce=this.currentTime-Yt.startTime,Me=Math.min(1,ce/Yt.duration),Oe=this.applyEasing(Me,((Be=n.settings)==null?void 0:Be.defaultEasing)||"easeOutCubic"),ue=Yt.from+(Yt.to-Yt.from)*Oe;this.setObjectProperty(i,e,lt,ue)}}}else if(n.type===H.SpringChain){const V=((We=n.settings)==null?void 0:We.connections)||[],Q=((Ye=n.settings)==null?void 0:Ye.globalDamping)||.3;this._springChainState.has(e.id)||this._springChainState.set(e.id,new Map);const U=this._springChainState.get(e.id);for(const Tt of V){if(!U.has(Tt.targetId)){const Lt=this.objectStates.get(Tt.targetId);U.set(Tt.targetId,{x:(Lt==null?void 0:Lt.x)??0,y:(Lt==null?void 0:Lt.y)??0,vx:0,vy:0})}U.has(e.id)||U.set(e.id,{x:i.x,y:i.y,vx:0,vy:0})}const lt=U.get(e.id);if(lt){lt.x=i.x,lt.y=i.y;for(const Tt of V){const Lt=U.get(Tt.targetId);if(!Lt)continue;const Yt=Lt.x-lt.x,ce=Lt.y-lt.y,Me=Math.sqrt(Yt*Yt+ce*ce)||.001,ue=(Me-(Tt.restLength||50))*(Tt.stiffness||.8),Te=Yt/Me*ue,Qe=ce/Me*ue;lt.vx+=Te*t*10,lt.vy+=Qe*t*10,Lt.vx-=Te*t*10,Lt.vy-=Qe*t*10,lt.vx*=1-Q*t*10,lt.vy*=1-Q*t*10,Lt.vx*=1-Q*t*10,Lt.vy*=1-Q*t*10;const Ie=this.objectStates.get(Tt.targetId);Ie&&(Ie.x+=Lt.vx*t,Ie.y+=Lt.vy*t)}i.x+=lt.vx*t,i.y+=lt.vy*t}}else if(n.type===H.ParticleEmitter){const V=((Xe=n.settings)==null?void 0:Xe.rate)||10,Q=((Ve=n.settings)==null?void 0:Ve.speed)||100,U=((te=n.settings)==null?void 0:te.size)||5,lt=((fe=n.settings)==null?void 0:fe.lifetime)||2,Tt=((be=n.settings)==null?void 0:be.gravity)||0,Lt=((De=n.settings)==null?void 0:De.color)||"#ffffff",Yt=((Ge=n.settings)==null?void 0:Ge.maxParticles)||200,ce=(we=n.settings)!=null&&we.rateInputId?this.inputs.get(n.settings.rateInputId)??V:V,Me=(Se=n.settings)!=null&&Se.gravityInputId?this.inputs.get(n.settings.gravityInputId)??Tt:Tt,Oe=(ve=n.settings)!=null&&ve.speedInputId?this.inputs.get(n.settings.speedInputId)??Q:Q;this._emitterPools.has(e.id)||this._emitterPools.set(e.id,[]);const ue=this._emitterPools.get(e.id);let Te=0;n._pendingBurst&&n._pendingBurst>0&&(Te=n._pendingBurst,n._pendingBurst=0);const Qe=Math.floor(ce*t)+(Te||0);for(let Ie=0;Ie<Math.min(Qe,Yt-ue.length);Ie++){const ge=Math.random()*Math.PI*2,ms=Oe*(.5+Math.random()*.5);ue.push({x:i.x,y:i.y,vx:Math.cos(ge)*ms,vy:Math.sin(ge)*ms,life:0,maxLife:lt*(.5+Math.random()*.5),size:U*(.5+Math.random()),color:Lt,opacity:1})}for(let Ie=ue.length-1;Ie>=0;Ie--){const ge=ue[Ie];ge.vy+=Me*t*10,ge.x+=ge.vx*t,ge.y+=ge.vy*t,ge.life+=t,ge.opacity=Math.max(0,1-ge.life/ge.maxLife),ge.life>=ge.maxLife&&ue.splice(Ie,1)}}})})}applyBehaviorSensor(t,s,o,e,i,n,a=0,r=0,c=1){var h,f,g,y,m,S,v,C,w,M,I,T,k,E,P,_,L,A,W,B,R,Y,G,z;const d=(i==null?void 0:i.intensity)||(i==null?void 0:i.strength)||1,u=Math.min(1,15*e),p=c>0?a/c:0,l=c>0?r/c:0;switch(s){case ne.Scale:{const O=((h=n==null?void 0:n.transform)==null?void 0:h.scale_x)??1,F=((f=n==null?void 0:n.transform)==null?void 0:f.scale_y)??1,Z=O*(1+o*d*.4),st=F*(1+o*d*.4);t.scale_x=(t.scale_x??O)*(1-u)+Z*u,t.scale_y=(t.scale_y??F)*(1-u)+st*u;break}case ne.Opacity:{const O=((g=n==null?void 0:n.transform)==null?void 0:g.opacity)??100,F=Math.max(0,Math.min(100,O-o*d*100));t.opacity=(t.opacity??O)*(1-u)+F*u;break}case ne.RotateZ:{const O=((y=n==null?void 0:n.transform)==null?void 0:y.rotation)??0,F=O+o*d*45;t.rotation=(t.rotation??O)*(1-u)+F*u;break}case ne.RotateX:{const O=((m=n==null?void 0:n.transform)==null?void 0:m.rotate_x)??0,F=O-l*o*d*60;t.rotate_x=(t.rotate_x??O)*(1-u)+F*u;break}case ne.RotateY:{const O=((S=n==null?void 0:n.transform)==null?void 0:S.rotate_y)??0,F=O+p*o*d*60;t.rotate_y=(t.rotate_y??O)*(1-u)+F*u;break}case ne.PositionX:{const O=((v=n==null?void 0:n.transform)==null?void 0:v.x)??0,F=O-p*o*d*40;t.x=(t.x??O)*(1-u)+F*u;break}case ne.PositionY:{const O=((C=n==null?void 0:n.transform)==null?void 0:C.y)??0,F=O-l*o*d*40;t.y=(t.y??O)*(1-u)+F*u;break}case ne.SkewX:{const O=((w=n==null?void 0:n.transform)==null?void 0:w.skew_x)??0,F=O+p*o*d*45;t.skew_x=(t.skew_x??O)*(1-u)+F*u,t.skew_x>85&&(t.skew_x=85),t.skew_x<-85&&(t.skew_x=-85);break}case ne.Blur:{t.style||(t.style={...n==null?void 0:n.style}),t.style.blur||(t.style.blur={...(M=n==null?void 0:n.style)==null?void 0:M.blur});const O=((T=(I=n==null?void 0:n.style)==null?void 0:I.blur)==null?void 0:T.amount)||0,F=O+o*((i==null?void 0:i.blur)||20)*d;t.style.blur.amount=(t.style.blur.amount??O)*(1-u)+F*u;break}case ne.Exposure:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(k=n==null?void 0:n.style)==null?void 0:k.adjustments});const O=((P=(E=n==null?void 0:n.style)==null?void 0:E.adjustments)==null?void 0:P.exposure)||0,F=O+o*((i==null?void 0:i.exposure)||50)*d;t.style.adjustments.exposure=(t.style.adjustments.exposure??O)*(1-u)+F*u;break}case ne.HueShift:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(_=n==null?void 0:n.style)==null?void 0:_.adjustments});const O=((A=(L=n==null?void 0:n.style)==null?void 0:L.adjustments)==null?void 0:A.hue)||0,F=O+o*((i==null?void 0:i.hue)||180)*d;t.style.adjustments.hue=(t.style.adjustments.hue??O)*(1-u)+F*u;break}case ne.Negative:{t.style||(t.style={...n==null?void 0:n.style}),t.style.adjustments||(t.style.adjustments={...(W=n==null?void 0:n.style)==null?void 0:W.adjustments});const O=((R=(B=n==null?void 0:n.style)==null?void 0:B.adjustments)==null?void 0:R.negative)||0,F=O+o*((i==null?void 0:i.negative)||100)*d;t.style.adjustments.negative=(t.style.adjustments.negative??O)*(1-u)+F*u;break}case ne.CornerRadius:{const O=((Y=n==null?void 0:n.transform)==null?void 0:Y.corner_radius)||0,F=O+o*d*50;t.corner_radius=(t.corner_radius??O)*(1-u)+F*u;break}case ne.StrokeWidth:{t.style||(t.style={...n==null?void 0:n.style});const O=((G=n==null?void 0:n.style)==null?void 0:G.borderWidth)||0,F=O+o*d*10;t.style.borderWidth=(t.style.borderWidth??O)*(1-u)+F*u;break}case ne.LetterSpacing:{t.geometry||(t.geometry={});const O=((z=n==null?void 0:n.geometry)==null?void 0:z.letterSpacing)||0,F=O+o*d*10;t.geometry.letterSpacing=(t.geometry.letterSpacing??O)*(1-u)+F*u;break}}}getObjectProperty(t,s,o){const e=o.replace(/\[(\d+)\]/g,".$1").split(".");let i=t;for(const n of e){if(i==null||typeof i!="object")return;if(n==="style"&&t.style===void 0){i=s.style;continue}i=i[n]}return typeof i=="number"?i:void 0}setObjectProperty(t,s,o,e){const i=o.replace(/\[(\d+)\]/g,".$1").split(".");let n=t;for(let r=0;r<i.length-1;r++){const c=i[r];if(n[c]===void 0||n[c]===null){const d=s,u=i.slice(0,r+1).reduce((h,f)=>h==null?void 0:h[f],d),p=i[r+1],l=!isNaN(Number(p));n[c]=u!==void 0?Array.isArray(u)?[...u]:{...u}:l?[]:{}}n=n[c]}const a=i[i.length-1];n!=null&&(n[a]=e)}applyEasing(t,s){switch(s){case"easeOutCubic":return 1-Math.pow(1-t,3);case"easeInCubic":return t*t*t;case"easeInOutCubic":return t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;case"easeOutQuad":return t*(2-t);case"easeInQuad":return t*t;case"easeInOutQuad":return t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2;case"easeOutExpo":return t===1?1:1-Math.pow(2,-10*t);case"easeOutBack":return 1+2.70158*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2);case"easeOutElastic":{const o=2*Math.PI/3;return t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*o)+1}case"easeOutBounce":return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375;case"linear":return t;default:return 1-Math.pow(1-t,3)}}lerp(t,s,o){return t*(1-o)+s*o}deepMerge(t,s){if(!t)return s;if(!s)return t;if(typeof t!="object"||typeof s!="object"||t===null||s===null)return s;if(Array.isArray(s)){if(!Array.isArray(t))return s;const e=[...t];for(let i=0;i<s.length;i++)s[i]&&typeof s[i]=="object"&&!Array.isArray(s[i])&&t[i]&&typeof t[i]=="object"?e[i]=this.deepMerge(t[i],s[i]):e[i]=s[i];return e}const o={...t};for(const e in s)Object.prototype.hasOwnProperty.call(s,e)&&(s[e]&&typeof s[e]=="object"&&!Array.isArray(s[e])?o[e]=this.deepMerge(t[e],s[e]):Array.isArray(s[e])?o[e]=this.deepMerge(t[e],s[e]):o[e]=s[e]);return o}processFabricAdjustmentsCanvas(t,s,o,e){if(!e)return t;const i=(e.exposure||0)/100,n=(e.contrast||0)/100,a=(e.saturation||0)/100,r=(e.temperature||0)/200,c=(e.tint||0)/200,d=(e.highlights||0)/500,u=(e.shadows||0)/500,p=e.hue||0,l=(e.negative||0)/100,h=e.blur||0;if(!(i!==0||n!==0||a!==0||r!==0||c!==0||d!==0||u!==0||p!==0||l!==0||h>0))return t;const g=t.naturalWidth||Math.max(1,Math.round(s)),y=t.naturalHeight||Math.max(1,Math.round(o)),m=document.createElement("canvas");m.width=g,m.height=y;const S=m.getContext("2d");if(!S)return t;const v=[];h>0&&v.push(`blur(${h}px)`),p!==0&&v.push(`hue-rotate(${Math.round(p)}deg)`),v.length>0&&(S.filter=v.join(" ")),S.drawImage(t,0,0,g,y);try{const C=S.getImageData(0,0,g,y),w=C.data,M=w.length,I=i*255,T=n>=0?(1+n)/Math.max(.01,1-n):1+n,k=1+a,E=1+r-c/2,P=1+c,_=1-r-c/2,L=1+d+u,A=u*25.5,W=1-l/50,B=(1-W)*255;for(let R=0;R<M;R+=4){let Y=w[R],G=w[R+1],z=w[R+2];if(i!==0&&(Y+=I,G+=I,z+=I),n!==0&&(Y=(Y-127.5)*T+127.5,G=(G-127.5)*T+127.5,z=(z-127.5)*T+127.5),a!==0){const O=.2989*Y+.587*G+.114*z;Y=O+(Y-O)*k,G=O+(G-O)*k,z=O+(z-O)*k}(r!==0||c!==0)&&(Y=Y*E,G=G*P,z=z*_),(d!==0||u!==0)&&(Y=Y*L+A,G=G*L+A,z=z*L+A),l!==0&&(Y=Y*W+B,G=G*W+B,z=z*W+B),w[R]=Math.min(255,Math.max(0,Y)),w[R+1]=Math.min(255,Math.max(0,G)),w[R+2]=Math.min(255,Math.max(0,z))}return S.putImageData(C,0,0),m}catch{return m}}renderFittedImage(t,s,o,e,i,n,a="cover"){const r=s.naturalWidth||s.width||i,c=s.naturalHeight||s.height||n,d=r/c,u=i/n;let p=i,l=n,h=o,f=e;a==="cover"?d>u?(p=n*d,h=o-(p-i)/2):(l=i/d,f=e-(l-n)/2):a==="contain"&&(d>u?(l=i/d,f=e+(n-l)/2):(p=n*d,h=o+(i-p)/2)),t.drawImage(s,h,f,p,l)}}const ai=_t.forwardRef(({artboard:b,src:t,style:s,autoPlay:o=!0,fit:e="Contain",alignment:i="Center",onReady:n,onTrigger:a,onInputUpdate:r,onComponentChange:c,onToggle:d,onInputChange:u,onInputFocus:p,onInputBlur:l,onLog:h,onLogicUpdate:f,onButtonClick:g,onGraphPointClick:y,currentTime:m,revision:S=0,scrollY:v,scrollX:C,mouseX:w,mouseY:M,isMouseDown:I,inputs:T,interactive:k=!0,onNavigation:E},P)=>{const _=_t.useRef(null),L=_t.useRef(null);L.current||(L.current=new ys);const A=_t.useRef(void 0),W=_t.useRef(0),B=_t.useRef(null),R=_t.useRef(S),Y=_t.useRef(null),[,G]=_t.useState(b||null),z=_t.useRef(!0),O=_t.useRef(o),F=_t.useRef(m);_t.useEffect(()=>{O.current=o},[o]),_t.useEffect(()=>{F.current=m},[m]),_t.useImperativeHandle(P,()=>_.current),_t.useEffect(()=>(z.current=!0,()=>{z.current=!1,A.current&&cancelAnimationFrame(A.current)}),[]),_t.useEffect(()=>{L.current.setLayout(e,i)},[e,i]),_t.useEffect(()=>{const $=L.current;a&&$.setTriggerCallback(a),r&&$.setInputUpdateCallback((X,N)=>r({[X]:N})),c&&$.setComponentChangeCallback(X=>c(X)),d&&$.setToggleCallback(d),u&&$.setInputChangeCallback(u),p&&$.setInputFocusCallback(p),l&&$.setInputBlurCallback(l),h&&$.setOnLogCallback(X=>h(X,"info")),f&&$.setLogicUpdateCallback(f),g&&$.setButtonClickCallback(g),y&&$.setGraphPointClickCallback(X=>y(X.objectId,X)),E&&$.setNavigationCallback(E)},[a,r,c,d,u,p,l,h,f,g,y,E]),_t.useEffect(()=>{(async()=>{let X=b;if(t&&!b)try{t.startsWith("{")?X=JSON.parse(t):X=await(await fetch(t)).json()}catch(N){console.error("[ExodeUI] Failed to load src:",N)}if(X){const N=L.current,ot=X.id||X.name||"default";(B.current!==ot||R.current!==S||Y.current!==X)&&(N.load(X),B.current=ot,R.current=S,Y.current=X,G(X),W.current=-1,N.advance(0)),n&&n(N)}})()},[b,t,S]),_t.useEffect(()=>{const $=X=>{if(!L.current||!z.current)return;const N=L.current,ot=_.current;if(!ot)return;const bt=ot.getContext("2d");if(!bt)return;const St=X/1e3;W.current<0&&(W.current=St),W.current===0&&(W.current=St);let Mt=St-W.current;Mt>.1&&(Mt=.1),W.current=St;const pt=ot.getBoundingClientRect(),wt=window.devicePixelRatio||1,yt=Math.round(pt.width*wt),qt=Math.round(pt.height*wt);(ot.width!==yt||ot.height!==qt)&&(ot.width=yt,ot.height=qt);try{O.current?N.advance(Mt):F.current!==void 0&&N.seek(F.current),N.render(bt,ot.width,ot.height)}catch(Kt){console.error("[ExodeUICanvas] Error in animation loop:",Kt),h&&h(`[Error] Animation loop crashed: ${Kt}`,"error")}A.current=requestAnimationFrame($)};return A.current=requestAnimationFrame($),()=>{A.current&&cancelAnimationFrame(A.current)}},[]),_t.useEffect(()=>{const $=L.current;v!==void 0&&$.updateInput("scrollY",v),C!==void 0&&$.updateInput("scrollX",C),w!==void 0&&$.updateInput("mouseX",w),M!==void 0&&$.updateInput("mouseY",M),I!==void 0&&$.updateInput("isMouseDown",I),T&&Object.entries(T).forEach(([X,N])=>$.updateInput(X,N))},[v,C,w,M,I,T]);const Z=($,X)=>{if(!k||!_.current)return;$.stopPropagation(),"nativeEvent"in $&&$.nativeEvent&&typeof $.nativeEvent.stopImmediatePropagation=="function"?$.nativeEvent.stopImmediatePropagation():typeof $.stopImmediatePropagation=="function"&&$.stopImmediatePropagation();const N=_.current,ot=N.getBoundingClientRect(),bt=$.clientX-ot.left,St=$.clientY-ot.top,Mt=window.devicePixelRatio||1;(X==="click"||X==="down"||X==="up")&&h&&h(`[Canvas] Pointer ${X} at rect(${Math.round(bt)},${Math.round(St)}) mapped to buffer(${Math.round(bt*Mt)},${Math.round(St*Mt)})`,"info"),L.current.handlePointerInput(X,bt*Mt,St*Mt,N.width,N.height)};_t.useEffect(()=>{if(!k)return;const $=N=>{var ot,bt,St;((ot=document.activeElement)==null?void 0:ot.tagName)==="INPUT"||((bt=document.activeElement)==null?void 0:bt.tagName)==="TEXTAREA"||(St=L.current)==null||St.handleKeyDown(N)},X=N=>{var ot,bt,St;((ot=document.activeElement)==null?void 0:ot.tagName)==="INPUT"||((bt=document.activeElement)==null?void 0:bt.tagName)==="TEXTAREA"||(St=L.current)==null||St.handleKeyUp(N)};return window.addEventListener("keydown",$),window.addEventListener("keyup",X),()=>{window.removeEventListener("keydown",$),window.removeEventListener("keyup",X)}},[k]);const[st,at]=_t.useState([]);_t.useEffect(()=>{if(b&&b.objects){const $=b.objects.filter(X=>{var N,ot;return X.type==="Joystick"&&((N=X.inputBinding)==null?void 0:N.type)==="keyboard"&&((ot=X.inputBinding.keyboardConfig)==null?void 0:ot.showVirtualKeyboard)});at($)}},[b]);const[,ct]=_t.useState(0);_t.useEffect(()=>{if(st.length===0)return;let $;const X=()=>{ct(N=>N+1),$=requestAnimationFrame(X)};return $=requestAnimationFrame(X),()=>cancelAnimationFrame($)},[st.length]);const dt=()=>st.map($=>{const X=$.inputBinding.keyboardConfig,N=pt=>{var yt;const wt={key:pt,code:pt,preventDefault:()=>{}};(yt=L.current)==null||yt.handleKeyDown(wt)},ot=pt=>{var yt;const wt={key:pt,code:pt,preventDefault:()=>{}};(yt=L.current)==null||yt.handleKeyUp(wt)},bt=L.current,St=pt=>bt&&bt.activeKeys?bt.activeKeys.has(pt.toLowerCase()):!1,Mt=pt=>({width:"50px",height:"50px",background:pt?"rgba(255, 255, 255, 0.4)":"rgba(0, 0, 0, 0.4)",border:"1px solid rgba(255, 255, 255, 0.2)",borderRadius:"12px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontWeight:"bold",fontSize:"18px",userSelect:"none",cursor:"pointer",backdropFilter:"blur(8px)",transition:"background 0.1s",boxShadow:pt?"none":"0 4px 6px rgba(0,0,0,0.1)"});return Vt.jsxs("div",{style:{position:"absolute",bottom:"40px",right:"40px",display:"flex",flexDirection:"column",alignItems:"center",gap:"8px",pointerEvents:"auto",zIndex:100},children:[Vt.jsx("div",{style:Mt(St(X.upKey)),onMouseDown:()=>N(X.upKey),onMouseUp:()=>ot(X.upKey),onMouseLeave:()=>ot(X.upKey),onTouchStart:pt=>{pt.preventDefault(),N(X.upKey)},onTouchEnd:pt=>{pt.preventDefault(),ot(X.upKey)},children:X.upKey.toUpperCase()}),Vt.jsxs("div",{style:{display:"flex",gap:"8px"},children:[Vt.jsx("div",{style:Mt(St(X.leftKey)),onMouseDown:()=>N(X.leftKey),onMouseUp:()=>ot(X.leftKey),onMouseLeave:()=>ot(X.leftKey),onTouchStart:pt=>{pt.preventDefault(),N(X.leftKey)},onTouchEnd:pt=>{pt.preventDefault(),ot(X.leftKey)},children:X.leftKey.toUpperCase()}),Vt.jsx("div",{style:Mt(St(X.downKey)),onMouseDown:()=>N(X.downKey),onMouseUp:()=>ot(X.downKey),onMouseLeave:()=>ot(X.downKey),onTouchStart:pt=>{pt.preventDefault(),N(X.downKey)},onTouchEnd:pt=>{pt.preventDefault(),ot(X.downKey)},children:X.downKey.toUpperCase()}),Vt.jsx("div",{style:Mt(St(X.rightKey)),onMouseDown:()=>N(X.rightKey),onMouseUp:()=>ot(X.rightKey),onMouseLeave:()=>ot(X.rightKey),onTouchStart:pt=>{pt.preventDefault(),N(X.rightKey)},onTouchEnd:pt=>{pt.preventDefault(),ot(X.rightKey)},children:X.rightKey.toUpperCase()})]})]},$.id)});return Vt.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[Vt.jsx("canvas",{ref:_,onPointerDown:$=>{var X;Z($,"down"),(X=_.current)==null||X.focus()},onPointerMove:$=>Z($,"move"),onPointerUp:$=>Z($,"up"),onPointerCancel:$=>Z($,"up"),onClick:$=>Z($,"click"),onWheel:$=>{L.current.handleWheel($.deltaX,$.deltaY)},onKeyDown:$=>L.current.handleKeyDown($.nativeEvent),onKeyUp:$=>L.current.handleKeyUp($.nativeEvent),onContextMenu:$=>$.preventDefault(),tabIndex:0,style:{...s,width:"100%",height:"100%",outline:"none",display:"block",touchAction:"none",pointerEvents:k?"auto":"none"}}),dt()]})});function ri(){const[b,t]=_t.useState(null),s=_t.useCallback((p,l)=>{b==null||b.setInputBool(p,l)},[b]),o=_t.useCallback((p,l)=>{b==null||b.setInputNumber(p,l)},[b]),e=_t.useCallback(p=>{b==null||b.fireTrigger(p)},[b]),i=_t.useCallback((p,l)=>{b==null||b.setInputText(p,l)},[b]),n=_t.useCallback((p,l)=>{b==null||b.setInputNumberArray(p,l)},[b]),a=_t.useCallback((p,l)=>{b==null||b.setInputStringArray(p,l)},[b]),r=_t.useCallback((p,l)=>{b==null||b.updateObjectOptions(p,l)},[b]),c=_t.useCallback((p,l,h)=>{b==null||b.updateConstraint(p,l,h)},[b]),d=_t.useCallback((p,l)=>{b==null||b.updateGraphData(p,l)},[b]),u=_t.useCallback(p=>b==null?void 0:b.getInputValue(p),[b]);return{setEngine:t,engine:b,setInputBool:s,setInputNumber:o,fireTrigger:e,setInputText:i,setInputNumberArray:n,setInputStringArray:a,updateConstraint:c,updateGraphData:d,updateObjectOptions:r,getInputValue:u}}const li=({artboard:b,config:t})=>{const s={...b.seo,...t},o=s.enableSmartExtraction!==!1;_t.useEffect(()=>{const a=s.title||b.name;a&&(document.title=a);let r=s.description;if(!r&&o){const u=b.objects.filter(p=>{var l;return((l=p.geometry)==null?void 0:l.type)==="Text"}).sort((p,l)=>{var h,f;return(((h=l.geometry.text)==null?void 0:h.length)||0)-(((f=p.geometry.text)==null?void 0:f.length)||0)});u.length>0&&(r=u[0].geometry.text)}r&&(e("name","description",r),e("property","og:description",r)),s.keywords&&s.keywords.length>0&&e("name","keywords",s.keywords.join(", "));const c=s.ogImage||b.backgroundImage;c&&e("property","og:image",c),a&&e("property","og:title",a),e("property","og:type","website")},[s,b,o]);const e=(a,r,c)=>{let d=document.querySelector(`meta[${a}="${r}"]`);d||(d=document.createElement("meta"),d.setAttribute(a,r),document.head.appendChild(d)),d.setAttribute("content",c)},i=()=>{const a=[];return a.push(Vt.jsx("h1",{children:s.title||b.name},"artboard-title")),b.objects.forEach((c,d)=>{var u,p;if(!(c.visible===!1||c.isVisible===!1))if(((u=c.geometry)==null?void 0:u.type)==="Text"){const l=c.geometry.text;l&&(c.geometry.fontSize>24?a.push(Vt.jsx("h2",{children:l},c.id||d)):a.push(Vt.jsx("p",{children:l},c.id||d)))}else if(((p=c.geometry)==null?void 0:p.type)==="Image"){const l=c.geometry.src,h=c.altText||c.name||"Illustration";a.push(Vt.jsx("img",{src:l,alt:h},c.id||d))}else c.type==="Button"&&a.push(Vt.jsx("button",{children:c.name||"Button"},c.id||d))}),a},n=s.jsonLd||{"@context":"https://schema.org","@type":"VisualArtwork",name:s.title||b.name,description:s.description,image:s.ogImage||b.backgroundImage,abstract:"Animated interface created with ExodeUI"};return Vt.jsxs("div",{id:`exode-seo-${b.id||"default"}`,"aria-hidden":"false",style:{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:"0",zIndex:-1},children:[i(),Vt.jsx("script",{type:"application/ld+json",children:JSON.stringify(n)})]})},ci={version:"6.3.50"}.version;Ut.BehaviorSensor=ne,Ut.BehaviorType=H,Ut.ConditionOp=je,Ut.ExodeSEO=li,Ut.ExodeUICanvas=ai,Ut.ExodeUIEngine=ys,Ut.LogicOp=Ct,Ut.RapierPhysics=is,Ut.VERSION=ci,Ut.useExodeUI=ri,Object.defineProperty(Ut,Symbol.toStringTag,{value:"Module"})}));
|