@designcombo/video 0.1.6 → 0.1.7

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.
@@ -1,4 +1,4 @@
1
- import { F as Ie, u as Ee, l as se, M as v, G as De, v as Oe, S as Fe, x as ae, E as u, e as D, y as S, z as Le, H as O, I as b, R as F, J as ne, K as He, t as m, b as f, i as B, w as L, L as K, N as We, c as Y, B as y, j as U, O as ze, Q as C, k as M, V as w, W as Ve, a as Ne, X as ie, Y as oe, Z as le, _ as ue, C as P, $ as je, a0 as A, a1 as J, D as H, a2 as $e, a3 as qe, P as Ke, d as Ye, T as X, a4 as Q, a5 as Je, a6 as Xe, a7 as Qe } from "./index-DyXIO7KH.js";
1
+ import { F as Ie, u as Ee, l as se, M as v, G as De, v as Oe, S as Fe, x as ae, E as u, e as D, y as S, z as Le, H as O, I as b, R as F, J as ne, K as He, t as m, b as f, i as B, w as L, L as K, N as We, c as Y, B as y, j as U, O as ze, Q as C, k as M, V as w, W as Ve, a as Ne, X as ie, Y as oe, Z as le, _ as ue, C as P, $ as je, a0 as A, a1 as J, D as H, a2 as $e, a3 as qe, P as Ke, d as Ye, T as X, a4 as Q, a5 as Je, a6 as Xe, a7 as Qe } from "./index-vzWoc22W.js";
2
2
  import { B as de, c as Ze } from "./colorToUniform-C2jGzNe1.js";
