@designcombo/video 0.0.4 → 0.0.5

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-CZk_O50g.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-Cu_5hRJ3.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-CZk_O50g.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-Cu_5hRJ3.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-Cv0Hv-t_.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-CRU_36xv.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-CZk_O50g.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-Cu_5hRJ3.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-Cv0Hv-t_.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-CRU_36xv.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-CZk_O50g.js";
2
- import "./webworkerAll-C-9pdN3u.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-Cu_5hRJ3.js";
2
+ import "./webworkerAll-yHa2ILeq.js";
3
3
  class q {
4
4
  constructor(e) {
5
5
  this._lastTransform = "", this._observer = null, this._tickerAttached = !1, this.updateTranslation = () => {
@@ -5569,7 +5569,7 @@ const rs = (s) => {
5569
5569
  },
5570
5570
  test: () => !0,
5571
5571
  load: async () => {
5572
- await import("./browserAll-CVO4QZK1.js");
5572
+ await import("./browserAll-yBQiB45V.js");
5573
5573
  }
5574
5574
  }, Dc = {
5575
5575
  extension: {
@@ -5579,7 +5579,7 @@ const rs = (s) => {
5579
5579
  },
5580
5580
  test: () => typeof self < "u" && self.WorkerGlobalScope !== void 0,
5581
5581
  load: async () => {
5582
- await import("./webworkerAll-C-9pdN3u.js");
5582
+ await import("./webworkerAll-yHa2ILeq.js");
5583
5583
  }
5584
5584
  };
5585
5585
  class ft {
@@ -14767,13 +14767,13 @@ async function Eu(s) {
14767
14767
  for (let a = 0; a < t.length; a++) {
14768
14768
  const h = t[a];
14769
14769
  if (h === "webgpu" && await Iu()) {
14770
- const { WebGPURenderer: l } = await import("./WebGPURenderer-CKsFf2P8.js");
14770
+ const { WebGPURenderer: l } = await import("./WebGPURenderer-Ct-nIPui.js");
14771
14771
  e = l, r = { ...s, ...s.webgpu };
14772
14772
  break;
14773
14773
  } else if (h === "webgl" && Au(
14774
14774
  s.failIfMajorPerformanceCaveat ?? Ba.defaultOptions.failIfMajorPerformanceCaveat
14775
14775
  )) {
14776
- const { WebGLRenderer: l } = await import("./WebGLRenderer-CeXIsNm5.js");
14776
+ const { WebGLRenderer: l } = await import("./WebGLRenderer-DEFvQb8g.js");
14777
14777
  e = l, r = { ...s, ...s.webgl };
14778
14778
  break;
14779
14779
  } else if (h === "canvas")
@@ -36628,7 +36628,7 @@ class sy extends No {
36628
36628
  a.updateState(h);
36629
36629
  const f = await a.getTexture();
36630
36630
  if (f != null) {
36631
- await n.updateFrame(f), c || n.updateTransforms();
36631
+ await n.updateFrame(f), c || n.updateTransforms(), this.opts.interactivity && this.setupSpriteInteractivity(a);
36632
36632
  continue;
36633
36633
  } else
36634
36634
  console.log(
@@ -36636,7 +36636,7 @@ class sy extends No {
36636
36636
  );
36637
36637
  }
36638
36638
  const { video: u } = await a.getFrame(h);
36639
- await n.updateFrame(u), c || n.updateTransforms();
36639
+ await n.updateFrame(u), c || n.updateTransforms(), this.opts.interactivity && this.setupSpriteInteractivity(a);
36640
36640
  }
36641
36641
  }
36642
36642
  if (this.activeGlobalEffect && this.clipsNormalContainer && this.clipsEffectContainer) {
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-CZk_O50g.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-Cu_5hRJ3.js";
2
2
  export {
3
3
  i as AudioClip,
4
4
  o as CaptionClip,
package/dist/index.umd.js CHANGED
@@ -7527,4 +7527,4 @@ vec4 transition(vec2 uv) {
7527
7527
  vec2 offset = dir * vec2(sin(progress * dist * amplitude * x), sin(progress * dist * amplitude * y)) / smoothness;
7528
7528
  return mix(getFromColor(p + offset), getToColor(p), smoothstep(0.2, 1.0, progress));
7529
7529
  }
7530
- `,jb={a:{value:4,type:"f32"},b:{value:1,type:"f32"},amplitude:{value:120,type:"f32"},smoothness:{value:.1,type:"f32"}},Zb={radialSwipe:{label:"Radial Swipe",fragment:ab}},fi={...di.reduce((s,e)=>(s[e.name]={label:e.name,fragment:e.glsl,uniforms:e.defaultParams},s),{}),...Zb},Jb=Object.entries(fi).map(([s,e])=>({key:s,label:e.label}));function Io({name:s,renderer:e}){console.log("Making transition",s);let t=di.find(Y=>Y.name===s);if(!t){const Y=Object.keys(fi).find(M=>M.toLowerCase()===s.toLowerCase());Y&&(t=fi[Y])}if(t||(t=di.find(Y=>Y.name.toLowerCase()===s.toLowerCase())),!t){const Y=[s,s.toLowerCase(),s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),s.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),s.replace(/_/g,"")];for(const M of Y){if(t=di.find(ue=>ue.name.toLowerCase()===M.toLowerCase()),t)break;const he=Object.keys(fi).find(ue=>ue.toLowerCase()===M.toLowerCase());if(he){t=fi[he];break}}}if(!t){const Y=di.length,M=di.slice(0,5).map(ue=>ue.name).join(", "),he=Object.keys(fi).slice(0,3).join(", ");throw console.error(`Transition not found: "${s}". Available in gl-transitions (${Y} total):`,M+"..."),console.error("Available locally:",he+"..."),new Error(`Transition "${s}" not found in gl-transitions library or local definitions`)}const r=new Te(U.WHITE),n=Se.create({width:e.width,height:e.height}),o=new nt({}),c=new nt({}),l=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",d=l?new nt({}):void 0;let f=null;if(l){f=document.createElement("canvas"),f.width=256,f.height=256;const Y=f.getContext("2d");if(Y){const M=Y.createImageData(256,256);for(let he=0;he<M.data.length;he+=4){const ue=Math.random();M.data[he]=ue*255,M.data[he+1]=ue*255,M.data[he+2]=ue*255,M.data[he+3]=255}Y.putImageData(M,0,0)}}let m=t.glsl||t.fragment;if(!m)throw new Error(`Transition "${s}" has no glsl or fragment code`);let g={...ce.basics,...ce.custom(t)};const v=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==="RotateScaleFade"||s.toLowerCase()==="rotatescalefade"||t.label==="rotateScaleFade",_=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",A=t.name==="heart"||s.toLowerCase()==="heart"||t.label==="heart",P=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",I=t.name==="directionalwipe"||s.toLowerCase()==="directionalwipe"||s.toLowerCase()==="directional_wipe"||t.label==="directionalwipe",k=t.name==="directionalwarp"||s.toLowerCase()==="directionalwarp"||s.toLowerCase()==="directional_warp"||t.label==="directionalwarp",O=t.name==="crosshatch"||s.toLowerCase()==="crosshatch"||t.label==="crosshatch",X=t.name==="circleopen"||s.toLowerCase()==="circleopen"||s.toLowerCase()==="circle_open"||t.label==="circleopen",oe=t.name==="cannabisleaf"||s.toLowerCase()==="cannabisleaf"||s.toLowerCase()==="cannabis_leaf"||t.label==="cannabisleaf",R=t.name==="StereoViewer"||s.toLowerCase()==="stereoviewer"||s.toLowerCase()==="stereo_viewer"||t.label==="StereoViewer",F=t.name==="GlitchDisplace"||s.toLowerCase()==="glitchDisplace"||t.label==="GlitchDisplace",q=t.name==="CrossZoom"||s.toLowerCase()==="crosszoom"||t.label==="CrossZoom",N=t.name==="CrazyParametricFun"||s.toLowerCase()==="crazyparametricfun"||t.label==="CrazyParametricFun";v&&(m=lb,g={...ce.basics,...cb}),y&&(m=hb,g={...ce.basics,...rd}),a&&(m=ub,g={...ce.basics,...db}),h&&(m=fb,g={...ce.basics,...pb}),u&&(m=mb,g={...ce.basics,...gb}),p&&(m=_b,g={...ce.basics,...vb}),_&&(m=yb,g={...ce.basics,...xb}),x&&(m=bb,g={...ce.basics,...Tb}),b&&(m=ed,g={...ce.basics,...td}),T&&(m=wb,g={...ce.basics,...Sb}),w&&(m=Cb,g={...ce.basics,...Ab}),S&&(m=Eb,g={...ce.basics,...Ib}),E&&(m=Pb,g={...ce.basics,...Rb}),A&&(m=Mb,g={...ce.basics,...Fb}),P&&(m=Ub,g={...ce.basics,...kb}),I&&(m=Bb,g={...ce.basics,...Db}),k&&(m=Ob,g={...ce.basics,...Gb}),O&&(m=Lb,g={...ce.basics,...Nb}),X&&(m=zb,g={...ce.basics,...rd}),oe&&(m=Hb,g={...ce.basics,...Wb}),R&&(m=Vb,g={...ce.basics,...Yb}),F&&(m=Xb),q&&(m=$b,g={...ce.basics,...qb}),N&&(m=Kb,g={...ce.basics,...jb});const Q={from:o,to:c,uniforms:g};l&&d&&(Q.displacementMap=d,f&&(d.resource=f,d.update()));const ee=new Br({glProgram:new ft({vertex:sb,fragment:ob(m)}),resources:Q});return r.filters=[ee],{render({width:Y,height:M,from:he,to:ue,progress:ot}){if((r.width!==Y||r.height!==M)&&(r.setSize({width:Y,height:M}),n.resize(Y,M)),he instanceof U?ee.resources.from=he.source:(o.resource=he,o.update(),ee.resources.from=o),ue instanceof U?ee.resources.to=ue.source:(c.resource=ue,c.update(),ee.resources.to=c),l&&d&&f){if(f.width!==Y||f.height!==M){f.width=Y,f.height=M;const mi=f.getContext("2d");if(mi){const xt=mi.createImageData(Y,M);for(let tt=0;tt<xt.data.length;tt+=4){const Rt=Math.random();xt.data[tt]=Rt*255,xt.data[tt+1]=Rt*255,xt.data[tt+2]=Rt*255,xt.data[tt+3]=255}mi.putImageData(xt,0,0)}}d.resource=f,d.update()}return ee.resources.uniforms.uniforms.progress=ot,e.render({container:r,target:n,clear:!1,width:Y,height:M}),n}}}let Qb=0;async function sd(s){s()>50&&(await Ts(15),await sd(s))}class e2{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 aa()).codec,sampleRate:ae.sampleRate,numberOfChannels:ae.channelCount})).supported)??!1}logger=W.create(`id:${Qb++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;hasVideoTrack;evtTool=new Yo;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,aa().catch(n=>{this.logger.warn("Failed to detect audio codec:",n)})}async initPixiApp(){const{width:e,height:t}=this.opts;if(this.pixiApp=new dn,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(v=>v.width>0&&v.height>0),m=this.hasVideoTrack&&f;return Zd({video:m?{width:r,height:n,expectFPS:t,codec:o,bitrate:c,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:l===!1?null:{codec:ae.codecType,sampleRate:ae.sampleRate,channelCount:ae.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}=Jo(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=t2({pixiApp:this.pixiApp,sprites:this.sprites,aborter:l});const _=i2({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)),_(x,b,w),x+=u,await sd(e.getEncodeQueueSize)}},g=()=>{l.aborted||(l.aborted=!0,clearInterval(v),f?.cleanup(),this.sprites.forEach(y=>{y.destroy()}))};m().catch(y=>{d=y,this.logger.error(y),g(),o(y)});const v=setInterval(()=>{r(c)},500);return g}exportToJSON(){const e=this.sprites.map(r=>or(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 pe||o instanceof ve)).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,transition:t.length>0?t:void 0,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(r=>{r.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 r of e.clips){const n=await ar(r);await this.addSprite(n,{main:r.main||!1})}const t=e.transition||e.transitions;if(t){console.log(`[Compositor] Restoring ${t.length} transitions`);for(const r of t){const n=r.clips[1],o=this.sprites.find(c=>c.id===n);o?(console.log(`[Compositor] Applying transition ${r.key} to clip ${n}`),o.transition={name:r.key,duration:r.duration,prevClipId:r.clips[0]}):console.warn(`[Compositor] Could not find target clip ${n} for transition ${r.key}`)}}else console.log("[Compositor] No transition data found in JSON")}}function t2(s){const{pixiApp:e,sprites:t,aborter:r}=s,n=e!=null,o=new Map,c=new Map,l=new Map,d=Se.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),f=Se.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),m=new Re().rect(0,0,e?.renderer.width||0,e?.renderer.height||0).fill({color:0}),g=new Map,v=T=>t.filter(w=>w.id!==T.id&&w.zIndex===T.zIndex&&w.display.from<T.display.from&&(w instanceof pe||w instanceof ve)).sort((w,S)=>S.display.to-w.display.to)[0]||null,y=async(T,w)=>{let S=null;if(T.transition?.prevClipId&&(S=t.find(I=>I.id===T.transition.prevClipId)||null),S||(S=v(T)),!S)return null;const E=S.duration>0?S.duration:0,A=Math.max(0,Math.min(w-S.display.from,E)),{video:P}=await S.getFrame(A);return P},a=(T,w,S)=>{if(!e)return;e.renderer.render({container:m,target:S,clear:!0});const E=new Te(w instanceof U?w:U.from(w));E.x=T.center.x,E.y=T.center.y,E.anchor.set(.5,.5);const A=E.texture.width||1,P=E.texture.height||1,I=T.width&&T.width!==0?Math.abs(T.width)/A:1,k=T.height&&T.height!==0?Math.abs(T.height)/P:1;T.flip==="horizontal"?(E.scale.x=-I,E.scale.y=k):T.flip==="vertical"?(E.scale.x=I,E.scale.y=-k):(E.scale.x=I,E.scale.y=k),E.rotation=(T.flip==null?1:-1)*T.angle,E.alpha=T.opacity,e.renderer.render({container:E,target:S,clear:!1}),w instanceof U||E.texture.destroy(!0),E.destroy()};let h=null,u=null,p=null;n&&e!=null&&(h=new ne,u=new ne,p=new ne,u.sortableChildren=!0,p.sortableChildren=!0,e.stage.addChild(u),e.stage.addChild(p),h.visible=!1,e.stage.addChild(h));const _=[...t].sort((T,w)=>T.zIndex-w.zIndex);return{render:async T=>{const w=[];let S=!1,E=!1;for(const A of l.values())A.visible=!1;for(const A of _){if(r.aborted)break;if(T<A.display.from||A.expired){if(n&&e!=null){const oe=o.get(A);oe&&await oe.updateFrame(null)}continue}const P=T-A.display.from,I=P*A.playbackRate;A.animate(I);const{video:k,audio:O,done:X}=await A.getFrame(P);if(w.push(O),n&&e!=null&&u!=null){if((A instanceof pe||A instanceof ve)&&A.transition&&P>=0&&P<=A.transition.duration){const F=await y(A,T),{video:q}=await A.getFrame(P);if(F&&q){const N=P/A.transition.duration,Q=v(A);Q?a(Q,F,d):e.renderer.render({container:m,target:d,clear:!0}),a(A,q,f);let ee=c.get(A.id);ee||(ee=Io({name:A.transition.name,renderer:e.renderer}),c.set(A.id,ee));const Y=ee.render({width:e.renderer.width,height:e.renderer.height,from:d,to:f,progress:N});let M=l.get(A.id);M||(M=new Te,M.label=`TransitionSprite_${A.id}`,l.set(A.id,M),u.addChild(M)),M.texture=Y,M.visible=!0,M.x=0,M.y=0,M.width=e.renderer.width,M.height=e.renderer.height,M.anchor.set(0,0),M.zIndex=A.zIndex,E=!0;const he=o.get(A);if(he){const ue=he.getSprite();ue&&(ue.visible=!1)}if(Q){const ue=o.get(Q);if(ue){const ot=ue.getSprite();ot&&(ot.visible=!1)}}continue}}let R=o.get(A);R==null&&k!=null&&(R=new nr(e,A,u),o.set(A,R)),R!=null&&(k!=null?(E=!0,await R.updateFrame(k)):await R.updateFrame(null)),R?.updateTransforms()}if(A.duration>0&&T>A.display.from+A.duration||X){if(A.main&&(S=!0),A.expired=!0,n){const oe=o.get(A);if(oe!=null){const R=oe.getSprite();R&&(R.visible=!1)}}}else if(n){const oe=o.get(A);oe?.updateTransforms()}}if(n&&e!=null&&h!=null&&u!=null&&p!=null){let A=null;for(const P of t)if(P instanceof $e&&T>=P.display.from&&T<P.display.from+P.duration){A={id:P.id,key:P.effect.key,startTime:P.display.from,duration:P.duration};break}if(!A)for(const P of t){if(P.effects&&P.effects.length>0){for(const I of P.effects)if(T>=I.startTime&&T<I.startTime+I.duration){A=I;break}}if(A)break}p.removeChildren();for(const P of o.values()){const I=P.getSprite();I&&I.parent!==u&&(I.parent&&I.parent.removeChild(I),u.addChild(I))}if(A){const{key:P,startTime:I,duration:k,id:O}=A,X=T-I,oe=k>0?Math.min(Math.max(X/k,0),1):0,R=t.some(F=>F.id===O&&F instanceof $e);for(const F of t){let q=!1;if(R?q=F.id!==O&&!(F instanceof $e):q=!!F.effects&&F.effects.some(N=>N.id===O),q){const N=o.get(F);if(N){const Q=N.getSprite();Q&&(Q.parent&&Q.parent.removeChild(Q),h.addChild(Q))}}}if(h.children.length>0){let F=g.get(O);if(!F)try{const q=Ao({name:P,renderer:e.renderer});q&&q.filter&&(F={filter:q.filter,render:q.render},g.set(O,F))}catch(q){console.warn("Failed to create effect",P,q)}if(F){const{filter:q,render:N}=F;q.resources&&q.resources.effectUniforms&&(q.resources.effectUniforms.uniforms.uTime=oe);const Q=e.renderer.width,ee=e.renderer.height,Y=Se.create({width:Q,height:ee});if(h.visible=!0,e.renderer.render({container:h,target:Y,clear:!0}),h.visible=!1,N){const M=N({canvasTexture:Y,progress:oe,width:Q,height:ee}),he=new Te(M);he.width=Q,he.height=ee,p.addChild(he)}}}}}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 i2(s){const{canvas:e,outputAudio:t,muxer:r,hasVideoTrack:n,timeSlice:o}=s;let c=0;const l=Math.floor(3*s.fps),d=r2(1024);return(f,m,g)=>{if(t!==!1)for(const v of d(f,m))r.encodeAudio(v);if(n&&g)try{const v=new VideoFrame(e,{duration:o,timestamp:f});r.encodeVideo(v,{keyFrame:c%l===0}),c+=1}catch(v){console.warn("Failed to create VideoFrame from canvas, skipping frame:",v)}}}function r2(s){const e=s*ae.channelCount,t=new Float32Array(e*3);let r=0,n=0;const o=s/ae.sampleRate*1e6,c=new Float32Array(e),l=d=>{let f=0;const m=Math.floor(r/e),g=[];for(let v=0;v<m;v++)g.push(new AudioData({timestamp:n,numberOfChannels:ae.channelCount,numberOfFrames:s,sampleRate:ae.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:ae.channelCount,numberOfFrames:s,sampleRate:ae.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 v=0,y=0;for(let a=0;a<f.length;a++){const h=f[a][0]?.[g]??0,u=f[a][1]?.[g]??h;v+=h,y+=u}t[r]=v,t[r+1]=y,r+=2}return l(d)}}class s2 extends Re{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 yt extends Re{#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 Vr(0,0,24)):(this.rect(-5,-5,10,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:5620223}),this.hitArea=new z(-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 nd={delta:new B};class n2 extends ne{group;wireframe=new s2;isDragging=!1;lastPointer=new J;activeHandle=null;#e;#o=new Map;#t=new J;#r=0;#l=0;#a=new z;#i=new J;#c=new z;#s=1;#n=1;opts;constructor(e){super(),this.opts=e,this.group=e.group,this.eventMode="static";const t={beginDrag:(r,n)=>this.#v(r,n),updateDrag:(r,n)=>this.#y(r,n),endDrag:()=>this.#f()};this.#e={tl:new yt("tl","nwse-resize",t),tr:new yt("tr","nesw-resize",t),bl:new yt("bl","nesw-resize",t),br:new yt("br","nwse-resize",t),ml:new yt("ml","ew-resize",t),mr:new yt("mr","ew-resize",t),mt:new yt("mt","ns-resize",t),mb:new yt("mb","ns-resize",t),rot:new yt("rot","crosshair",{beginDrag:(r,n)=>this.#b(n),updateDrag:(r,n)=>this.#T(n),endDrag:()=>this.#f()})},this.addChild(this.wireframe,...Object.values(this.#e)),this.#m(),De.shared.addOnce(()=>this.#h())}#m(){this.on("pointerdown",this.#g),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],t=e.getBounds();this.#t.set(t.x+t.width/2,t.y+t.height/2),this.#r=e.rotation;let r,n;if(this.opts.clip)r=this.opts.clip.width,n=this.opts.clip.height;else{const o=e.getLocalBounds();r=o.width,n=o.height}this.#c.copyFrom(new z(-r/2,-n/2,r,n))}else{const e=this.#w();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 z(-t/2,-r/2,t,r);this.#c.copyFrom(n)}this.#u()}updateBounds(){this.#h()}#g=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()};#v(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.#S(e)}#y(e,t){this.#x(e,t)}async#x(e,t){const r=this.#i,n=this.#C(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.#A(l,this.#r,o,c));this.#c.copyFrom(n),this.#u()}#b(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)}#T(e){const r=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)-this.#l,n=this.#r+r;this.#p(this.#E(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")}#w(){let e=1/0,t=1/0,r=-1/0,n=-1/0;for(const o of this.group){const c=o.getBounds();e=Math.min(e,c.x),t=Math.min(t,c.y),r=Math.max(r,c.x+c.width),n=Math.max(n,c.y+c.height)}return new z(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)}#S(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)}#C(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 z(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 z(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 z(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 z(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 z(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 z(o,n.y,r.x-o,n.height)}if(e==="mr"){const o=Math.max(t.x,r.x+this.#s);return new z(r.x,n.y,o-r.x,n.height)}if(e==="mt"){const o=Math.min(t.y,r.y-this.#n);return new z(n.x,o,n.width,r.y-o)}if(e==="mb"){const o=Math.max(t.y,r.y+this.#n);return new z(n.x,r.y,n.width,o-r.y)}return new z(r.x,r.y,this.#s,this.#n)}#A(e,t,r,n){return nd.delta.identity().translate(-e.x,-e.y).rotate(-t).scale(r,n).rotate(t).translate(e.x,e.y)}#E(e,t){return nd.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 o2 extends oa{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 dn,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 ne,this.artboard.label="ArtboardRoot",t.stage.addChild(this.artboard),this.artboardBg=new Re,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}),this.artboard.addChild(this.artboardBg),this.clipContainer=new ne,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new Re,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 ne,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new ne,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.transFromTexture=Se.create({width:this.opts.width,height:this.opts.height}),this.transToTexture=Se.create({width:this.opts.width,height:this.opts.height}),this.transBgGraphics=new Re,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}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;(this.pixiApp.renderer.width!==o||this.pixiApp.renderer.height!==c)&&this.pixiApp.renderer.resize(o,c);const 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,v=m.display.to+d;await this.updateClip(f,{display:{from:g,to:v}})}}}e.display.from=0,e.display.to=n,await this.addClip(e,{trackId:l}),await this.seek(0)}async addTransition(e,t=2e6){if(this.destroyed)return;let r=null,n=null;const o=Array.from(this.selectedClips);if(o.length>0&&(n=o[0]),!n){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).sort((u,p)=>u.display.from-p.display.from);for(let u=0;u<h.length-1;u++){const p=h[u],_=h[u+1];if(Math.abs(_.display.from-p.display.to)<1e5){r=p,n=_;break}}if(r&&n)break}}if(n&&!r){const y=this.findTrackIdByClipId(n.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).sort((p,_)=>p.display.from-_.display.from),u=h.findIndex(p=>p.id===n.id);u>0&&(r=h[u-1])}}}if(!r||!n){console.warn("[Studio] Unable to resolve Clip A and Clip B for transition");return}const c=t,l=n.display.from-c/2,d=l+c,f={key:e,name:e,duration:c,fromClipId:r.id,toClipId:n.id,start:Math.max(0,l),end:d};"transition"in r&&(r.transition={...f}),"transition"in n&&(n.transition={...f});const{TransitionClip:m}=await Promise.resolve().then(()=>Rx),g=new m(e);g.duration=c,g.display.from=Math.max(0,l),g.display.to=d;const v=this.findTrackIdByClipId(n.id);await this.addClip(g,{trackId:v}),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 pe){if(e.tickInterceptor!=null){const d=new nr(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}}else{const d=new nr(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 Xe&&(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.getSprite();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 nr(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,r)}return}try{const r=e;if(e instanceof Ae&&t&&typeof t!="string"){const c=URL.createObjectURL(t);e.src=c}const{element:n,objectUrl:o}=await r.createPlaybackElement();if(e instanceof pe){const c=U.from(n),l=new Te(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 nr(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=or(r,!1),l=await ar(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=or(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 ar(m);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const v=this.findTrackIdByClipId(r.id);v&&(await this.addClip(g,{trackId:v}),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=U.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.getSprite();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 h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.element);continue}if(o.display.to>0&&e>o.display.to){const h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.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 h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.element);continue}const m=this.playbackElements.get(o),g=o instanceof pe||o instanceof ve,v=o.transition?o.transition.start:0,y=o.transition?o.transition.end:0;if(g&&o.transition&&e>=v&&e<=y){this.transFromTexture||(this.transFromTexture=Se.create({width:this.opts.width,height:this.opts.height})),this.transToTexture||(this.transToTexture=Se.create({width:this.opts.width,height:this.opts.height})),this.transBgGraphics||(this.transBgGraphics=new Re,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}));const h=this.getClipById(o.transition.fromClipId),u=this.getClipById(o.transition.toClipId);let p=null,_=null;if(h){const x=Math.max(0,e-h.display.from),{video:b}=await h.getFrame(x);b instanceof HTMLVideoElement?p=this.getVideoTexture(b):p=b,p&&(this.lastFromFrame=p)}if(u){const x=Math.max(0,e-u.display.from),{video:b}=await u.getFrame(x);b instanceof HTMLVideoElement?_=this.getVideoTexture(b):_=b,_&&(this.lastToFrame=_)}if(p||(p=this.lastFromFrame),_||(_=this.lastToFrame),!p||!_)continue;if(p&&_&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const x=(e-v)/o.transition.duration;h&&p&&this.renderClipToTransitionTexture(h,p,this.transFromTexture),u&&_&&this.renderClipToTransitionTexture(u,_,this.transToTexture);let b=this.transitionRenderers.get(o.id);if(!b)try{b=Io({name:o.transition.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(o.id,b)}catch(T){console.error("[Studio] Failed to create transition renderer:",T)}if(b){const T=b.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:x});let w=this.transitionSprites.get(o.id);w||(w=new Te,w.label=`TransitionSprite_${o.id}`,this.transitionSprites.set(o.id,w),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(w)),w.texture=T,w.visible=!0,w.x=0,w.y=0,w.width=this.opts.width,w.height=this.opts.height,w.anchor.set(0,0),w.zIndex=o.zIndex,t.add(o.id);const S=this.spriteRenderers.get(o);if(S?.getSprite()&&(S.getSprite().visible=!1),h){const E=this.spriteRenderers.get(h);E?.getSprite()&&(E.getSprite().visible=!1)}continue}}}if(m!=null&&this.isPlaybackCapable(o)){const h=c/1e6;if(o.syncPlayback(m.element,this.isPlaying,h),o instanceof pe){const u=this.videoSprites.get(o);if(u!=null){const p=o.meta.duration/1e6;if(this.spriteRenderers.has(o))u.visible=!1;else{u.visible=h>=0&&h<p,u.visible&&tb(o,u);continue}}}else continue}const a=this.spriteRenderers.get(o);if(a!=null){const h=this.selectedClips.has(o);if(o instanceof ve){const p=o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms();continue}}if(o instanceof Xe){const p=await o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms();continue}}if(o instanceof Pt){o.updateState(c);const p=await o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms();continue}else console.log("[Studio] CaptionClip texture is null, falling back to traditional path")}const{video:u}=await o.getFrame(c);await a.updateFrame(u),h||a.updateTransforms()}}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 $e);for(const m of this.clips){let g=!1;if(f){const v=this.activeGlobalEffect.trackIndex??-1,y=this.getTrackIndex(m.id);g=m.id!==this.activeGlobalEffect.id&&!(m instanceof $e)&&y>v}else{const v=m.effects;g=Array.isArray(v)&&v.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.getSprite();if(c&&c.parent!==r){try{c.parent&&c.parent.removeChild&&c.parent.removeChild(c)}catch(l){console.warn("moveClipToEffectContainer: could not remove sprite 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 ve&&c.addEffect(o),c instanceof pe&&c.addEffect(o),c instanceof Xe&&c.addEffect(o),c instanceof Pt&&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 pe||r instanceof ve)).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 Te(t instanceof U?t:U.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 U||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 $e&&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=Ao({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=Se.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}),v=new Te(g);v.x=0,v.y=0,v.width=d,v.height=f,v.scale.set(1),v.zIndex=5,this.clipContainer.addChild(v),this.currentGlobalEffectSprite=v,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.getSprite();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 n2({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 Xe))continue;const r=this.spriteRenderers.get(t);if(r==null)continue;const n=r.getSprite();if(n==null||n.texture==null)continue;const o=Math.abs(n.scale.x);if(o===1)continue;const c=t.left,l=t.top,d=n.texture.width,f=o*d;await t.updateStyle({wordWrap:!0,wordWrapWidth:f});const m=await t.getTexture();m&&(await r.updateFrame(m),n.scale.set(1,1),t.left=c,t.top=l,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.getSprite();if(r==null||r.texture==null)continue;const n=r.texture.width,o=r.texture.height,c=Math.abs(r.scale.x)*n,l=Math.abs(r.scale.y)*o,d=e instanceof Xe&&this.textClipResizedWidth!==null?this.textClipResizedWidth:c,f=r.x-d/2,m=r.y-l/2;if(e instanceof Xe&&this.textClipResizedWidth!==null){await e.updateStyle({wordWrap:!0,wordWrapWidth:d});const g=await e.getTexture();g&&(await t.updateFrame(g),e.width=d,e.height=g.height,this.textClipResizedWidth=null,e.left=r.x-e.width/2,e.top=r.y-e.height/2,r.scale.set(1,1))}else e.left=f,e.top=m,e.width=c,e.height=l,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.getSprite();if(r!=null&&r.texture!=null){const n=r.texture.width,o=r.texture.height,c=Math.abs(r.scale.x)*n,l=Math.abs(r.scale.y)*o,d=r.x-c/2,f=r.y-l/2;e.left=d,e.top=f,e.width=c,e.height=l,e.angle=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=>or(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,transition:r.length>0?r:void 0,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 r=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),r&&this.pixiApp!=null){const n=this.opts.width,o=this.opts.height;this.pixiApp.renderer.resize(n,o),this.opts.canvas&&(this.opts.canvas.width=n,this.opts.canvas.height=o)}}if(e.clips){const r=new Map;if(e.tracks){for(const n of e.tracks)if(n.clipIds)for(const o of n.clipIds)r.set(o,n.id)}if(e.tracks)for(const n of e.tracks)this.tracks.push({id:n.id,name:n.name,type:n.type,clipIds:[]});for(const n of e.clips){const o=n.id?r.get(n.id):void 0;await this.loadClipIntoTrack(n,o)}}for(const r of this.clips){const n=r.effects;if(Array.isArray(n))for(const o of n)this.globalEffects.has(o.id)||this.globalEffects.set(o.id,{id:o.id,key:o.key,startTime:o.startTime,duration:o.duration})}const t=e.transition||e.transitions;if(t)for(const r of t){const n=r.clips[0],o=r.clips[1],c=this.clips.find(l=>l.id===o);c?c.transition={name:r.key,duration:r.duration,prevClipId:n}:console.warn(`[Studio] Could not find target clip ${o} for transition ${r.key}`)}else console.log("[Studio] No transition data found in JSON");try{await this.updateFrame(this.currentTime)}catch(r){console.error("[Studio] Failed to update initial frame:",r)}}async loadClipIntoTrack(e,t){if(e.type!=="Text"&&e.type!=="Caption"&&e.type!=="Effect"&&(!e.src||e.src.trim()==="")){console.warn(`Skipping clip ${e.type} with empty source`);return}try{const r=await ar(e),n=r instanceof Ae?e.src:void 0;await this.addClip(r,{trackId:t,audioSource:n}),(r instanceof pe||r instanceof ve)&&(!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 pi{static instance;fonts=new Map;constructor(){}static getInstance(){return pi.instance||(pi.instance=new pi),pi.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 a2=pi.getInstance();L.add(Jp),L.mixin(ne,Qp),L.add(Bl),L.add(Dl),L.add(Wc),L.mixin(ne,A_),L.add(Hc),L.add(Eu),L.add(Mn),L.add(Ru),L.add(Bu),L.add(Du),L.add($u),L.add(Xu),L.add(Nu),L.add(Vu),L.add(Hu),L.add(Lu),L.add(Gu),L.add($c),L.add(Yc);const l2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),c2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));te.AudioClip=Ae,te.CaptionClip=Pt,te.Compositor=e2,te.EffectClip=$e,te.GL_EFFECT_OPTIONS=eb,te.GL_TRANSITION_OPTIONS=Jb,te.ImageClip=ve,te.Log=W,te.MP4Clip=pe,te.Studio=o2,te.TextClip=Xe,te.TransitionClip=sr,te.VideoClip=pe,te.clipToJSON=or,te.createChromakey=Bf,te.fastConcatMP4=Qu,te.fixFMP4Duration=kx,te.fontManager=a2,te.jsonToClip=ar,te.makeEffect=Ao,te.makeTransition=Io,te.mixinMP4AndAudio=Gx,te.renderTxt2ImgBitmap=Lf,Object.defineProperty(te,Symbol.toStringTag,{value:"Module"})}));
7530
+ `,jb={a:{value:4,type:"f32"},b:{value:1,type:"f32"},amplitude:{value:120,type:"f32"},smoothness:{value:.1,type:"f32"}},Zb={radialSwipe:{label:"Radial Swipe",fragment:ab}},fi={...di.reduce((s,e)=>(s[e.name]={label:e.name,fragment:e.glsl,uniforms:e.defaultParams},s),{}),...Zb},Jb=Object.entries(fi).map(([s,e])=>({key:s,label:e.label}));function Io({name:s,renderer:e}){console.log("Making transition",s);let t=di.find(Y=>Y.name===s);if(!t){const Y=Object.keys(fi).find(M=>M.toLowerCase()===s.toLowerCase());Y&&(t=fi[Y])}if(t||(t=di.find(Y=>Y.name.toLowerCase()===s.toLowerCase())),!t){const Y=[s,s.toLowerCase(),s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),s.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),s.replace(/_/g,"")];for(const M of Y){if(t=di.find(ue=>ue.name.toLowerCase()===M.toLowerCase()),t)break;const he=Object.keys(fi).find(ue=>ue.toLowerCase()===M.toLowerCase());if(he){t=fi[he];break}}}if(!t){const Y=di.length,M=di.slice(0,5).map(ue=>ue.name).join(", "),he=Object.keys(fi).slice(0,3).join(", ");throw console.error(`Transition not found: "${s}". Available in gl-transitions (${Y} total):`,M+"..."),console.error("Available locally:",he+"..."),new Error(`Transition "${s}" not found in gl-transitions library or local definitions`)}const r=new Te(U.WHITE),n=Se.create({width:e.width,height:e.height}),o=new nt({}),c=new nt({}),l=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",d=l?new nt({}):void 0;let f=null;if(l){f=document.createElement("canvas"),f.width=256,f.height=256;const Y=f.getContext("2d");if(Y){const M=Y.createImageData(256,256);for(let he=0;he<M.data.length;he+=4){const ue=Math.random();M.data[he]=ue*255,M.data[he+1]=ue*255,M.data[he+2]=ue*255,M.data[he+3]=255}Y.putImageData(M,0,0)}}let m=t.glsl||t.fragment;if(!m)throw new Error(`Transition "${s}" has no glsl or fragment code`);let g={...ce.basics,...ce.custom(t)};const v=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==="RotateScaleFade"||s.toLowerCase()==="rotatescalefade"||t.label==="rotateScaleFade",_=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",A=t.name==="heart"||s.toLowerCase()==="heart"||t.label==="heart",P=t.name==="displacement"||s.toLowerCase()==="displacement"||t.label==="displacement",I=t.name==="directionalwipe"||s.toLowerCase()==="directionalwipe"||s.toLowerCase()==="directional_wipe"||t.label==="directionalwipe",k=t.name==="directionalwarp"||s.toLowerCase()==="directionalwarp"||s.toLowerCase()==="directional_warp"||t.label==="directionalwarp",O=t.name==="crosshatch"||s.toLowerCase()==="crosshatch"||t.label==="crosshatch",X=t.name==="circleopen"||s.toLowerCase()==="circleopen"||s.toLowerCase()==="circle_open"||t.label==="circleopen",oe=t.name==="cannabisleaf"||s.toLowerCase()==="cannabisleaf"||s.toLowerCase()==="cannabis_leaf"||t.label==="cannabisleaf",R=t.name==="StereoViewer"||s.toLowerCase()==="stereoviewer"||s.toLowerCase()==="stereo_viewer"||t.label==="StereoViewer",F=t.name==="GlitchDisplace"||s.toLowerCase()==="glitchDisplace"||t.label==="GlitchDisplace",q=t.name==="CrossZoom"||s.toLowerCase()==="crosszoom"||t.label==="CrossZoom",N=t.name==="CrazyParametricFun"||s.toLowerCase()==="crazyparametricfun"||t.label==="CrazyParametricFun";v&&(m=lb,g={...ce.basics,...cb}),y&&(m=hb,g={...ce.basics,...rd}),a&&(m=ub,g={...ce.basics,...db}),h&&(m=fb,g={...ce.basics,...pb}),u&&(m=mb,g={...ce.basics,...gb}),p&&(m=_b,g={...ce.basics,...vb}),_&&(m=yb,g={...ce.basics,...xb}),x&&(m=bb,g={...ce.basics,...Tb}),b&&(m=ed,g={...ce.basics,...td}),T&&(m=wb,g={...ce.basics,...Sb}),w&&(m=Cb,g={...ce.basics,...Ab}),S&&(m=Eb,g={...ce.basics,...Ib}),E&&(m=Pb,g={...ce.basics,...Rb}),A&&(m=Mb,g={...ce.basics,...Fb}),P&&(m=Ub,g={...ce.basics,...kb}),I&&(m=Bb,g={...ce.basics,...Db}),k&&(m=Ob,g={...ce.basics,...Gb}),O&&(m=Lb,g={...ce.basics,...Nb}),X&&(m=zb,g={...ce.basics,...rd}),oe&&(m=Hb,g={...ce.basics,...Wb}),R&&(m=Vb,g={...ce.basics,...Yb}),F&&(m=Xb),q&&(m=$b,g={...ce.basics,...qb}),N&&(m=Kb,g={...ce.basics,...jb});const Q={from:o,to:c,uniforms:g};l&&d&&(Q.displacementMap=d,f&&(d.resource=f,d.update()));const ee=new Br({glProgram:new ft({vertex:sb,fragment:ob(m)}),resources:Q});return r.filters=[ee],{render({width:Y,height:M,from:he,to:ue,progress:ot}){if((r.width!==Y||r.height!==M)&&(r.setSize({width:Y,height:M}),n.resize(Y,M)),he instanceof U?ee.resources.from=he.source:(o.resource=he,o.update(),ee.resources.from=o),ue instanceof U?ee.resources.to=ue.source:(c.resource=ue,c.update(),ee.resources.to=c),l&&d&&f){if(f.width!==Y||f.height!==M){f.width=Y,f.height=M;const mi=f.getContext("2d");if(mi){const xt=mi.createImageData(Y,M);for(let tt=0;tt<xt.data.length;tt+=4){const Rt=Math.random();xt.data[tt]=Rt*255,xt.data[tt+1]=Rt*255,xt.data[tt+2]=Rt*255,xt.data[tt+3]=255}mi.putImageData(xt,0,0)}}d.resource=f,d.update()}return ee.resources.uniforms.uniforms.progress=ot,e.render({container:r,target:n,clear:!1,width:Y,height:M}),n}}}let Qb=0;async function sd(s){s()>50&&(await Ts(15),await sd(s))}class e2{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 aa()).codec,sampleRate:ae.sampleRate,numberOfChannels:ae.channelCount})).supported)??!1}logger=W.create(`id:${Qb++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;hasVideoTrack;evtTool=new Yo;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,aa().catch(n=>{this.logger.warn("Failed to detect audio codec:",n)})}async initPixiApp(){const{width:e,height:t}=this.opts;if(this.pixiApp=new dn,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(v=>v.width>0&&v.height>0),m=this.hasVideoTrack&&f;return Zd({video:m?{width:r,height:n,expectFPS:t,codec:o,bitrate:c,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:l===!1?null:{codec:ae.codecType,sampleRate:ae.sampleRate,channelCount:ae.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}=Jo(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=t2({pixiApp:this.pixiApp,sprites:this.sprites,aborter:l});const _=i2({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)),_(x,b,w),x+=u,await sd(e.getEncodeQueueSize)}},g=()=>{l.aborted||(l.aborted=!0,clearInterval(v),f?.cleanup(),this.sprites.forEach(y=>{y.destroy()}))};m().catch(y=>{d=y,this.logger.error(y),g(),o(y)});const v=setInterval(()=>{r(c)},500);return g}exportToJSON(){const e=this.sprites.map(r=>or(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 pe||o instanceof ve)).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,transition:t.length>0?t:void 0,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(r=>{r.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 r of e.clips){const n=await ar(r);await this.addSprite(n,{main:r.main||!1})}const t=e.transition||e.transitions;if(t){console.log(`[Compositor] Restoring ${t.length} transitions`);for(const r of t){const n=r.clips[1],o=this.sprites.find(c=>c.id===n);o?(console.log(`[Compositor] Applying transition ${r.key} to clip ${n}`),o.transition={name:r.key,duration:r.duration,prevClipId:r.clips[0]}):console.warn(`[Compositor] Could not find target clip ${n} for transition ${r.key}`)}}else console.log("[Compositor] No transition data found in JSON")}}function t2(s){const{pixiApp:e,sprites:t,aborter:r}=s,n=e!=null,o=new Map,c=new Map,l=new Map,d=Se.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),f=Se.create({width:e?.renderer.width||0,height:e?.renderer.height||0}),m=new Re().rect(0,0,e?.renderer.width||0,e?.renderer.height||0).fill({color:0}),g=new Map,v=T=>t.filter(w=>w.id!==T.id&&w.zIndex===T.zIndex&&w.display.from<T.display.from&&(w instanceof pe||w instanceof ve)).sort((w,S)=>S.display.to-w.display.to)[0]||null,y=async(T,w)=>{let S=null;if(T.transition?.prevClipId&&(S=t.find(I=>I.id===T.transition.prevClipId)||null),S||(S=v(T)),!S)return null;const E=S.duration>0?S.duration:0,A=Math.max(0,Math.min(w-S.display.from,E)),{video:P}=await S.getFrame(A);return P},a=(T,w,S)=>{if(!e)return;e.renderer.render({container:m,target:S,clear:!0});const E=new Te(w instanceof U?w:U.from(w));E.x=T.center.x,E.y=T.center.y,E.anchor.set(.5,.5);const A=E.texture.width||1,P=E.texture.height||1,I=T.width&&T.width!==0?Math.abs(T.width)/A:1,k=T.height&&T.height!==0?Math.abs(T.height)/P:1;T.flip==="horizontal"?(E.scale.x=-I,E.scale.y=k):T.flip==="vertical"?(E.scale.x=I,E.scale.y=-k):(E.scale.x=I,E.scale.y=k),E.rotation=(T.flip==null?1:-1)*T.angle,E.alpha=T.opacity,e.renderer.render({container:E,target:S,clear:!1}),w instanceof U||E.texture.destroy(!0),E.destroy()};let h=null,u=null,p=null;n&&e!=null&&(h=new ne,u=new ne,p=new ne,u.sortableChildren=!0,p.sortableChildren=!0,e.stage.addChild(u),e.stage.addChild(p),h.visible=!1,e.stage.addChild(h));const _=[...t].sort((T,w)=>T.zIndex-w.zIndex);return{render:async T=>{const w=[];let S=!1,E=!1;for(const A of l.values())A.visible=!1;for(const A of _){if(r.aborted)break;if(T<A.display.from||A.expired){if(n&&e!=null){const oe=o.get(A);oe&&await oe.updateFrame(null)}continue}const P=T-A.display.from,I=P*A.playbackRate;A.animate(I);const{video:k,audio:O,done:X}=await A.getFrame(P);if(w.push(O),n&&e!=null&&u!=null){if((A instanceof pe||A instanceof ve)&&A.transition&&P>=0&&P<=A.transition.duration){const F=await y(A,T),{video:q}=await A.getFrame(P);if(F&&q){const N=P/A.transition.duration,Q=v(A);Q?a(Q,F,d):e.renderer.render({container:m,target:d,clear:!0}),a(A,q,f);let ee=c.get(A.id);ee||(ee=Io({name:A.transition.name,renderer:e.renderer}),c.set(A.id,ee));const Y=ee.render({width:e.renderer.width,height:e.renderer.height,from:d,to:f,progress:N});let M=l.get(A.id);M||(M=new Te,M.label=`TransitionSprite_${A.id}`,l.set(A.id,M),u.addChild(M)),M.texture=Y,M.visible=!0,M.x=0,M.y=0,M.width=e.renderer.width,M.height=e.renderer.height,M.anchor.set(0,0),M.zIndex=A.zIndex,E=!0;const he=o.get(A);if(he){const ue=he.getSprite();ue&&(ue.visible=!1)}if(Q){const ue=o.get(Q);if(ue){const ot=ue.getSprite();ot&&(ot.visible=!1)}}continue}}let R=o.get(A);R==null&&k!=null&&(R=new nr(e,A,u),o.set(A,R)),R!=null&&(k!=null?(E=!0,await R.updateFrame(k)):await R.updateFrame(null)),R?.updateTransforms()}if(A.duration>0&&T>A.display.from+A.duration||X){if(A.main&&(S=!0),A.expired=!0,n){const oe=o.get(A);if(oe!=null){const R=oe.getSprite();R&&(R.visible=!1)}}}else if(n){const oe=o.get(A);oe?.updateTransforms()}}if(n&&e!=null&&h!=null&&u!=null&&p!=null){let A=null;for(const P of t)if(P instanceof $e&&T>=P.display.from&&T<P.display.from+P.duration){A={id:P.id,key:P.effect.key,startTime:P.display.from,duration:P.duration};break}if(!A)for(const P of t){if(P.effects&&P.effects.length>0){for(const I of P.effects)if(T>=I.startTime&&T<I.startTime+I.duration){A=I;break}}if(A)break}p.removeChildren();for(const P of o.values()){const I=P.getSprite();I&&I.parent!==u&&(I.parent&&I.parent.removeChild(I),u.addChild(I))}if(A){const{key:P,startTime:I,duration:k,id:O}=A,X=T-I,oe=k>0?Math.min(Math.max(X/k,0),1):0,R=t.some(F=>F.id===O&&F instanceof $e);for(const F of t){let q=!1;if(R?q=F.id!==O&&!(F instanceof $e):q=!!F.effects&&F.effects.some(N=>N.id===O),q){const N=o.get(F);if(N){const Q=N.getSprite();Q&&(Q.parent&&Q.parent.removeChild(Q),h.addChild(Q))}}}if(h.children.length>0){let F=g.get(O);if(!F)try{const q=Ao({name:P,renderer:e.renderer});q&&q.filter&&(F={filter:q.filter,render:q.render},g.set(O,F))}catch(q){console.warn("Failed to create effect",P,q)}if(F){const{filter:q,render:N}=F;q.resources&&q.resources.effectUniforms&&(q.resources.effectUniforms.uniforms.uTime=oe);const Q=e.renderer.width,ee=e.renderer.height,Y=Se.create({width:Q,height:ee});if(h.visible=!0,e.renderer.render({container:h,target:Y,clear:!0}),h.visible=!1,N){const M=N({canvasTexture:Y,progress:oe,width:Q,height:ee}),he=new Te(M);he.width=Q,he.height=ee,p.addChild(he)}}}}}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 i2(s){const{canvas:e,outputAudio:t,muxer:r,hasVideoTrack:n,timeSlice:o}=s;let c=0;const l=Math.floor(3*s.fps),d=r2(1024);return(f,m,g)=>{if(t!==!1)for(const v of d(f,m))r.encodeAudio(v);if(n&&g)try{const v=new VideoFrame(e,{duration:o,timestamp:f});r.encodeVideo(v,{keyFrame:c%l===0}),c+=1}catch(v){console.warn("Failed to create VideoFrame from canvas, skipping frame:",v)}}}function r2(s){const e=s*ae.channelCount,t=new Float32Array(e*3);let r=0,n=0;const o=s/ae.sampleRate*1e6,c=new Float32Array(e),l=d=>{let f=0;const m=Math.floor(r/e),g=[];for(let v=0;v<m;v++)g.push(new AudioData({timestamp:n,numberOfChannels:ae.channelCount,numberOfFrames:s,sampleRate:ae.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:ae.channelCount,numberOfFrames:s,sampleRate:ae.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 v=0,y=0;for(let a=0;a<f.length;a++){const h=f[a][0]?.[g]??0,u=f[a][1]?.[g]??h;v+=h,y+=u}t[r]=v,t[r+1]=y,r+=2}return l(d)}}class s2 extends Re{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 yt extends Re{#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 Vr(0,0,24)):(this.rect(-5,-5,10,10),this.fill({color:"#ffffff"}),this.stroke({width:1,color:5620223}),this.hitArea=new z(-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 nd={delta:new B};class n2 extends ne{group;wireframe=new s2;isDragging=!1;lastPointer=new J;activeHandle=null;#e;#o=new Map;#t=new J;#r=0;#l=0;#a=new z;#i=new J;#c=new z;#s=1;#n=1;opts;constructor(e){super(),this.opts=e,this.group=e.group,this.eventMode="static";const t={beginDrag:(r,n)=>this.#v(r,n),updateDrag:(r,n)=>this.#y(r,n),endDrag:()=>this.#f()};this.#e={tl:new yt("tl","nwse-resize",t),tr:new yt("tr","nesw-resize",t),bl:new yt("bl","nesw-resize",t),br:new yt("br","nwse-resize",t),ml:new yt("ml","ew-resize",t),mr:new yt("mr","ew-resize",t),mt:new yt("mt","ns-resize",t),mb:new yt("mb","ns-resize",t),rot:new yt("rot","crosshair",{beginDrag:(r,n)=>this.#b(n),updateDrag:(r,n)=>this.#T(n),endDrag:()=>this.#f()})},this.addChild(this.wireframe,...Object.values(this.#e)),this.#m(),De.shared.addOnce(()=>this.#h())}#m(){this.on("pointerdown",this.#g),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],t=e.getBounds();this.#t.set(t.x+t.width/2,t.y+t.height/2),this.#r=e.rotation;let r,n;if(this.opts.clip)r=this.opts.clip.width,n=this.opts.clip.height;else{const o=e.getLocalBounds();r=o.width,n=o.height}this.#c.copyFrom(new z(-r/2,-n/2,r,n))}else{const e=this.#w();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 z(-t/2,-r/2,t,r);this.#c.copyFrom(n)}this.#u()}updateBounds(){this.#h()}#g=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()};#v(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.#S(e)}#y(e,t){this.#x(e,t)}async#x(e,t){const r=this.#i,n=this.#C(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.#A(l,this.#r,o,c));this.#c.copyFrom(n),this.#u()}#b(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)}#T(e){const r=Math.atan2(e.y-this.#t.y,e.x-this.#t.x)-this.#l,n=this.#r+r;this.#p(this.#E(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")}#w(){let e=1/0,t=1/0,r=-1/0,n=-1/0;for(const o of this.group){const c=o.getBounds();e=Math.min(e,c.x),t=Math.min(t,c.y),r=Math.max(r,c.x+c.width),n=Math.max(n,c.y+c.height)}return new z(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)}#S(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)}#C(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 z(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 z(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 z(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 z(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 z(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 z(o,n.y,r.x-o,n.height)}if(e==="mr"){const o=Math.max(t.x,r.x+this.#s);return new z(r.x,n.y,o-r.x,n.height)}if(e==="mt"){const o=Math.min(t.y,r.y-this.#n);return new z(n.x,o,n.width,r.y-o)}if(e==="mb"){const o=Math.max(t.y,r.y+this.#n);return new z(n.x,r.y,n.width,o-r.y)}return new z(r.x,r.y,this.#s,this.#n)}#A(e,t,r,n){return nd.delta.identity().translate(-e.x,-e.y).rotate(-t).scale(r,n).rotate(t).translate(e.x,e.y)}#E(e,t){return nd.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 o2 extends oa{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 dn,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 ne,this.artboard.label="ArtboardRoot",t.stage.addChild(this.artboard),this.artboardBg=new Re,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}),this.artboard.addChild(this.artboardBg),this.clipContainer=new ne,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new Re,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 ne,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new ne,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.transFromTexture=Se.create({width:this.opts.width,height:this.opts.height}),this.transToTexture=Se.create({width:this.opts.width,height:this.opts.height}),this.transBgGraphics=new Re,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}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;(this.pixiApp.renderer.width!==o||this.pixiApp.renderer.height!==c)&&this.pixiApp.renderer.resize(o,c);const 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,v=m.display.to+d;await this.updateClip(f,{display:{from:g,to:v}})}}}e.display.from=0,e.display.to=n,await this.addClip(e,{trackId:l}),await this.seek(0)}async addTransition(e,t=2e6){if(this.destroyed)return;let r=null,n=null;const o=Array.from(this.selectedClips);if(o.length>0&&(n=o[0]),!n){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).sort((u,p)=>u.display.from-p.display.from);for(let u=0;u<h.length-1;u++){const p=h[u],_=h[u+1];if(Math.abs(_.display.from-p.display.to)<1e5){r=p,n=_;break}}if(r&&n)break}}if(n&&!r){const y=this.findTrackIdByClipId(n.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).sort((p,_)=>p.display.from-_.display.from),u=h.findIndex(p=>p.id===n.id);u>0&&(r=h[u-1])}}}if(!r||!n){console.warn("[Studio] Unable to resolve Clip A and Clip B for transition");return}const c=t,l=n.display.from-c/2,d=l+c,f={key:e,name:e,duration:c,fromClipId:r.id,toClipId:n.id,start:Math.max(0,l),end:d};"transition"in r&&(r.transition={...f}),"transition"in n&&(n.transition={...f});const{TransitionClip:m}=await Promise.resolve().then(()=>Rx),g=new m(e);g.duration=c,g.display.from=Math.max(0,l),g.display.to=d;const v=this.findTrackIdByClipId(n.id);await this.addClip(g,{trackId:v}),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 pe){if(e.tickInterceptor!=null){const d=new nr(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,d)}}else{const d=new nr(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 Xe&&(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.getSprite();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 nr(this.pixiApp,e,this.clipsNormalContainer);this.spriteRenderers.set(e,r)}return}try{const r=e;if(e instanceof Ae&&t&&typeof t!="string"){const c=URL.createObjectURL(t);e.src=c}const{element:n,objectUrl:o}=await r.createPlaybackElement();if(e instanceof pe){const c=U.from(n),l=new Te(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 nr(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=or(r,!1),l=await ar(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=or(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 ar(m);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const v=this.findTrackIdByClipId(r.id);v&&(await this.addClip(g,{trackId:v}),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=U.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.getSprite();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 h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.element);continue}if(o.display.to>0&&e>o.display.to){const h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.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 h=this.spriteRenderers.get(o);h!=null&&await h.updateFrame(null);const u=this.playbackElements.get(o);u!=null&&this.isPlaybackCapable(o)&&o.pause(u.element);continue}const m=this.playbackElements.get(o),g=o instanceof pe||o instanceof ve,v=o.transition?o.transition.start:0,y=o.transition?o.transition.end:0;if(g&&o.transition&&e>=v&&e<=y){this.transFromTexture||(this.transFromTexture=Se.create({width:this.opts.width,height:this.opts.height})),this.transToTexture||(this.transToTexture=Se.create({width:this.opts.width,height:this.opts.height})),this.transBgGraphics||(this.transBgGraphics=new Re,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:3355443}));const h=this.getClipById(o.transition.fromClipId),u=this.getClipById(o.transition.toClipId);let p=null,_=null;if(h){const x=Math.max(0,e-h.display.from),{video:b}=await h.getFrame(x);b instanceof HTMLVideoElement?p=this.getVideoTexture(b):p=b,p&&(this.lastFromFrame=p)}if(u){const x=Math.max(0,e-u.display.from),{video:b}=await u.getFrame(x);b instanceof HTMLVideoElement?_=this.getVideoTexture(b):_=b,_&&(this.lastToFrame=_)}if(p||(p=this.lastFromFrame),_||(_=this.lastToFrame),!p||!_)continue;if(p&&_&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const x=(e-v)/o.transition.duration;h&&p&&this.renderClipToTransitionTexture(h,p,this.transFromTexture),u&&_&&this.renderClipToTransitionTexture(u,_,this.transToTexture);let b=this.transitionRenderers.get(o.id);if(!b)try{b=Io({name:o.transition.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(o.id,b)}catch(T){console.error("[Studio] Failed to create transition renderer:",T)}if(b){const T=b.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:x});let w=this.transitionSprites.get(o.id);w||(w=new Te,w.label=`TransitionSprite_${o.id}`,this.transitionSprites.set(o.id,w),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(w)),w.texture=T,w.visible=!0,w.x=0,w.y=0,w.width=this.opts.width,w.height=this.opts.height,w.anchor.set(0,0),w.zIndex=o.zIndex,t.add(o.id);const S=this.spriteRenderers.get(o);if(S?.getSprite()&&(S.getSprite().visible=!1),h){const E=this.spriteRenderers.get(h);E?.getSprite()&&(E.getSprite().visible=!1)}continue}}}if(m!=null&&this.isPlaybackCapable(o)){const h=c/1e6;if(o.syncPlayback(m.element,this.isPlaying,h),o instanceof pe){const u=this.videoSprites.get(o);if(u!=null){const p=o.meta.duration/1e6;if(this.spriteRenderers.has(o))u.visible=!1;else{u.visible=h>=0&&h<p,u.visible&&tb(o,u);continue}}}else continue}const a=this.spriteRenderers.get(o);if(a!=null){const h=this.selectedClips.has(o);if(o instanceof ve){const p=o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms();continue}}if(o instanceof Xe){const p=await o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms();continue}}if(o instanceof Pt){o.updateState(c);const p=await o.getTexture();if(p!=null){await a.updateFrame(p),h||a.updateTransforms(),this.opts.interactivity&&this.setupSpriteInteractivity(o);continue}else console.log("[Studio] CaptionClip texture is null, falling back to traditional path")}const{video:u}=await o.getFrame(c);await a.updateFrame(u),h||a.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 $e);for(const m of this.clips){let g=!1;if(f){const v=this.activeGlobalEffect.trackIndex??-1,y=this.getTrackIndex(m.id);g=m.id!==this.activeGlobalEffect.id&&!(m instanceof $e)&&y>v}else{const v=m.effects;g=Array.isArray(v)&&v.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.getSprite();if(c&&c.parent!==r){try{c.parent&&c.parent.removeChild&&c.parent.removeChild(c)}catch(l){console.warn("moveClipToEffectContainer: could not remove sprite 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 ve&&c.addEffect(o),c instanceof pe&&c.addEffect(o),c instanceof Xe&&c.addEffect(o),c instanceof Pt&&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 pe||r instanceof ve)).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 Te(t instanceof U?t:U.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 U||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 $e&&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=Ao({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=Se.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}),v=new Te(g);v.x=0,v.y=0,v.width=d,v.height=f,v.scale.set(1),v.zIndex=5,this.clipContainer.addChild(v),this.currentGlobalEffectSprite=v,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.getSprite();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 n2({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 Xe))continue;const r=this.spriteRenderers.get(t);if(r==null)continue;const n=r.getSprite();if(n==null||n.texture==null)continue;const o=Math.abs(n.scale.x);if(o===1)continue;const c=t.left,l=t.top,d=n.texture.width,f=o*d;await t.updateStyle({wordWrap:!0,wordWrapWidth:f});const m=await t.getTexture();m&&(await r.updateFrame(m),n.scale.set(1,1),t.left=c,t.top=l,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.getSprite();if(r==null||r.texture==null)continue;const n=r.texture.width,o=r.texture.height,c=Math.abs(r.scale.x)*n,l=Math.abs(r.scale.y)*o,d=e instanceof Xe&&this.textClipResizedWidth!==null?this.textClipResizedWidth:c,f=r.x-d/2,m=r.y-l/2;if(e instanceof Xe&&this.textClipResizedWidth!==null){await e.updateStyle({wordWrap:!0,wordWrapWidth:d});const g=await e.getTexture();g&&(await t.updateFrame(g),e.width=d,e.height=g.height,this.textClipResizedWidth=null,e.left=r.x-e.width/2,e.top=r.y-e.height/2,r.scale.set(1,1))}else e.left=f,e.top=m,e.width=c,e.height=l,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.getSprite();if(r!=null&&r.texture!=null){const n=r.texture.width,o=r.texture.height,c=Math.abs(r.scale.x)*n,l=Math.abs(r.scale.y)*o,d=r.x-c/2,f=r.y-l/2;e.left=d,e.top=f,e.width=c,e.height=l,e.angle=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=>or(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,transition:r.length>0?r:void 0,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 r=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),r&&this.pixiApp!=null){const n=this.opts.width,o=this.opts.height;this.pixiApp.renderer.resize(n,o),this.opts.canvas&&(this.opts.canvas.width=n,this.opts.canvas.height=o)}}if(e.clips){const r=new Map;if(e.tracks){for(const n of e.tracks)if(n.clipIds)for(const o of n.clipIds)r.set(o,n.id)}if(e.tracks)for(const n of e.tracks)this.tracks.push({id:n.id,name:n.name,type:n.type,clipIds:[]});for(const n of e.clips){const o=n.id?r.get(n.id):void 0;await this.loadClipIntoTrack(n,o)}}for(const r of this.clips){const n=r.effects;if(Array.isArray(n))for(const o of n)this.globalEffects.has(o.id)||this.globalEffects.set(o.id,{id:o.id,key:o.key,startTime:o.startTime,duration:o.duration})}const t=e.transition||e.transitions;if(t)for(const r of t){const n=r.clips[0],o=r.clips[1],c=this.clips.find(l=>l.id===o);c?c.transition={name:r.key,duration:r.duration,prevClipId:n}:console.warn(`[Studio] Could not find target clip ${o} for transition ${r.key}`)}else console.log("[Studio] No transition data found in JSON");try{await this.updateFrame(this.currentTime)}catch(r){console.error("[Studio] Failed to update initial frame:",r)}}async loadClipIntoTrack(e,t){if(e.type!=="Text"&&e.type!=="Caption"&&e.type!=="Effect"&&(!e.src||e.src.trim()==="")){console.warn(`Skipping clip ${e.type} with empty source`);return}try{const r=await ar(e),n=r instanceof Ae?e.src:void 0;await this.addClip(r,{trackId:t,audioSource:n}),(r instanceof pe||r instanceof ve)&&(!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 pi{static instance;fonts=new Map;constructor(){}static getInstance(){return pi.instance||(pi.instance=new pi),pi.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 a2=pi.getInstance();L.add(Jp),L.mixin(ne,Qp),L.add(Bl),L.add(Dl),L.add(Wc),L.mixin(ne,A_),L.add(Hc),L.add(Eu),L.add(Mn),L.add(Ru),L.add(Bu),L.add(Du),L.add($u),L.add(Xu),L.add(Nu),L.add(Vu),L.add(Hu),L.add(Lu),L.add(Gu),L.add($c),L.add(Yc);const l2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),c2=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));te.AudioClip=Ae,te.CaptionClip=Pt,te.Compositor=e2,te.EffectClip=$e,te.GL_EFFECT_OPTIONS=eb,te.GL_TRANSITION_OPTIONS=Jb,te.ImageClip=ve,te.Log=W,te.MP4Clip=pe,te.Studio=o2,te.TextClip=Xe,te.TransitionClip=sr,te.VideoClip=pe,te.clipToJSON=or,te.createChromakey=Bf,te.fastConcatMP4=Qu,te.fixFMP4Duration=kx,te.fontManager=a2,te.jsonToClip=ar,te.makeEffect=Ao,te.makeTransition=Io,te.mixinMP4AndAudio=Gx,te.renderTxt2ImgBitmap=Lf,Object.defineProperty(te,Symbol.toStringTag,{value:"Module"})}));
package/dist/studio.d.ts CHANGED
@@ -14,29 +14,29 @@ export interface IStudioOpts {
14
14
  interactivity?: boolean;
15
15
  }
16
16
  export interface StudioEvents {
17
- 'selection:created': {
17
+ "selection:created": {
18
18
  selected: IClip[];
19
19
  };
20
- 'selection:updated': {
20
+ "selection:updated": {
21
21
  selected: IClip[];
22
22
  };
23
- 'selection:cleared': {
23
+ "selection:cleared": {
24
24
  deselected: IClip[];
25
25
  };
26
- 'track:added': {
26
+ "track:added": {
27
27
  track: StudioTrack;
28
28
  };
29
- 'track:removed': {
29
+ "track:removed": {
30
30
  trackId: string;
31
31
  };
32
- 'clip:added': {
32
+ "clip:added": {
33
33
  clip: IClip;
34
34
  trackId: string;
35
35
  };
36
- 'clip:removed': {
36
+ "clip:removed": {
37
37
  clipId: string;
38
38
  };
39
- 'clip:updated': {
39
+ "clip:updated": {
40
40
  clip: IClip;
41
41
  };
42
42
  currentTime: {
@@ -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-CZk_O50g.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-Cu_5hRJ3.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.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Video rendering and processing library",
5
5
  "type": "module",
6
6
  "publishConfig": {