3
3
  var et = `in vec2 vMaskCoord;
4
4
  in vec2 vTextureCoord;
@@ -1,6 +1,6 @@
1
- import { S as G, E as d, B as v, w as m, D as S, L as j, v as ve, s as U, t as b, a8 as Be, k as K, a9 as Ae, b as p, V as L, j as B, i as A, l as F, M as $, aa as z, ab as Ne, ac as ye, ad as Y, ae as Ce, A as De, R as Ie, e as T } from "./index-DyXIO7KH.js";
1
+ import { S as G, E as d, B as v, w as m, D as S, L as j, v as ve, s as U, t as b, a8 as Be, k as K, a9 as Ae, b as p, V as L, j as B, i as A, l as F, M as $, aa as z, ab as Ne, ac as ye, ad as Y, ae as Ce, A as De, R as Ie, e as T } from "./index-vzWoc22W.js";
2
2
  import { b as q } from "./colorToUniform-C2jGzNe1.js";
3
- import { e as Ge, G as Ue, c as Fe, b as Oe, U as Pe, R as Me, B as Z, d as N, f as Le, S as He, a as we } from "./SharedSystems-BUZjMwM9.js";
3
+ import { e as Ge, G as Ue, c as Fe, b as Oe, U as Pe, R as Me, B as Z, d as N, f as Le, S as He, a as we } from "./SharedSystems-84EoMkf6.js";
4
4
  class Q {
5
5
  constructor() {
6
6
  this._tempState = G.for2d(), this._didUploadHash = {};
@@ -1,6 +1,6 @@
1
- import { S as E, g as A, E as p, f as ae, D as S, b as C, B as T, c as ue, d as L, h as M, w as v, i as x, j as ce, k as de, l as k, m as w, M as D, n as H, o as he, p as pe, q as z, s as F, t as R, A as le, R as fe, e as B } from "./index-DyXIO7KH.js";
1
+ import { S as E, g as A, E as p, f as ae, D as S, b as C, B as T, c as ue, d as L, h as M, w as v, i as x, j as ce, k as de, l as k, m as w, M as D, n as H, o as he, p as pe, q as z, s as F, t as R, A as le, R as fe, e as B } from "./index-vzWoc22W.js";
2
2
  import { l as ge, a as me } from "./colorToUniform-C2jGzNe1.js";
3
- import { c as _e, u as be, U as xe, B as ye, G as Ge, e as Se, R as Be, t as Pe, S as Te, a as Ce } from "./SharedSystems-BUZjMwM9.js";
3
+ import { c as _e, u as be, U as xe, B as ye, G as Ge, e as Se, R as Be, t as Pe, S as Te, a as Ce } from "./SharedSystems-84EoMkf6.js";
4
4
  const y = E.for2d();
5
5
  class O {
6
6
  start(e, t, r) {
@@ -1,5 +1,5 @@
1
- import { T as M, U as Z, P as m, r as te, E as y, a as ie, w as g, e as P, C as V } from "./index-DyXIO7KH.js";
2
- import "./webworkerAll-BHvFAvAJ.js";
1
+ import { T as M, U as Z, P as m, r as te, E as y, a as ie, w as g, e as P, C as V } from "./index-vzWoc22W.js";
2
+ import "./webworkerAll-D3uve5FK.js";
3
3
  class q {
4
4
  constructor(e) {
5
5
  this._lastTransform = "", this._observer = null, this._tickerAttached = !1, this.updateTranslation = () => {
@@ -5602,7 +5602,7 @@ const as = (s) => {
5602
5602
  },
5603
5603
  test: () => !0,
5604
5604
  load: async () => {
5605
- await import("./browserAll-CgzKDh9G.js");
5605
+ await import("./browserAll-gdNZPp2i.js");
5606
5606
  }
5607
5607
  }, Vc = {
5608
5608
  extension: {
@@ -5612,7 +5612,7 @@ const as = (s) => {
5612
5612
  },
5613
5613
  test: () => typeof self < "u" && self.WorkerGlobalScope !== void 0,
5614
5614
  load: async () => {
5615
- await import("./webworkerAll-BHvFAvAJ.js");
5615
+ await import("./webworkerAll-D3uve5FK.js");
5616
5616
  }
5617
5617
  };
5618
5618
  class yt {
@@ -14800,13 +14800,13 @@ async function Uu(s) {
14800
14800
  for (let a = 0; a < t.length; a++) {
14801
14801
  const h = t[a];
14802
14802
  if (h === "webgpu" && await Ru()) {
14803
- const { WebGPURenderer: l } = await import("./WebGPURenderer-BIu3svRd.js");
14803
+ const { WebGPURenderer: l } = await import("./WebGPURenderer-BIy0qtY7.js");
14804
14804
  e = l, r = { ...s, ...s.webgpu };
14805
14805
  break;
14806
14806
  } else if (h === "webgl" && Pu(
14807
14807
  s.failIfMajorPerformanceCaveat ?? za.defaultOptions.failIfMajorPerformanceCaveat
14808
14808
  )) {
14809
- const { WebGLRenderer: l } = await import("./WebGLRenderer-BiM4kX3p.js");
14809
+ const { WebGLRenderer: l } = await import("./WebGLRenderer-t-t-51YG.js");
14810
14810
  e = l, r = { ...s, ...s.webgl };
14811
14811
  break;
14812
14812
  } else if (h === "canvas")
@@ -31759,7 +31759,7 @@ class oi {
31759
31759
  e,
31760
31760
  r,
31761
31761
  Math.min(o, e / 2, r / 2)
31762
- ), this.maskGraphics.fill({ color: 16777215, alpha: 1 }), this.maskGraphics.visible = !0) : this.maskGraphics && (this.maskGraphics.visible = !1, this.pixiSprite.mask = null), this.applyStroke(t, e, r), this.applyShadow(t);
31762
+ ), this.maskGraphics.fill({ color: 16777215, alpha: 1 }), this.maskGraphics.visible = !0) : this.maskGraphics && (this.maskGraphics.visible = !1, this.pixiSprite.mask = null), this.sprite.type !== "Text" && this.sprite.type !== "Caption" ? this.applyStroke(t, e, r) : this.strokeGraphics && (this.strokeGraphics.visible = !1), this.applyShadow(t);
31763
31763
  }
31764
31764
  applyStroke(t, e, r) {
31765
31765
  const o = t.stroke;
@@ -31806,15 +31806,12 @@ class oi {
31806
31806
  _
31807
31807
  );
31808
31808
  } else
31809
- this.shadowGraphics.rect(
31810
- -r / 2,
31811
- -o / 2,
31812
- r,
31813
- o
31814
- );
31809
+ this.shadowGraphics.rect(-r / 2, -o / 2, r, o);
31815
31810
  if (this.shadowGraphics.fill({ color: a, alpha: h }), l > 0) {
31816
31811
  (!this.shadowContainer.filters || this.shadowContainer.filters.length === 0) && (this.shadowContainer.filters = [new vl()]);
31817
- const _ = this.shadowContainer.filters[0], n = this.root ? Math.sqrt(this.root.worldTransform.a ** 2 + this.root.worldTransform.b ** 2) : 1;
31812
+ const _ = this.shadowContainer.filters[0], n = this.root ? Math.sqrt(
31813
+ this.root.worldTransform.a ** 2 + this.root.worldTransform.b ** 2
31814
+ ) : 1;
31818
31815
  _.strength = l * n, _.resolution = this.resolution, _.padding = Math.max(l * 2 * n, 20);
31819
31816
  } else
31820
31817
  this.shadowContainer.filters = [];
@@ -36748,7 +36745,7 @@ class _y extends Vo {
36748
36745
  autoDensity: !0
36749
36746
  }), this.pixiApp = e, e.stage.eventMode = "static", e.stage.hitArea = e.screen, e.stage.on("pointerdown", (o) => {
36750
36747
  o.target === e.stage && this.deselectClip();
36751
- }), this.artboard = new nt(), this.artboard.label = "ArtboardRoot", e.stage.addChild(this.artboard), this.artboardBg = new ut(), this.artboardBg.rect(0, 0, this.opts.width, this.opts.height).fill({ color: 0 }), this.artboard.addChild(this.artboardBg), this.clipContainer = new nt(), this.clipContainer.label = "ClipContainer", this.artboard.addChild(this.clipContainer), this.artboardMask = new ut(), this.artboardMask.rect(0, 0, this.opts.width, this.opts.height).fill({ color: 16777215 }), this.clipContainer.addChild(this.artboardMask), this.clipContainer.mask = this.artboardMask, this.clipsEffectContainer = new nt(), this.clipsEffectContainer.label = "ClipsEffect", this.clipsEffectContainer.visible = !1, this.clipsEffectContainer.zIndex = 1, this.clipsEffectContainer.sortableChildren = !0, this.clipContainer.addChild(this.clipsEffectContainer), this.clipsNormalContainer = new nt(), this.clipsNormalContainer.label = "ClipsNormal", this.clipsNormalContainer.zIndex = 10, this.clipsNormalContainer.sortableChildren = !0, this.clipContainer.addChild(this.clipsNormalContainer), this.transFromTexture = wt.create({
36748
+ }), this.artboard = new nt(), this.artboard.label = "ArtboardRoot", e.stage.addChild(this.artboard), this.artboardBg = new ut(), this.artboardBg.rect(0, 0, this.opts.width, this.opts.height).fill({ color: 13882323 }), this.artboard.addChild(this.artboardBg), this.clipContainer = new nt(), this.clipContainer.label = "ClipContainer", this.artboard.addChild(this.clipContainer), this.artboardMask = new ut(), this.artboardMask.rect(0, 0, this.opts.width, this.opts.height).fill({ color: 16777215 }), this.clipContainer.addChild(this.artboardMask), this.clipContainer.mask = this.artboardMask, this.clipsEffectContainer = new nt(), this.clipsEffectContainer.label = "ClipsEffect", this.clipsEffectContainer.visible = !1, this.clipsEffectContainer.zIndex = 1, this.clipsEffectContainer.sortableChildren = !0, this.clipContainer.addChild(this.clipsEffectContainer), this.clipsNormalContainer = new nt(), this.clipsNormalContainer.label = "ClipsNormal", this.clipsNormalContainer.zIndex = 10, this.clipsNormalContainer.sortableChildren = !0, this.clipContainer.addChild(this.clipsNormalContainer), this.transFromTexture = wt.create({
36752
36749
  width: this.opts.width,
36753
36750
  height: this.opts.height
36754
36751
  }), this.transToTexture = wt.create({
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import { aw as i, ax as o, aD as t, aB as C, aK as e, aM as p, ay as n, aF as r, az as T, aE as l, aA as m, aC as f, az as I, aG as d, au as x, ar as M, as as O, aI as P, aH as c, aJ as u, aL as A, at as E, av as N } from "./index-DyXIO7KH.js";
1
+ import { aw as i, ax as o, aD as t, aB as C, aK as e, aM as p, ay as n, aF as r, az as T, aE as l, aA as m, aC as f, az as I, aG as d, au as x, ar as M, as as O, aI as P, aH as c, aJ as u, aL as A, at as E, av as N } from "./index-vzWoc22W.js";
2
2
  export {
3
3
  i as AudioClip,
4
4
  o as CaptionClip,
package/dist/index.umd.js CHANGED
@@ -4351,7 +4351,7 @@ void main() {
4351
4351
 
4352
4352
  gl_FragColor = color;
4353
4353
  }
4354
- `,uniforms:{uTime:{value:0,type:"f32"},uZoomSpeed:{value:5,type:"f32"},uMaxZoom:{value:2,type:"f32"},uBlurStrength:{value:.01,type:"f32"}}}}},db=Object.entries(Eo).map(([s,e])=>({key:s,label:e.label,previewStatic:`https://cdn.subgen.co/previews/effects/static/effect_${s}_static.webp`,previewDynamic:`https://cdn.subgen.co/previews/effects/dynamic/effect_${s}_dynamic.webp`}));function Io({name:s,renderer:e}){let t;const r=Object.keys(Eo).find(g=>g.toLowerCase()===s.toLowerCase());r&&(t=Eo[r]);const{fragment:n,uniforms:o,label:c}=t,l=new Ae,d=Pe.create({width:e.width,height:e.height}),f=new ht({vertex:Zx,fragment:n,name:`${c}-shader`}),m=new si({glProgram:f,resources:{effectUniforms:{...o}}});return l.filters=[m],{filter:m,render({width:g,height:_,canvasTexture:y,progress:a}){(d.width!==g||d.height!==_)&&d.resize(g,_);const h=y instanceof Pe?y:k.from(y);l.texture=h,l.width=g,l.height=_;const u=m.resources.effectUniforms.uniforms;return u.uTime=a,e.render({container:l,target:d,clear:!0}),d}}}function fb(s,e){const{opacity:t,zIndex:r,flip:n,left:o,top:c,width:l,height:d,angle:f}=s;e.x=o,e.y=c,e.width=Math.abs(l),e.height=Math.abs(d),e.angle=f,e.alpha=t,e.zIndex=r,n==="horizontal"?e.scale.x=-Math.abs(e.scale.x):n==="vertical"&&(e.scale.y=-Math.abs(e.scale.y))}class ar{constructor(e,t,r=null){this.sprite=t,this.targetContainer=r,!r&&e&&(this.targetContainer=e.stage),this.resolution=e?.renderer?.resolution??1,this.canvas=new OffscreenCanvas(1,1);const n=this.canvas.getContext("2d");if(n==null)throw new Error("Failed to create 2d context for PixiSpriteRenderer");this.context=n}pixiSprite=null;texture=null;canvas;context;root=null;strokeGraphics=null;maskGraphics=null;shadowGraphics=null;shadowContainer=null;resolution=1;destroyed=!1;async updateFrame(e){if(this.destroyed)return;if(e==null){this.root!=null&&(this.root.visible=!1,this.applySpriteTransforms());return}if(e instanceof k){if(e.width===0||e.height===0){console.warn("PixiSpriteRenderer: Invalid texture dimensions",e.width,e.height);return}this.pixiSprite==null?(this.pixiSprite=new Ae(e),this.pixiSprite.label="MainSprite",this.root=new ie,this.root.addChild(this.pixiSprite),this.targetContainer?.addChild(this.root),this.applySpriteTransforms()):this.pixiSprite.texture=e,this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms());return}if(e.width===0||e.height===0){console.warn("PixiSpriteRenderer: Invalid frame dimensions",e.width,e.height);return}const t=this.texture==null||this.pixiSprite==null;if(this.canvas.width!==e.width||this.canvas.height!==e.height||t){if(this.canvas.width=e.width,this.canvas.height=e.height,this.texture!=null&&(this.texture.destroy(!0),this.texture=null),this.texture=k.from(this.canvas),!this.texture||!this.texture.source){console.error("PixiSpriteRenderer: Failed to create valid texture");return}this.pixiSprite==null?(this.pixiSprite=new Ae(this.texture),this.pixiSprite.label="MainSprite",this.root=new ie,this.root.addChild(this.pixiSprite),this.targetContainer?.addChild(this.root),this.applySpriteTransforms()):this.pixiSprite.texture=this.texture}if(this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.context.drawImage(e,0,0),this.texture!=null&&this.texture.source!=null){const n=this.texture.source;if(n.resource){const o=n.resource;o.update&&o.update()}typeof n.update=="function"&&n.update()}this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms())}applySpriteTransforms(){if(this.pixiSprite==null||this.root==null||this.destroyed)return;const{flip:e,center:t,width:r,height:n,angle:o,opacity:c,zIndex:l}=this.sprite;this.root.x=t.x,this.root.y=t.y,this.root.angle=(e==null?1:-1)*o,this.root.alpha=c,this.root.zIndex=l,this.root.scale.set(1,1),this.pixiSprite.anchor.set(.5,.5),this.pixiSprite.position.set(0,0);const d=this.pixiSprite.texture?.width??1,f=this.pixiSprite.texture?.height??1,m=r&&r!==0?Math.abs(r)/d:1,g=n&&n!==0?Math.abs(n)/f:1;e==="horizontal"?(this.pixiSprite.scale.x=-m,this.pixiSprite.scale.y=g):e==="vertical"?(this.pixiSprite.scale.x=m,this.pixiSprite.scale.y=-g):(this.pixiSprite.scale.x=m,this.pixiSprite.scale.y=g),this.applyStyle()}applyStyle(){if(this.pixiSprite==null||this.destroyed)return;const e=this.sprite.style||{},t=this.pixiSprite.texture?.width??0,r=this.pixiSprite.texture?.height??0;if(t===0||r===0)return;const n=e.borderRadius||0;n>0?(this.maskGraphics==null&&(this.maskGraphics=new me,this.pixiSprite.addChild(this.maskGraphics),this.pixiSprite.mask=this.maskGraphics),this.maskGraphics.clear(),this.maskGraphics.roundRect(-t/2,-r/2,t,r,Math.min(n,t/2,r/2)),this.maskGraphics.fill({color:16777215,alpha:1}),this.maskGraphics.visible=!0):this.maskGraphics&&(this.maskGraphics.visible=!1,this.pixiSprite.mask=null),this.applyStroke(e,t,r),this.applyShadow(e)}applyStroke(e,t,r){const n=e.stroke;if(n&&n.width>0){this.strokeGraphics==null&&(this.strokeGraphics=new me,this.pixiSprite.addChild(this.strokeGraphics)),this.strokeGraphics.clear();const o=xe(n.color)??16777215,c=n.width,l=e.borderRadius||0;if(this.strokeGraphics.setStrokeStyle({width:c,color:o,alignment:1}),l>0){const d=Math.min(l,t/2,r/2);this.strokeGraphics.roundRect(-t/2,-r/2,t,r,d)}else this.strokeGraphics.rect(-t/2,-r/2,t,r);this.strokeGraphics.stroke(),this.strokeGraphics.visible=!0}else this.strokeGraphics!=null&&(this.strokeGraphics.visible=!1)}applyShadow(e){const t=e.dropShadow,r=Math.abs(this.sprite.width??0),n=Math.abs(this.sprite.height??0);if(t&&r>0&&n>0&&(t.blur>0||t.distance>0)){this.shadowContainer==null&&(this.shadowContainer=new ie,this.shadowContainer.label="ShadowContainer",this.shadowGraphics=new me,this.shadowContainer.addChild(this.shadowGraphics),this.root.addChildAt(this.shadowContainer,0));const o=xe(t.color)??0,c=t.alpha??.5,l=t.blur??0,d=t.distance??0,f=t.angle??0,m=Math.cos(f)*d,g=Math.sin(f)*d;this.shadowContainer.position.set(m,g),this.shadowGraphics.clear();const _=e.borderRadius||0;if(_>0){const y=Math.min(_,r/2,n/2);this.shadowGraphics.roundRect(-r/2,-n/2,r,n,y)}else this.shadowGraphics.rect(-r/2,-n/2,r,n);if(this.shadowGraphics.fill({color:o,alpha:c}),l>0){(!this.shadowContainer.filters||this.shadowContainer.filters.length===0)&&(this.shadowContainer.filters=[new $c]);const y=this.shadowContainer.filters[0],a=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1;y.strength=l*a,y.resolution=this.resolution,y.padding=Math.max(l*2*a,20)}else this.shadowContainer.filters=[];this.shadowContainer.visible=!0}else this.shadowContainer!=null&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}updateTransforms(){this.root!=null&&!this.destroyed&&this.applySpriteTransforms()}getSprite(){return this.pixiSprite}getRoot(){return this.root}destroy(){this.destroyed||(this.destroyed=!0,this.root!=null&&(this.root.parent&&this.root.parent.removeChild(this.root),this.root.destroy({children:!0}),this.root=null,this.pixiSprite=null),this.strokeGraphics!=null&&(this.strokeGraphics.destroy(),this.strokeGraphics=null),this.maskGraphics!=null&&(this.maskGraphics.destroy(),this.maskGraphics=null),this.shadowGraphics!=null&&(this.shadowGraphics.destroy(),this.shadowGraphics=null),this.shadowContainer!=null&&(this.shadowContainer.destroy({children:!0}),this.shadowContainer=null),this.texture!=null&&(this.texture.destroy(),this.texture=null))}}function lr(s,e=!1){return s.toJSON(e)}async function cr(s){let e,t=null;switch(s.type){case"Video":t=ge;break;case"Audio":t=Me;break;case"Image":t=Te;break;case"Text":t=Je;break;case"Caption":t=Ft;break;case"Effect":t=Qe;break;case"Transition":t=mi;break}if(t&&typeof t.fromObject=="function")return await t.fromObject(s);switch(s.type){case"Video":{const r=await fetch(s.src);if(!r.ok)throw new Error(`Failed to fetch video from ${s.src}: ${r.status} ${r.statusText}. Make sure the file exists in the public directory.`);const n=s.audio!==void 0?{audio:s.audio,volume:s.volume}:{volume:s.volume};e=new ge(r.body,n,s.src);break}case"Audio":{if(!s.src||s.src.trim()==="")throw new Error("AudioClip requires a valid source URL");const r={};s.loop!==void 0&&(r.loop=s.loop),s.volume!==void 0&&(r.volume=s.volume),e=await Me.fromUrl(s.src,r);break}case"Image":{if(!s.src||s.src.trim()==="")throw new Error("ImageClip requires a valid source URL. Generated clips (like text-to-image) cannot be loaded from JSON without their source data.");try{const r=await fetch(s.src);if(!r.ok)throw new Error(`Failed to fetch image from ${s.src}: ${r.status} ${r.statusText}. Make sure the file exists in the public directory.`);const n=await r.blob();if(!n.type.startsWith("image/"))throw new Error(`Invalid image format: ${n.type}. Expected an image file.`);e=new Te(await createImageBitmap(n),s.src)}catch(r){throw r instanceof Error&&r.message.includes("could not be decoded")?new Error(`Failed to decode image from ${s.src}. The image may be corrupted, in an unsupported format, or there may be CORS issues.`):r}break}case"Text":{const r=s.text||"",n=s.style||{},o={fontSize:n.fontSize,fontFamily:n.fontFamily,fontWeight:n.fontWeight,fontStyle:n.fontStyle,fill:n.color,align:n.align};n.stroke&&(o.stroke=n.stroke.color,o.strokeWidth=n.stroke.width),n.shadow&&(o.dropShadow={color:n.shadow.color,alpha:n.shadow.alpha,blur:n.shadow.blur,distance:n.shadow.distance,angle:n.shadow.angle}),e=new Je(r,o);break}case"Caption":{const r=s.text||"",n=s.style||{},o={fontSize:n.fontSize,fontFamily:n.fontFamily,fontWeight:n.fontWeight,fontStyle:n.fontStyle,fill:n.color,align:n.align};if(n.fontUrl!==void 0?o.fontUrl=n.fontUrl:s.fontUrl!==void 0&&(o.fontUrl=s.fontUrl),n.stroke&&(o.stroke=n.stroke.color,o.strokeWidth=n.stroke.width),n.shadow&&(o.dropShadow={color:n.shadow.color,alpha:n.shadow.alpha,blur:n.shadow.blur,distance:n.shadow.distance,angle:n.shadow.angle}),s.caption){const c=s.caption;c.words&&(o.words=c.words),c.colors&&(c.colors.appeared!==void 0&&(o.appearedColor=c.colors.appeared),c.colors.active!==void 0&&(o.activeColor=c.colors.active),c.colors.activeFill!==void 0&&(o.activeFillColor=c.colors.activeFill),c.colors.background!==void 0&&(o.backgroundColor=c.colors.background),c.colors.keyword!==void 0&&(o.isKeyWordColor=c.colors.keyword)),c.preserveKeywordColor!==void 0&&(o.preservedColorKeyWord=c.preserveKeywordColor),c.positioning&&(c.positioning.bottomOffset!==void 0&&(o.bottomOffset=c.positioning.bottomOffset),c.positioning.videoWidth!==void 0&&(o.videoWidth=c.positioning.videoWidth),c.positioning.videoHeight!==void 0&&(o.videoHeight=c.positioning.videoHeight))}else s.bottomOffset!==void 0&&(o.bottomOffset=s.bottomOffset),s.words&&(o.words=s.words),s.appearedColor!==void 0&&(o.appearedColor=s.appearedColor),s.activeColor!==void 0&&(o.activeColor=s.activeColor),s.activeFillColor!==void 0&&(o.activeFillColor=s.activeFillColor),s.backgroundColor!==void 0&&(o.backgroundColor=s.backgroundColor),s.isKeyWordColor!==void 0&&(o.isKeyWordColor=s.isKeyWordColor),s.preservedColorKeyWord!==void 0&&(o.preservedColorKeyWord=s.preservedColorKeyWord),s.videoWidth!==void 0&&(o.videoWidth=s.videoWidth),s.videoHeight!==void 0&&(o.videoHeight=s.videoHeight);e=new Ft(r,o);break}case"Effect":{e=new Qe(s.effect.key),e.effect=s.effect;break}default:throw new Error(`Unsupported clip type: ${s.type}`)}return e.left=s.left,e.top=s.top,e.width=s.width,e.height=s.height,e.angle=s.angle,e.display.from=s.display.from,e.display.to=s.display.to,e.duration=s.duration,e.playbackRate=s.playbackRate,e.zIndex=s.zIndex,e.opacity=s.opacity,e.flip=s.flip,s.style&&(e.style={...e.style,...s.style}),s.animation&&e.setAnimation(s.animation.keyFrames,s.animation.opts),s.id&&(e.id=s.id),s.effects&&(e.effects=s.effects),s.trim&&(e.trim.from=s.trim.from<1e6?s.trim.from*1e6:s.trim.from,e.trim.to=s.trim.to<1e6?s.trim.to*1e6:s.trim.to),e}var Po,ad;function pb(){return ad||(ad=1,Po=[{name:"Bounce",paramsTypes:{shadow_colour:"vec4",shadow_height:"float",bounces:"float"},defaultParams:{shadow_colour:[0,0,0,.6],shadow_height:.075,bounces:3},glsl:`// Author: Adrian Purser
4354
+ `,uniforms:{uTime:{value:0,type:"f32"},uZoomSpeed:{value:5,type:"f32"},uMaxZoom:{value:2,type:"f32"},uBlurStrength:{value:.01,type:"f32"}}}}},db=Object.entries(Eo).map(([s,e])=>({key:s,label:e.label,previewStatic:`https://cdn.subgen.co/previews/effects/static/effect_${s}_static.webp`,previewDynamic:`https://cdn.subgen.co/previews/effects/dynamic/effect_${s}_dynamic.webp`}));function Io({name:s,renderer:e}){let t;const r=Object.keys(Eo).find(g=>g.toLowerCase()===s.toLowerCase());r&&(t=Eo[r]);const{fragment:n,uniforms:o,label:c}=t,l=new Ae,d=Pe.create({width:e.width,height:e.height}),f=new ht({vertex:Zx,fragment:n,name:`${c}-shader`}),m=new si({glProgram:f,resources:{effectUniforms:{...o}}});return l.filters=[m],{filter:m,render({width:g,height:_,canvasTexture:y,progress:a}){(d.width!==g||d.height!==_)&&d.resize(g,_);const h=y instanceof Pe?y:k.from(y);l.texture=h,l.width=g,l.height=_;const u=m.resources.effectUniforms.uniforms;return u.uTime=a,e.render({container:l,target:d,clear:!0}),d}}}function fb(s,e){const{opacity:t,zIndex:r,flip:n,left:o,top:c,width:l,height:d,angle:f}=s;e.x=o,e.y=c,e.width=Math.abs(l),e.height=Math.abs(d),e.angle=f,e.alpha=t,e.zIndex=r,n==="horizontal"?e.scale.x=-Math.abs(e.scale.x):n==="vertical"&&(e.scale.y=-Math.abs(e.scale.y))}class ar{constructor(e,t,r=null){this.sprite=t,this.targetContainer=r,!r&&e&&(this.targetContainer=e.stage),this.resolution=e?.renderer?.resolution??1,this.canvas=new OffscreenCanvas(1,1);const n=this.canvas.getContext("2d");if(n==null)throw new Error("Failed to create 2d context for PixiSpriteRenderer");this.context=n}pixiSprite=null;texture=null;canvas;context;root=null;strokeGraphics=null;maskGraphics=null;shadowGraphics=null;shadowContainer=null;resolution=1;destroyed=!1;async updateFrame(e){if(this.destroyed)return;if(e==null){this.root!=null&&(this.root.visible=!1,this.applySpriteTransforms());return}if(e instanceof k){if(e.width===0||e.height===0){console.warn("PixiSpriteRenderer: Invalid texture dimensions",e.width,e.height);return}this.pixiSprite==null?(this.pixiSprite=new Ae(e),this.pixiSprite.label="MainSprite",this.root=new ie,this.root.addChild(this.pixiSprite),this.targetContainer?.addChild(this.root),this.applySpriteTransforms()):this.pixiSprite.texture=e,this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms());return}if(e.width===0||e.height===0){console.warn("PixiSpriteRenderer: Invalid frame dimensions",e.width,e.height);return}const t=this.texture==null||this.pixiSprite==null;if(this.canvas.width!==e.width||this.canvas.height!==e.height||t){if(this.canvas.width=e.width,this.canvas.height=e.height,this.texture!=null&&(this.texture.destroy(!0),this.texture=null),this.texture=k.from(this.canvas),!this.texture||!this.texture.source){console.error("PixiSpriteRenderer: Failed to create valid texture");return}this.pixiSprite==null?(this.pixiSprite=new Ae(this.texture),this.pixiSprite.label="MainSprite",this.root=new ie,this.root.addChild(this.pixiSprite),this.targetContainer?.addChild(this.root),this.applySpriteTransforms()):this.pixiSprite.texture=this.texture}if(this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.context.drawImage(e,0,0),this.texture!=null&&this.texture.source!=null){const n=this.texture.source;if(n.resource){const o=n.resource;o.update&&o.update()}typeof n.update=="function"&&n.update()}this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms())}applySpriteTransforms(){if(this.pixiSprite==null||this.root==null||this.destroyed)return;const{flip:e,center:t,width:r,height:n,angle:o,opacity:c,zIndex:l}=this.sprite;this.root.x=t.x,this.root.y=t.y,this.root.angle=(e==null?1:-1)*o,this.root.alpha=c,this.root.zIndex=l,this.root.scale.set(1,1),this.pixiSprite.anchor.set(.5,.5),this.pixiSprite.position.set(0,0);const d=this.pixiSprite.texture?.width??1,f=this.pixiSprite.texture?.height??1,m=r&&r!==0?Math.abs(r)/d:1,g=n&&n!==0?Math.abs(n)/f:1;e==="horizontal"?(this.pixiSprite.scale.x=-m,this.pixiSprite.scale.y=g):e==="vertical"?(this.pixiSprite.scale.x=m,this.pixiSprite.scale.y=-g):(this.pixiSprite.scale.x=m,this.pixiSprite.scale.y=g),this.applyStyle()}applyStyle(){if(this.pixiSprite==null||this.destroyed)return;const e=this.sprite.style||{},t=this.pixiSprite.texture?.width??0,r=this.pixiSprite.texture?.height??0;if(t===0||r===0)return;const n=e.borderRadius||0;n>0?(this.maskGraphics==null&&(this.maskGraphics=new me,this.pixiSprite.addChild(this.maskGraphics),this.pixiSprite.mask=this.maskGraphics),this.maskGraphics.clear(),this.maskGraphics.roundRect(-t/2,-r/2,t,r,Math.min(n,t/2,r/2)),this.maskGraphics.fill({color:16777215,alpha:1}),this.maskGraphics.visible=!0):this.maskGraphics&&(this.maskGraphics.visible=!1,this.pixiSprite.mask=null),this.sprite.type!=="Text"&&this.sprite.type!=="Caption"?this.applyStroke(e,t,r):this.strokeGraphics&&(this.strokeGraphics.visible=!1),this.applyShadow(e)}applyStroke(e,t,r){const n=e.stroke;if(n&&n.width>0){this.strokeGraphics==null&&(this.strokeGraphics=new me,this.pixiSprite.addChild(this.strokeGraphics)),this.strokeGraphics.clear();const o=xe(n.color)??16777215,c=n.width,l=e.borderRadius||0;if(this.strokeGraphics.setStrokeStyle({width:c,color:o,alignment:1}),l>0){const d=Math.min(l,t/2,r/2);this.strokeGraphics.roundRect(-t/2,-r/2,t,r,d)}else this.strokeGraphics.rect(-t/2,-r/2,t,r);this.strokeGraphics.stroke(),this.strokeGraphics.visible=!0}else this.strokeGraphics!=null&&(this.strokeGraphics.visible=!1)}applyShadow(e){const t=e.dropShadow,r=Math.abs(this.sprite.width??0),n=Math.abs(this.sprite.height??0);if(t&&r>0&&n>0&&(t.blur>0||t.distance>0)){this.shadowContainer==null&&(this.shadowContainer=new ie,this.shadowContainer.label="ShadowContainer",this.shadowGraphics=new me,this.shadowContainer.addChild(this.shadowGraphics),this.root.addChildAt(this.shadowContainer,0));const o=xe(t.color)??0,c=t.alpha??.5,l=t.blur??0,d=t.distance??0,f=t.angle??0,m=Math.cos(f)*d,g=Math.sin(f)*d;this.shadowContainer.position.set(m,g),this.shadowGraphics.clear();const _=e.borderRadius||0;if(_>0){const y=Math.min(_,r/2,n/2);this.shadowGraphics.roundRect(-r/2,-n/2,r,n,y)}else this.shadowGraphics.rect(-r/2,-n/2,r,n);if(this.shadowGraphics.fill({color:o,alpha:c}),l>0){(!this.shadowContainer.filters||this.shadowContainer.filters.length===0)&&(this.shadowContainer.filters=[new $c]);const y=this.shadowContainer.filters[0],a=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1;y.strength=l*a,y.resolution=this.resolution,y.padding=Math.max(l*2*a,20)}else this.shadowContainer.filters=[];this.shadowContainer.visible=!0}else this.shadowContainer!=null&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}updateTransforms(){this.root!=null&&!this.destroyed&&this.applySpriteTransforms()}getSprite(){return this.pixiSprite}getRoot(){return this.root}destroy(){this.destroyed||(this.destroyed=!0,this.root!=null&&(this.root.parent&&this.root.parent.removeChild(this.root),this.root.destroy({children:!0}),this.root=null,this.pixiSprite=null),this.strokeGraphics!=null&&(this.strokeGraphics.destroy(),this.strokeGraphics=null),this.maskGraphics!=null&&(this.maskGraphics.destroy(),this.maskGraphics=null),this.shadowGraphics!=null&&(this.shadowGraphics.destroy(),this.shadowGraphics=null),this.shadowContainer!=null&&(this.shadowContainer.destroy({children:!0}),this.shadowContainer=null),this.texture!=null&&(this.texture.destroy(),this.texture=null))}}function lr(s,e=!1){return s.toJSON(e)}async function cr(s){let e,t=null;switch(s.type){case"Video":t=ge;break;case"Audio":t=Me;break;case"Image":t=Te;break;case"Text":t=Je;break;case"Caption":t=Ft;break;case"Effect":t=Qe;break;case"Transition":t=mi;break}if(t&&typeof t.fromObject=="function")return await t.fromObject(s);switch(s.type){case"Video":{const r=await fetch(s.src);if(!r.ok)throw new Error(`Failed to fetch video from ${s.src}: ${r.status} ${r.statusText}. Make sure the file exists in the public directory.`);const n=s.audio!==void 0?{audio:s.audio,volume:s.volume}:{volume:s.volume};e=new ge(r.body,n,s.src);break}case"Audio":{if(!s.src||s.src.trim()==="")throw new Error("AudioClip requires a valid source URL");const r={};s.loop!==void 0&&(r.loop=s.loop),s.volume!==void 0&&(r.volume=s.volume),e=await Me.fromUrl(s.src,r);break}case"Image":{if(!s.src||s.src.trim()==="")throw new Error("ImageClip requires a valid source URL. Generated clips (like text-to-image) cannot be loaded from JSON without their source data.");try{const r=await fetch(s.src);if(!r.ok)throw new Error(`Failed to fetch image from ${s.src}: ${r.status} ${r.statusText}. Make sure the file exists in the public directory.`);const n=await r.blob();if(!n.type.startsWith("image/"))throw new Error(`Invalid image format: ${n.type}. Expected an image file.`);e=new Te(await createImageBitmap(n),s.src)}catch(r){throw r instanceof Error&&r.message.includes("could not be decoded")?new Error(`Failed to decode image from ${s.src}. The image may be corrupted, in an unsupported format, or there may be CORS issues.`):r}break}case"Text":{const r=s.text||"",n=s.style||{},o={fontSize:n.fontSize,fontFamily:n.fontFamily,fontWeight:n.fontWeight,fontStyle:n.fontStyle,fill:n.color,align:n.align};n.stroke&&(o.stroke=n.stroke.color,o.strokeWidth=n.stroke.width),n.shadow&&(o.dropShadow={color:n.shadow.color,alpha:n.shadow.alpha,blur:n.shadow.blur,distance:n.shadow.distance,angle:n.shadow.angle}),e=new Je(r,o);break}case"Caption":{const r=s.text||"",n=s.style||{},o={fontSize:n.fontSize,fontFamily:n.fontFamily,fontWeight:n.fontWeight,fontStyle:n.fontStyle,fill:n.color,align:n.align};if(n.fontUrl!==void 0?o.fontUrl=n.fontUrl:s.fontUrl!==void 0&&(o.fontUrl=s.fontUrl),n.stroke&&(o.stroke=n.stroke.color,o.strokeWidth=n.stroke.width),n.shadow&&(o.dropShadow={color:n.shadow.color,alpha:n.shadow.alpha,blur:n.shadow.blur,distance:n.shadow.distance,angle:n.shadow.angle}),s.caption){const c=s.caption;c.words&&(o.words=c.words),c.colors&&(c.colors.appeared!==void 0&&(o.appearedColor=c.colors.appeared),c.colors.active!==void 0&&(o.activeColor=c.colors.active),c.colors.activeFill!==void 0&&(o.activeFillColor=c.colors.activeFill),c.colors.background!==void 0&&(o.backgroundColor=c.colors.background),c.colors.keyword!==void 0&&(o.isKeyWordColor=c.colors.keyword)),c.preserveKeywordColor!==void 0&&(o.preservedColorKeyWord=c.preserveKeywordColor),c.positioning&&(c.positioning.bottomOffset!==void 0&&(o.bottomOffset=c.positioning.bottomOffset),c.positioning.videoWidth!==void 0&&(o.videoWidth=c.positioning.videoWidth),c.positioning.videoHeight!==void 0&&(o.videoHeight=c.positioning.videoHeight))}else s.bottomOffset!==void 0&&(o.bottomOffset=s.bottomOffset),s.words&&(o.words=s.words),s.appearedColor!==void 0&&(o.appearedColor=s.appearedColor),s.activeColor!==void 0&&(o.activeColor=s.activeColor),s.activeFillColor!==void 0&&(o.activeFillColor=s.activeFillColor),s.backgroundColor!==void 0&&(o.backgroundColor=s.backgroundColor),s.isKeyWordColor!==void 0&&(o.isKeyWordColor=s.isKeyWordColor),s.preservedColorKeyWord!==void 0&&(o.preservedColorKeyWord=s.preservedColorKeyWord),s.videoWidth!==void 0&&(o.videoWidth=s.videoWidth),s.videoHeight!==void 0&&(o.videoHeight=s.videoHeight);e=new Ft(r,o);break}case"Effect":{e=new Qe(s.effect.key),e.effect=s.effect;break}default:throw new Error(`Unsupported clip type: ${s.type}`)}return e.left=s.left,e.top=s.top,e.width=s.width,e.height=s.height,e.angle=s.angle,e.display.from=s.display.from,e.display.to=s.display.to,e.duration=s.duration,e.playbackRate=s.playbackRate,e.zIndex=s.zIndex,e.opacity=s.opacity,e.flip=s.flip,s.style&&(e.style={...e.style,...s.style}),s.animation&&e.setAnimation(s.animation.keyFrames,s.animation.opts),s.id&&(e.id=s.id),s.effects&&(e.effects=s.effects),s.trim&&(e.trim.from=s.trim.from<1e6?s.trim.from*1e6:s.trim.from,e.trim.to=s.trim.to<1e6?s.trim.to*1e6:s.trim.to),e}var Po,ad;function pb(){return ad||(ad=1,Po=[{name:"Bounce",paramsTypes:{shadow_colour:"vec4",shadow_height:"float",bounces:"float"},defaultParams:{shadow_colour:[0,0,0,.6],shadow_height:.075,bounces:3},glsl:`// Author: Adrian Purser
4355
4355
  // License: MIT
4356
4356
 
4357
4357
  uniform vec4 shadow_colour; // = vec4(0.,0.,0.,.6)
@@ -7786,4 +7786,4 @@ vec4 transition(vec2 uv) {
7786
7786
  bool nextImage = distance(fract(uv * dots), vec2(0.5, 0.5)) < ( progress / distance(uv, center));
7787
7787
  return nextImage ? getToColor(uv) : getFromColor(uv);
7788
7788
  }
7789
- `,f2={radialSwipe:{label:"Radial Swipe",fragment:yb}},vi={...gi.reduce((s,e)=>(s[e.name]={label:e.name,fragment:e.glsl,uniforms:e.defaultParams,previewDynamic:`transition: ${e.name}`},s),{}),...f2},p2=Object.entries(vi).map(([s,e])=>({key:s,label:e.label,previewStatic:`https://cdn.subgen.co/previews/static/transition_${s}_static.webp`,previewDynamic:`https://cdn.subgen.co/previews/dynamic/transition_${s}_dynamic.webp`}));function Ro({name:s,renderer:e}){let t=gi.find(L=>L.name===s);if(!t){const L=Object.keys(vi).find(K=>K.toLowerCase()===s.toLowerCase());L&&(t=vi[L])}if(t||(t=gi.find(L=>L.name.toLowerCase()===s.toLowerCase())),!t){const L=[s,s.toLowerCase(),s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),s.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),s.replace(/_/g,"")];for(const K of L){if(t=gi.find(we=>we.name.toLowerCase()===K.toLowerCase()),t)break;const de=Object.keys(vi).find(we=>we.toLowerCase()===K.toLowerCase());if(de){t=vi[de];break}}}if(!t){const L=gi.length,K=gi.slice(0,5).map(we=>we.name).join(", "),de=Object.keys(vi).slice(0,3).join(", ");throw console.error(`Transition not found: "${s}". Available in gl-transitions (${L} total):`,K+"..."),console.error("Available locally:",de+"..."),new Error(`Transition "${s}" not found in gl-transitions library or local definitions`)}const r=new Ae(k.WHITE),n=Pe.create({width:e.width,height:e.height}),o=new ct({}),c=new ct({}),l=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",d=l?new ct({}):void 0;let f=null;if(l){f=document.createElement("canvas"),f.width=256,f.height=256;const L=f.getContext("2d");if(L){const K=L.createImageData(256,256);for(let de=0;de<K.data.length;de+=4){const we=Math.random();K.data[de]=we*255,K.data[de+1]=we*255,K.data[de+2]=we*255,K.data[de+3]=255}L.putImageData(K,0,0)}}let m=t.glsl||t.fragment;if(!m)throw new Error(`Transition "${s}" has no glsl or fragment code`);let g={...ue.basics,...ue.custom(t)};Object.entries(g).forEach(([,L])=>{L.type==="int<f32>"&&(L.type="i32",typeof L.value=="number"&&(L.value=Math.trunc(L.value))),L.type==="ivec2<f32>"&&(L.type="vec2<f32>")});const _=t.name==="GridFlip"||s.toLowerCase()==="gridflip"||t.label==="gridflip",y=t.name==="circle"||s.toLowerCase()==="circle"||t.label==="circle",a=t.name==="directional"||s.toLowerCase()==="directional"||t.label==="directional",h=t.name==="UndulatingBurnOut"||s.toLowerCase()==="undulatingburnout"||t.label==="undulatingBurnOut",u=t.name==="SquaresWire"||s.toLowerCase()==="squareswire"||t.label==="squaresWire",p=t.name==="rotate_scale_fade"||s.toLowerCase()==="rotatescalefade"||t.label==="rotateScaleFade",v=t.name==="RandomSquares"||s.toLowerCase()==="randomsquares"||t.label==="randomSquares",x=t.name==="polar_function"||s.toLowerCase()==="polar_function"||t.label==="polar_function",b=t.name==="pixelate"||s.toLowerCase()==="pixelate"||t.label==="pixelate",T=t.name==="perlin"||s.toLowerCase()==="perlin"||t.label==="perlin",w=t.name==="luma"||s.toLowerCase()==="luma"||t.label==="luma",S=t.name==="luminance_melt"||s.toLowerCase()==="luminance_melt"||s.toLowerCase()==="luminancemelt"||t.label==="luminance_melt",E=t.name==="hexagonalize"||s.toLowerCase()==="hexagonalize"||t.label==="hexagonalize",I=t.name==="heart"||s.toLowerCase()==="heart"||t.label==="heart",P=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",A=t.name==="directionalwipe"||s.toLowerCase()==="directionalwipe"||s.toLowerCase()==="directional_wipe"||t.label==="directionalwipe",M=t.name==="directionalwarp"||s.toLowerCase()==="directionalwarp"||s.toLowerCase()==="directional_warp"||t.label==="directionalwarp",U=t.name==="crosshatch"||s.toLowerCase()==="crosshatch"||t.label==="crosshatch",H=t.name==="circleopen"||s.toLowerCase()==="circleopen"||s.toLowerCase()==="circle_open"||t.label==="circleopen",re=t.name==="cannabisleaf"||s.toLowerCase()==="cannabisleaf"||s.toLowerCase()==="cannabis_leaf"||t.label==="cannabisleaf",F=t.name==="StereoViewer"||s.toLowerCase()==="stereoviewer"||s.toLowerCase()==="stereo_viewer"||t.label==="StereoViewer",R=t.name==="GlitchDisplace"||s.toLowerCase()==="glitchDisplace"||t.label==="GlitchDisplace",$=t.name==="CrossZoom"||s.toLowerCase()==="crosszoom"||t.label==="CrossZoom",B=t.name==="CrazyParametricFun"||s.toLowerCase()==="crazyparametricfun"||t.label==="CrazyParametricFun",q=t.name==="BowTieHorizontal"||s.toLowerCase()==="bowtiehorizontal"||t.label==="BowTieHorizontal",se=t.name==="PolkaDotsCurtain"||s.toLowerCase()==="polkadotscurtain"||t.label==="PolkaDotsCurtain",ee=t.name==="Pixelize"||s.toLowerCase()==="pixelize"||t.label==="Pixelize";_&&(m=xb,g={...ue.basics,...bb}),y&&(m=Tb,g={...ue.basics,...ld}),a&&(m=wb,g={...ue.basics,...Sb}),h&&(m=Cb,g={...ue.basics,...Ab}),u&&(m=Eb,g={...ue.basics,...Ib}),p&&(m=Pb,g={...ue.basics,...Rb}),v&&(m=Mb,g={...ue.basics,...Fb}),x&&(m=kb,g={...ue.basics,...Ub}),b&&(m=nd,g={...ue.basics,...od}),T&&(m=Db,g={...ue.basics,...Gb}),w&&(m=Lb,g={...ue.basics,...Nb}),S&&(m=zb,g={...ue.basics,...Hb}),E&&(m=Wb,g={...ue.basics,...Vb}),I&&(m=Yb,g={...ue.basics,...Xb}),P&&(m=$b,g={...ue.basics,...qb}),A&&(m=Kb,g={...ue.basics,...jb}),M&&(m=Zb,g={...ue.basics,...Jb}),U&&(m=Qb,g={...ue.basics,...e2}),H&&(m=t2,g={...ue.basics,...ld}),re&&(m=i2,g={...ue.basics,...r2}),F&&(m=s2,g={...ue.basics,...n2}),R&&(m=o2),$&&(m=a2,g={...ue.basics,...l2}),B&&(m=c2,g={...ue.basics,...h2}),q&&(m=u2),se&&(m=d2),ee&&(m=Bb,g={...ue.basics,...Ob});const G={from:o,to:c,uniforms:g};l&&d&&(G.displacementMap=d,f&&(d.resource=f,d.update()));const Ee=new si({glProgram:new ht({vertex:gb,fragment:_b(m)}),resources:G});return r.filters=[Ee],{render({width:L,height:K,from:de,to:we,progress:yi}){if((r.width!==L||r.height!==K)&&(r.setSize({width:L,height:K}),n.resize(L,K)),de instanceof k?Ee.resources.from=de.source:(o.resource=de,o.update(),Ee.resources.from=o),we instanceof k?Ee.resources.to=we.source:(c.resource=we,c.update(),Ee.resources.to=c),l&&d&&f){if(f.width!==L||f.height!==K){f.width=L,f.height=K;const kt=f.getContext("2d");if(kt){const ut=kt.createImageData(L,K);for(let Ge=0;Ge<ut.data.length;Ge+=4){const nt=Math.random();ut.data[Ge]=nt*255,ut.data[Ge+1]=nt*255,ut.data[Ge+2]=nt*255,ut.data[Ge+3]=255}kt.putImageData(ut,0,0)}}d.resource=f,d.update()}return Ee.resources.uniforms.uniforms.progress=yi,e.render({container:r,target:n,clear:!1,width:L,height:K}),n},destroy(){n.destroy(),r.destroy({children:!0})}}}let m2=0;async function cd(s){s()>50&&(await ws(15),await cd(s))}class g2{static async isSupported(e={}){return(self.OffscreenCanvas!=null&&self.VideoEncoder!=null&&self.VideoDecoder!=null&&self.VideoFrame!=null&&self.AudioEncoder!=null&&self.AudioDecoder!=null&&self.AudioData!=null&&((await self.VideoEncoder.isConfigSupported({codec:e.videoCodec??"avc1.42E032",width:e.width??1920,height:e.height??1080,bitrate:e.bitrate??7e6})).supported??!1)&&(await self.AudioEncoder.isConfigSupported({codec:(await la()).codec,sampleRate:le.sampleRate,numberOfChannels:le.channelCount})).supported)??!1}logger=Y.create(`id:${m2++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;hasVideoTrack;evtTool=new Xo;on=this.evtTool.on;constructor(e={}){const{width:t=0,height:r=0}=e;this.canvas=new OffscreenCanvas(t,r),this.opts=Object.assign({bgColor:"#000",width:0,height:0,videoCodec:"avc1.42E032",audio:!0,bitrate:5e6,fps:30,metaDataTags:null},e),this.hasVideoTrack=t*r>0,la().catch(n=>{this.logger.warn("Failed to detect audio codec:",n)})}async initPixiApp(){const{width:e,height:t}=this.opts;if(this.pixiApp=new fn,console.log("PIXI APP 000",this.pixiApp),await this.pixiApp.init({canvas:this.canvas,width:e,height:t,backgroundColor:0,antialias:!1,autoDensity:!1,resolution:1,preference:"webgl"}),this.pixiApp.renderer==null||this.pixiApp.stage==null)throw new Error("Pixi.js Application failed to initialize properly");try{const r=this.pixiApp;r.ticker&&typeof r.ticker.stop=="function"&&r.ticker.stop()}catch{}}async addSprite(e,t={}){const r={rect:{x:e.left,y:e.top,w:e.width,h:e.height},display:{...e.display},duration:e.duration,playbackRate:e.playbackRate,zIndex:e.zIndex};this.logger.info("Compositor add clip",r);const n=await e.clone();console.log("PIXI APP 111",this.pixiApp),this.pixiApp!=null&&this.pixiApp.renderer!=null&&typeof n.setRenderer=="function"&&n.setRenderer(this.pixiApp.renderer),this.logger.info("Compositor add clip ready"),this.sprites.push(Object.assign(n,{main:t.main??!1,expired:!1})),this.sprites.sort((o,c)=>o.zIndex-c.zIndex)}initMuxer(e){const{fps:t,width:r,height:n,videoCodec:o,bitrate:c,audio:l,metaDataTags:d}=this.opts,f=this.sprites.some(_=>_.width>0&&_.height>0),m=this.hasVideoTrack&&f;return sf({video:m?{width:r,height:n,expectFPS:t,codec:o,bitrate:c,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:l===!1?null:{codec:le.codecType,sampleRate:le.sampleRate,channelCount:le.channelCount},duration:e,metaDataTags:d})}output(e={}){if(this.sprites.length===0)throw Error("No sprite added");const t=this.sprites.find(g=>g.main),n=this.sprites.map(g=>g.display.from+g.duration).filter(g=>g!==1/0),o=e.maxTime??(t!=null?t.display.from+t.duration:n.length>0?Math.max(...n):1/0);if(o===1/0||o<=0)throw Error("Unable to determine the end time, please specify a main sprite, or limit the duration of ImageClip, AudioClip");o===-1&&this.logger.warn("Unable to determine the end time, process value don't update"),this.logger.info(`start combinate video, maxTime:${o}`);const c=this.initMuxer(o);let l=performance.now();const d=this.runEncoding(c,o,{onProgress:g=>{this.logger.debug("OutputProgress:",g),this.evtTool.emit("OutputProgress",g)},onEnded:async()=>{await c.flush(),this.logger.info("===== output ended =====, cost:",performance.now()-l),this.evtTool.emit("OutputProgress",1),this.destroy()},onError:g=>{this.evtTool.emit("error",g),m(g),this.destroy()}});this.stopOutput=()=>{d(),c.close(),m()};const{stream:f,stop:m}=Qo(c.mp4file,500,this.destroy);return f}destroy(){if(!this.destroyed&&(this.destroyed=!0,this.stopOutput?.(),this.evtTool.destroy(),this.pixiApp!=null))try{const e=this.pixiApp;if(e.destroyed===!0){this.pixiApp=null;return}if(e.ticker&&typeof e.ticker.stop=="function")try{e.ticker.stop()}catch{}if(e.renderer!=null){const t=e.renderer.gl;if(t&&t.isContextLost()){this.pixiApp=null;return}this.pixiApp.destroy()}}catch(e){console.warn("Error while destroying Pixi application:",e)}finally{this.pixiApp=null}}runEncoding(e,t,{onProgress:r,onEnded:n,onError:o}){let c=0;const l={aborted:!1};let d=null,f=null;const m=async()=>{const{fps:y,bgColor:a,audio:h}=this.opts,u=Math.round(1e6/y),p=this.sprites.some(b=>b.width>0&&b.height>0);f=v2({pixiApp:this.pixiApp,sprites:this.sprites,aborter:l});const v=_2({muxer:e,canvas:this.canvas,outputAudio:h,hasVideoTrack:this.hasVideoTrack&&p,timeSlice:u,fps:y});let x=0;for(;;){if(d!=null)return;if(l.aborted||t!==-1&&x>t||this.sprites.length===0){g(),await n();return}c=x/t;const{audios:b,mainSprDone:T,hasVideo:w}=await f.render(x);if(T){g(),await n();return}if(l.aborted)return;this.hasVideoTrack&&w&&await new Promise(S=>requestAnimationFrame(S)),v(x,b,w),x+=u,await cd(e.getEncodeQueueSize)}},g=()=>{l.aborted||(l.aborted=!0,clearInterval(_),f?.cleanup(),this.sprites.forEach(y=>{y.destroy()}))};m().catch(y=>{d=y,this.logger.error(y),g(),o(y)});const _=setInterval(()=>{r(c)},500);return g}exportToJSON(){const e=this.sprites.map(r=>lr(r,r.main)),t=[];return this.sprites.forEach(r=>{if(r.transition){const n=this.sprites.filter(o=>o.id!==r.id&&o.zIndex===r.zIndex&&o.display.from<r.display.from&&(o instanceof ge||o instanceof Te)).sort((o,c)=>c.display.to-o.display.to)[0];n&&t.push({key:r.transition.name,duration:r.transition.duration,clips:[n.id,r.id]})}}),{clips:e,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,bgColor:this.opts.bgColor,videoCodec:this.opts.videoCodec,bitrate:this.opts.bitrate,audio:this.opts.audio,metaDataTags:this.opts.metaDataTags}}}async loadFromJSON(e){this.sprites.forEach(t=>{t.destroy()}),this.sprites=[],e.settings&&(e.settings.width!==void 0&&(this.opts.width=e.settings.width),e.settings.height!==void 0&&(this.opts.height=e.settings.height),e.settings.fps!==void 0&&(this.opts.fps=e.settings.fps),e.settings.bgColor!==void 0&&(this.opts.bgColor=e.settings.bgColor),e.settings.videoCodec!==void 0&&(this.opts.videoCodec=e.settings.videoCodec),e.settings.bitrate!==void 0&&(this.opts.bitrate=e.settings.bitrate),e.settings.audio!==void 0&&(this.opts.audio=e.settings.audio===!1?!1:void 0),e.settings.metaDataTags!==void 0&&(this.opts.metaDataTags=e.settings.metaDataTags));for(const t of e.clips){const r=await cr(t);if(await this.addSprite(r,{main:t.main||!1}),t.type==="Transition"){const n=t.toClipId,o=this.sprites.find(c=>c.id===n);o?(console.log(`[Compositor] Applying transition ${t.transitionEffect.key} to clip ${n}`),o.transition={name:t.transitionEffect.key,duration:t.duration,prevClipId:t.fromClipId||""}):console.warn(`[Compositor] Could not find target clip ${n} for transition ${t.transitionEffect.key}`)}}}}function v2(s){const{pixiApp:e,sprites:t,aborter:r}=s,n=e!=null,o=new Map,c=new Map,l=new Map,d=Pe.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),f=Pe.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),m=new me().rect(0,0,e?.renderer.width||0,e?.renderer.height||0).fill({color:0}),g=new Map,_=T=>t.filter(w=>w.id!==T.id&&w.zIndex===T.zIndex&&w.display.from<T.display.from&&(w instanceof ge||w instanceof Te)).sort((w,S)=>S.display.to-w.display.to)[0]||null,y=async(T,w,S)=>{let E=null;if(T.transition?.prevClipId&&(E=t.find(M=>M.id===T.transition.prevClipId)||null),E||(E=_(T)),!E)return null;const I=E.duration>0?E.duration:0,P=Math.max(0,Math.min(w-E.display.from,I)),{video:A}=await S(E,P);return A},a=(T,w,S)=>{if(!e)return;e.renderer.render({container:m,target:S,clear:!0});const E=new Ae(w instanceof k?w:k.from(w));E.x=T.center.x,E.y=T.center.y,E.anchor.set(.5,.5);const I=E.texture.width||1,P=E.texture.height||1,A=T.width&&T.width!==0?Math.abs(T.width)/I:1,M=T.height&&T.height!==0?Math.abs(T.height)/P:1;T.flip==="horizontal"?(E.scale.x=-A,E.scale.y=M):T.flip==="vertical"?(E.scale.x=A,E.scale.y=-M):(E.scale.x=A,E.scale.y=M),E.rotation=(T.flip==null?1:-1)*T.angle,E.alpha=T.opacity;const U=T.style||{},H=U.borderRadius||0;let re=null;H>0&&(re=new me,re.roundRect(-I/2,-P/2,I,P,Math.min(H,I/2,P/2)),re.fill({color:16777215,alpha:1}),E.addChild(re),E.mask=re);const F=U.stroke;let R=null;if(F&&F.width>0){R=new me;const q=xe(F.color)??16777215,se=F.width;if(R.setStrokeStyle({width:se,color:q,alignment:1}),H>0){const ee=Math.min(H,I/2,P/2);R.roundRect(-I/2,-P/2,I,P,ee)}else R.rect(-I/2,-P/2,I,P);R.stroke(),E.addChild(R)}const $=U.dropShadow;let B=null;if($&&($.blur>0||$.distance>0)){B=new me;const q=xe($.color)??0,se=$.alpha??.5,ee=$.distance??0,G=$.angle??0,Ee=Math.cos(G)*ee,L=Math.sin(G)*ee;if(H>0){const K=Math.min(H,I/2,P/2);B.roundRect(-I/2+Ee,-P/2+L,I,P,K)}else B.rect(-I/2+Ee,-P/2+L,I,P);B.fill({color:q,alpha:se}),E.addChildAt(B,0)}e.renderer.render({container:E,target:S,clear:!1}),w instanceof k||E.texture.destroy(!0),R&&R.destroy(),re&&re.destroy(),B&&B.destroy(),E.destroy()};let h=null,u=null,p=null;n&&e!=null&&(h=new ie,u=new ie,p=new ie,u.sortableChildren=!0,p.sortableChildren=!0,e.stage.addChild(u),e.stage.addChild(p),h.visible=!1,e.stage.addChild(h));const v=[...t].sort((T,w)=>T.zIndex-w.zIndex);return{render:async T=>{const w=[];let S=!1,E=!1;const I=new Map,P=async(A,M)=>{const U=`${A.id}_${M}`;if(I.has(U))return I.get(U);const H=await A.getFrame(M);return I.set(U,H),H};for(const A of l.values())A.visible=!1;for(const A of v){if(r.aborted)break;if(T<A.display.from||A.expired){if(n&&e!=null){const R=o.get(A);R&&await R.updateFrame(null)}continue}const M=T-A.display.from,U=M*A.playbackRate;A.animate(U);const{video:H,audio:re,done:F}=await P(A,M);if(w.push(re),n&&e!=null&&u!=null){if((A instanceof ge||A instanceof Te)&&A.transition&&M>=0&&M<=A.transition.duration){const B=await y(A,T,P),q=H;if(B&&q){const se=M/A.transition.duration,ee=_(A);ee?a(ee,B,d):e.renderer.render({container:m,target:d,clear:!0}),a(A,q,f);let G=c.get(A.id);G||(G=Ro({name:A.transition.name,renderer:e.renderer}),c.set(A.id,G));const Ee=G.render({width:e.renderer.width,height:e.renderer.height,from:d,to:f,progress:se});let L=l.get(A.id);L||(L=new Ae,L.label=`TransitionSprite_${A.id}`,l.set(A.id,L),u.addChild(L)),L.texture=Ee,L.visible=!0,L.x=0,L.y=0,L.width=e.renderer.width,L.height=e.renderer.height,L.anchor.set(0,0),L.zIndex=A.zIndex,E=!0;const K=o.get(A);if(K){const de=K.getRoot();de&&(de.visible=!1)}if(ee){const de=o.get(ee);if(de){const we=de.getRoot();we&&(we.visible=!1)}}continue}}let $=o.get(A);$==null&&H!=null&&($=new ar(e,A,u),o.set(A,$)),$!=null&&(H!=null?(E=!0,await $.updateFrame(H)):await $.updateFrame(null)),$?.updateTransforms()}if(A.duration>0&&T>A.display.from+A.duration||F){if(A.main&&(S=!0),A.expired=!0,n){const R=o.get(A);if(R!=null){const $=R.getRoot();$&&($.visible=!1)}}}else if(n){const R=o.get(A);R?.updateTransforms()}}if(n&&e!=null&&h!=null&&u!=null&&p!=null){let A=null;for(const M of t)if(M instanceof Qe&&T>=M.display.from&&T<M.display.from+M.duration){A={id:M.id,key:M.effect.key,startTime:M.display.from,duration:M.duration};break}if(!A)for(const M of t){if(M.effects&&M.effects.length>0){for(const U of M.effects)if(T>=U.startTime&&T<U.startTime+U.duration){A=U;break}}if(A)break}p.removeChildren();for(const M of o.values()){const U=M.getRoot();U&&U.parent!==u&&(U.parent&&U.parent.removeChild(U),u.addChild(U))}if(A){const{key:M,startTime:U,duration:H,id:re}=A,F=T-U,R=H>0?Math.min(Math.max(F/H,0),1):0,$=t.some(B=>B.id===re&&B instanceof Qe);for(const B of t){let q=!1;if($?q=B.id!==re&&!(B instanceof Qe):q=!!B.effects&&B.effects.some(se=>se.id===re),q){const se=o.get(B);if(se){const ee=se.getRoot();ee&&(ee.parent&&ee.parent.removeChild(ee),h.addChild(ee))}}}if(h.children.length>0){let B=g.get(re);if(!B)try{const q=Io({name:M,renderer:e.renderer});q&&q.filter&&(B={filter:q.filter,render:q.render},g.set(re,B))}catch(q){console.warn("Failed to create effect",M,q)}if(B){const{filter:q,render:se}=B;q.resources&&q.resources.effectUniforms&&(q.resources.effectUniforms.uniforms.uTime=R);const ee=e.renderer.width,G=e.renderer.height,Ee=Pe.create({width:ee,height:G});if(h.visible=!0,e.renderer.render({container:h,target:Ee,clear:!0}),h.visible=!1,se){const L=se({canvasTexture:Ee,progress:R,width:ee,height:G}),K=new Ae(L);K.width=ee,K.height=G,p.addChild(K)}}}}}return n&&e!=null&&e.render(),{audios:w,mainSprDone:S,hasVideo:E}},cleanup:()=>{d&&d.destroy(!0),f&&f.destroy(!0),m&&m.destroy(!0);for(const T of l.values())T.destroy();l.clear(),c.clear(),h&&h.destroy({children:!0}),u&&u.destroy({children:!0}),p&&p.destroy({children:!0}),o.forEach(T=>{T.destroy()}),o.clear()}}}function _2(s){const{canvas:e,outputAudio:t,muxer:r,hasVideoTrack:n,timeSlice:o}=s;let c=0;const l=Math.floor(3*s.fps),d=y2(1024);return(f,m,g)=>{if(t!==!1)for(const _ of d(f,m))r.encodeAudio(_);if(n&&g)try{const _=new VideoFrame(e,{duration:o,timestamp:f});r.encodeVideo(_,{keyFrame:c%l===0}),c+=1}catch(_){console.warn("Failed to create VideoFrame from canvas, skipping frame:",_)}}}function y2(s){const e=s*le.channelCount,t=new Float32Array(e*3);let r=0,n=0;const o=s/le.sampleRate*1e6,c=new Float32Array(e),l=d=>{let f=0;const m=Math.floor(r/e),g=[];for(let _=0;_<m;_++)g.push(new AudioData({timestamp:n,numberOfChannels:le.channelCount,numberOfFrames:s,sampleRate:le.sampleRate,format:"f32",data:t.subarray(f,f+e)})),f+=e,n+=o;for(t.set(t.subarray(f,r),0),r-=f;d-n>o;)g.push(new AudioData({timestamp:n,numberOfChannels:le.channelCount,numberOfFrames:s,sampleRate:le.sampleRate,format:"f32",data:c})),n+=o;return g};return(d,f)=>{const m=Math.max(...f.map(g=>g[0]?.length??0));for(let g=0;g<m;g++){let _=0,y=0;for(let a=0;a<f.length;a++){const h=f[a][0]?.[g]??0,u=f[a][1]?.[g]??h;_+=h,y+=u}t[r]=_,t[r+1]=y,r+=2}return l(d)}}class x2 extends me{constructor(){super(),this.eventMode="static",this.cursor="move"}draw(e,t=1){const n=1*t;this.clear(),this.setStrokeStyle({width:n,color:5620223}).rect(e.x,e.y,e.width,e.height).stroke(),this.hitArea=e}}class St extends me{#e=!1;handle;cursor;callbacks;constructor(e,t,r){super(),this.handle=e,this.cursor=t,this.callbacks=r,this.eventMode="static",this.#o(),this.on("pointerdown",this.#t),this.on("globalpointermove",this.#r),this.on("pointerup",this.#l),this.on("pointerupoutside",this.#l)}#o(){this.clear(),this.handle==="rot"?(this.circle(0,0,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:13421772}),this.moveTo(0,-5),this.arc(0,0,5,-Math.PI/2,Math.PI,!1),this.stroke({width:1,color:0}),this.moveTo(0,-8),this.lineTo(-3,-5),this.lineTo(0,-2),this.stroke({width:1,color:0,cap:"round",join:"round"}),this.hitArea=new Yr(0,0,24)):(this.rect(-5,-5,10,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:5620223}),this.hitArea=new V(-15,-15,30,30))}#t=e=>{this.#e=!0,this.cursor="grabbing",this.callbacks.beginDrag(this.handle,e.global),e.stopPropagation()};#r=e=>{this.#e&&(this.callbacks.updateDrag(this.handle,e.global),e.stopPropagation())};#l=e=>{this.#e&&(this.#e=!1,this.cursor="pointer",this.callbacks.endDrag(),e.stopPropagation())}}const hd={delta:new O};class b2 extends ie{group;wireframe=new x2;isDragging=!1;lastPointer=new J;activeHandle=null;#e;#o=new Map;#t=new J;#r=0;#l=0;#a=new V;#i=new J;#c=new V;#s=1;#n=1;opts;constructor(e){super(),this.opts=e,this.group=e.group,this.eventMode="static";const t={beginDrag:(r,n)=>this.#y(r,n),updateDrag:(r,n)=>this.#x(r,n),endDrag:()=>this.#f()};this.#e={tl:new St("tl","nwse-resize",t),tr:new St("tr","nesw-resize",t),bl:new St("bl","nesw-resize",t),br:new St("br","nwse-resize",t),ml:new St("ml","ew-resize",t),mr:new St("mr","ew-resize",t),mt:new St("mt","ns-resize",t),mb:new St("mb","ns-resize",t),rot:new St("rot","crosshair",{beginDrag:(r,n)=>this.#T(n),updateDrag:(r,n)=>this.#w(n),endDrag:()=>this.#f()})},this.addChild(this.wireframe,...Object.values(this.#e)),this.#m(),Ne.shared.addOnce(()=>this.#h())}#m(){this.on("pointerdown",this.#v),this.on("pointerup",this.#d),this.on("pointerupoutside",this.#d),this.on("globalpointermove",this.#_)}#h(){if(this.group.length===1){const e=this.group[0];this.#r=e.rotation;const t=this.#g(e);let r,n;this.opts.clip?(r=this.opts.clip.width,n=this.opts.clip.height):(r=t.width,n=t.height),this.#t.set(e.worldTransform.tx,e.worldTransform.ty),this.#c.copyFrom(new V(-r/2,-n/2,r,n))}else{const e=this.#S();this.#t.set(e.x+e.width/2,e.y+e.height/2);let t=e.width,r=e.height;if(this.parent){const o=new J(e.x,e.y),c=new J(e.x+e.width,e.y+e.height),l=this.parent.toLocal(o),d=this.parent.toLocal(c);t=Math.abs(d.x-l.x),r=Math.abs(d.y-l.y)}const n=new V(-t/2,-r/2,t,r);this.#c.copyFrom(n)}this.#u()}#g(e){const t=e.children.filter(d=>d.label!=="ShadowContainer");if(t.length===0){const d=e.getLocalBounds();return new V(d.minX,d.minY,d.maxX-d.minX,d.maxY-d.minY)}const r=t.find(d=>d.label==="MainSprite");if(r){const d=r.getLocalBounds();return new V(d.minX,d.minY,d.maxX-d.minX,d.maxY-d.minY)}let n=1/0,o=1/0,c=-1/0,l=-1/0;for(const d of t){const f=d.getBounds(),m=e.toLocal(new J(f.minX,f.minY)),g=e.toLocal(new J(f.maxX,f.maxY));n=Math.min(n,m.x,g.x),o=Math.min(o,m.y,g.y),c=Math.max(c,m.x,g.x),l=Math.max(l,m.y,g.y)}return new V(n,o,c-n,l-o)}updateBounds(){this.#h()}#v=e=>{this.#h(),this.isDragging=!0,this.lastPointer.copyFrom(e.global),this.cursor="grabbing"};#d=()=>{this.isDragging&&this.emit("transformEnd"),this.isDragging=!1,this.activeHandle=null,this.cursor="default"};#_=e=>{if(!this.isDragging||this.activeHandle||!this.parent)return;const t=this.parent.toLocal(this.lastPointer),r=this.parent.toLocal(e.global),n=r.x-t.x,o=r.y-t.y;for(const d of this.group)d.x+=n,d.y+=o;const c=e.global.x-this.lastPointer.x,l=e.global.y-this.lastPointer.y;this.#t.x+=c,this.#t.y+=l,this.lastPointer.copyFrom(e.global),this.#u()};#y(e,t){this.#h(),this.isDragging=!0,this.activeHandle=e,console.log("[Transformer] #beginHandleDrag called, activeHandle:",this.activeHandle),this.#o.clear();for(const r of this.group)this.#o.set(r,r.localTransform.clone());this.rotation=this.#r,this.#a.copyFrom(this.#c),this.#C(e)}#x(e,t){this.#b(e,t)}async#b(e,t){const r=this.#i,n=this.#A(e,this.toLocal(t),r),o=n.width/this.#a.width,c=n.height/this.#a.height,l=this.toGlobal(r);if(this.opts.clip&&this.opts.clip.constructor.name==="TextClip"){const f=n.width;console.log("[Transformer] TextClip scaling:",{handle:e,originalWidth:this.#a.width,newWidth:f,sx:o,sy:c}),this.emit("textClipResize",{handle:e,newWidth:f,newHeight:n.height,pivotWorld:l,proposed:n})}else this.#p(this.#E(l,this.#r,o,c));this.#c.copyFrom(n),this.#u()}#T(e){this.#h(),this.isDragging=!0,this.activeHandle="rot",this.#o.clear();for(const t of this.group)this.#o.set(t,t.localTransform.clone());this.#l=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)}#w(e){const r=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)-this.#l,n=this.#r+r;this.#p(this.#I(this.#t,r)),this.rotation=n,this.#u(n)}#f(){console.log("[Transformer] #endDrag called, activeHandle:",this.activeHandle),this.isDragging=!1,this.#r=this.rotation,this.activeHandle=null,this.#u(this.#r),this.emit("transformEnd")}#S(){let e=1/0,t=1/0,r=-1/0,n=-1/0;for(const o of this.group){const c=o.children.filter(l=>l.label!=="ShadowContainer");if(c.length===0){const l=o.getBounds();e=Math.min(e,l.minX),t=Math.min(t,l.minY),r=Math.max(r,l.maxX),n=Math.max(n,l.maxY);continue}for(const l of c){const d=l.getBounds();e=Math.min(e,d.minX),t=Math.min(t,d.minY),r=Math.max(r,d.maxX),n=Math.max(n,d.maxY)}}return new V(e,t,r-e,n-t)}#u(e=this.#r){this.parent&&this.position.copyFrom(this.parent.toLocal(this.#t)),this.rotation=e;const r=1/((this.parent?Math.abs(this.parent.worldTransform.a):1)||1),n=this.#c;this.wireframe.draw(n,r);const o=n.x+n.width/2,c=n.y+n.height/2,l=[this.#e.tl,this.#e.tr,this.#e.bl,this.#e.br,this.#e.ml,this.#e.mr,this.#e.mt,this.#e.mb,this.#e.rot];for(const d of l)d.scale.set(r);this.#e.tl.position.set(n.x,n.y),this.#e.tr.position.set(n.x+n.width,n.y),this.#e.bl.position.set(n.x,n.y+n.height),this.#e.br.position.set(n.x+n.width,n.y+n.height),this.#e.ml.position.set(n.x,c),this.#e.mr.position.set(n.x+n.width,c),this.#e.mt.position.set(o,n.y),this.#e.mb.position.set(o,n.y+n.height),this.#e.rot.position.set(o,n.y-30*r)}#C(e){const t=this.#a;if(this.opts.centeredScaling){this.#i.set(t.x+t.width/2,t.y+t.height/2);return}e==="tl"?this.#i.set(t.x+t.width,t.y+t.height):e==="tr"?this.#i.set(t.x,t.y+t.height):e==="bl"?this.#i.set(t.x+t.width,t.y):e==="br"?this.#i.set(t.x,t.y):e==="ml"?this.#i.set(t.x+t.width,t.y+t.height/2):e==="mr"?this.#i.set(t.x,t.y+t.height/2):e==="mt"?this.#i.set(t.x+t.width/2,t.y+t.height):e==="mb"&&this.#i.set(t.x+t.width/2,t.y)}#A(e,t,r){if(this.opts.centeredScaling){const o=Math.max(this.#s,Math.abs(t.x-r.x)*2),c=Math.max(this.#n,Math.abs(t.y-r.y)*2);return new V(r.x-o/2,r.y-c/2,o,c)}if(e==="tl"){const o=Math.min(t.x,r.x-this.#s),c=Math.min(t.y,r.y-this.#n);return new V(o,c,r.x-o,r.y-c)}if(e==="tr"){const o=Math.max(t.x,r.x+this.#s),c=Math.min(t.y,r.y-this.#n);return new V(r.x,c,o-r.x,r.y-c)}if(e==="bl"){const o=Math.min(t.x,r.x-this.#s),c=Math.max(t.y,r.y+this.#n);return new V(o,r.y,r.x-o,c-r.y)}if(e==="br"){const o=Math.max(t.x,r.x+this.#s),c=Math.max(t.y,r.y+this.#n);return new V(r.x,r.y,o-r.x,c-r.y)}const n=this.#a;if(e==="ml"){const o=Math.min(t.x,r.x-this.#s);return new V(o,n.y,r.x-o,n.height)}if(e==="mr"){const o=Math.max(t.x,r.x+this.#s);return new V(r.x,n.y,o-r.x,n.height)}if(e==="mt"){const o=Math.min(t.y,r.y-this.#n);return new V(n.x,o,n.width,r.y-o)}if(e==="mb"){const o=Math.max(t.y,r.y+this.#n);return new V(n.x,r.y,n.width,o-r.y)}return new V(r.x,r.y,this.#s,this.#n)}#E(e,t,r,n){return hd.delta.identity().translate(-e.x,-e.y).rotate(-t).scale(r,n).rotate(t).translate(e.x,e.y)}#I(e,t){return hd.delta.identity().translate(-e.x,-e.y).rotate(t).translate(e.x,e.y)}#p(e){for(const t of this.group){const r=this.#o.get(t),n=t.parent;if(!r||!n)continue;const o=n.worldTransform.clone().invert(),c=n.worldTransform.clone().append(r),l=e.clone().append(c),d=o.clone().append(l);t.setFromMatrix(d)}}}class T2 extends aa{pixiApp=null;tracks=[];clips=[];spriteRenderers=new Map;artboard=null;clipContainer=null;artboardMask=null;artboardBg=null;activeTransformer=null;selectedClips=new Set;interactiveClips=new Set;playbackElements=new Map;videoSprites=new Map;clipListeners=new Map;isPlaying=!1;currentTime=0;playStartTime=0;playStartTimestamp=0;rafId=null;maxDuration=0;opts;destroyed=!1;globalEffects=new Map;activeGlobalEffect=null;currentGlobalEffectSprite=null;effectFilters=new Map;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture=null;transToTexture=null;transBgGraphics=null;clipsNormalContainer=null;clipsEffectContainer=null;videoTextureCache=new WeakMap;lastFromFrame=null;lastToFrame=null;hexToNumber(e){const t=e.startsWith("#")?e.slice(1):e;return parseInt(t,16)}ready;constructor(e){super(),this.opts={fps:30,bgColor:"#000000",interactivity:!0,...e},this.ready=this.initPixiApp()}async initPixiApp(){if(this.destroyed)return;const e=this.opts.canvas||document.createElement("canvas");e.width=this.opts.width,e.height=this.opts.height,console.log("Initializing Pixi.js Application...",{width:this.opts.width,height:this.opts.height});const t=new fn,r=e.parentElement||window;await t.init({canvas:e,resizeTo:r,backgroundColor:this.hexToNumber(this.opts.bgColor),antialias:!0,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.pixiApp=t,t.stage.eventMode="static",t.stage.hitArea=t.screen,t.stage.on("pointerdown",n=>{n.target===t.stage&&this.deselectClip()}),this.artboard=new ie,this.artboard.label="ArtboardRoot",t.stage.addChild(this.artboard),this.artboardBg=new me,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:0}),this.artboard.addChild(this.artboardBg),this.clipContainer=new ie,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new me,this.artboardMask.rect(0,0,this.opts.width,this.opts.height).fill({color:16777215}),this.clipContainer.addChild(this.artboardMask),this.clipContainer.mask=this.artboardMask,this.clipsEffectContainer=new ie,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new ie,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.transFromTexture=Pe.create({width:this.opts.width,height:this.opts.height}),this.transToTexture=Pe.create({width:this.opts.width,height:this.opts.height}),this.transBgGraphics=new me,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}),this.clipContainer.sortableChildren=!0,this.updateArtboardLayout(),t.renderer.on("resize",()=>{this.handleResize()})}getOptions(){return this.opts}updateDimensions(e,t){this.opts.width=e,this.opts.height=t,this.artboardBg&&this.artboardBg.clear().rect(0,0,e,t).fill({color:3355443}),this.artboardMask&&this.artboardMask.clear().rect(0,0,e,t).fill({color:16777215}),this.transFromTexture&&this.transFromTexture.resize(e,t),this.transToTexture&&this.transToTexture.resize(e,t),this.transBgGraphics&&this.transBgGraphics.clear().rect(0,0,e,t).fill({color:3355443}),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}handleResize=()=>{this.destroyed||!this.pixiApp||this.updateArtboardLayout()};updateArtboardLayout(){if(!this.pixiApp||!this.artboard)return;const e=this.pixiApp.canvas.width,t=this.pixiApp.canvas.height,r=this.opts.width,n=this.opts.height,o=this.pixiApp.canvas.parentElement?.clientWidth||e,c=this.pixiApp.canvas.parentElement?.clientHeight||t,l=o/r,d=c/n,f=Math.min(l,d);this.artboard.scale.set(f),this.artboard.x=(o-r*f)/2,this.artboard.y=(c-n*f)/2}getCanvas(){if(this.opts.canvas)return this.opts.canvas;if(this.pixiApp?.canvas)return this.pixiApp.canvas;throw new Error("Canvas not initialized yet. Wait for initPixiApp to complete.")}async addMedia(e){if(this.destroyed)return;const t=this.opts.width,r=this.opts.height;t&&r&&(typeof e.scaleToFit=="function"&&await e.scaleToFit(t,r),typeof e.centerInScene=="function"&&e.centerInScene(t,r));const n=e.duration>0?e.duration:5e6;e.duration<=0&&(e.duration=n);const o=this.tracks.filter(d=>["media","video","image","Video","Image"].includes(d.type)),c=o.find(d=>d.clipIds.length>0)||o[0];let l;if(c){l=c.id;const d=n;for(const f of c.clipIds){const m=this.getClipById(f);if(m){const g=m.display.from+d,_=m.display.to+d;await this.updateClip(f,{display:{from:g,to:_}})}}}e.display.from=0,e.display.to=n,await this.addClip(e,{trackId:l}),await this.seek(0)}async addTransition(e,t=2e6,r,n){if(this.destroyed)return;console.log("transitionKey",e);let o=null,c=null;if(r&&n&&(o=this.getClipById(r)??null,c=this.getClipById(n)??null,!o||!c)){console.warn("[Studio] Invalid fromClipId or toClipId",{fromClipId:r,toClipId:n});return}if(!c){const y=this.tracks.filter(a=>["media","video","image","Video","Image"].includes(a.type)||a.clipIds.length>1);for(const a of y){const h=a.clipIds.map(u=>this.getClipById(u)).filter(u=>!!u&&u.type!=="Transition").sort((u,p)=>u.display.from-p.display.from);for(let u=0;u<h.length-1;u++){const p=h[u],v=h[u+1];if(Math.abs(v.display.from-p.display.to)<1e5){o=p,c=v;break}}if(o&&c)break}}if(c&&!o){const y=this.findTrackIdByClipId(c.id);if(y){const a=this.tracks.find(h=>h.id===y);if(a){const h=a.clipIds.map(p=>this.getClipById(p)).filter(p=>!!p&&p.type!=="Transition").sort((p,v)=>p.display.from-v.display.from),u=h.findIndex(p=>p.id===c.id);u>0&&(o=h[u-1])}}}if(!o||!c){console.warn("[Studio] Unable to resolve Clip A and Clip B for transition");return}const l=t,d=c.display.from-l/2,f=d+l,m={key:e,name:e,duration:l,fromClipId:o.id,toClipId:c.id,start:Math.max(0,d),end:f},g=this.findTrackIdByClipId(c.id);if(g){const y=this.tracks.find(a=>a.id===g);if(y){const a=y.clipIds.map(h=>this.getClipById(h)).filter(h=>{if(!h||h.type!=="Transition")return!1;const u=h;return u.fromClipId===o.id&&u.toClipId===c.id});for(const h of a)await this.removeClip(h)}}this.transitionRenderers.has(o.id)&&(this.transitionRenderers.get(o.id)?.destroy(),this.transitionRenderers.delete(o.id)),this.transitionRenderers.has(c.id)&&(this.transitionRenderers.get(c.id)?.destroy(),this.transitionRenderers.delete(c.id)),"transition"in o&&(o.transition={...m}),"transition"in c&&(c.transition={...m});const _=new mi(e);_.duration=l,_.fromClipId=Math.max(0,d)===0?null:o.id,_.toClipId=c.id,_.fromClipId===null&&o&&(_.fromClipId=o.id),_.display.from=Math.max(0,d),_.display.to=f,await this.addClip(_,{trackId:g}),this.seek(this.currentTime)}findTrackIdByClipId(e){for(const t of this.tracks)if(t.clipIds.includes(e))return t.id}async addClip(e,t){let r,n;if(t&&(typeof t=="string"||t instanceof File||t instanceof Blob))r=t;else if(typeof t=="object"&&t!==null&&!("size"in t)){const d=t;r=d.audioSource,n=d.trackId}if(this.destroyed)return;if(this.pixiApp==null)throw new Error("Failed to initialize Pixi.js Application");const o=async()=>{await this.updateFrame(this.currentTime),this.activeTransformer!=null&&this.selectedClips.has(e)&&typeof this.activeTransformer.updateBounds=="function"&&this.activeTransformer.updateBounds()};e.on("propsChange",o),this.clipListeners.set(e,o),this.pixiApp!=null&&typeof e.setRenderer=="function"&&e.setRenderer(this.pixiApp.renderer);const c=await e.ready;if(e.id||(e.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.clips.includes(e)||this.clips.push(e),n){const d=this.tracks.find(f=>f.id===n);d?d.clipIds.includes(e.id)||d.clipIds.push(e.id):this.tracks.unshift({id:n,name:`Track ${this.tracks.length+1}`,type:e.type,clipIds:[e.id]})}else{const d=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;this.tracks.unshift({id:d,name:`Track ${this.tracks.length+1}`,type:e.type,clipIds:[e.id]})}const l=e.duration>0?e.duration:c.duration;if(l===1/0||isNaN(l))await this.recalculateMaxDuration();else{const d=e.display.from+l;d>0&&(this.maxDuration=Math.max(this.maxDuration,d))}if(await this.setupPlaybackForClip(e,r),c.width>0&&c.height>0)if(e instanceof ge){if(e.tickInterceptor!=null){const d=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}}else{const d=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}await this.updateFrame(this.currentTime),this.opts.interactivity&&this.setupSpriteInteractivity(e),this.emit("clip:added",{clip:e,trackId:n||this.tracks.find(d=>d.clipIds.includes(e.id))?.id||""})}addTrack(e){const t={id:e.id||`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:e.name,type:e.type,clipIds:[]};return this.tracks.push(t),this.emit("track:added",{track:t}),t}async setTracks(e){this.tracks=e,await this.recalculateMaxDuration(),await this.updateFrame(this.currentTime)}async removeTrack(e){const t=this.tracks.findIndex(o=>o.id===e);if(t===-1)return;const n=[...this.tracks[t].clipIds];for(const o of n){const c=this.clips.find(l=>l.id===o);c&&await this.removeClip(c)}this.tracks.splice(t,1),this.emit("track:removed",{trackId:e}),await this.recalculateMaxDuration()}getClipById(e){return this.clips.find(t=>t.id===e)}async updateClip(e,t){const r=this.clips.find(n=>n.id===e);if(!r){console.warn(`[Studio] updateClip: Clip not found with id ${e}`);return}if(r instanceof Je&&(await r.updateStyle(t),"style"in t&&delete t.style),Object.assign(r,t),t.display&&!t.duration?r.duration=t.display.to-t.display.from:t.duration&&(!t.display||!t.display.to)&&(r.display||(r.display={from:0,to:t.duration}),r.display.to=r.display.from+t.duration),t.display&&t.duration){const n=t.display.to-t.display.from;n!==t.duration&&(r.duration=n)}else r.display&&(r.display.to=r.display.from+r.duration);await this.recalculateMaxDuration(),this.emit("clip:updated",{clip:r}),await this.updateFrame(this.currentTime)}getTracks(){return this.tracks}getClip(e){return this.clips.find(t=>t.id===e)}setupSpriteInteractivity(e){if(this.interactiveClips.has(e))return;const t=this.spriteRenderers.get(e);if(t==null)return;const r=t.getRoot();r!=null&&(r.eventMode="static",r.cursor="pointer",r.on("pointerdown",n=>{n.stopPropagation(),this.selectClip(e,n.shiftKey)}),this.interactiveClips.add(e))}async setupPlaybackForClip(e,t){if(this.pixiApp!=null){if(!this.isPlaybackCapable(e)){if(this.pixiApp!=null&&(await e.ready).width>0&&(await e.ready).height>0){const r=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,r)}return}try{const r=e;if(e instanceof Me&&t&&typeof t!="string"){const c=URL.createObjectURL(t);e.src=c}const{element:n,objectUrl:o}=await r.createPlaybackElement();if(e instanceof ge){const c=k.from(n),l=new Ae(c);l.visible=!1,this.clipsNormalContainer&&this.clipsNormalContainer.addChild(l),this.videoSprites.set(e,l)}this.playbackElements.set(e,{element:n,objectUrl:o})}catch(r){if(console.warn(`Failed to setup playback for ${e.constructor.name}, falling back to PixiSpriteRenderer:`,r),this.pixiApp!=null){const n=await e.ready;if(n.width>0&&n.height>0){const o=new ar(this.pixiApp,e,this.artboard);this.spriteRenderers.set(e,o)}}}}}isPlaybackCapable(e){return"createPlaybackElement"in e&&"play"in e&&"pause"in e&&"seek"in e&&"syncPlayback"in e&&"cleanupPlayback"in e}async removeClip(e){const t=this.clips.findIndex(l=>l===e);if(t===-1)return;this.selectedClips.has(e)&&this.deselectClip(),this.clips.splice(t,1);for(const l of this.tracks){const d=l.clipIds.indexOf(e.id);d!==-1&&l.clipIds.splice(d,1)}this.interactiveClips.delete(e);const r=this.clipListeners.get(e);r&&(e.off("propsChange",r),this.clipListeners.delete(e));const n=this.spriteRenderers.get(e);n!=null&&(n.destroy(),this.spriteRenderers.delete(e));const o=this.playbackElements.get(e);o!=null&&(this.isPlaybackCapable(e)&&e.cleanupPlayback(o.element,o.objectUrl),this.playbackElements.delete(e));const c=this.videoSprites.get(e);c!=null&&this.pixiApp!=null&&(this.artboard?.removeChild(c),c.destroy(),this.videoSprites.delete(e)),await this.recalculateMaxDuration(),this.emit("clip:removed",{clipId:e.id})}async removeClipById(e){const t=this.clips.find(r=>r.id===e);t&&await this.removeClip(t)}async deleteSelected(){const e=Array.from(this.selectedClips);if(e.length!==0)for(const t of e)await this.removeClip(t)}async duplicateSelected(){const e=Array.from(this.selectedClips);if(e.length===0)return;const t=[];for(const r of e){const n=this.findTrackIdByClipId(r.id);if(!n)continue;const o=this.tracks.find(m=>m.id===n);if(!o)continue;const c=lr(r,!1),l=await cr(c);l.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const d=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,f=`${o.name} (Copy)`;this.addTrack({id:d,name:f,type:o.type}),await this.addClip(l,{trackId:d}),t.push(l.id)}t.length>0&&this.selectClipsByIds(t)}async splitSelected(e){const t=Array.from(this.selectedClips);if(t.length!==1){console.warn("[Studio] Split requires exactly one selected clip");return}const r=t[0],n=e??this.currentTime;if(n<=r.display.from||r.display.to>0&&n>=r.display.to){console.warn("[Studio] Split time is outside clip bounds");return}const o=lr(r,!1),c=n-r.display.from,l=r.playbackRate||1,d=c*l,f={duration:c,display:{from:r.display.from,to:n}};r.trim&&(f.trim={from:r.trim.from,to:r.trim.from+d}),await this.updateClip(r.id,f);const m={...o};m.display={from:n,to:o.display.to},m.duration=o.duration-c,m.trim&&(m.trim={from:m.trim.from+d,to:m.trim.to});const g=await cr(m);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const _=this.findTrackIdByClipId(r.id);_&&(await this.addClip(g,{trackId:_}),this.selectClipsByIds([g.id]))}async trimSelected(e){const t=Array.from(this.selectedClips);if(t.length!==1){console.warn("[Studio] Trim requires exactly one selected clip");return}const r=t[0];console.log("[Studio] Trimming clip:",{clipId:r.id,currentDisplay:r.display,currentDuration:r.duration,currentTrim:r.trim,trimFromSeconds:e});const n=e*1e6,o=r.playbackRate||1,c=n*o;if(n>=r.duration){console.warn("[Studio] Trim amount exceeds clip duration");return}const l=r.duration-n,d=r.display.from+n,f=r.display.to,m={duration:l,display:{from:d,to:f}};if(r.trim)m.trim={from:r.trim.from+c,to:r.trim.to};else{const g=r.sourceDuration||r.duration;m.trim={from:c,to:g}}console.log("[Studio] Trim updates:",m),await this.updateClip(r.id,m),console.log("[Studio] Clip after trim:",{display:r.display,duration:r.duration,trim:r.trim})}async updateSelected(e){const t=Array.from(this.selectedClips);if(t.length!==0)for(const r of t)await this.updateClip(r.id,e)}clear(){this.deselectClip(),this.interactiveClips.clear(),this.effectFilters.clear(),this.globalEffects.clear(),this.spriteRenderers.forEach(e=>{e.destroy()}),this.spriteRenderers.clear();for(const[e,t]of this.playbackElements.entries())this.isPlaybackCapable(e)&&e.cleanupPlayback(t.element,t.objectUrl);this.playbackElements.clear();for(const e of this.videoSprites.values())e.destroy();this.videoSprites.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const e of this.transitionSprites.values())e.parent&&e.parent.removeChild(e),e.destroy();this.transitionSprites.clear(),this.tracks=[],this.clips=[],this.maxDuration=0,this.currentTime=0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),this.emit("reset")}async play(){if(!(this.isPlaying||this.destroyed)){if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){console.warn("Cannot play: invalid duration",this.maxDuration);return}this.isPlaying||(this.isPlaying=!0),this.playStartTime=this.currentTime,this.playStartTimestamp=performance.now();for(const[e,{element:t}]of this.playbackElements.entries()){if(!(this.currentTime>=e.display.from&&(e.display.to===0||this.currentTime<=e.display.to))){this.isPlaybackCapable(e)&&e.pause(t);continue}const n=(this.currentTime-e.display.from)/1e6;this.isPlaybackCapable(e)&&await e.play(t,n)}this.renderLoop(),this.emit("play",{isPlaying:!0})}}pause(){this.isPlaying=!1,this.rafId!=null&&(cancelAnimationFrame(this.rafId),this.rafId=null);for(const[e,{element:t}]of this.playbackElements.entries())this.isPlaybackCapable(e)&&e.pause(t);this.emit("pause",{isPlaying:!1})}async stop(){this.pause(),await this.seek(0)}async seek(e){if(this.destroyed)return;const t=this.isPlaying;this.playStartTime=Math.max(0,Math.min(e,this.maxDuration)),this.playStartTimestamp=performance.now(),this.currentTime=this.playStartTime;for(const[r,{element:n}]of this.playbackElements.entries()){if(!(this.currentTime>=r.display.from&&(r.display.to===0||this.currentTime<=r.display.to))){this.isPlaybackCapable(r)&&r.pause(n);continue}const c=(this.currentTime-r.display.from)/1e6;this.isPlaybackCapable(r)&&await r.seek(n,c)}if(await this.updateFrame(this.currentTime),t){this.isPlaying=!0;for(const[r,{element:n}]of this.playbackElements.entries()){if(!(this.currentTime>=r.display.from&&(r.display.to===0||this.currentTime<=r.display.to)))continue;const c=(this.currentTime-r.display.from)/1e6;this.isPlaybackCapable(r)&&await r.play(n,c)}}}getCurrentTime(){return this.currentTime}getMaxDuration(){return this.maxDuration===1/0||isNaN(this.maxDuration)||this.maxDuration<=0?0:this.maxDuration}getIsPlaying(){return this.isPlaying}getSelectedClips(){return Array.from(this.selectedClips)}async renderLoop(){if(!this.isPlaying||this.destroyed||this.pixiApp==null)return;if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){this.pause();return}const e=async()=>{if(!this.isPlaying||this.destroyed||this.pixiApp==null)return;if(this.currentTime>=this.maxDuration){this.currentTime=this.maxDuration,this.pause();return}const r=(performance.now()-this.playStartTimestamp)*1e3;this.currentTime=Math.min(this.playStartTime+r,this.maxDuration),this.emit("currentTime",{currentTime:this.currentTime});try{await this.updateFrame(this.currentTime)}catch(n){console.warn("Error updating frame:",n)}this.isPlaying&&(this.rafId=requestAnimationFrame(e))};e()}getVideoTexture(e){let t=this.videoTextureCache.get(e);return t||(t=k.from(e),this.videoTextureCache.set(e,t)),t}async updateFrame(e){if(this.destroyed||this.pixiApp==null)return;this.updateActiveGlobalEffect(e);const t=new Set,r=this.tracks.length;for(const o of this.clips){const c=this.getTrackIndex(o.id);if(c!==-1){const l=(r-c)*10;o.zIndex=l;const d=this.spriteRenderers.get(o);if(d){const f=d.getRoot();f&&(f.zIndex=l)}}}const n=[...this.clips].sort((o,c)=>o.zIndex-c.zIndex);for(const o of n){if(e<o.display.from){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}if(o.display.to>0&&e>o.display.to){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}const c=e-o.display.from,l=c*o.playbackRate;o.animate(l);const d=await o.ready,f=o.duration||d.duration;if(f>0&&c>f){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}const m=this.playbackElements.get(o),g=o instanceof ge||o instanceof Te,_=o.transition?o.transition.start:0,y=o.transition?o.transition.end:0,a=g&&o.transition&&e>=_&&e<=y;if(m!=null&&this.isPlaybackCapable(o)){const u=c/1e6;if(o.syncPlayback(m.element,this.isPlaying,u),o instanceof ge){const p=this.videoSprites.get(o);if(p!=null){const v=o.meta.duration/1e6;if(this.spriteRenderers.has(o))p.visible=!1;else if(p.visible=!a&&u>=0&&u<v,p.visible&&fb(o,p),!a)continue}}else continue}if(a){this.transFromTexture||(this.transFromTexture=Pe.create({width:this.opts.width,height:this.opts.height})),this.transToTexture||(this.transToTexture=Pe.create({width:this.opts.width,height:this.opts.height})),this.transBgGraphics||(this.transBgGraphics=new me,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}));const u=this.getClipById(o?.transition?.fromClipId),p=this.getClipById(o?.transition?.toClipId);let v=null,x=null;if(u){const b=Math.max(0,e-u.display.from),{video:T}=await u.getFrame(b);T instanceof HTMLVideoElement?v=this.getVideoTexture(T):v=T,v&&(this.lastFromFrame=v)}if(p){const b=Math.max(0,e-p.display.from),{video:T}=await p.getFrame(b);T instanceof HTMLVideoElement?x=this.getVideoTexture(T):x=T,x&&(this.lastToFrame=x)}if(v||(v=this.lastFromFrame),x||(x=this.lastToFrame),!v||!x)continue;if(v&&x&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const b=(e-_)/o?.transition?.duration;u&&v&&this.renderClipToTransitionTexture(u,v,this.transFromTexture),p&&x&&this.renderClipToTransitionTexture(p,x,this.transToTexture);let T=this.transitionRenderers.get(o.id);if(!T)try{T=Ro({name:o?.transition?.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(o.id,T)}catch(w){console.error("[Studio] Failed to create transition renderer:",w)}if(T){const w=T.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:b});let S=this.transitionSprites.get(o.id);S||(S=new Ae,S.label=`TransitionSprite_${o.id}`,this.transitionSprites.set(o.id,S),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(S)),S.texture=w,S.visible=!0,S.x=0,S.y=0,S.width=this.opts.width,S.height=this.opts.height,S.anchor.set(0,0),S.zIndex=o.zIndex,t.add(o.id);const E=this.spriteRenderers.get(o);E?.getRoot()&&(E.getRoot().visible=!1);const I=this.videoSprites.get(o);if(I&&(I.visible=!1),u){const P=this.spriteRenderers.get(u);P?.getRoot()&&(P.getRoot().visible=!1);const A=this.videoSprites.get(u);A&&(A.visible=!1)}continue}}}const h=this.spriteRenderers.get(o);if(h!=null){const u=this.selectedClips.has(o);if(o instanceof Te){const v=o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms();continue}}if(o instanceof Je){const v=await o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms();continue}}if(o instanceof Ft){o.updateState(c);const v=await o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms(),this.opts.interactivity&&this.setupSpriteInteractivity(o);continue}else console.log("[Studio] CaptionClip texture is null, falling back to traditional path")}const{video:p}=await o.getFrame(c);await h.updateFrame(p),u||h.updateTransforms(),this.opts.interactivity&&this.setupSpriteInteractivity(o)}}if(this.activeGlobalEffect&&this.clipsNormalContainer&&this.clipsEffectContainer){const{startTime:o,duration:c}=this.activeGlobalEffect,l=e-o,d=Math.min(Math.max(l/c,0),1);if(d>0&&d<1){try{for(const m of this.clips)this.moveClipToEffectContainer(m,!1);const f=this.clips.some(m=>m.id===this.activeGlobalEffect.id&&m instanceof Qe);for(const m of this.clips){let g=!1;if(f){const _=this.activeGlobalEffect.trackIndex??-1,y=this.getTrackIndex(m.id);g=m.id!==this.activeGlobalEffect.id&&!(m instanceof Qe)&&y>_}else{const _=m.effects;g=Array.isArray(_)&&_.some(y=>y&&y.id===this.activeGlobalEffect.id)}g&&this.moveClipToEffectContainer(m,!0)}}catch(f){console.warn("Failed to reparent clips for effect; falling back to full-scene render",f)}this.clipsNormalContainer.visible=!0,await this.applyGlobalEffectIfNeeded(e)}else{for(const f of this.clips)try{this.moveClipToEffectContainer(f,!1)}catch{}this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}}else if(this.clipsNormalContainer){for(const o of this.clips)try{this.moveClipToEffectContainer(o,!1)}catch{}this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}for(const[o,c]of this.transitionSprites.entries())t.has(o)||(c.visible=!1);this.pixiApp!=null&&this.pixiApp.render()}async recalculateMaxDuration(){this.maxDuration=0;for(const e of this.clips){const t=await e.ready,r=e.duration>0?e.duration:t.duration,n=e.display.from+r;n!==1/0&&!isNaN(n)&&n>0&&(this.maxDuration=Math.max(this.maxDuration,n))}}moveClipToEffectContainer(e,t=!0){if(!this.clipsNormalContainer||!this.clipsEffectContainer)return;const r=t?this.clipsEffectContainer:this.clipsNormalContainer,n=this.spriteRenderers.get(e);if(n){const c=n.getRoot();if(c&&c.parent!==r){try{c.parent&&c.parent.removeChild&&c.parent.removeChild(c)}catch(l){console.warn("moveClipToEffectContainer: could not remove root from parent",l)}r.addChild(c)}}const o=this.transitionSprites.get(e.id);if(o&&o.parent!==r){try{o.parent&&o.parent.removeChild&&o.parent.removeChild(o)}catch(c){console.warn("moveClipToEffectContainer: could not remove transSprite from parent",c)}r.addChild(o)}}applyGlobalEffect(e,t,r){const n=t.id||`${e}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,key:e,startTime:t.startTime,duration:t.duration??1e6};for(const c of r)c instanceof Te&&c.addEffect(o),c instanceof ge&&c.addEffect(o),c instanceof Je&&c.addEffect(o),c instanceof Ft&&c.addEffect(o);return this.globalEffects.set(n,o),n}getTrackIndex(e){return this.tracks.findIndex(t=>t.clipIds.includes(e))}async getTransitionFromFrame(e,t){let r=null;if(e.transition?.prevClipId&&(r=this.clips.find(l=>l.id===e.transition.prevClipId)||null),r||(r=this.getPreviousClipOnTrack(e)),!r)return null;const n=r.duration>0?r.duration:0,o=Math.max(0,Math.min(t-r.display.from,n)),{video:c}=await r.getFrame(o);return c}getPreviousClipOnTrack(e){const t=this.getTrackIndex(e.id);return t===-1?null:this.clips.filter(r=>r.id!==e.id&&this.getTrackIndex(r.id)===t&&r.display.from<e.display.from&&(r instanceof ge||r instanceof Te)).sort((r,n)=>n.display.to-r.display.to)[0]||null}renderClipToTransitionTexture(e,t,r){if(!this.pixiApp||!this.transBgGraphics)return;this.pixiApp.renderer.render({container:this.transBgGraphics,target:r,clear:!0});const n=new Ae(t instanceof k?t:k.from(t));n.x=e.center.x,n.y=e.center.y,n.anchor.set(.5,.5);const o=n.texture.width||1,c=n.texture.height||1,l=e.width&&e.width!==0?Math.abs(e.width)/o:1,d=e.height&&e.height!==0?Math.abs(e.height)/c:1;e.flip==="horizontal"?(n.scale.x=-l,n.scale.y=d):e.flip==="vertical"?(n.scale.x=l,n.scale.y=-d):(n.scale.x=l,n.scale.y=d),n.rotation=(e.flip==null?1:-1)*e.angle,n.alpha=e.opacity,this.pixiApp.renderer.render({container:n,target:r,clear:!1}),t instanceof k||n.texture.destroy(!0),n.destroy()}removeGlobalEffect(e){this.globalEffects.delete(e)}clearGlobalEffects(){this.globalEffects.clear()}updateActiveGlobalEffect(e){let t=null;for(const r of this.clips)if(r instanceof Qe&&e>=r.display.from&&(r.display.to===0||e<=r.display.to)){t={id:r.id,key:r.effect.key,startTime:r.display.from,duration:r.duration>0?r.duration:r.display.to-r.display.from,trackIndex:this.getTrackIndex(r.id)};break}if(!t)for(const r of this.globalEffects.values()){const n=r.startTime+r.duration;if(e>=r.startTime&&e<n){t={id:r.id,key:r.key,startTime:r.startTime,duration:r.duration,trackIndex:-1};break}}this.activeGlobalEffect=t}async applyGlobalEffectIfNeeded(e){if(this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),!this.activeGlobalEffect||!this.pixiApp||!this.clipContainer||!this.artboard||!this.clipsNormalContainer||!this.clipsEffectContainer)return;const{key:t,startTime:r,duration:n}=this.activeGlobalEffect,o=e-r,c=Math.min(Math.max(o/n,0),1);if(c<=0||c>=1)return;this.clipsEffectContainer.visible=!0;let l=this.effectFilters.get(t);if(!l)try{if(l=Io({name:t.toLowerCase(),renderer:this.pixiApp.renderer}),l)this.effectFilters.set(t,l);else return}catch(y){console.error(y);return}const d=this.opts.width,f=this.opts.height,m=Pe.create({width:d,height:f});this.pixiApp.renderer.render({container:this.clipsEffectContainer,target:m,clear:!0}),this.clipsEffectContainer.visible=!1;const g=l.render({canvasTexture:m,progress:c,width:d,height:f}),_=new Ae(g);_.x=0,_.y=0,_.width=d,_.height=f,_.scale.set(1),_.zIndex=5,this.clipContainer.addChild(_),this.currentGlobalEffectSprite=_,m.destroy(!0)}destroy(){if(!this.destroyed){window.removeEventListener("resize",this.handleResize),this.destroyed=!0,this.stop(),this.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const e of this.transitionSprites.values())e.destroy();this.transitionSprites.clear(),this.pixiApp&&(this.pixiApp.destroy(!0,{children:!0,texture:!0}),this.pixiApp=null)}}selectClip(e,t=!1){if(!(this.destroyed||this.pixiApp==null)){if(t||this.deselectClip(),t&&this.selectedClips.has(e)){this.selectedClips.delete(e),this.activeTransformer!=null&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.selectedClips.size>0&&this.createTransformer(),this.emit("selection:updated",{selected:Array.from(this.selectedClips)});return}this.selectedClips.add(e),this.activeTransformer!=null&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.createTransformer(),t?this.emit("selection:updated",{selected:Array.from(this.selectedClips)}):this.emit("selection:created",{selected:Array.from(this.selectedClips)})}}createTransformer(){if(this.destroyed||this.artboard==null||this.selectedClips.size===0)return;const e=[];let t=null;for(const n of this.selectedClips){const o=this.spriteRenderers.get(n);if(o==null)continue;const c=o.getRoot();c!=null&&(e.push(c),this.selectedClips.size===1&&(t=n))}if(e.length===0){console.warn("Cannot create transformer: no sprites found");return}this.activeTransformer=new b2({group:e,clip:t});let r=null;this.activeTransformer.on("transforming",()=>{r===null&&(r=requestAnimationFrame(()=>{r=null,this.syncSelectedClipsTransformsRealtime()}))}),this.activeTransformer.on("textClipResize",n=>{this.textClipResizedWidth=n.newWidth}),this.activeTransformer.on("transformEnd",()=>{r!==null&&(cancelAnimationFrame(r),r=null),this.syncSelectedClipsTransforms()}),this.artboard.addChild(this.activeTransformer)}isUpdatingTextClipRealtime=!1;textClipResizedWidth=null;async syncSelectedClipsTransformsRealtime(){if(!(this.selectedClips.size===0||this.activeTransformer==null)&&!this.isUpdatingTextClipRealtime){this.isUpdatingTextClipRealtime=!0;try{if(this.activeTransformer.activeHandle!=="mr")return;for(const t of this.selectedClips){if(!(t instanceof Je))continue;const r=this.spriteRenderers.get(t);if(r==null)continue;const n=r.getRoot(),o=r.getSprite();if(n==null||o==null||o.texture==null)continue;const c=Math.abs(n.scale.x*o.scale.x);if(c===1)continue;const l=t.left,d=t.top,f=o.texture.width,m=c*f;await t.updateStyle({wordWrap:!0,wordWrapWidth:m});const g=await t.getTexture();g&&(await r.updateFrame(g),o.scale.set(1,1),n.scale.set(1,1),t.left=l,t.top=d,n.x=t.left+t.width/2,n.y=t.top+t.height/2)}}finally{this.isUpdatingTextClipRealtime=!1}}}async syncSelectedClipsTransforms(){if(!(this.selectedClips.size===0||this.activeTransformer==null)){for(const e of this.selectedClips){const t=this.spriteRenderers.get(e);if(t==null)continue;const r=t.getRoot(),n=t.getSprite();if(r==null||n==null||n.texture==null)continue;const o=n.texture.width,c=n.texture.height,l=Math.abs(r.scale.x*n.scale.x)*o,d=Math.abs(r.scale.y*n.scale.y)*c,f=e instanceof Je&&this.textClipResizedWidth!==null?this.textClipResizedWidth:l,m=r.x-f/2,g=r.y-d/2;if(e instanceof Je&&this.textClipResizedWidth!==null){await e.updateStyle({wordWrap:!0,wordWrapWidth:f});const _=await e.getTexture();_&&(await t.updateFrame(_),e.width=f,e.height=_.height,this.textClipResizedWidth=null,e.left=r.x-e.width/2,e.top=r.y-e.height/2,n.scale.set(1,1),r.scale.set(1,1))}else{e.left=m,e.top=g,e.width=l,e.height=d;const _=e.flip==null?1:-1;e.angle=_*r.angle}}this.activeTransformer!=null&&this.activeTransformer.updateBounds();for(const e of this.selectedClips){const t=this.spriteRenderers.get(e);t?.updateTransforms()}}}syncSpriteToClipProperties(e){const t=this.spriteRenderers.get(e);if(t!=null){const r=t.getRoot(),n=t.getSprite();if(r!=null&&n!=null&&n.texture!=null){const o=n.texture.width,c=n.texture.height,l=Math.abs(r.scale.x*n.scale.x)*o,d=Math.abs(r.scale.y*n.scale.y)*c,f=r.x-l/2,m=r.y-d/2;e.left=f,e.top=m,e.width=l,e.height=d;const g=e.flip==null?1:-1;e.angle=g*r.angle,t.updateTransforms()}}}setSelection(e){if(!(this.destroyed||this.pixiApp==null)&&!(this.selectedClips.size===e.length&&e.every(t=>this.selectedClips.has(t)))){for(const t of this.selectedClips)this.syncSpriteToClipProperties(t);this.activeTransformer&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.selectedClips.clear();for(const t of e)this.selectedClips.add(t);this.selectedClips.size>0?(this.createTransformer(),this.emit("selection:updated",{selected:Array.from(this.selectedClips)})):this.emit("selection:cleared",{deselected:[]})}}selectClipsByIds(e){const t=this.clips.filter(r=>e.includes(r.id));this.setSelection(t)}deselectClip(){if(this.selectedClips.size>0)for(const t of this.selectedClips)this.syncSpriteToClipProperties(t);this.activeTransformer!=null&&(this.activeTransformer.parent!=null&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null);const e=Array.from(this.selectedClips);this.selectedClips.clear(),e.length>0&&this.emit("selection:cleared",{deselected:e})}exportToJSON(){const e=this.clips.map(n=>lr(n,!1)),t=this.tracks.map(n=>({id:n.id,name:n.name,type:n.type,clipIds:n.clipIds})),r=[];return this.clips.forEach(n=>{if(n.transition){const o=this.tracks.find(c=>c.clipIds.includes(n.id));if(o){const c=o.clipIds.indexOf(n.id);if(c>0){const l=o.clipIds[c-1];r.push({key:n.transition.name,duration:n.transition.duration,clips:[l,n.id]})}}}}),{tracks:t,clips:e,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,bgColor:this.opts.bgColor}}}async loadFromJSON(e){if(this.clear(),e.settings){const t=e.settings.width&&e.settings.width!==this.opts.width||e.settings.height&&e.settings.height!==this.opts.height;if(e.settings.width&&(this.opts.width=e.settings.width),e.settings.height&&(this.opts.height=e.settings.height),e.settings.fps&&(this.opts.fps=e.settings.fps),e.settings.bgColor&&(this.opts.bgColor=e.settings.bgColor),t&&this.pixiApp!=null){const r=this.opts.width,n=this.opts.height;this.pixiApp.renderer.resize(r,n),this.opts.canvas&&(this.opts.canvas.width=r,this.opts.canvas.height=n)}}if(e.clips){const t=new Map;if(e.tracks){for(const r of e.tracks)if(r.clipIds)for(const n of r.clipIds)t.set(n,r.id)}if(e.tracks)for(const r of e.tracks)this.tracks.push({id:r.id,name:r.name,type:r.type,clipIds:[]});for(const r of e.clips){let n=r.id?t.get(r.id):void 0;if(r.type==="Transition"){const o=r,c=o.toClipId||o.fromClipId;c&&(n=t.get(c));const l=r.fromClipId||"",d=r.toClipId||"",f=this.getClipById(l),m=this.getClipById(d);if(f&&m){const g=this.clips.find(u=>u.type==="Transition"&&u.fromClipId===l&&u.toClipId===d),_=r.duration;let y,a;if(g)y=g.display.from,a=g.display.to;else{const u=m.display.from;y=Math.max(0,u-_/2),a=y+_}const h={key:r.transitionEffect.key,name:r.transitionEffect.name,duration:_,fromClipId:l,toClipId:d,start:y,end:a};"transition"in f&&(f.transition=h),"transition"in m&&(m.transition=h)}else console.warn(`[Studio] Could not find clips for transition ${r.transitionEffect.key}: from=${l}, to=${d}`)}await this.loadClipIntoTrack(r,n)}}for(const t of this.clips){const r=t.effects;if(Array.isArray(r))for(const n of r)this.globalEffects.has(n.id)||this.globalEffects.set(n.id,{id:n.id,key:n.key,startTime:n.startTime,duration:n.duration})}try{await this.updateFrame(this.currentTime)}catch(t){console.error("[Studio] Failed to update initial frame:",t)}}async loadClipIntoTrack(e,t){if(e.type!=="Text"&&e.type!=="Caption"&&e.type!=="Effect"&&e.type!=="Transition"&&(!e.src||e.src.trim()==="")){console.warn(`Skipping clip ${e.type} with empty source`);return}try{const r=await cr(e),n=r instanceof Me?e.src:void 0;await this.addClip(r,{trackId:t,audioSource:n}),(r instanceof ge||r instanceof Te)&&(!e.width||!e.height)&&(await r.scaleToFit(this.opts.width,this.opts.height),r.centerInScene(this.opts.width,this.opts.height))}catch(r){console.warn(`Failed to load clip of type ${e.type}:`,r)}}}class _i{static instance;fonts=new Map;constructor(){}static getInstance(){return _i.instance||(_i.instance=new _i),_i.instance}async addFont(e){if(!this.fonts.has(e.name))try{const r=await new FontFace(e.name,`url(${e.url})`).load();document.fonts.add(r),this.fonts.set(e.name,r)}catch(t){console.error(`Failed to load font ${e.name}:`,t)}}async loadFonts(e){await Promise.all(e.map(t=>this.addFont(t)))}removeFont(e){const t=this.fonts.get(e);t&&(document.fonts.delete(t),this.fonts.delete(e))}clear(){this.fonts.forEach(e=>{document.fonts.delete(e)}),this.fonts.clear()}getLoadedFonts(){return Array.from(this.fonts.keys())}}const w2=_i.getInstance();W.add(sm),W.mixin(ie,nm),W.add(Ol),W.add(Dl),W.add(Vc),W.mixin(ie,Fv),W.add(Wc),W.add(Mu),W.add(Fn),W.add(Uu),W.add(Lu),W.add(Nu),W.add(Zu),W.add(ju),W.add(Vu),W.add(qu),W.add(Xu),W.add(Wu),W.add(Hu),W.add(Zc),W.add(Kc);const S2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),C2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));ne.AudioClip=Me,ne.CaptionClip=Ft,ne.Compositor=g2,ne.EffectClip=Qe,ne.GL_EFFECT_OPTIONS=db,ne.GL_TRANSITION_OPTIONS=p2,ne.ImageClip=Te,ne.Log=Y,ne.MP4Clip=ge,ne.Studio=T2,ne.TextClip=Je,ne.TransitionClip=mi,ne.VideoClip=ge,ne.clipToJSON=lr,ne.createChromakey=zf,ne.fastConcatMP4=sd,ne.fixFMP4Duration=Xx,ne.fontManager=w2,ne.jsonToClip=cr,ne.makeEffect=Io,ne.makeTransition=Ro,ne.mixinMP4AndAudio=jx,ne.renderTxt2ImgBitmap=Yf,Object.defineProperty(ne,Symbol.toStringTag,{value:"Module"})}));
7789
+ `,f2={radialSwipe:{label:"Radial Swipe",fragment:yb}},vi={...gi.reduce((s,e)=>(s[e.name]={label:e.name,fragment:e.glsl,uniforms:e.defaultParams,previewDynamic:`transition: ${e.name}`},s),{}),...f2},p2=Object.entries(vi).map(([s,e])=>({key:s,label:e.label,previewStatic:`https://cdn.subgen.co/previews/static/transition_${s}_static.webp`,previewDynamic:`https://cdn.subgen.co/previews/dynamic/transition_${s}_dynamic.webp`}));function Ro({name:s,renderer:e}){let t=gi.find(L=>L.name===s);if(!t){const L=Object.keys(vi).find(K=>K.toLowerCase()===s.toLowerCase());L&&(t=vi[L])}if(t||(t=gi.find(L=>L.name.toLowerCase()===s.toLowerCase())),!t){const L=[s,s.toLowerCase(),s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),s.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),s.replace(/_/g,"")];for(const K of L){if(t=gi.find(we=>we.name.toLowerCase()===K.toLowerCase()),t)break;const de=Object.keys(vi).find(we=>we.toLowerCase()===K.toLowerCase());if(de){t=vi[de];break}}}if(!t){const L=gi.length,K=gi.slice(0,5).map(we=>we.name).join(", "),de=Object.keys(vi).slice(0,3).join(", ");throw console.error(`Transition not found: "${s}". Available in gl-transitions (${L} total):`,K+"..."),console.error("Available locally:",de+"..."),new Error(`Transition "${s}" not found in gl-transitions library or local definitions`)}const r=new Ae(k.WHITE),n=Pe.create({width:e.width,height:e.height}),o=new ct({}),c=new ct({}),l=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",d=l?new ct({}):void 0;let f=null;if(l){f=document.createElement("canvas"),f.width=256,f.height=256;const L=f.getContext("2d");if(L){const K=L.createImageData(256,256);for(let de=0;de<K.data.length;de+=4){const we=Math.random();K.data[de]=we*255,K.data[de+1]=we*255,K.data[de+2]=we*255,K.data[de+3]=255}L.putImageData(K,0,0)}}let m=t.glsl||t.fragment;if(!m)throw new Error(`Transition "${s}" has no glsl or fragment code`);let g={...ue.basics,...ue.custom(t)};Object.entries(g).forEach(([,L])=>{L.type==="int<f32>"&&(L.type="i32",typeof L.value=="number"&&(L.value=Math.trunc(L.value))),L.type==="ivec2<f32>"&&(L.type="vec2<f32>")});const _=t.name==="GridFlip"||s.toLowerCase()==="gridflip"||t.label==="gridflip",y=t.name==="circle"||s.toLowerCase()==="circle"||t.label==="circle",a=t.name==="directional"||s.toLowerCase()==="directional"||t.label==="directional",h=t.name==="UndulatingBurnOut"||s.toLowerCase()==="undulatingburnout"||t.label==="undulatingBurnOut",u=t.name==="SquaresWire"||s.toLowerCase()==="squareswire"||t.label==="squaresWire",p=t.name==="rotate_scale_fade"||s.toLowerCase()==="rotatescalefade"||t.label==="rotateScaleFade",v=t.name==="RandomSquares"||s.toLowerCase()==="randomsquares"||t.label==="randomSquares",x=t.name==="polar_function"||s.toLowerCase()==="polar_function"||t.label==="polar_function",b=t.name==="pixelate"||s.toLowerCase()==="pixelate"||t.label==="pixelate",T=t.name==="perlin"||s.toLowerCase()==="perlin"||t.label==="perlin",w=t.name==="luma"||s.toLowerCase()==="luma"||t.label==="luma",S=t.name==="luminance_melt"||s.toLowerCase()==="luminance_melt"||s.toLowerCase()==="luminancemelt"||t.label==="luminance_melt",E=t.name==="hexagonalize"||s.toLowerCase()==="hexagonalize"||t.label==="hexagonalize",I=t.name==="heart"||s.toLowerCase()==="heart"||t.label==="heart",P=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",A=t.name==="directionalwipe"||s.toLowerCase()==="directionalwipe"||s.toLowerCase()==="directional_wipe"||t.label==="directionalwipe",M=t.name==="directionalwarp"||s.toLowerCase()==="directionalwarp"||s.toLowerCase()==="directional_warp"||t.label==="directionalwarp",U=t.name==="crosshatch"||s.toLowerCase()==="crosshatch"||t.label==="crosshatch",H=t.name==="circleopen"||s.toLowerCase()==="circleopen"||s.toLowerCase()==="circle_open"||t.label==="circleopen",re=t.name==="cannabisleaf"||s.toLowerCase()==="cannabisleaf"||s.toLowerCase()==="cannabis_leaf"||t.label==="cannabisleaf",F=t.name==="StereoViewer"||s.toLowerCase()==="stereoviewer"||s.toLowerCase()==="stereo_viewer"||t.label==="StereoViewer",R=t.name==="GlitchDisplace"||s.toLowerCase()==="glitchDisplace"||t.label==="GlitchDisplace",$=t.name==="CrossZoom"||s.toLowerCase()==="crosszoom"||t.label==="CrossZoom",B=t.name==="CrazyParametricFun"||s.toLowerCase()==="crazyparametricfun"||t.label==="CrazyParametricFun",q=t.name==="BowTieHorizontal"||s.toLowerCase()==="bowtiehorizontal"||t.label==="BowTieHorizontal",se=t.name==="PolkaDotsCurtain"||s.toLowerCase()==="polkadotscurtain"||t.label==="PolkaDotsCurtain",ee=t.name==="Pixelize"||s.toLowerCase()==="pixelize"||t.label==="Pixelize";_&&(m=xb,g={...ue.basics,...bb}),y&&(m=Tb,g={...ue.basics,...ld}),a&&(m=wb,g={...ue.basics,...Sb}),h&&(m=Cb,g={...ue.basics,...Ab}),u&&(m=Eb,g={...ue.basics,...Ib}),p&&(m=Pb,g={...ue.basics,...Rb}),v&&(m=Mb,g={...ue.basics,...Fb}),x&&(m=kb,g={...ue.basics,...Ub}),b&&(m=nd,g={...ue.basics,...od}),T&&(m=Db,g={...ue.basics,...Gb}),w&&(m=Lb,g={...ue.basics,...Nb}),S&&(m=zb,g={...ue.basics,...Hb}),E&&(m=Wb,g={...ue.basics,...Vb}),I&&(m=Yb,g={...ue.basics,...Xb}),P&&(m=$b,g={...ue.basics,...qb}),A&&(m=Kb,g={...ue.basics,...jb}),M&&(m=Zb,g={...ue.basics,...Jb}),U&&(m=Qb,g={...ue.basics,...e2}),H&&(m=t2,g={...ue.basics,...ld}),re&&(m=i2,g={...ue.basics,...r2}),F&&(m=s2,g={...ue.basics,...n2}),R&&(m=o2),$&&(m=a2,g={...ue.basics,...l2}),B&&(m=c2,g={...ue.basics,...h2}),q&&(m=u2),se&&(m=d2),ee&&(m=Bb,g={...ue.basics,...Ob});const G={from:o,to:c,uniforms:g};l&&d&&(G.displacementMap=d,f&&(d.resource=f,d.update()));const Ee=new si({glProgram:new ht({vertex:gb,fragment:_b(m)}),resources:G});return r.filters=[Ee],{render({width:L,height:K,from:de,to:we,progress:yi}){if((r.width!==L||r.height!==K)&&(r.setSize({width:L,height:K}),n.resize(L,K)),de instanceof k?Ee.resources.from=de.source:(o.resource=de,o.update(),Ee.resources.from=o),we instanceof k?Ee.resources.to=we.source:(c.resource=we,c.update(),Ee.resources.to=c),l&&d&&f){if(f.width!==L||f.height!==K){f.width=L,f.height=K;const kt=f.getContext("2d");if(kt){const ut=kt.createImageData(L,K);for(let Ge=0;Ge<ut.data.length;Ge+=4){const nt=Math.random();ut.data[Ge]=nt*255,ut.data[Ge+1]=nt*255,ut.data[Ge+2]=nt*255,ut.data[Ge+3]=255}kt.putImageData(ut,0,0)}}d.resource=f,d.update()}return Ee.resources.uniforms.uniforms.progress=yi,e.render({container:r,target:n,clear:!1,width:L,height:K}),n},destroy(){n.destroy(),r.destroy({children:!0})}}}let m2=0;async function cd(s){s()>50&&(await ws(15),await cd(s))}class g2{static async isSupported(e={}){return(self.OffscreenCanvas!=null&&self.VideoEncoder!=null&&self.VideoDecoder!=null&&self.VideoFrame!=null&&self.AudioEncoder!=null&&self.AudioDecoder!=null&&self.AudioData!=null&&((await self.VideoEncoder.isConfigSupported({codec:e.videoCodec??"avc1.42E032",width:e.width??1920,height:e.height??1080,bitrate:e.bitrate??7e6})).supported??!1)&&(await self.AudioEncoder.isConfigSupported({codec:(await la()).codec,sampleRate:le.sampleRate,numberOfChannels:le.channelCount})).supported)??!1}logger=Y.create(`id:${m2++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;hasVideoTrack;evtTool=new Xo;on=this.evtTool.on;constructor(e={}){const{width:t=0,height:r=0}=e;this.canvas=new OffscreenCanvas(t,r),this.opts=Object.assign({bgColor:"#000",width:0,height:0,videoCodec:"avc1.42E032",audio:!0,bitrate:5e6,fps:30,metaDataTags:null},e),this.hasVideoTrack=t*r>0,la().catch(n=>{this.logger.warn("Failed to detect audio codec:",n)})}async initPixiApp(){const{width:e,height:t}=this.opts;if(this.pixiApp=new fn,console.log("PIXI APP 000",this.pixiApp),await this.pixiApp.init({canvas:this.canvas,width:e,height:t,backgroundColor:0,antialias:!1,autoDensity:!1,resolution:1,preference:"webgl"}),this.pixiApp.renderer==null||this.pixiApp.stage==null)throw new Error("Pixi.js Application failed to initialize properly");try{const r=this.pixiApp;r.ticker&&typeof r.ticker.stop=="function"&&r.ticker.stop()}catch{}}async addSprite(e,t={}){const r={rect:{x:e.left,y:e.top,w:e.width,h:e.height},display:{...e.display},duration:e.duration,playbackRate:e.playbackRate,zIndex:e.zIndex};this.logger.info("Compositor add clip",r);const n=await e.clone();console.log("PIXI APP 111",this.pixiApp),this.pixiApp!=null&&this.pixiApp.renderer!=null&&typeof n.setRenderer=="function"&&n.setRenderer(this.pixiApp.renderer),this.logger.info("Compositor add clip ready"),this.sprites.push(Object.assign(n,{main:t.main??!1,expired:!1})),this.sprites.sort((o,c)=>o.zIndex-c.zIndex)}initMuxer(e){const{fps:t,width:r,height:n,videoCodec:o,bitrate:c,audio:l,metaDataTags:d}=this.opts,f=this.sprites.some(_=>_.width>0&&_.height>0),m=this.hasVideoTrack&&f;return sf({video:m?{width:r,height:n,expectFPS:t,codec:o,bitrate:c,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:l===!1?null:{codec:le.codecType,sampleRate:le.sampleRate,channelCount:le.channelCount},duration:e,metaDataTags:d})}output(e={}){if(this.sprites.length===0)throw Error("No sprite added");const t=this.sprites.find(g=>g.main),n=this.sprites.map(g=>g.display.from+g.duration).filter(g=>g!==1/0),o=e.maxTime??(t!=null?t.display.from+t.duration:n.length>0?Math.max(...n):1/0);if(o===1/0||o<=0)throw Error("Unable to determine the end time, please specify a main sprite, or limit the duration of ImageClip, AudioClip");o===-1&&this.logger.warn("Unable to determine the end time, process value don't update"),this.logger.info(`start combinate video, maxTime:${o}`);const c=this.initMuxer(o);let l=performance.now();const d=this.runEncoding(c,o,{onProgress:g=>{this.logger.debug("OutputProgress:",g),this.evtTool.emit("OutputProgress",g)},onEnded:async()=>{await c.flush(),this.logger.info("===== output ended =====, cost:",performance.now()-l),this.evtTool.emit("OutputProgress",1),this.destroy()},onError:g=>{this.evtTool.emit("error",g),m(g),this.destroy()}});this.stopOutput=()=>{d(),c.close(),m()};const{stream:f,stop:m}=Qo(c.mp4file,500,this.destroy);return f}destroy(){if(!this.destroyed&&(this.destroyed=!0,this.stopOutput?.(),this.evtTool.destroy(),this.pixiApp!=null))try{const e=this.pixiApp;if(e.destroyed===!0){this.pixiApp=null;return}if(e.ticker&&typeof e.ticker.stop=="function")try{e.ticker.stop()}catch{}if(e.renderer!=null){const t=e.renderer.gl;if(t&&t.isContextLost()){this.pixiApp=null;return}this.pixiApp.destroy()}}catch(e){console.warn("Error while destroying Pixi application:",e)}finally{this.pixiApp=null}}runEncoding(e,t,{onProgress:r,onEnded:n,onError:o}){let c=0;const l={aborted:!1};let d=null,f=null;const m=async()=>{const{fps:y,bgColor:a,audio:h}=this.opts,u=Math.round(1e6/y),p=this.sprites.some(b=>b.width>0&&b.height>0);f=v2({pixiApp:this.pixiApp,sprites:this.sprites,aborter:l});const v=_2({muxer:e,canvas:this.canvas,outputAudio:h,hasVideoTrack:this.hasVideoTrack&&p,timeSlice:u,fps:y});let x=0;for(;;){if(d!=null)return;if(l.aborted||t!==-1&&x>t||this.sprites.length===0){g(),await n();return}c=x/t;const{audios:b,mainSprDone:T,hasVideo:w}=await f.render(x);if(T){g(),await n();return}if(l.aborted)return;this.hasVideoTrack&&w&&await new Promise(S=>requestAnimationFrame(S)),v(x,b,w),x+=u,await cd(e.getEncodeQueueSize)}},g=()=>{l.aborted||(l.aborted=!0,clearInterval(_),f?.cleanup(),this.sprites.forEach(y=>{y.destroy()}))};m().catch(y=>{d=y,this.logger.error(y),g(),o(y)});const _=setInterval(()=>{r(c)},500);return g}exportToJSON(){const e=this.sprites.map(r=>lr(r,r.main)),t=[];return this.sprites.forEach(r=>{if(r.transition){const n=this.sprites.filter(o=>o.id!==r.id&&o.zIndex===r.zIndex&&o.display.from<r.display.from&&(o instanceof ge||o instanceof Te)).sort((o,c)=>c.display.to-o.display.to)[0];n&&t.push({key:r.transition.name,duration:r.transition.duration,clips:[n.id,r.id]})}}),{clips:e,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,bgColor:this.opts.bgColor,videoCodec:this.opts.videoCodec,bitrate:this.opts.bitrate,audio:this.opts.audio,metaDataTags:this.opts.metaDataTags}}}async loadFromJSON(e){this.sprites.forEach(t=>{t.destroy()}),this.sprites=[],e.settings&&(e.settings.width!==void 0&&(this.opts.width=e.settings.width),e.settings.height!==void 0&&(this.opts.height=e.settings.height),e.settings.fps!==void 0&&(this.opts.fps=e.settings.fps),e.settings.bgColor!==void 0&&(this.opts.bgColor=e.settings.bgColor),e.settings.videoCodec!==void 0&&(this.opts.videoCodec=e.settings.videoCodec),e.settings.bitrate!==void 0&&(this.opts.bitrate=e.settings.bitrate),e.settings.audio!==void 0&&(this.opts.audio=e.settings.audio===!1?!1:void 0),e.settings.metaDataTags!==void 0&&(this.opts.metaDataTags=e.settings.metaDataTags));for(const t of e.clips){const r=await cr(t);if(await this.addSprite(r,{main:t.main||!1}),t.type==="Transition"){const n=t.toClipId,o=this.sprites.find(c=>c.id===n);o?(console.log(`[Compositor] Applying transition ${t.transitionEffect.key} to clip ${n}`),o.transition={name:t.transitionEffect.key,duration:t.duration,prevClipId:t.fromClipId||""}):console.warn(`[Compositor] Could not find target clip ${n} for transition ${t.transitionEffect.key}`)}}}}function v2(s){const{pixiApp:e,sprites:t,aborter:r}=s,n=e!=null,o=new Map,c=new Map,l=new Map,d=Pe.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),f=Pe.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),m=new me().rect(0,0,e?.renderer.width||0,e?.renderer.height||0).fill({color:0}),g=new Map,_=T=>t.filter(w=>w.id!==T.id&&w.zIndex===T.zIndex&&w.display.from<T.display.from&&(w instanceof ge||w instanceof Te)).sort((w,S)=>S.display.to-w.display.to)[0]||null,y=async(T,w,S)=>{let E=null;if(T.transition?.prevClipId&&(E=t.find(M=>M.id===T.transition.prevClipId)||null),E||(E=_(T)),!E)return null;const I=E.duration>0?E.duration:0,P=Math.max(0,Math.min(w-E.display.from,I)),{video:A}=await S(E,P);return A},a=(T,w,S)=>{if(!e)return;e.renderer.render({container:m,target:S,clear:!0});const E=new Ae(w instanceof k?w:k.from(w));E.x=T.center.x,E.y=T.center.y,E.anchor.set(.5,.5);const I=E.texture.width||1,P=E.texture.height||1,A=T.width&&T.width!==0?Math.abs(T.width)/I:1,M=T.height&&T.height!==0?Math.abs(T.height)/P:1;T.flip==="horizontal"?(E.scale.x=-A,E.scale.y=M):T.flip==="vertical"?(E.scale.x=A,E.scale.y=-M):(E.scale.x=A,E.scale.y=M),E.rotation=(T.flip==null?1:-1)*T.angle,E.alpha=T.opacity;const U=T.style||{},H=U.borderRadius||0;let re=null;H>0&&(re=new me,re.roundRect(-I/2,-P/2,I,P,Math.min(H,I/2,P/2)),re.fill({color:16777215,alpha:1}),E.addChild(re),E.mask=re);const F=U.stroke;let R=null;if(F&&F.width>0){R=new me;const q=xe(F.color)??16777215,se=F.width;if(R.setStrokeStyle({width:se,color:q,alignment:1}),H>0){const ee=Math.min(H,I/2,P/2);R.roundRect(-I/2,-P/2,I,P,ee)}else R.rect(-I/2,-P/2,I,P);R.stroke(),E.addChild(R)}const $=U.dropShadow;let B=null;if($&&($.blur>0||$.distance>0)){B=new me;const q=xe($.color)??0,se=$.alpha??.5,ee=$.distance??0,G=$.angle??0,Ee=Math.cos(G)*ee,L=Math.sin(G)*ee;if(H>0){const K=Math.min(H,I/2,P/2);B.roundRect(-I/2+Ee,-P/2+L,I,P,K)}else B.rect(-I/2+Ee,-P/2+L,I,P);B.fill({color:q,alpha:se}),E.addChildAt(B,0)}e.renderer.render({container:E,target:S,clear:!1}),w instanceof k||E.texture.destroy(!0),R&&R.destroy(),re&&re.destroy(),B&&B.destroy(),E.destroy()};let h=null,u=null,p=null;n&&e!=null&&(h=new ie,u=new ie,p=new ie,u.sortableChildren=!0,p.sortableChildren=!0,e.stage.addChild(u),e.stage.addChild(p),h.visible=!1,e.stage.addChild(h));const v=[...t].sort((T,w)=>T.zIndex-w.zIndex);return{render:async T=>{const w=[];let S=!1,E=!1;const I=new Map,P=async(A,M)=>{const U=`${A.id}_${M}`;if(I.has(U))return I.get(U);const H=await A.getFrame(M);return I.set(U,H),H};for(const A of l.values())A.visible=!1;for(const A of v){if(r.aborted)break;if(T<A.display.from||A.expired){if(n&&e!=null){const R=o.get(A);R&&await R.updateFrame(null)}continue}const M=T-A.display.from,U=M*A.playbackRate;A.animate(U);const{video:H,audio:re,done:F}=await P(A,M);if(w.push(re),n&&e!=null&&u!=null){if((A instanceof ge||A instanceof Te)&&A.transition&&M>=0&&M<=A.transition.duration){const B=await y(A,T,P),q=H;if(B&&q){const se=M/A.transition.duration,ee=_(A);ee?a(ee,B,d):e.renderer.render({container:m,target:d,clear:!0}),a(A,q,f);let G=c.get(A.id);G||(G=Ro({name:A.transition.name,renderer:e.renderer}),c.set(A.id,G));const Ee=G.render({width:e.renderer.width,height:e.renderer.height,from:d,to:f,progress:se});let L=l.get(A.id);L||(L=new Ae,L.label=`TransitionSprite_${A.id}`,l.set(A.id,L),u.addChild(L)),L.texture=Ee,L.visible=!0,L.x=0,L.y=0,L.width=e.renderer.width,L.height=e.renderer.height,L.anchor.set(0,0),L.zIndex=A.zIndex,E=!0;const K=o.get(A);if(K){const de=K.getRoot();de&&(de.visible=!1)}if(ee){const de=o.get(ee);if(de){const we=de.getRoot();we&&(we.visible=!1)}}continue}}let $=o.get(A);$==null&&H!=null&&($=new ar(e,A,u),o.set(A,$)),$!=null&&(H!=null?(E=!0,await $.updateFrame(H)):await $.updateFrame(null)),$?.updateTransforms()}if(A.duration>0&&T>A.display.from+A.duration||F){if(A.main&&(S=!0),A.expired=!0,n){const R=o.get(A);if(R!=null){const $=R.getRoot();$&&($.visible=!1)}}}else if(n){const R=o.get(A);R?.updateTransforms()}}if(n&&e!=null&&h!=null&&u!=null&&p!=null){let A=null;for(const M of t)if(M instanceof Qe&&T>=M.display.from&&T<M.display.from+M.duration){A={id:M.id,key:M.effect.key,startTime:M.display.from,duration:M.duration};break}if(!A)for(const M of t){if(M.effects&&M.effects.length>0){for(const U of M.effects)if(T>=U.startTime&&T<U.startTime+U.duration){A=U;break}}if(A)break}p.removeChildren();for(const M of o.values()){const U=M.getRoot();U&&U.parent!==u&&(U.parent&&U.parent.removeChild(U),u.addChild(U))}if(A){const{key:M,startTime:U,duration:H,id:re}=A,F=T-U,R=H>0?Math.min(Math.max(F/H,0),1):0,$=t.some(B=>B.id===re&&B instanceof Qe);for(const B of t){let q=!1;if($?q=B.id!==re&&!(B instanceof Qe):q=!!B.effects&&B.effects.some(se=>se.id===re),q){const se=o.get(B);if(se){const ee=se.getRoot();ee&&(ee.parent&&ee.parent.removeChild(ee),h.addChild(ee))}}}if(h.children.length>0){let B=g.get(re);if(!B)try{const q=Io({name:M,renderer:e.renderer});q&&q.filter&&(B={filter:q.filter,render:q.render},g.set(re,B))}catch(q){console.warn("Failed to create effect",M,q)}if(B){const{filter:q,render:se}=B;q.resources&&q.resources.effectUniforms&&(q.resources.effectUniforms.uniforms.uTime=R);const ee=e.renderer.width,G=e.renderer.height,Ee=Pe.create({width:ee,height:G});if(h.visible=!0,e.renderer.render({container:h,target:Ee,clear:!0}),h.visible=!1,se){const L=se({canvasTexture:Ee,progress:R,width:ee,height:G}),K=new Ae(L);K.width=ee,K.height=G,p.addChild(K)}}}}}return n&&e!=null&&e.render(),{audios:w,mainSprDone:S,hasVideo:E}},cleanup:()=>{d&&d.destroy(!0),f&&f.destroy(!0),m&&m.destroy(!0);for(const T of l.values())T.destroy();l.clear(),c.clear(),h&&h.destroy({children:!0}),u&&u.destroy({children:!0}),p&&p.destroy({children:!0}),o.forEach(T=>{T.destroy()}),o.clear()}}}function _2(s){const{canvas:e,outputAudio:t,muxer:r,hasVideoTrack:n,timeSlice:o}=s;let c=0;const l=Math.floor(3*s.fps),d=y2(1024);return(f,m,g)=>{if(t!==!1)for(const _ of d(f,m))r.encodeAudio(_);if(n&&g)try{const _=new VideoFrame(e,{duration:o,timestamp:f});r.encodeVideo(_,{keyFrame:c%l===0}),c+=1}catch(_){console.warn("Failed to create VideoFrame from canvas, skipping frame:",_)}}}function y2(s){const e=s*le.channelCount,t=new Float32Array(e*3);let r=0,n=0;const o=s/le.sampleRate*1e6,c=new Float32Array(e),l=d=>{let f=0;const m=Math.floor(r/e),g=[];for(let _=0;_<m;_++)g.push(new AudioData({timestamp:n,numberOfChannels:le.channelCount,numberOfFrames:s,sampleRate:le.sampleRate,format:"f32",data:t.subarray(f,f+e)})),f+=e,n+=o;for(t.set(t.subarray(f,r),0),r-=f;d-n>o;)g.push(new AudioData({timestamp:n,numberOfChannels:le.channelCount,numberOfFrames:s,sampleRate:le.sampleRate,format:"f32",data:c})),n+=o;return g};return(d,f)=>{const m=Math.max(...f.map(g=>g[0]?.length??0));for(let g=0;g<m;g++){let _=0,y=0;for(let a=0;a<f.length;a++){const h=f[a][0]?.[g]??0,u=f[a][1]?.[g]??h;_+=h,y+=u}t[r]=_,t[r+1]=y,r+=2}return l(d)}}class x2 extends me{constructor(){super(),this.eventMode="static",this.cursor="move"}draw(e,t=1){const n=1*t;this.clear(),this.setStrokeStyle({width:n,color:5620223}).rect(e.x,e.y,e.width,e.height).stroke(),this.hitArea=e}}class St extends me{#e=!1;handle;cursor;callbacks;constructor(e,t,r){super(),this.handle=e,this.cursor=t,this.callbacks=r,this.eventMode="static",this.#o(),this.on("pointerdown",this.#t),this.on("globalpointermove",this.#r),this.on("pointerup",this.#l),this.on("pointerupoutside",this.#l)}#o(){this.clear(),this.handle==="rot"?(this.circle(0,0,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:13421772}),this.moveTo(0,-5),this.arc(0,0,5,-Math.PI/2,Math.PI,!1),this.stroke({width:1,color:0}),this.moveTo(0,-8),this.lineTo(-3,-5),this.lineTo(0,-2),this.stroke({width:1,color:0,cap:"round",join:"round"}),this.hitArea=new Yr(0,0,24)):(this.rect(-5,-5,10,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:5620223}),this.hitArea=new V(-15,-15,30,30))}#t=e=>{this.#e=!0,this.cursor="grabbing",this.callbacks.beginDrag(this.handle,e.global),e.stopPropagation()};#r=e=>{this.#e&&(this.callbacks.updateDrag(this.handle,e.global),e.stopPropagation())};#l=e=>{this.#e&&(this.#e=!1,this.cursor="pointer",this.callbacks.endDrag(),e.stopPropagation())}}const hd={delta:new O};class b2 extends ie{group;wireframe=new x2;isDragging=!1;lastPointer=new J;activeHandle=null;#e;#o=new Map;#t=new J;#r=0;#l=0;#a=new V;#i=new J;#c=new V;#s=1;#n=1;opts;constructor(e){super(),this.opts=e,this.group=e.group,this.eventMode="static";const t={beginDrag:(r,n)=>this.#y(r,n),updateDrag:(r,n)=>this.#x(r,n),endDrag:()=>this.#f()};this.#e={tl:new St("tl","nwse-resize",t),tr:new St("tr","nesw-resize",t),bl:new St("bl","nesw-resize",t),br:new St("br","nwse-resize",t),ml:new St("ml","ew-resize",t),mr:new St("mr","ew-resize",t),mt:new St("mt","ns-resize",t),mb:new St("mb","ns-resize",t),rot:new St("rot","crosshair",{beginDrag:(r,n)=>this.#T(n),updateDrag:(r,n)=>this.#w(n),endDrag:()=>this.#f()})},this.addChild(this.wireframe,...Object.values(this.#e)),this.#m(),Ne.shared.addOnce(()=>this.#h())}#m(){this.on("pointerdown",this.#v),this.on("pointerup",this.#d),this.on("pointerupoutside",this.#d),this.on("globalpointermove",this.#_)}#h(){if(this.group.length===1){const e=this.group[0];this.#r=e.rotation;const t=this.#g(e);let r,n;this.opts.clip?(r=this.opts.clip.width,n=this.opts.clip.height):(r=t.width,n=t.height),this.#t.set(e.worldTransform.tx,e.worldTransform.ty),this.#c.copyFrom(new V(-r/2,-n/2,r,n))}else{const e=this.#S();this.#t.set(e.x+e.width/2,e.y+e.height/2);let t=e.width,r=e.height;if(this.parent){const o=new J(e.x,e.y),c=new J(e.x+e.width,e.y+e.height),l=this.parent.toLocal(o),d=this.parent.toLocal(c);t=Math.abs(d.x-l.x),r=Math.abs(d.y-l.y)}const n=new V(-t/2,-r/2,t,r);this.#c.copyFrom(n)}this.#u()}#g(e){const t=e.children.filter(d=>d.label!=="ShadowContainer");if(t.length===0){const d=e.getLocalBounds();return new V(d.minX,d.minY,d.maxX-d.minX,d.maxY-d.minY)}const r=t.find(d=>d.label==="MainSprite");if(r){const d=r.getLocalBounds();return new V(d.minX,d.minY,d.maxX-d.minX,d.maxY-d.minY)}let n=1/0,o=1/0,c=-1/0,l=-1/0;for(const d of t){const f=d.getBounds(),m=e.toLocal(new J(f.minX,f.minY)),g=e.toLocal(new J(f.maxX,f.maxY));n=Math.min(n,m.x,g.x),o=Math.min(o,m.y,g.y),c=Math.max(c,m.x,g.x),l=Math.max(l,m.y,g.y)}return new V(n,o,c-n,l-o)}updateBounds(){this.#h()}#v=e=>{this.#h(),this.isDragging=!0,this.lastPointer.copyFrom(e.global),this.cursor="grabbing"};#d=()=>{this.isDragging&&this.emit("transformEnd"),this.isDragging=!1,this.activeHandle=null,this.cursor="default"};#_=e=>{if(!this.isDragging||this.activeHandle||!this.parent)return;const t=this.parent.toLocal(this.lastPointer),r=this.parent.toLocal(e.global),n=r.x-t.x,o=r.y-t.y;for(const d of this.group)d.x+=n,d.y+=o;const c=e.global.x-this.lastPointer.x,l=e.global.y-this.lastPointer.y;this.#t.x+=c,this.#t.y+=l,this.lastPointer.copyFrom(e.global),this.#u()};#y(e,t){this.#h(),this.isDragging=!0,this.activeHandle=e,console.log("[Transformer] #beginHandleDrag called, activeHandle:",this.activeHandle),this.#o.clear();for(const r of this.group)this.#o.set(r,r.localTransform.clone());this.rotation=this.#r,this.#a.copyFrom(this.#c),this.#C(e)}#x(e,t){this.#b(e,t)}async#b(e,t){const r=this.#i,n=this.#A(e,this.toLocal(t),r),o=n.width/this.#a.width,c=n.height/this.#a.height,l=this.toGlobal(r);if(this.opts.clip&&this.opts.clip.constructor.name==="TextClip"){const f=n.width;console.log("[Transformer] TextClip scaling:",{handle:e,originalWidth:this.#a.width,newWidth:f,sx:o,sy:c}),this.emit("textClipResize",{handle:e,newWidth:f,newHeight:n.height,pivotWorld:l,proposed:n})}else this.#p(this.#E(l,this.#r,o,c));this.#c.copyFrom(n),this.#u()}#T(e){this.#h(),this.isDragging=!0,this.activeHandle="rot",this.#o.clear();for(const t of this.group)this.#o.set(t,t.localTransform.clone());this.#l=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)}#w(e){const r=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)-this.#l,n=this.#r+r;this.#p(this.#I(this.#t,r)),this.rotation=n,this.#u(n)}#f(){console.log("[Transformer] #endDrag called, activeHandle:",this.activeHandle),this.isDragging=!1,this.#r=this.rotation,this.activeHandle=null,this.#u(this.#r),this.emit("transformEnd")}#S(){let e=1/0,t=1/0,r=-1/0,n=-1/0;for(const o of this.group){const c=o.children.filter(l=>l.label!=="ShadowContainer");if(c.length===0){const l=o.getBounds();e=Math.min(e,l.minX),t=Math.min(t,l.minY),r=Math.max(r,l.maxX),n=Math.max(n,l.maxY);continue}for(const l of c){const d=l.getBounds();e=Math.min(e,d.minX),t=Math.min(t,d.minY),r=Math.max(r,d.maxX),n=Math.max(n,d.maxY)}}return new V(e,t,r-e,n-t)}#u(e=this.#r){this.parent&&this.position.copyFrom(this.parent.toLocal(this.#t)),this.rotation=e;const r=1/((this.parent?Math.abs(this.parent.worldTransform.a):1)||1),n=this.#c;this.wireframe.draw(n,r);const o=n.x+n.width/2,c=n.y+n.height/2,l=[this.#e.tl,this.#e.tr,this.#e.bl,this.#e.br,this.#e.ml,this.#e.mr,this.#e.mt,this.#e.mb,this.#e.rot];for(const d of l)d.scale.set(r);this.#e.tl.position.set(n.x,n.y),this.#e.tr.position.set(n.x+n.width,n.y),this.#e.bl.position.set(n.x,n.y+n.height),this.#e.br.position.set(n.x+n.width,n.y+n.height),this.#e.ml.position.set(n.x,c),this.#e.mr.position.set(n.x+n.width,c),this.#e.mt.position.set(o,n.y),this.#e.mb.position.set(o,n.y+n.height),this.#e.rot.position.set(o,n.y-30*r)}#C(e){const t=this.#a;if(this.opts.centeredScaling){this.#i.set(t.x+t.width/2,t.y+t.height/2);return}e==="tl"?this.#i.set(t.x+t.width,t.y+t.height):e==="tr"?this.#i.set(t.x,t.y+t.height):e==="bl"?this.#i.set(t.x+t.width,t.y):e==="br"?this.#i.set(t.x,t.y):e==="ml"?this.#i.set(t.x+t.width,t.y+t.height/2):e==="mr"?this.#i.set(t.x,t.y+t.height/2):e==="mt"?this.#i.set(t.x+t.width/2,t.y+t.height):e==="mb"&&this.#i.set(t.x+t.width/2,t.y)}#A(e,t,r){if(this.opts.centeredScaling){const o=Math.max(this.#s,Math.abs(t.x-r.x)*2),c=Math.max(this.#n,Math.abs(t.y-r.y)*2);return new V(r.x-o/2,r.y-c/2,o,c)}if(e==="tl"){const o=Math.min(t.x,r.x-this.#s),c=Math.min(t.y,r.y-this.#n);return new V(o,c,r.x-o,r.y-c)}if(e==="tr"){const o=Math.max(t.x,r.x+this.#s),c=Math.min(t.y,r.y-this.#n);return new V(r.x,c,o-r.x,r.y-c)}if(e==="bl"){const o=Math.min(t.x,r.x-this.#s),c=Math.max(t.y,r.y+this.#n);return new V(o,r.y,r.x-o,c-r.y)}if(e==="br"){const o=Math.max(t.x,r.x+this.#s),c=Math.max(t.y,r.y+this.#n);return new V(r.x,r.y,o-r.x,c-r.y)}const n=this.#a;if(e==="ml"){const o=Math.min(t.x,r.x-this.#s);return new V(o,n.y,r.x-o,n.height)}if(e==="mr"){const o=Math.max(t.x,r.x+this.#s);return new V(r.x,n.y,o-r.x,n.height)}if(e==="mt"){const o=Math.min(t.y,r.y-this.#n);return new V(n.x,o,n.width,r.y-o)}if(e==="mb"){const o=Math.max(t.y,r.y+this.#n);return new V(n.x,r.y,n.width,o-r.y)}return new V(r.x,r.y,this.#s,this.#n)}#E(e,t,r,n){return hd.delta.identity().translate(-e.x,-e.y).rotate(-t).scale(r,n).rotate(t).translate(e.x,e.y)}#I(e,t){return hd.delta.identity().translate(-e.x,-e.y).rotate(t).translate(e.x,e.y)}#p(e){for(const t of this.group){const r=this.#o.get(t),n=t.parent;if(!r||!n)continue;const o=n.worldTransform.clone().invert(),c=n.worldTransform.clone().append(r),l=e.clone().append(c),d=o.clone().append(l);t.setFromMatrix(d)}}}class T2 extends aa{pixiApp=null;tracks=[];clips=[];spriteRenderers=new Map;artboard=null;clipContainer=null;artboardMask=null;artboardBg=null;activeTransformer=null;selectedClips=new Set;interactiveClips=new Set;playbackElements=new Map;videoSprites=new Map;clipListeners=new Map;isPlaying=!1;currentTime=0;playStartTime=0;playStartTimestamp=0;rafId=null;maxDuration=0;opts;destroyed=!1;globalEffects=new Map;activeGlobalEffect=null;currentGlobalEffectSprite=null;effectFilters=new Map;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture=null;transToTexture=null;transBgGraphics=null;clipsNormalContainer=null;clipsEffectContainer=null;videoTextureCache=new WeakMap;lastFromFrame=null;lastToFrame=null;hexToNumber(e){const t=e.startsWith("#")?e.slice(1):e;return parseInt(t,16)}ready;constructor(e){super(),this.opts={fps:30,bgColor:"#000000",interactivity:!0,...e},this.ready=this.initPixiApp()}async initPixiApp(){if(this.destroyed)return;const e=this.opts.canvas||document.createElement("canvas");e.width=this.opts.width,e.height=this.opts.height,console.log("Initializing Pixi.js Application...",{width:this.opts.width,height:this.opts.height});const t=new fn,r=e.parentElement||window;await t.init({canvas:e,resizeTo:r,backgroundColor:this.hexToNumber(this.opts.bgColor),antialias:!0,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.pixiApp=t,t.stage.eventMode="static",t.stage.hitArea=t.screen,t.stage.on("pointerdown",n=>{n.target===t.stage&&this.deselectClip()}),this.artboard=new ie,this.artboard.label="ArtboardRoot",t.stage.addChild(this.artboard),this.artboardBg=new me,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:13882323}),this.artboard.addChild(this.artboardBg),this.clipContainer=new ie,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new me,this.artboardMask.rect(0,0,this.opts.width,this.opts.height).fill({color:16777215}),this.clipContainer.addChild(this.artboardMask),this.clipContainer.mask=this.artboardMask,this.clipsEffectContainer=new ie,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new ie,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.transFromTexture=Pe.create({width:this.opts.width,height:this.opts.height}),this.transToTexture=Pe.create({width:this.opts.width,height:this.opts.height}),this.transBgGraphics=new me,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}),this.clipContainer.sortableChildren=!0,this.updateArtboardLayout(),t.renderer.on("resize",()=>{this.handleResize()})}getOptions(){return this.opts}updateDimensions(e,t){this.opts.width=e,this.opts.height=t,this.artboardBg&&this.artboardBg.clear().rect(0,0,e,t).fill({color:3355443}),this.artboardMask&&this.artboardMask.clear().rect(0,0,e,t).fill({color:16777215}),this.transFromTexture&&this.transFromTexture.resize(e,t),this.transToTexture&&this.transToTexture.resize(e,t),this.transBgGraphics&&this.transBgGraphics.clear().rect(0,0,e,t).fill({color:3355443}),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}handleResize=()=>{this.destroyed||!this.pixiApp||this.updateArtboardLayout()};updateArtboardLayout(){if(!this.pixiApp||!this.artboard)return;const e=this.pixiApp.canvas.width,t=this.pixiApp.canvas.height,r=this.opts.width,n=this.opts.height,o=this.pixiApp.canvas.parentElement?.clientWidth||e,c=this.pixiApp.canvas.parentElement?.clientHeight||t,l=o/r,d=c/n,f=Math.min(l,d);this.artboard.scale.set(f),this.artboard.x=(o-r*f)/2,this.artboard.y=(c-n*f)/2}getCanvas(){if(this.opts.canvas)return this.opts.canvas;if(this.pixiApp?.canvas)return this.pixiApp.canvas;throw new Error("Canvas not initialized yet. Wait for initPixiApp to complete.")}async addMedia(e){if(this.destroyed)return;const t=this.opts.width,r=this.opts.height;t&&r&&(typeof e.scaleToFit=="function"&&await e.scaleToFit(t,r),typeof e.centerInScene=="function"&&e.centerInScene(t,r));const n=e.duration>0?e.duration:5e6;e.duration<=0&&(e.duration=n);const o=this.tracks.filter(d=>["media","video","image","Video","Image"].includes(d.type)),c=o.find(d=>d.clipIds.length>0)||o[0];let l;if(c){l=c.id;const d=n;for(const f of c.clipIds){const m=this.getClipById(f);if(m){const g=m.display.from+d,_=m.display.to+d;await this.updateClip(f,{display:{from:g,to:_}})}}}e.display.from=0,e.display.to=n,await this.addClip(e,{trackId:l}),await this.seek(0)}async addTransition(e,t=2e6,r,n){if(this.destroyed)return;console.log("transitionKey",e);let o=null,c=null;if(r&&n&&(o=this.getClipById(r)??null,c=this.getClipById(n)??null,!o||!c)){console.warn("[Studio] Invalid fromClipId or toClipId",{fromClipId:r,toClipId:n});return}if(!c){const y=this.tracks.filter(a=>["media","video","image","Video","Image"].includes(a.type)||a.clipIds.length>1);for(const a of y){const h=a.clipIds.map(u=>this.getClipById(u)).filter(u=>!!u&&u.type!=="Transition").sort((u,p)=>u.display.from-p.display.from);for(let u=0;u<h.length-1;u++){const p=h[u],v=h[u+1];if(Math.abs(v.display.from-p.display.to)<1e5){o=p,c=v;break}}if(o&&c)break}}if(c&&!o){const y=this.findTrackIdByClipId(c.id);if(y){const a=this.tracks.find(h=>h.id===y);if(a){const h=a.clipIds.map(p=>this.getClipById(p)).filter(p=>!!p&&p.type!=="Transition").sort((p,v)=>p.display.from-v.display.from),u=h.findIndex(p=>p.id===c.id);u>0&&(o=h[u-1])}}}if(!o||!c){console.warn("[Studio] Unable to resolve Clip A and Clip B for transition");return}const l=t,d=c.display.from-l/2,f=d+l,m={key:e,name:e,duration:l,fromClipId:o.id,toClipId:c.id,start:Math.max(0,d),end:f},g=this.findTrackIdByClipId(c.id);if(g){const y=this.tracks.find(a=>a.id===g);if(y){const a=y.clipIds.map(h=>this.getClipById(h)).filter(h=>{if(!h||h.type!=="Transition")return!1;const u=h;return u.fromClipId===o.id&&u.toClipId===c.id});for(const h of a)await this.removeClip(h)}}this.transitionRenderers.has(o.id)&&(this.transitionRenderers.get(o.id)?.destroy(),this.transitionRenderers.delete(o.id)),this.transitionRenderers.has(c.id)&&(this.transitionRenderers.get(c.id)?.destroy(),this.transitionRenderers.delete(c.id)),"transition"in o&&(o.transition={...m}),"transition"in c&&(c.transition={...m});const _=new mi(e);_.duration=l,_.fromClipId=Math.max(0,d)===0?null:o.id,_.toClipId=c.id,_.fromClipId===null&&o&&(_.fromClipId=o.id),_.display.from=Math.max(0,d),_.display.to=f,await this.addClip(_,{trackId:g}),this.seek(this.currentTime)}findTrackIdByClipId(e){for(const t of this.tracks)if(t.clipIds.includes(e))return t.id}async addClip(e,t){let r,n;if(t&&(typeof t=="string"||t instanceof File||t instanceof Blob))r=t;else if(typeof t=="object"&&t!==null&&!("size"in t)){const d=t;r=d.audioSource,n=d.trackId}if(this.destroyed)return;if(this.pixiApp==null)throw new Error("Failed to initialize Pixi.js Application");const o=async()=>{await this.updateFrame(this.currentTime),this.activeTransformer!=null&&this.selectedClips.has(e)&&typeof this.activeTransformer.updateBounds=="function"&&this.activeTransformer.updateBounds()};e.on("propsChange",o),this.clipListeners.set(e,o),this.pixiApp!=null&&typeof e.setRenderer=="function"&&e.setRenderer(this.pixiApp.renderer);const c=await e.ready;if(e.id||(e.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.clips.includes(e)||this.clips.push(e),n){const d=this.tracks.find(f=>f.id===n);d?d.clipIds.includes(e.id)||d.clipIds.push(e.id):this.tracks.unshift({id:n,name:`Track ${this.tracks.length+1}`,type:e.type,clipIds:[e.id]})}else{const d=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;this.tracks.unshift({id:d,name:`Track ${this.tracks.length+1}`,type:e.type,clipIds:[e.id]})}const l=e.duration>0?e.duration:c.duration;if(l===1/0||isNaN(l))await this.recalculateMaxDuration();else{const d=e.display.from+l;d>0&&(this.maxDuration=Math.max(this.maxDuration,d))}if(await this.setupPlaybackForClip(e,r),c.width>0&&c.height>0)if(e instanceof ge){if(e.tickInterceptor!=null){const d=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}}else{const d=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}await this.updateFrame(this.currentTime),this.opts.interactivity&&this.setupSpriteInteractivity(e),this.emit("clip:added",{clip:e,trackId:n||this.tracks.find(d=>d.clipIds.includes(e.id))?.id||""})}addTrack(e){const t={id:e.id||`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:e.name,type:e.type,clipIds:[]};return this.tracks.push(t),this.emit("track:added",{track:t}),t}async setTracks(e){this.tracks=e,await this.recalculateMaxDuration(),await this.updateFrame(this.currentTime)}async removeTrack(e){const t=this.tracks.findIndex(o=>o.id===e);if(t===-1)return;const n=[...this.tracks[t].clipIds];for(const o of n){const c=this.clips.find(l=>l.id===o);c&&await this.removeClip(c)}this.tracks.splice(t,1),this.emit("track:removed",{trackId:e}),await this.recalculateMaxDuration()}getClipById(e){return this.clips.find(t=>t.id===e)}async updateClip(e,t){const r=this.clips.find(n=>n.id===e);if(!r){console.warn(`[Studio] updateClip: Clip not found with id ${e}`);return}if(r instanceof Je&&(await r.updateStyle(t),"style"in t&&delete t.style),Object.assign(r,t),t.display&&!t.duration?r.duration=t.display.to-t.display.from:t.duration&&(!t.display||!t.display.to)&&(r.display||(r.display={from:0,to:t.duration}),r.display.to=r.display.from+t.duration),t.display&&t.duration){const n=t.display.to-t.display.from;n!==t.duration&&(r.duration=n)}else r.display&&(r.display.to=r.display.from+r.duration);await this.recalculateMaxDuration(),this.emit("clip:updated",{clip:r}),await this.updateFrame(this.currentTime)}getTracks(){return this.tracks}getClip(e){return this.clips.find(t=>t.id===e)}setupSpriteInteractivity(e){if(this.interactiveClips.has(e))return;const t=this.spriteRenderers.get(e);if(t==null)return;const r=t.getRoot();r!=null&&(r.eventMode="static",r.cursor="pointer",r.on("pointerdown",n=>{n.stopPropagation(),this.selectClip(e,n.shiftKey)}),this.interactiveClips.add(e))}async setupPlaybackForClip(e,t){if(this.pixiApp!=null){if(!this.isPlaybackCapable(e)){if(this.pixiApp!=null&&(await e.ready).width>0&&(await e.ready).height>0){const r=new ar(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,r)}return}try{const r=e;if(e instanceof Me&&t&&typeof t!="string"){const c=URL.createObjectURL(t);e.src=c}const{element:n,objectUrl:o}=await r.createPlaybackElement();if(e instanceof ge){const c=k.from(n),l=new Ae(c);l.visible=!1,this.clipsNormalContainer&&this.clipsNormalContainer.addChild(l),this.videoSprites.set(e,l)}this.playbackElements.set(e,{element:n,objectUrl:o})}catch(r){if(console.warn(`Failed to setup playback for ${e.constructor.name}, falling back to PixiSpriteRenderer:`,r),this.pixiApp!=null){const n=await e.ready;if(n.width>0&&n.height>0){const o=new ar(this.pixiApp,e,this.artboard);this.spriteRenderers.set(e,o)}}}}}isPlaybackCapable(e){return"createPlaybackElement"in e&&"play"in e&&"pause"in e&&"seek"in e&&"syncPlayback"in e&&"cleanupPlayback"in e}async removeClip(e){const t=this.clips.findIndex(l=>l===e);if(t===-1)return;this.selectedClips.has(e)&&this.deselectClip(),this.clips.splice(t,1);for(const l of this.tracks){const d=l.clipIds.indexOf(e.id);d!==-1&&l.clipIds.splice(d,1)}this.interactiveClips.delete(e);const r=this.clipListeners.get(e);r&&(e.off("propsChange",r),this.clipListeners.delete(e));const n=this.spriteRenderers.get(e);n!=null&&(n.destroy(),this.spriteRenderers.delete(e));const o=this.playbackElements.get(e);o!=null&&(this.isPlaybackCapable(e)&&e.cleanupPlayback(o.element,o.objectUrl),this.playbackElements.delete(e));const c=this.videoSprites.get(e);c!=null&&this.pixiApp!=null&&(this.artboard?.removeChild(c),c.destroy(),this.videoSprites.delete(e)),await this.recalculateMaxDuration(),this.emit("clip:removed",{clipId:e.id})}async removeClipById(e){const t=this.clips.find(r=>r.id===e);t&&await this.removeClip(t)}async deleteSelected(){const e=Array.from(this.selectedClips);if(e.length!==0)for(const t of e)await this.removeClip(t)}async duplicateSelected(){const e=Array.from(this.selectedClips);if(e.length===0)return;const t=[];for(const r of e){const n=this.findTrackIdByClipId(r.id);if(!n)continue;const o=this.tracks.find(m=>m.id===n);if(!o)continue;const c=lr(r,!1),l=await cr(c);l.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const d=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,f=`${o.name} (Copy)`;this.addTrack({id:d,name:f,type:o.type}),await this.addClip(l,{trackId:d}),t.push(l.id)}t.length>0&&this.selectClipsByIds(t)}async splitSelected(e){const t=Array.from(this.selectedClips);if(t.length!==1){console.warn("[Studio] Split requires exactly one selected clip");return}const r=t[0],n=e??this.currentTime;if(n<=r.display.from||r.display.to>0&&n>=r.display.to){console.warn("[Studio] Split time is outside clip bounds");return}const o=lr(r,!1),c=n-r.display.from,l=r.playbackRate||1,d=c*l,f={duration:c,display:{from:r.display.from,to:n}};r.trim&&(f.trim={from:r.trim.from,to:r.trim.from+d}),await this.updateClip(r.id,f);const m={...o};m.display={from:n,to:o.display.to},m.duration=o.duration-c,m.trim&&(m.trim={from:m.trim.from+d,to:m.trim.to});const g=await cr(m);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const _=this.findTrackIdByClipId(r.id);_&&(await this.addClip(g,{trackId:_}),this.selectClipsByIds([g.id]))}async trimSelected(e){const t=Array.from(this.selectedClips);if(t.length!==1){console.warn("[Studio] Trim requires exactly one selected clip");return}const r=t[0];console.log("[Studio] Trimming clip:",{clipId:r.id,currentDisplay:r.display,currentDuration:r.duration,currentTrim:r.trim,trimFromSeconds:e});const n=e*1e6,o=r.playbackRate||1,c=n*o;if(n>=r.duration){console.warn("[Studio] Trim amount exceeds clip duration");return}const l=r.duration-n,d=r.display.from+n,f=r.display.to,m={duration:l,display:{from:d,to:f}};if(r.trim)m.trim={from:r.trim.from+c,to:r.trim.to};else{const g=r.sourceDuration||r.duration;m.trim={from:c,to:g}}console.log("[Studio] Trim updates:",m),await this.updateClip(r.id,m),console.log("[Studio] Clip after trim:",{display:r.display,duration:r.duration,trim:r.trim})}async updateSelected(e){const t=Array.from(this.selectedClips);if(t.length!==0)for(const r of t)await this.updateClip(r.id,e)}clear(){this.deselectClip(),this.interactiveClips.clear(),this.effectFilters.clear(),this.globalEffects.clear(),this.spriteRenderers.forEach(e=>{e.destroy()}),this.spriteRenderers.clear();for(const[e,t]of this.playbackElements.entries())this.isPlaybackCapable(e)&&e.cleanupPlayback(t.element,t.objectUrl);this.playbackElements.clear();for(const e of this.videoSprites.values())e.destroy();this.videoSprites.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const e of this.transitionSprites.values())e.parent&&e.parent.removeChild(e),e.destroy();this.transitionSprites.clear(),this.tracks=[],this.clips=[],this.maxDuration=0,this.currentTime=0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),this.emit("reset")}async play(){if(!(this.isPlaying||this.destroyed)){if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){console.warn("Cannot play: invalid duration",this.maxDuration);return}this.isPlaying||(this.isPlaying=!0),this.playStartTime=this.currentTime,this.playStartTimestamp=performance.now();for(const[e,{element:t}]of this.playbackElements.entries()){if(!(this.currentTime>=e.display.from&&(e.display.to===0||this.currentTime<=e.display.to))){this.isPlaybackCapable(e)&&e.pause(t);continue}const n=(this.currentTime-e.display.from)/1e6;this.isPlaybackCapable(e)&&await e.play(t,n)}this.renderLoop(),this.emit("play",{isPlaying:!0})}}pause(){this.isPlaying=!1,this.rafId!=null&&(cancelAnimationFrame(this.rafId),this.rafId=null);for(const[e,{element:t}]of this.playbackElements.entries())this.isPlaybackCapable(e)&&e.pause(t);this.emit("pause",{isPlaying:!1})}async stop(){this.pause(),await this.seek(0)}async seek(e){if(this.destroyed)return;const t=this.isPlaying;this.playStartTime=Math.max(0,Math.min(e,this.maxDuration)),this.playStartTimestamp=performance.now(),this.currentTime=this.playStartTime;for(const[r,{element:n}]of this.playbackElements.entries()){if(!(this.currentTime>=r.display.from&&(r.display.to===0||this.currentTime<=r.display.to))){this.isPlaybackCapable(r)&&r.pause(n);continue}const c=(this.currentTime-r.display.from)/1e6;this.isPlaybackCapable(r)&&await r.seek(n,c)}if(await this.updateFrame(this.currentTime),t){this.isPlaying=!0;for(const[r,{element:n}]of this.playbackElements.entries()){if(!(this.currentTime>=r.display.from&&(r.display.to===0||this.currentTime<=r.display.to)))continue;const c=(this.currentTime-r.display.from)/1e6;this.isPlaybackCapable(r)&&await r.play(n,c)}}}getCurrentTime(){return this.currentTime}getMaxDuration(){return this.maxDuration===1/0||isNaN(this.maxDuration)||this.maxDuration<=0?0:this.maxDuration}getIsPlaying(){return this.isPlaying}getSelectedClips(){return Array.from(this.selectedClips)}async renderLoop(){if(!this.isPlaying||this.destroyed||this.pixiApp==null)return;if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){this.pause();return}const e=async()=>{if(!this.isPlaying||this.destroyed||this.pixiApp==null)return;if(this.currentTime>=this.maxDuration){this.currentTime=this.maxDuration,this.pause();return}const r=(performance.now()-this.playStartTimestamp)*1e3;this.currentTime=Math.min(this.playStartTime+r,this.maxDuration),this.emit("currentTime",{currentTime:this.currentTime});try{await this.updateFrame(this.currentTime)}catch(n){console.warn("Error updating frame:",n)}this.isPlaying&&(this.rafId=requestAnimationFrame(e))};e()}getVideoTexture(e){let t=this.videoTextureCache.get(e);return t||(t=k.from(e),this.videoTextureCache.set(e,t)),t}async updateFrame(e){if(this.destroyed||this.pixiApp==null)return;this.updateActiveGlobalEffect(e);const t=new Set,r=this.tracks.length;for(const o of this.clips){const c=this.getTrackIndex(o.id);if(c!==-1){const l=(r-c)*10;o.zIndex=l;const d=this.spriteRenderers.get(o);if(d){const f=d.getRoot();f&&(f.zIndex=l)}}}const n=[...this.clips].sort((o,c)=>o.zIndex-c.zIndex);for(const o of n){if(e<o.display.from){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}if(o.display.to>0&&e>o.display.to){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}const c=e-o.display.from,l=c*o.playbackRate;o.animate(l);const d=await o.ready,f=o.duration||d.duration;if(f>0&&c>f){const u=this.spriteRenderers.get(o);u!=null&&await u.updateFrame(null);const p=this.playbackElements.get(o);p!=null&&this.isPlaybackCapable(o)&&o.pause(p.element);continue}const m=this.playbackElements.get(o),g=o instanceof ge||o instanceof Te,_=o.transition?o.transition.start:0,y=o.transition?o.transition.end:0,a=g&&o.transition&&e>=_&&e<=y;if(m!=null&&this.isPlaybackCapable(o)){const u=c/1e6;if(o.syncPlayback(m.element,this.isPlaying,u),o instanceof ge){const p=this.videoSprites.get(o);if(p!=null){const v=o.meta.duration/1e6;if(this.spriteRenderers.has(o))p.visible=!1;else if(p.visible=!a&&u>=0&&u<v,p.visible&&fb(o,p),!a)continue}}else continue}if(a){this.transFromTexture||(this.transFromTexture=Pe.create({width:this.opts.width,height:this.opts.height})),this.transToTexture||(this.transToTexture=Pe.create({width:this.opts.width,height:this.opts.height})),this.transBgGraphics||(this.transBgGraphics=new me,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}));const u=this.getClipById(o?.transition?.fromClipId),p=this.getClipById(o?.transition?.toClipId);let v=null,x=null;if(u){const b=Math.max(0,e-u.display.from),{video:T}=await u.getFrame(b);T instanceof HTMLVideoElement?v=this.getVideoTexture(T):v=T,v&&(this.lastFromFrame=v)}if(p){const b=Math.max(0,e-p.display.from),{video:T}=await p.getFrame(b);T instanceof HTMLVideoElement?x=this.getVideoTexture(T):x=T,x&&(this.lastToFrame=x)}if(v||(v=this.lastFromFrame),x||(x=this.lastToFrame),!v||!x)continue;if(v&&x&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const b=(e-_)/o?.transition?.duration;u&&v&&this.renderClipToTransitionTexture(u,v,this.transFromTexture),p&&x&&this.renderClipToTransitionTexture(p,x,this.transToTexture);let T=this.transitionRenderers.get(o.id);if(!T)try{T=Ro({name:o?.transition?.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(o.id,T)}catch(w){console.error("[Studio] Failed to create transition renderer:",w)}if(T){const w=T.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:b});let S=this.transitionSprites.get(o.id);S||(S=new Ae,S.label=`TransitionSprite_${o.id}`,this.transitionSprites.set(o.id,S),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(S)),S.texture=w,S.visible=!0,S.x=0,S.y=0,S.width=this.opts.width,S.height=this.opts.height,S.anchor.set(0,0),S.zIndex=o.zIndex,t.add(o.id);const E=this.spriteRenderers.get(o);E?.getRoot()&&(E.getRoot().visible=!1);const I=this.videoSprites.get(o);if(I&&(I.visible=!1),u){const P=this.spriteRenderers.get(u);P?.getRoot()&&(P.getRoot().visible=!1);const A=this.videoSprites.get(u);A&&(A.visible=!1)}continue}}}const h=this.spriteRenderers.get(o);if(h!=null){const u=this.selectedClips.has(o);if(o instanceof Te){const v=o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms();continue}}if(o instanceof Je){const v=await o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms();continue}}if(o instanceof Ft){o.updateState(c);const v=await o.getTexture();if(v!=null){await h.updateFrame(v),u||h.updateTransforms(),this.opts.interactivity&&this.setupSpriteInteractivity(o);continue}else console.log("[Studio] CaptionClip texture is null, falling back to traditional path")}const{video:p}=await o.getFrame(c);await h.updateFrame(p),u||h.updateTransforms(),this.opts.interactivity&&this.setupSpriteInteractivity(o)}}if(this.activeGlobalEffect&&this.clipsNormalContainer&&this.clipsEffectContainer){const{startTime:o,duration:c}=this.activeGlobalEffect,l=e-o,d=Math.min(Math.max(l/c,0),1);if(d>0&&d<1){try{for(const m of this.clips)this.moveClipToEffectContainer(m,!1);const f=this.clips.some(m=>m.id===this.activeGlobalEffect.id&&m instanceof Qe);for(const m of this.clips){let g=!1;if(f){const _=this.activeGlobalEffect.trackIndex??-1,y=this.getTrackIndex(m.id);g=m.id!==this.activeGlobalEffect.id&&!(m instanceof Qe)&&y>_}else{const _=m.effects;g=Array.isArray(_)&&_.some(y=>y&&y.id===this.activeGlobalEffect.id)}g&&this.moveClipToEffectContainer(m,!0)}}catch(f){console.warn("Failed to reparent clips for effect; falling back to full-scene render",f)}this.clipsNormalContainer.visible=!0,await this.applyGlobalEffectIfNeeded(e)}else{for(const f of this.clips)try{this.moveClipToEffectContainer(f,!1)}catch{}this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}}else if(this.clipsNormalContainer){for(const o of this.clips)try{this.moveClipToEffectContainer(o,!1)}catch{}this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}for(const[o,c]of this.transitionSprites.entries())t.has(o)||(c.visible=!1);this.pixiApp!=null&&this.pixiApp.render()}async recalculateMaxDuration(){this.maxDuration=0;for(const e of this.clips){const t=await e.ready,r=e.duration>0?e.duration:t.duration,n=e.display.from+r;n!==1/0&&!isNaN(n)&&n>0&&(this.maxDuration=Math.max(this.maxDuration,n))}}moveClipToEffectContainer(e,t=!0){if(!this.clipsNormalContainer||!this.clipsEffectContainer)return;const r=t?this.clipsEffectContainer:this.clipsNormalContainer,n=this.spriteRenderers.get(e);if(n){const c=n.getRoot();if(c&&c.parent!==r){try{c.parent&&c.parent.removeChild&&c.parent.removeChild(c)}catch(l){console.warn("moveClipToEffectContainer: could not remove root from parent",l)}r.addChild(c)}}const o=this.transitionSprites.get(e.id);if(o&&o.parent!==r){try{o.parent&&o.parent.removeChild&&o.parent.removeChild(o)}catch(c){console.warn("moveClipToEffectContainer: could not remove transSprite from parent",c)}r.addChild(o)}}applyGlobalEffect(e,t,r){const n=t.id||`${e}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,key:e,startTime:t.startTime,duration:t.duration??1e6};for(const c of r)c instanceof Te&&c.addEffect(o),c instanceof ge&&c.addEffect(o),c instanceof Je&&c.addEffect(o),c instanceof Ft&&c.addEffect(o);return this.globalEffects.set(n,o),n}getTrackIndex(e){return this.tracks.findIndex(t=>t.clipIds.includes(e))}async getTransitionFromFrame(e,t){let r=null;if(e.transition?.prevClipId&&(r=this.clips.find(l=>l.id===e.transition.prevClipId)||null),r||(r=this.getPreviousClipOnTrack(e)),!r)return null;const n=r.duration>0?r.duration:0,o=Math.max(0,Math.min(t-r.display.from,n)),{video:c}=await r.getFrame(o);return c}getPreviousClipOnTrack(e){const t=this.getTrackIndex(e.id);return t===-1?null:this.clips.filter(r=>r.id!==e.id&&this.getTrackIndex(r.id)===t&&r.display.from<e.display.from&&(r instanceof ge||r instanceof Te)).sort((r,n)=>n.display.to-r.display.to)[0]||null}renderClipToTransitionTexture(e,t,r){if(!this.pixiApp||!this.transBgGraphics)return;this.pixiApp.renderer.render({container:this.transBgGraphics,target:r,clear:!0});const n=new Ae(t instanceof k?t:k.from(t));n.x=e.center.x,n.y=e.center.y,n.anchor.set(.5,.5);const o=n.texture.width||1,c=n.texture.height||1,l=e.width&&e.width!==0?Math.abs(e.width)/o:1,d=e.height&&e.height!==0?Math.abs(e.height)/c:1;e.flip==="horizontal"?(n.scale.x=-l,n.scale.y=d):e.flip==="vertical"?(n.scale.x=l,n.scale.y=-d):(n.scale.x=l,n.scale.y=d),n.rotation=(e.flip==null?1:-1)*e.angle,n.alpha=e.opacity,this.pixiApp.renderer.render({container:n,target:r,clear:!1}),t instanceof k||n.texture.destroy(!0),n.destroy()}removeGlobalEffect(e){this.globalEffects.delete(e)}clearGlobalEffects(){this.globalEffects.clear()}updateActiveGlobalEffect(e){let t=null;for(const r of this.clips)if(r instanceof Qe&&e>=r.display.from&&(r.display.to===0||e<=r.display.to)){t={id:r.id,key:r.effect.key,startTime:r.display.from,duration:r.duration>0?r.duration:r.display.to-r.display.from,trackIndex:this.getTrackIndex(r.id)};break}if(!t)for(const r of this.globalEffects.values()){const n=r.startTime+r.duration;if(e>=r.startTime&&e<n){t={id:r.id,key:r.key,startTime:r.startTime,duration:r.duration,trackIndex:-1};break}}this.activeGlobalEffect=t}async applyGlobalEffectIfNeeded(e){if(this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),!this.activeGlobalEffect||!this.pixiApp||!this.clipContainer||!this.artboard||!this.clipsNormalContainer||!this.clipsEffectContainer)return;const{key:t,startTime:r,duration:n}=this.activeGlobalEffect,o=e-r,c=Math.min(Math.max(o/n,0),1);if(c<=0||c>=1)return;this.clipsEffectContainer.visible=!0;let l=this.effectFilters.get(t);if(!l)try{if(l=Io({name:t.toLowerCase(),renderer:this.pixiApp.renderer}),l)this.effectFilters.set(t,l);else return}catch(y){console.error(y);return}const d=this.opts.width,f=this.opts.height,m=Pe.create({width:d,height:f});this.pixiApp.renderer.render({container:this.clipsEffectContainer,target:m,clear:!0}),this.clipsEffectContainer.visible=!1;const g=l.render({canvasTexture:m,progress:c,width:d,height:f}),_=new Ae(g);_.x=0,_.y=0,_.width=d,_.height=f,_.scale.set(1),_.zIndex=5,this.clipContainer.addChild(_),this.currentGlobalEffectSprite=_,m.destroy(!0)}destroy(){if(!this.destroyed){window.removeEventListener("resize",this.handleResize),this.destroyed=!0,this.stop(),this.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const e of this.transitionSprites.values())e.destroy();this.transitionSprites.clear(),this.pixiApp&&(this.pixiApp.destroy(!0,{children:!0,texture:!0}),this.pixiApp=null)}}selectClip(e,t=!1){if(!(this.destroyed||this.pixiApp==null)){if(t||this.deselectClip(),t&&this.selectedClips.has(e)){this.selectedClips.delete(e),this.activeTransformer!=null&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.selectedClips.size>0&&this.createTransformer(),this.emit("selection:updated",{selected:Array.from(this.selectedClips)});return}this.selectedClips.add(e),this.activeTransformer!=null&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.createTransformer(),t?this.emit("selection:updated",{selected:Array.from(this.selectedClips)}):this.emit("selection:created",{selected:Array.from(this.selectedClips)})}}createTransformer(){if(this.destroyed||this.artboard==null||this.selectedClips.size===0)return;const e=[];let t=null;for(const n of this.selectedClips){const o=this.spriteRenderers.get(n);if(o==null)continue;const c=o.getRoot();c!=null&&(e.push(c),this.selectedClips.size===1&&(t=n))}if(e.length===0){console.warn("Cannot create transformer: no sprites found");return}this.activeTransformer=new b2({group:e,clip:t});let r=null;this.activeTransformer.on("transforming",()=>{r===null&&(r=requestAnimationFrame(()=>{r=null,this.syncSelectedClipsTransformsRealtime()}))}),this.activeTransformer.on("textClipResize",n=>{this.textClipResizedWidth=n.newWidth}),this.activeTransformer.on("transformEnd",()=>{r!==null&&(cancelAnimationFrame(r),r=null),this.syncSelectedClipsTransforms()}),this.artboard.addChild(this.activeTransformer)}isUpdatingTextClipRealtime=!1;textClipResizedWidth=null;async syncSelectedClipsTransformsRealtime(){if(!(this.selectedClips.size===0||this.activeTransformer==null)&&!this.isUpdatingTextClipRealtime){this.isUpdatingTextClipRealtime=!0;try{if(this.activeTransformer.activeHandle!=="mr")return;for(const t of this.selectedClips){if(!(t instanceof Je))continue;const r=this.spriteRenderers.get(t);if(r==null)continue;const n=r.getRoot(),o=r.getSprite();if(n==null||o==null||o.texture==null)continue;const c=Math.abs(n.scale.x*o.scale.x);if(c===1)continue;const l=t.left,d=t.top,f=o.texture.width,m=c*f;await t.updateStyle({wordWrap:!0,wordWrapWidth:m});const g=await t.getTexture();g&&(await r.updateFrame(g),o.scale.set(1,1),n.scale.set(1,1),t.left=l,t.top=d,n.x=t.left+t.width/2,n.y=t.top+t.height/2)}}finally{this.isUpdatingTextClipRealtime=!1}}}async syncSelectedClipsTransforms(){if(!(this.selectedClips.size===0||this.activeTransformer==null)){for(const e of this.selectedClips){const t=this.spriteRenderers.get(e);if(t==null)continue;const r=t.getRoot(),n=t.getSprite();if(r==null||n==null||n.texture==null)continue;const o=n.texture.width,c=n.texture.height,l=Math.abs(r.scale.x*n.scale.x)*o,d=Math.abs(r.scale.y*n.scale.y)*c,f=e instanceof Je&&this.textClipResizedWidth!==null?this.textClipResizedWidth:l,m=r.x-f/2,g=r.y-d/2;if(e instanceof Je&&this.textClipResizedWidth!==null){await e.updateStyle({wordWrap:!0,wordWrapWidth:f});const _=await e.getTexture();_&&(await t.updateFrame(_),e.width=f,e.height=_.height,this.textClipResizedWidth=null,e.left=r.x-e.width/2,e.top=r.y-e.height/2,n.scale.set(1,1),r.scale.set(1,1))}else{e.left=m,e.top=g,e.width=l,e.height=d;const _=e.flip==null?1:-1;e.angle=_*r.angle}}this.activeTransformer!=null&&this.activeTransformer.updateBounds();for(const e of this.selectedClips){const t=this.spriteRenderers.get(e);t?.updateTransforms()}}}syncSpriteToClipProperties(e){const t=this.spriteRenderers.get(e);if(t!=null){const r=t.getRoot(),n=t.getSprite();if(r!=null&&n!=null&&n.texture!=null){const o=n.texture.width,c=n.texture.height,l=Math.abs(r.scale.x*n.scale.x)*o,d=Math.abs(r.scale.y*n.scale.y)*c,f=r.x-l/2,m=r.y-d/2;e.left=f,e.top=m,e.width=l,e.height=d;const g=e.flip==null?1:-1;e.angle=g*r.angle,t.updateTransforms()}}}setSelection(e){if(!(this.destroyed||this.pixiApp==null)&&!(this.selectedClips.size===e.length&&e.every(t=>this.selectedClips.has(t)))){for(const t of this.selectedClips)this.syncSpriteToClipProperties(t);this.activeTransformer&&(this.activeTransformer.parent&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null),this.selectedClips.clear();for(const t of e)this.selectedClips.add(t);this.selectedClips.size>0?(this.createTransformer(),this.emit("selection:updated",{selected:Array.from(this.selectedClips)})):this.emit("selection:cleared",{deselected:[]})}}selectClipsByIds(e){const t=this.clips.filter(r=>e.includes(r.id));this.setSelection(t)}deselectClip(){if(this.selectedClips.size>0)for(const t of this.selectedClips)this.syncSpriteToClipProperties(t);this.activeTransformer!=null&&(this.activeTransformer.parent!=null&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null);const e=Array.from(this.selectedClips);this.selectedClips.clear(),e.length>0&&this.emit("selection:cleared",{deselected:e})}exportToJSON(){const e=this.clips.map(n=>lr(n,!1)),t=this.tracks.map(n=>({id:n.id,name:n.name,type:n.type,clipIds:n.clipIds})),r=[];return this.clips.forEach(n=>{if(n.transition){const o=this.tracks.find(c=>c.clipIds.includes(n.id));if(o){const c=o.clipIds.indexOf(n.id);if(c>0){const l=o.clipIds[c-1];r.push({key:n.transition.name,duration:n.transition.duration,clips:[l,n.id]})}}}}),{tracks:t,clips:e,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,bgColor:this.opts.bgColor}}}async loadFromJSON(e){if(this.clear(),e.settings){const t=e.settings.width&&e.settings.width!==this.opts.width||e.settings.height&&e.settings.height!==this.opts.height;if(e.settings.width&&(this.opts.width=e.settings.width),e.settings.height&&(this.opts.height=e.settings.height),e.settings.fps&&(this.opts.fps=e.settings.fps),e.settings.bgColor&&(this.opts.bgColor=e.settings.bgColor),t&&this.pixiApp!=null){const r=this.opts.width,n=this.opts.height;this.pixiApp.renderer.resize(r,n),this.opts.canvas&&(this.opts.canvas.width=r,this.opts.canvas.height=n)}}if(e.clips){const t=new Map;if(e.tracks){for(const r of e.tracks)if(r.clipIds)for(const n of r.clipIds)t.set(n,r.id)}if(e.tracks)for(const r of e.tracks)this.tracks.push({id:r.id,name:r.name,type:r.type,clipIds:[]});for(const r of e.clips){let n=r.id?t.get(r.id):void 0;if(r.type==="Transition"){const o=r,c=o.toClipId||o.fromClipId;c&&(n=t.get(c));const l=r.fromClipId||"",d=r.toClipId||"",f=this.getClipById(l),m=this.getClipById(d);if(f&&m){const g=this.clips.find(u=>u.type==="Transition"&&u.fromClipId===l&&u.toClipId===d),_=r.duration;let y,a;if(g)y=g.display.from,a=g.display.to;else{const u=m.display.from;y=Math.max(0,u-_/2),a=y+_}const h={key:r.transitionEffect.key,name:r.transitionEffect.name,duration:_,fromClipId:l,toClipId:d,start:y,end:a};"transition"in f&&(f.transition=h),"transition"in m&&(m.transition=h)}else console.warn(`[Studio] Could not find clips for transition ${r.transitionEffect.key}: from=${l}, to=${d}`)}await this.loadClipIntoTrack(r,n)}}for(const t of this.clips){const r=t.effects;if(Array.isArray(r))for(const n of r)this.globalEffects.has(n.id)||this.globalEffects.set(n.id,{id:n.id,key:n.key,startTime:n.startTime,duration:n.duration})}try{await this.updateFrame(this.currentTime)}catch(t){console.error("[Studio] Failed to update initial frame:",t)}}async loadClipIntoTrack(e,t){if(e.type!=="Text"&&e.type!=="Caption"&&e.type!=="Effect"&&e.type!=="Transition"&&(!e.src||e.src.trim()==="")){console.warn(`Skipping clip ${e.type} with empty source`);return}try{const r=await cr(e),n=r instanceof Me?e.src:void 0;await this.addClip(r,{trackId:t,audioSource:n}),(r instanceof ge||r instanceof Te)&&(!e.width||!e.height)&&(await r.scaleToFit(this.opts.width,this.opts.height),r.centerInScene(this.opts.width,this.opts.height))}catch(r){console.warn(`Failed to load clip of type ${e.type}:`,r)}}}class _i{static instance;fonts=new Map;constructor(){}static getInstance(){return _i.instance||(_i.instance=new _i),_i.instance}async addFont(e){if(!this.fonts.has(e.name))try{const r=await new FontFace(e.name,`url(${e.url})`).load();document.fonts.add(r),this.fonts.set(e.name,r)}catch(t){console.error(`Failed to load font ${e.name}:`,t)}}async loadFonts(e){await Promise.all(e.map(t=>this.addFont(t)))}removeFont(e){const t=this.fonts.get(e);t&&(document.fonts.delete(t),this.fonts.delete(e))}clear(){this.fonts.forEach(e=>{document.fonts.delete(e)}),this.fonts.clear()}getLoadedFonts(){return Array.from(this.fonts.keys())}}const w2=_i.getInstance();W.add(sm),W.mixin(ie,nm),W.add(Ol),W.add(Dl),W.add(Vc),W.mixin(ie,Fv),W.add(Wc),W.add(Mu),W.add(Fn),W.add(Uu),W.add(Lu),W.add(Nu),W.add(Zu),W.add(ju),W.add(Vu),W.add(qu),W.add(Xu),W.add(Wu),W.add(Hu),W.add(Zc),W.add(Kc);const S2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),C2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));ne.AudioClip=Me,ne.CaptionClip=Ft,ne.Compositor=g2,ne.EffectClip=Qe,ne.GL_EFFECT_OPTIONS=db,ne.GL_TRANSITION_OPTIONS=p2,ne.ImageClip=Te,ne.Log=Y,ne.MP4Clip=ge,ne.Studio=T2,ne.TextClip=Je,ne.TransitionClip=mi,ne.VideoClip=ge,ne.clipToJSON=lr,ne.createChromakey=zf,ne.fastConcatMP4=sd,ne.fixFMP4Duration=Xx,ne.fontManager=w2,ne.jsonToClip=cr,ne.makeEffect=Io,ne.makeTransition=Ro,ne.mixinMP4AndAudio=jx,ne.renderTxt2ImgBitmap=Yf,Object.defineProperty(ne,Symbol.toStringTag,{value:"Module"})}));
@@ -1,4 +1,4 @@
1
- import { E as p, U as Ne, T as ee, F as je, G as he, v as fe, M as P, l as C, d as pe, I as v, t as w, a8 as $, R as N, w as L, H as me, a5 as G, a6 as ge, c as F, B as T, D as j, S as M, y as D, af as qe, ag as q, L as Y, ah as U, s as Q, a0 as Qe, $ as X, n as xe, q as _e, aa as be, ad as ye, o as Je, p as Ze, ab as et, ac as tt, ae as rt, ai as nt, aj as st, ak as it, al as H, am as at, an as ot, m as ve, ao as te, ap as k, e as b, aq as ut } from "./index-DyXIO7KH.js";
1
+ import { E as p, U as Ne, T as ee, F as je, G as he, v as fe, M as P, l as C, d as pe, I as v, t as w, a8 as $, R as N, w as L, H as me, a5 as G, a6 as ge, c as F, B as T, D as j, S as M, y as D, af as qe, ag as q, L as Y, ah as U, s as Q, a0 as Qe, $ as X, n as xe, q as _e, aa as be, ad as ye, o as Je, p as Ze, ab as et, ac as tt, ae as rt, ai as nt, aj as st, ak as it, al as H, am as at, an as ot, m as ve, ao as te, ap as k, e as b, aq as ut } from "./index-vzWoc22W.js";
2
2
  import { c as z, a as lt, b as ct, B as Te } from "./colorToUniform-C2jGzNe1.js";
3
3
  class Pe {
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@designcombo/video",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Video rendering and processing library",
5
5
  "type": "module",
6
6
  "publishConfig": {