@dnyantra/dtly 0.0.0-stage → 0.2.0

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.
Files changed (76) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +172 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +95 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/anim.d.ts +3 -0
  7. package/dist/core/anim.js +61 -0
  8. package/dist/core/anim.js.map +1 -0
  9. package/dist/core/color.d.ts +4 -0
  10. package/dist/core/color.js +28 -0
  11. package/dist/core/color.js.map +1 -0
  12. package/dist/core/ease.d.ts +8 -0
  13. package/dist/core/ease.js +90 -0
  14. package/dist/core/ease.js.map +1 -0
  15. package/dist/core/model.d.ts +229 -0
  16. package/dist/core/model.js +4 -0
  17. package/dist/core/model.js.map +1 -0
  18. package/dist/core/text.d.ts +41 -0
  19. package/dist/core/text.js +222 -0
  20. package/dist/core/text.js.map +1 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.js +13 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/mcp/index.d.ts +1 -0
  25. package/dist/mcp/index.js +2 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/mcp/server.d.ts +3 -0
  28. package/dist/mcp/server.js +193 -0
  29. package/dist/mcp/server.js.map +1 -0
  30. package/dist/node.d.ts +4 -0
  31. package/dist/node.js +6 -0
  32. package/dist/node.js.map +1 -0
  33. package/dist/ops/ops.d.ts +39 -0
  34. package/dist/ops/ops.js +259 -0
  35. package/dist/ops/ops.js.map +1 -0
  36. package/dist/ops/store.d.ts +4 -0
  37. package/dist/ops/store.js +22 -0
  38. package/dist/ops/store.js.map +1 -0
  39. package/dist/presets/index.d.ts +14 -0
  40. package/dist/presets/index.js +235 -0
  41. package/dist/presets/index.js.map +1 -0
  42. package/dist/presets/text.d.ts +5 -0
  43. package/dist/presets/text.js +19 -0
  44. package/dist/presets/text.js.map +1 -0
  45. package/dist/render/export.d.ts +43 -0
  46. package/dist/render/export.js +215 -0
  47. package/dist/render/export.js.map +1 -0
  48. package/dist/render/ffmpeg.d.ts +1 -0
  49. package/dist/render/ffmpeg.js +16 -0
  50. package/dist/render/ffmpeg.js.map +1 -0
  51. package/dist/render/node-host.d.ts +18 -0
  52. package/dist/render/node-host.js +168 -0
  53. package/dist/render/node-host.js.map +1 -0
  54. package/dist/render/renderer.d.ts +36 -0
  55. package/dist/render/renderer.js +372 -0
  56. package/dist/render/renderer.js.map +1 -0
  57. package/dist/starter.d.ts +5 -0
  58. package/dist/starter.js +32 -0
  59. package/dist/starter.js.map +1 -0
  60. package/dist/studio/server.d.ts +12 -0
  61. package/dist/studio/server.js +190 -0
  62. package/dist/studio/server.js.map +1 -0
  63. package/dist/studio-app/app.css +2 -0
  64. package/dist/studio-app/app.css.map +7 -0
  65. package/dist/studio-app/app.js +5 -0
  66. package/dist/studio-app/app.js.map +7 -0
  67. package/dist/studio-app/index.html +15 -0
  68. package/dist/version.d.ts +2 -0
  69. package/dist/version.js +3 -0
  70. package/dist/version.js.map +1 -0
  71. package/fonts/Baloo2.ttf +0 -0
  72. package/fonts/Mukta-Bold.ttf +0 -0
  73. package/fonts/OFL-Baloo2.txt +93 -0
  74. package/fonts/OFL-Mukta.txt +93 -0
  75. package/package.json +84 -4
  76. package/plugin/skills/dtly/SKILL.md +94 -0
@@ -0,0 +1,5 @@
1
+ var O,Ht,Yn,ge,ut,Ge,Bt,Je,Kt,ht,mt,Gn,Ze={},Qe=[],Zn=/^m(i|n|o|s|text|space)$/,gt=Array.isArray,Wt=Qe.slice,ke=Object.assign;function xe(e){e&&e.parentNode&&e.remove()}function Xe(e,t,n,o,i){var r={type:e,props:t,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i||++Ht,__i:-1,__u:0};return!i&&O.vnode&&O.vnode(r),r}function ye(e){return e.children}function Ye(e,t){this.props=e,this.context=t,this.__g=0}function be(e,t){if(t==null)return e.__&&be(e.__,e.__i+1);for(var n;t<e.__k.length;t++)if((n=e.__k[t])&&n.__e)return n.__e;return typeof e.type!="function"||e.props.__P?null:be(e)}function Ut(e){if((e=e.__)&&e.__c&&!e.props.__P)return e.__e=null,e.__k.some(function(t){return t&&(e.__e=t.__e)}),Ut(e)}function Dt(e){(8&e.__g||(e.__g|=8,ge.push(e),Ge++))&&ut==O.debounceRendering||((ut=O.debounceRendering)||queueMicrotask)(qt)}function qt(){var e,t,n,o,i,r,a,s,c;try{for(t=1;ge.length;)ge.length>t&&ge.sort(Bt),e=ge.shift(),t=ge.length,8&e.__g&&(o=void 0,i=void 0,r=(i=(n=e).__v).__e,a=[],s=[],(c=n.__P)&&((o=ke({constructor:void 0},i)).__v=i.__v+1,O.vnode&&O.vnode(o),bt(c,o,i,n.__n,c.namespaceURI,32&i.__u?[r]:null,a,r||be(i),32&i.__u,s),o.__v=i.__v,o.__.__k[o.__i]=o,Gt(a,o,s),i.__=i.__e=null,o.__e!=r&&Ut(o)))}finally{(Ge=ge.length)&&(ut||queueMicrotask)(qt)}}function Jt(e,t,n,o,i,r,a,s,c,u,p){var m,h,d,f,g,v,y=o.__k||Qe,k=t.length;for(c=Qn(n,t,y,c,k),m=0;m<k;m++)(d=n.__k[m])!=null&&(h=~d.__i&&y[d.__i]||Ze,d.__i=m,v=bt(e,d,h,i,r,a,s,c,u,p),f=d.__e,(h.ref!=d.ref||8&h.__u)&&(h.ref&&yt(h.ref,null,d,h),d.ref&&p.push(d.ref,d.__c||f,d)),g=g||f,4&d.__u?(c=Xt(d,c,e,!h.__v),h.__e&&(h.__e=null)):typeof d.type=="function"&&v!==void 0?c=v:f&&(c=f.nextSibling),d.__u&=-21);return n.__e=g,c}function Qn(e,t,n,o,i){var r,a,s,c,u,p,m,h,d,f=n.length,g=f,v=0,y=0,k=e.__k=Array(i);for(r=0;r<i;r++)(a=t[r])!=null&&typeof a!="boolean"&&typeof a!="function"?(typeof a!="object"||a.constructor==String?a=k[r]=Xe(null,a):gt(a)?a=k[r]=Xe(ye,{children:a}):a.constructor===void 0&&a.__b?a=k[r]=Xe(a.type,a.props,a.key,a.ref,a.__v):k[r]=a,c=r+v,a.__=e,a.__b=e.__b+1,s=null,~(u=a.__i=eo(a,n,c,g))&&(g--,(s=n[u])&&(s.__u|=2)),s&&s.__v?(a.__u|=16,u==c-1?v--:u==c+1?v++:u!=c&&(u>c?v--:v++,y=1)):(~u||(i>f?v--:i<f&&v++),typeof a.type!="function"&&(a.__u|=4))):k[r]=null;if(y){for(p=[],m=[],r=0;r<i;r++)if((a=k[r])&&16&a.__u){for(v=0,h=p.length;v<h;)p[d=v+h>>1]<a.__i?v=d+1:h=d;p[v]=a.__i,m[r]=v+1}for(v=p.length;r--;)m[r]&&(m[r]==v?v--:k[r].__u|=4)}if(g)for(r=0;r<f;r++)!(s=n[r])||2&s.__u||(s.__e==o&&(o=be(s)),_t(s,s));return o}function Xt(e,t,n,o){var i,r,a,s;if(typeof e.type=="function"){if(e.props.__P)return t;if(i=e.__k)for(r=0;r<i.length;r++)i[r]&&(i[r].__=e,t=Xt(i[r],t,n,!1));return t}for(t&&!t.parentNode&&(t=be(e))&&!t.parentNode&&(t=null),a=e.__e,s=t;s&&s.nodeType==8;)s=s.nextSibling;for(a!=s&&(!o&&n.moveBefore&&a.parentNode?n.moveBefore(a,t):n.insertBefore(a,t||null)),t=a;(t=t&&t.nextSibling)&&t.nodeType==8&&!t.data.startsWith("$s"););return t}function eo(e,t,n,o){var i,r=e.key,a=e.type,s=t[n],c=s&&!(2&s.__u);if(s===null&&r==null||c&&r==s.key&&a==s.type)return n;if(o>(c?1:0)){for(i=n-1;i>=0;i--)if((s=t[i])&&!(2&s.__u)&&r==s.key&&a==s.type)return i;for(i=n+1;i<t.length;i++)if((s=t[i])&&!(2&s.__u)&&r==s.key&&a==s.type)return i}return-1}function Vt(e,t,n){n==null&&(n=""),t[0]=="-"?e.setProperty(t,n):e[t]=n}function qe(e,t,n,o,i){var r,a;if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof o=="string"&&(e.style.cssText=o=""),o)for(t in o)n&&t in n||Vt(e.style,t);if(n)for(t in n)o&&n[t]==o[t]||Vt(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")(e.__e||(e.__e={}))[t]=n,n&&o||(a=mt[t]||(mt[t]=to(t)),(e.__a||(e.__a={}))[t]=ht,r=t!=(t=t.replace(Kt,"$1")),(t=t.slice(2))[0]<"a"&&(t=t.toLowerCase()),n?e.addEventListener(t,a,r):e.removeEventListener(t,a,r));else{if(i=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{return void(e[t]=n??"")}catch{}if(typeof n=="function")return;n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n)}}function to(e){return function(t){var n=this.__e;if(n){if(n=n[e],t[Je]==null)t[Je]=ht++;else if(t[Je]<this.__a[e])return;return n(O.event?O.event(t):t)}}}function bt(e,t,n,o,i,r,a,s,c,u){var p,m,h,d,f,g,v,y,k,L,b,M,w,$,_,x,C,P,T=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(c=32&n.__u,p=n.__c.__z)&&(t.__u|=c,m=r=[],p.nodeType==8?s=ft(p,r):r.push(p),s=r[0]||s),(p=O.__b)&&p(t);e:if(typeof T=="function"){h=a.length;try{if(y=t.props,k=(p=T.prototype)&&p.render,L=(p=T.contextType)&&o[p.__c],b=p?L?L.props.value:p.__:o,(d=n.__c)?(t.__c=d,2&d.__g&&(d.__g|=1)):(k?t.__c=d=new T(y,b):(t.__c=d=new Ye(y,b),d.constructor=T,d.render=oo),L&&L.sub(d),d.state||(d.state={}),d.__n=o,d.__g|=8,d.__h=[],d.__k=[]),k&&(d.__s||(d.__s=d.state),T.getDerivedStateFromProps&&(d.__s==d.state&&(d.__s=ke({},d.__s)),ke(d.__s,T.getDerivedStateFromProps(y,d.__s)))),f=d.props,g=d.state,d.__v=t,n.__c){if(y!==f&&k&&!T.getDerivedStateFromProps&&d.componentWillReceiveProps&&d.componentWillReceiveProps(y,b),t.__v==n.__v&&!(8&d.__g)||!(4&d.__g)&&d.shouldComponentUpdate&&d.shouldComponentUpdate(y,d.__s,b)===!1){t.__v!=n.__v&&(d.props=y,d.state=d.__s,d.__g&=-9),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(j){j&&(j.__=t)}),Qe.push.apply(d.__h,d.__k),d.__k=[],d.__h.length&&a.push(d),s=be(n);break e}d.componentWillUpdate&&d.componentWillUpdate(y,d.__s,b),k&&d.componentDidUpdate&&d.__h.push(function(){d.componentDidUpdate(f,g,v)})}else k&&!T.getDerivedStateFromProps&&d.componentWillMount&&d.componentWillMount(),k&&d.componentDidMount&&d.__h.push(d.componentDidMount);if(d.context=b,d.props=y,d.__P=e,d.__g&=-5,M=O.__r,w=0,k)d.state=d.__s,d.__g&=-9,M&&M(t),p=d.render(d.props,d.state,d.context),Qe.push.apply(d.__h,d.__k),d.__k=[];else do d.__g&=-9,M&&M(t),p=d.render(d.props,d.state,d.context),d.state=d.__s;while(8&d.__g&&++w<25);d.state=d.__s,d.getChildContext&&(o=ke({},o,d.getChildContext())),k&&n.__c&&d.getSnapshotBeforeUpdate&&(v=d.getSnapshotBeforeUpdate(f,g)),$=p&&p.type===ye&&p.key==null?p.props.children:p,y.__P&&(p=s,i=(e=y.__P).namespaceURI,c=r=null,n.props&&n.props.__P!=e&&(n.__k.some(function(j){j&&_t(j,j)}),n.__k=null),s=n.__k?be(n,0):null),s=Jt(e,gt($)?$:[$],t,n,o,i,r,a,s,c,u),y.__P&&(t.__e=null,s=p),t.__u&=-161,m&&m.some(xe),d.__h.length&&a.push(d),1&d.__g&&(d.__g&=-4)}catch(j){if(a.length=h,t.__v=null,c||r)if(j.then){if(_=0,t.__u|=128|c,r){for(~(C=r.indexOf(s||void 0))||(C=r.length);(P=r[C-1])&&P.nodeType==8;)C--;for(;C<r.length;C++)if(P=r[C]){if(r[C]=null,P.nodeType==8){if(P.data.startsWith("$s"))_++||(x=P);else if(_&&P.data.startsWith("/$s")&&!--_)break}else if(!_)break}}if(!x){for(;s&&s.nodeType==8&&s.nextSibling;)s=s.nextSibling;x=s}(p=ft(x=t.__c.__z||(t.__c.__z=x)))?(t.__e=x,s=p):t.__e=s,s=s&&s.nextSibling}else r&&r.some(xe);else t.__e=n.__e;t.__k||(t.__k=n.__k||[]),j.then||Yt(t),O.__e(j,t,n)}}else s=t.__e=no(n.__e,t,n,o,i,r,a,c,u,e);return(p=O.diffed)&&p(t),s}function ft(e,t){if(e&&e.nodeType==8&&e.data.startsWith("$s"))for(var n=1;e=e.nextSibling;){if(e.nodeType==8){if(e.data.startsWith("$s"))n++;else if(e.data.startsWith("/$s")&&!--n)return e}t&&t.push(e)}}function Yt(e){e&&(e.__c&&(e.__c.__g|=4),e.__k&&e.__k.some(Yt))}function Gt(e,t,n){for(var o=0;o<n.length;)yt(n[o++],n[o++],n[o++]);O.__c&&O.__c(t,e),e.some(function(i){try{e=i.__h,i.__h=[],e.some(function(r){r.call(i)})}catch(r){O.__e(r,i.__v)}})}function no(e,t,n,o,i,r,a,s,c,u){var p,m,h,d,f,g,v,y,k,L=n.props||Ze,b=t.props,M=t.type;if(M=="svg"?i="http://www.w3.org/2000/svg":M=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),r){for(p=0;p<r.length;p++)if((f=r[p])&&(M?f.localName==M:f.nodeType==3)){e=f,r[p]=null;break}}if(!e){if(y=u.ownerDocument||document,!M)return y.createTextNode(b);e=y.createElementNS(i,M,b.is&&b),s&&(O.__m&&O.__m(t,r),s=!1),r=null}if(M){if(u=M=="template"?e.content:e,r=M=="textarea"&&b.defaultValue!=null?null:r&&Wt.call(u.childNodes),!s&&r)for(L={},p=0;p<e.attributes.length;p++)L[(f=e.attributes[p]).name]=f.value;for(p in L)f=L[p],p=="dangerouslySetInnerHTML"?h=f:p=="children"||p in b||p=="value"&&"defaultValue"in b||p=="checked"&&"defaultChecked"in b||qe(e,p,null,f,i);for(p in k=1&n.__u,b)f=b[p],p=="children"?d=f:p=="dangerouslySetInnerHTML"?m=f:p=="value"?g=f:p=="checked"?v=f:s&&typeof f!="function"||!(L[p]!==f||k&&f!=null)||qe(e,p,f,L[p],i);m?(s||h&&(m.__html==h.__html||m.__html==e.innerHTML)||(e.innerHTML=m.__html),t.__k=[]):(h&&(e.textContent=""),(M=="foreignObject"||i=="http://www.w3.org/1998/Math/MathML"&&Zn.test(M))&&(i="http://www.w3.org/1999/xhtml"),Jt(u,gt(d)?d:[d],t,n,o,i,r,a,r?r[0]:n.__k&&be(n,0),s,c),r&&r.some(xe)),s&&M!="textarea"||(p="value",M=="progress"&&g==null?e.removeAttribute(p):g==null||g===e[p]&&(M!="progress"||g)||qe(e,p,g,L[p],i),p="checked",v!=null&&v!=e[p]&&qe(e,p,v,L[p],i))}else L===b||s&&e.data==b||(e.data=b);return e}function yt(e,t,n,o){try{typeof e=="function"?t?t.__x=e(t)||1:o&&(o=o.__c||o.__e)&&(t=o.__x)&&(o.__x=null,typeof t=="function"?t():e(null)):e.current=t}catch(i){O.__e(i,n)}}function _t(e,t,n){var o,i,r,a;if(O.unmount&&O.unmount(e),!(o=e.ref)||o.current&&o.current!=e.__e||yt(o,null,t,e),o=e.__c){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(s){O.__e(s,t)}o.__P=o.__n=null}if(o=e.__k)for(a=0;a<o.length;a++)o[a]&&_t(o[a],t,typeof e.type!="function"||n&&!e.props.__P);!n&&(o=e.__c)&&(o=o.__z)&&(i=ft(o,r=[]))&&(o==e.__e&&r.some(xe),xe(i),xe(o)),(o=e.__e)&&(n||xe(o),o.__e&&(o.__e=null)),e.__e=e.__c=e.__=null}function oo(e,t,n){return this.constructor(e,n)}function Zt(e,t){var n,o,i,r;O.__&&O.__(e,t),t.nodeType==9&&(t=t.documentElement),o=(n=e&&32&e.__u)?null:t.__k,t.__k=Xe(ye,{children:[e]}),i=[],r=[],bt(t,t.__k,o||Ze,Ze,t.namespaceURI,o?null:t.firstChild?Wt.call(t.childNodes):null,i,o?o.__e:t.firstChild,n,r),Gt(i,t.__k,r),t.__k.props.children=null}O={__e:function(e,t,n,o){for(var i,r,a;t=t.__;)if((i=t.__c)&&!(1&i.__g)){i.__g|=4;try{if((a=(r=i.constructor)&&r.getDerivedStateFromError)&&i.setState(r.getDerivedStateFromError(e)),i.componentDidCatch&&(i.componentDidCatch(e,o||{}),a=1),a&&8&i.__g)return void(i.__g|=2)}catch(s){e=s}}throw Ge=0,e}},Ht=0,Yn=function(e){return e!=null&&e.constructor===void 0},Ye.prototype.setState=function(e,t){var n=this.__s;n&&n!=this.state||(n=this.__s=ke({},this.state)),typeof e=="function"&&(e=e(ke({},n),this.props)),e&&(ke(n,e),this.__v&&(t&&this.__k.push(t),Dt(this)))},Ye.prototype.forceUpdate=function(e){this.__v&&(this.__g|=4,e&&this.__h.push(e),Dt(this))},Ye.prototype.render=ye,ge=[],Ge=0,Bt=function(e,t){return e.__v.__b-t.__v.__b},Je=Symbol(),Kt=/(PointerCapture)$|Capture$/i,ht=0,mt={},Gn=0;var Fe,B,vt,Qt,wt=Object.is,et=0,cn=[],xt=[],V=O,en=V.__b,tn=V.__r,nn=V.diffed,on=V.__c,rn=V.unmount,an=V.__;function Ct(e,t){V.__h&&V.__h(B,e,et||t),et=0;var n=B.__H||(B.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function Y(e){return et=1,ro(pn,e)}function ro(e,t,n){var o=Ct(Fe++,2);if(o.t=e,!o.__c&&(o.__=[n?n(t):pn(void 0,t),function(r){var a=o.__N?o.__N[0]:o.__[0],s=o.t(a,r);wt(a,s)||(o.__N=[s,o.__[1]],o.__c.setState({}))}],o.__c=B,!B.__f)){B.__f=!0;var i=B.shouldComponentUpdate;B.shouldComponentUpdate=function(r,a,s){var c=this.__H;if(!c)return!0;var u=!1,p=this.props!=r;if(c.__.some(function(h){h.__N&&(u=!0,wt(h.__[0],h.__N[0])||(p=!0))}),i){var m=i.call(this,r,a,s);return u?m||p:m}return!u||p}}return o.__}function ae(e,t){var n=Ct(Fe++,3);!V.__s&&dn(n.__H,t)&&(n.__P=!0,n.__=e,n.u=t,B.__H.__h.push(n))}function re(e){return et=5,io(function(){return{current:e}},[])}function io(e,t){var n=Ct(Fe++,7);return dn(n.__H,t)&&(n.__=e(),n.__H=t),n.__}function ao(){var e;do{for(;e=xt.shift();)try{Oe(e)}catch(n){V.__e(n,{__:(e=e.__P)&&e.__v})}for(;e=cn.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Oe),t.__h.some(kt),t.__h=[]}catch(n){t.__h=[],V.__e(n,e.__v)}}}while(xt.length)}V.__b=function(e){B=null,en&&en(e)},V.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),an&&an(e,t)},V.__r=function(e){tn&&tn(e),Fe=0;var t=(B=e.__c).__H;t&&(vt==B?B.__h=[]:(t.__h.some(Oe),t.__h.some(kt),Fe=0),t.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})),vt=B},V.diffed=function(e){nn&&nn(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&ln(cn.push(t)),t.__H.__.some(function(n){n.u&&(n.__H=n.u)})),vt=B=null},V.__c=function(e,t){t.some(function(n){try{n.__h.some(Oe),n.__h=n.__h.filter(function(o){return!o.__||kt(o)})}catch(o){t.some(function(i){i.__h&&(i.__h=[])}),t=[],V.__e(o,n.__v)}}),on&&on(e,t)},V.unmount=function(e){rn&&rn(e);var t,n,o=e.__c;o&&o.__H&&(o.__H.__.some(function(i){try{if(i.__P&&i.__c){if(n===void 0){for(n=e.__;n&&(!n.__c||!n.__c.__P);)n=n.__;n=n&&n.__c}i.__P=n,ln(xt.push(i))}else Oe(i)}catch(r){t=r}}),o.__H=void 0,t&&V.__e(t,o.__v))};var sn=typeof requestAnimationFrame=="function";function so(e){var t,n=function(){clearTimeout(o),sn&&cancelAnimationFrame(t),setTimeout(e)},o=setTimeout(n,35);sn&&(t=requestAnimationFrame(n))}function ln(e){e!=1&&Qt==V.requestAnimationFrame||((Qt=V.requestAnimationFrame)||so)(ao)}function Oe(e){var t=B,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),B=t}function kt(e){var t=B;e.__c=e.__(),B=t}function dn(e,t){return!e||e.length!=t.length||t.some(function(n,o){return!wt(n,e[o])})}function pn(e,t){return typeof t=="function"?t(e):t}var te=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&"keyframes"in e;var Q=class extends Error{};var pe=(e,t)=>{let n=e.comps.find(o=>o.id===(t??e.root));if(!n)throw new Q(`No composition "${t}". Comps: ${e.comps.map(o=>o.id).join(", ")}`);return n},K=(e,t)=>{for(let n of e.comps){let o=n.layers.findIndex(i=>i.id===t);if(o>=0)return{comp:n,layer:n.layers[o],index:o}}throw new Q(`No layer "${t}"`)},un=e=>new Set(e.comps.flatMap(t=>t.layers.map(n=>n.id))),mn=(e,t)=>{let n=un(e),o=t.replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||"layer";if(!n.has(o))return o;let i=2;for(;n.has(`${o}-${i}`);)i++;return`${o}-${i}`},fn=(e,t)=>{if(e.comps.some(i=>i.id===t.id))throw new Q(`Composition "${t.id}" already exists`);let n=pe(e),o={width:n.width,height:n.height,fps:n.fps,duration:n.duration,layers:[],...t};return e.comps.push(o),o},hn=(e,t,n)=>{Object.assign(pe(e,t),n)},ie=(e,t,n,o=0)=>{let i=pe(e,t),r=n.id?un(e).has(n.id)?(()=>{throw new Q(`Layer id "${n.id}" already used`)})():n.id:mn(e,n.name??n.type),a={...n,id:r};return i.layers.splice(Math.max(0,Math.min(o,i.layers.length)),0,a),a},Pt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),gn=(e,t)=>{for(let[n,o]of Object.entries(t))o===null?delete e[n]:Pt(o)&&Pt(e[n])&&!("keyframes"in o)?gn(e[n],o):e[n]=o;return e},ee=(e,t,n)=>{if("id"in n)throw new Q("Cannot change a layer id; duplicate it instead");let{layer:o}=K(e,t);return gn(o,n),o},tt=(e,t)=>{let{comp:n,index:o}=K(e,t);n.layers.splice(o,1);for(let i of e.comps)for(let r of i.layers)r.parent===t&&delete r.parent,r.matte?.layer===t&&delete r.matte},St=(e,t,n)=>{let{comp:o,index:i,layer:r}=K(e,t);o.layers.splice(i,1),o.layers.splice(Math.max(0,Math.min(n,o.layers.length)),0,r)},Mt=(e,t)=>{Array.isArray(e)?e.forEach(n=>Mt(n,t)):Pt(e)&&(Array.isArray(e.keyframes)&&t(e.keyframes),Object.values(e).forEach(n=>Mt(n,t)))},ze=(e,t,n)=>{let{layer:o}=K(e,t);(o.inPoint!==void 0||n)&&(o.inPoint=(o.inPoint??0)+n),o.outPoint!==void 0&&(o.outPoint+=n),Mt(o,i=>i.forEach(r=>r.t=+(r.t+n).toFixed(4)))},nt=(e,t,n={})=>{let{comp:o,index:i,layer:r}=K(e,t),a=structuredClone(r);return a.id=n.newId??mn(e,r.id),o.layers.splice(i,0,a),n.timeShift&&ze(e,a.id,n.timeShift),a},bn=e=>e.split(".").map(t=>/^\d+$/.test(t)?Number(t):t),ot=(e,t)=>bn(t).reduce((n,o)=>n?.[o],e),Lt=(e,t,n)=>{let o=bn(t),i=e;o.slice(0,-1).forEach((r,a)=>{i[r]==null&&(i[r]=typeof o[a+1]=="number"?[]:{}),i=i[r]}),i[o[o.length-1]]=n},Le=.001,Ne=(e,t,n,o)=>{let{layer:i}=K(e,t);Lt(i,n,o)},q=(e,t,n,o,i,r)=>{let{layer:a}=K(e,t),s=ot(a,n),c;if(te(s))c=s.keyframes;else{c=[];let p=a.inPoint??0;s!==void 0&&Math.abs(p-o)>Le&&c.push({t:p,v:s}),Lt(a,n,{keyframes:c})}let u=c.find(p=>Math.abs(p.t-o)<Le);return u?(u.v=i,r!==void 0&&(u.ease=r)):c.push(r!==void 0?{t:o,v:i,ease:r}:{t:o,v:i}),c.sort((p,m)=>p.t-m.t),c},Re=(e,t,n,o)=>{let{layer:i}=K(e,t),r=ot(i,n);if(!r||!te(r))throw new Q(`${t}.${n} is not animated`);let a=r.keyframes.findIndex(s=>Math.abs(s.t-o)<Le);if(a<0)throw new Q(`No keyframe at ${o}s on ${t}.${n}`);r.keyframes.splice(a,1),r.keyframes.length===1&&!r.wiggle&&Lt(i,n,r.keyframes[0].v)},yn=(e,t,n,o,i)=>{let{layer:r}=K(e,t),a=ot(r,n),s=a?.keyframes?.find(u=>Math.abs(u.t-o)<Le);if(!a||!s)throw new Q(`No keyframe at ${o}s on ${t}.${n}`);let c=Math.round(i*1e3)/1e3;if(a.keyframes.some(u=>u!==s&&Math.abs(u.t-c)<Le))throw new Q(`There is already a keyframe at ${c}s`);s.t=c,a.keyframes.sort((u,p)=>u.t-p.t)},Et=(e,t,n,o,i)=>{let{layer:r}=K(e,t),s=ot(r,n)?.keyframes?.find(c=>Math.abs(c.t-o)<Le);if(!s)throw new Q(`No keyframe at ${o}s on ${t}.${n}`);s.ease=i};var _e={typewriter:{description:"Letters appear one by one with no motion.",animators:[{unit:"grapheme",stagger:.05,duration:.01,ease:"hold",from:{opacity:0}}]},fadeUp:{description:"Words fade in while rising slightly. Calm, readable default.",animators:[{unit:"word",stagger:.08,duration:.6,ease:"cubicOut",from:{opacity:0,y:40}}]},popIn:{description:"Words scale up from zero with an overshoot. Playful, energetic.",animators:[{unit:"word",stagger:.1,duration:.55,ease:"backOut",from:{opacity:0,scale:0}}]},slam:{description:"Words crash in from huge and blurred. Punchy kinetic typography.",animators:[{unit:"word",stagger:.18,duration:.35,ease:"expoOut",from:{opacity:0,scale:320,blur:14}}]},blurIn:{description:"Letters sharpen from a blur. Elegant, premium.",animators:[{unit:"grapheme",stagger:.03,duration:.7,ease:"cubicOut",from:{opacity:0,blur:18,x:-20}}]},maskedLines:{description:"Each line slides up from behind its own mask. The classic title reveal.",animators:[{unit:"line",stagger:.12,duration:.8,ease:"expoOut",clip:!0,from:{y:120}}]},cascade:{description:"Letters drop and rotate into place with an overshoot.",animators:[{unit:"grapheme",stagger:.035,duration:.7,ease:"backOut",from:{opacity:0,y:-70,rotation:-25}}]},trackingIn:{description:"Letter spacing collapses from wide to normal while fading in. Cinematic openers.",animators:[{unit:"grapheme",stagger:0,duration:1.4,ease:"expoOut",from:{opacity:0,tracking:60}}]},centerOut:{description:"Letters grow outward from the middle of the word.",animators:[{unit:"grapheme",order:"center",stagger:.04,duration:.5,ease:"backOut",from:{opacity:0,scale:0}}]},randomFlicker:{description:"Letters switch on in random order.",animators:[{unit:"grapheme",order:"random",stagger:.03,duration:.08,ease:"hold",from:{opacity:0}}]},colorSweep:{description:"A highlight colour sweeps through the letters, settling to the text colour.",animators:[{unit:"grapheme",stagger:.04,duration:.5,ease:"easeOut",from:{color:"#FFC93C",scale:115}}]},fadeOutDown:{description:"Exit: words fade out while dropping.",animators:[{unit:"word",mode:"out",stagger:.05,duration:.4,ease:"easeIn",from:{opacity:0,y:40}}]},blurOut:{description:"Exit: letters blur away.",animators:[{unit:"grapheme",mode:"out",stagger:.02,duration:.45,ease:"easeIn",from:{opacity:0,blur:16}}]},maskedLinesOut:{description:"Exit: lines slide up out of their masks.",animators:[{unit:"line",mode:"out",stagger:.08,duration:.5,ease:"expoInOut",clip:!0,from:{y:-120}}]}};var D=(e,t)=>typeof e=="number"?e:t,R=(e,t)=>typeof e=="string"?e:t,Ee=e=>Math.round(e*1e3)/1e3,G=(...e)=>({keyframes:e.map(([t,n,o])=>o?{t:Ee(t),v:n,ease:o}:{t:Ee(t),v:n})}),J={};for(let[e,t]of Object.entries(_e))J[`text.${e}`]={kind:"text",description:t.description,params:"{layer: textLayerId, delay?: s, stagger?: s, duration?: s, replace?: boolean}",apply:(n,o,i)=>{let{layer:r}=K(n,R(i.layer,""));if(r.type!=="text")throw new Q(`${r.id} is not a text layer`);let a=t.animators.map(s=>({...s,...i.delay!==void 0&&{delay:D(i.delay,0)},...i.stagger!==void 0&&{stagger:D(i.stagger,0)},...i.duration!==void 0&&{duration:D(i.duration,.5)}}));return r.animators=i.replace===!1?[...r.animators??[],...a]:[...(r.animators??[]).filter(s=>s.mode==="out"!=(a[0].mode==="out")),...a],{created:[],note:`Applied ${e} to ${r.id}`}}};J["kinetic.sequence"]={kind:"kinetic",description:"Classic kinetic typography: phrases appear one after another in the same spot, each with its own entrance, emphasis words bigger and coloured.",params:'{phrases: string[], start?: s, each?: s (default by length), position?: [x,y], size?: px, color?, accent?: color, emphasis?: string[] (words to highlight), style?: "slam"|"popIn"|"fadeUp"|"blurIn"|"cascade", font?, maxWidth?, holdLast?: boolean (default true: last phrase stays to the end of the comp)}',apply:(e,t,n)=>{let o=pe(e,t),i=n.phrases??[],r=n.position??[o.width/2,o.height/2],a=D(n.size,Math.round(o.width/9)),s=R(n.style,"slam"),c=new Set((n.emphasis??[]).map(h=>h.toLowerCase())),u=D(n.start,0),p=[],m=n.holdLast!==!1;return i.forEach((h,d)=>{let f=h.split(/\s+/).length,g=D(n.each,Math.max(.7,.35+f*.32)),v=m&&d===i.length-1,y=v?Math.max(o.duration,u+g):u+g,k=h.split(/\s+/).some(b=>c.has(b.toLowerCase())),L=ie(e,o.id,{type:"text",name:`kinetic-${d+1}`,text:h,inPoint:Ee(u),outPoint:Ee(y),size:k?Math.round(a*1.35):a,weight:800,font:n.font,color:k?R(n.accent,"#FFC93C"):R(n.color,"#ffffff"),maxWidth:D(n.maxWidth,o.width*.86),transform:{position:r,scale:G([u,[100,100]],[y,[100+8*((y-u)/g),100+8*((y-u)/g)]])},animators:[..._e[s in _e?s:"slam"].animators,...v?[]:[{unit:"word",mode:"out",stagger:.03,duration:.18,ease:"easeIn",from:{opacity:0,scale:80}}]]});p.push(L.id),u=Ee(u+g)}),{created:p,note:`Sequence ends at ${u.toFixed(2)}s`}}};J["opener.logoReveal"]={kind:"opener",description:"Brand opener: a ring draws on and bursts, the title tracks in, an accent line draws, and a tagline reveals from a mask.",params:"{title: string, tagline?: string, start?: s, color?: brand colour, accent?: colour, textColor?, position?: [x,y], size?: px, font?}",apply:(e,t,n)=>{let o=pe(e,t),i=D(n.start,0),[r,a]=n.position??[o.width/2,o.height/2],s=R(n.color,"#E8692A"),c=R(n.accent,"#FFC93C"),u=D(n.size,Math.round(o.width/7.5)),p=Math.min(o.width,o.height)*.42,m=[],h=d=>m.push(ie(e,o.id,d).id);return h({type:"shape",name:"reveal-ring",shape:"ellipse",size:[p,p],stroke:s,strokeWidth:10,inPoint:i,outPoint:i+1.6,motionBlur:{samples:8},transform:{position:[r,a],rotation:G([i,-120,"expoOut"],[i+1,0]),scale:G([i+.7,[100,100],"expoOut"],[i+1.4,[260,260]]),opacity:G([i+.9,100],[i+1.4,0])},trim:{end:G([i,0,"expoOut"],[i+.8,100])}}),h({type:"shape",name:"reveal-burst",shape:"ellipse",size:[p*.9,p*.9],fill:s,inPoint:i+.7,outPoint:i+1.5,transform:{position:[r,a],scale:G([i+.7,[0,0],"expoOut"],[i+1.2,[220,220]]),opacity:G([i+.9,90],[i+1.5,0])}}),h({type:"text",name:"opener-title",text:R(n.title,"TITLE"),size:u,weight:800,color:R(n.textColor,"#ffffff"),font:n.font,inPoint:i+.8,maxWidth:o.width*.88,transform:{position:[r,a]},animators:[{unit:"grapheme",stagger:.025,duration:1.1,ease:"expoOut",from:{opacity:0,tracking:40,blur:10}}],effects:[{type:"dropShadow",blur:30,distance:0,opacity:50}]}),h({type:"shape",name:"opener-line",shape:"line",points:[[-o.width*.3,0],[o.width*.3,0]],stroke:c,strokeWidth:8,inPoint:i+1.2,transform:{position:[r,a+u*.85]},trim:{start:G([i+1.2,50,"expoOut"],[i+1.9,0]),end:G([i+1.2,50,"expoOut"],[i+1.9,100])}}),n.tagline&&h({type:"text",name:"opener-tagline",text:R(n.tagline,""),size:Math.round(u*.42),weight:600,color:c,font:n.font,inPoint:i+1.5,transform:{position:[r,a+u*1.4]},animators:[{unit:"line",clip:!0,stagger:.1,duration:.8,ease:"expoOut",from:{y:u*.6}}]}),{created:m,note:`Opener settles at ${(i+2.3).toFixed(1)}s`}}};J["opener.bars"]={kind:"opener",description:"Coloured bars sweep across the frame in a stagger, uncovering a title that slams in.",params:'{title: string, start?: s, colors?: string[], textColor?, size?: px, font?, direction?: "left"|"right"}',apply:(e,t,n)=>{let o=pe(e,t),i=D(n.start,0),r=n.colors??["#E8692A","#FFC93C","#F6EEDF","#1A1512"],a=n.direction==="right"?-1:1,s=o.height/r.length,c=[];return r.forEach((u,p)=>{let m=i+p*.08;c.push(ie(e,o.id,{type:"solid",name:`bar-${p+1}`,color:u,size:[o.width,s+2],inPoint:i,outPoint:i+1.6,transform:{anchor:[0,0],position:G([m,[-o.width*a,p*s],"expoInOut"],[m+.6,[0,p*s],"expoInOut"],[m+.85,[0,p*s],"expoInOut"],[m+1.4,[o.width*a,p*s]])}}).id)}),c.unshift(ie(e,o.id,{type:"text",name:"bars-title",text:R(n.title,"TITLE"),size:D(n.size,Math.round(o.width/8)),weight:800,color:R(n.textColor,"#ffffff"),font:n.font,inPoint:i+.9,maxWidth:o.width*.88,animators:_e.slam.animators},0).id),{created:c}}};J["slides.slideshow"]={kind:"slides",description:"Slider/slideshow from images and clips: each slide gets a slow Ken Burns move, an optional caption, and a transition into the next.",params:'{items: [{src, type?: "image"|"video", caption?, trimIn?, speed?}], start?: s, each?: s, transition?: type or list of types cycled per cut ("push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp"), transitionDuration?: s, captionStyle?: text preset name, captionColor?, captionY?: px, plate?: colour, fitComp?: boolean (default true: comp duration = slideshow end)}',apply:(e,t,n)=>{let o=pe(e,t),i=n.items??[],r=D(n.each,3),a=D(n.transitionDuration,.5),s=D(n.start,0),c=[],u=[];i.forEach((h,d)=>{let f=s+d*(r-a),g=f+r,v=h.type??(/\.(mp4|mov|webm|m4v)$/i.test(h.src)?"video":"image"),y=d%2===0,k=ie(e,o.id,{type:v,name:`slide-${d+1}`,src:h.src,inPoint:+f.toFixed(3),outPoint:+g.toFixed(3),...v==="video"?{trimIn:h.trimIn??0,speed:h.speed??1}:{},transform:{scale:G([f,y?[104,104]:[118,118]],[g,y?[118,118]:[104,104]])}},o.layers.length);u.push(k.id),c.push(k.id),h.caption&&c.push(ie(e,o.id,{type:"text",name:`caption-${d+1}`,text:h.caption,size:Math.round(o.width/15),weight:800,color:R(n.captionColor,"#ffffff"),inPoint:+(f+a*.6).toFixed(3),outPoint:+(g-a).toFixed(3),maxWidth:o.width*.84,transform:{position:[o.width/2,D(n.captionY,o.height*.78)]},box:n.plate?{color:R(n.plate,"#000000"),padding:[32,16],radius:18,reveal:G([f+a*.6,0,"expoOut"],[f+a*.6+.5,100])}:void 0,shadow:n.plate?void 0:{color:"rgba(0,0,0,0.7)",blur:18,y:4},animators:[..._e[R(n.captionStyle,"fadeUp")]?.animators??_e.fadeUp.animators,..._e.fadeOutDown.animators]},0).id)});let p=Array.isArray(n.transition)?n.transition:[R(n.transition,"push")];for(let h=1;h<u.length;h++)J["transition.between"].apply(e,o.id,{from:u[h-1],to:u[h],type:p[(h-1)%p.length],duration:a});let m=Ee(s+i.length*(r-a)+a);return n.fitComp!==!1&&(o.duration=m),{created:c,note:`Slideshow ends at ${m}s${n.fitComp!==!1?" (comp duration set to match)":""}`}}};J["transition.between"]={kind:"transition",description:"Animates two overlapping layers (clips, images or precomps) so one hands over to the other at the overlap.",params:'{from: layerId (outgoing), to: layerId (incoming, must start before `from` ends), type: "push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp", duration?: s}',apply:(e,t,n)=>{let o=K(e,R(n.from,"")),i=K(e,R(n.to,"")),r=o.comp,a=D(n.duration,.5),s=i.layer.inPoint??0,c=s+a,u=r.width,p=r.height,m=[u/2,p/2],h=R(n.type,"push"),d=(f,...g)=>g.forEach(([v,y,k])=>q(e,f,"transform.position",v,y,k));switch(i.index>o.index&&(r.layers.splice(i.index,1),r.layers.splice(o.index,0,i.layer)),h){case"crossfade":q(e,i.layer.id,"transform.opacity",s,0,"easyEase"),q(e,i.layer.id,"transform.opacity",c,100);break;case"zoom":q(e,o.layer.id,"transform.opacity",s,100,"easeIn"),q(e,o.layer.id,"transform.opacity",c,0),ee(e,o.layer.id,{effects:[...o.layer.effects??[],{type:"blur",radius:G([s,0,"easeIn"],[c,25])}]}),q(e,i.layer.id,"transform.opacity",s,0,"easeOut"),q(e,i.layer.id,"transform.opacity",c,100);break;case"wipe":ee(e,i.layer.id,{masks:[{shape:"rect",rect:G([s,[0,0,0,p],"expoInOut"],[c,[0,0,u*1.2,p]])}]});break;case"slideUp":d(o.layer.id,[s,m,"expoInOut"],[c,[u/2,-p/2]]),d(i.layer.id,[s,[u/2,p*1.5],"expoInOut"],[c,m]);break;case"whip":d(o.layer.id,[s,m,"expoIn"],[c,[-u/2,p/2]]),d(i.layer.id,[s,[u*1.5,p/2],"expoOut"],[c,m]);for(let f of[o.layer.id,i.layer.id])ee(e,f,{motionBlur:{samples:12,shutter:360}});break;default:d(o.layer.id,[s,m,"expoInOut"],[c,[-u/2,p/2]]),d(i.layer.id,[s,[u*1.5,p/2],"expoInOut"],[c,m])}return{created:[],note:`${h} from ${o.layer.id} to ${i.layer.id} at ${s}s\u2013${c}s`}}};J["element.lowerThird"]={kind:"element",description:"Lower third: an accent bar wipes in, then name and title slide out from behind it.",params:"{name: string, title?: string, start?: s, duration?: s, color?, textColor?, y?: px, font?}",apply:(e,t,n)=>{let o=pe(e,t),i=D(n.start,0),r=D(n.duration,4),a=D(n.y,o.height*.72),s=R(n.color,"#E8692A"),c=o.width*.08,u=[],p=ie(e,o.id,{type:"solid",name:"lt-bar",color:s,size:[12,170],inPoint:i,outPoint:i+r,transform:{anchor:[0,0],position:[c,a],scale:G([i,[100,0],"expoOut"],[i+.5,[100,100]],[i+r-.5,[100,100],"expoIn"],[i+r,[100,0]])}});u.push(p.id);let m=(h,d,f,g,v,y)=>u.push(ie(e,o.id,{type:"text",name:y,text:h,size:d,weight:800,align:"left",color:v,font:n.font,inPoint:i+g,outPoint:i+r,transform:{position:[c+34,a+f]},masks:[{shape:"rect",rect:[0,-200,o.width,400]}],animators:[{unit:"line",duration:.7,ease:"expoOut",from:{x:-o.width*.6}},{unit:"line",mode:"out",duration:.5,ease:"expoIn",from:{x:-o.width*.6}}]}).id);return m(R(n.name,"Name"),Math.round(o.width/15),55,.25,R(n.textColor,"#ffffff"),"lt-name"),n.title&&m(R(n.title,""),Math.round(o.width/28),125,.4,s,"lt-title"),{created:u}}};J["element.highlightWord"]={kind:"element",description:"Adds a background plate that wipes in behind an existing text layer (marker highlight).",params:"{layer: textLayerId, color?, at?: s, duration?: s, padding?: [x,y], radius?}",apply:(e,t,n)=>{let{layer:o}=K(e,R(n.layer,""));if(o.type!=="text")throw new Q(`${o.id} is not a text layer`);let i=D(n.at,o.inPoint??0),r=D(n.duration,.45);return o.box={color:R(n.color,"#E8692A"),padding:n.padding??[26,10],radius:D(n.radius,14),reveal:G([i,0,"expoOut"],[i+r,100])},{created:[]}}};var ue=window.DTLY;var lo=(e,t,n,o)=>{let i=3*e,r=3*(n-e)-i,a=1-i-r,s=3*t,c=3*(o-t)-s,u=1-s-c,p=d=>((a*d+r)*d+i)*d,m=d=>((u*d+c)*d+s)*d,h=d=>(3*a*d+2*r)*d+i;return d=>{let f=d;for(let y=0;y<8;y++){let k=p(f)-d;if(Math.abs(k)<1e-6)return m(f);let L=h(f);if(Math.abs(L)<1e-6)break;f-=k/L}let g=0,v=1;f=d;for(let y=0;y<40;y++){let k=p(f);if(Math.abs(k-d)<1e-6)break;k<d?g=f:v=f,f=(g+v)/2}return m(f)}},vn={easeIn:[.42,0,1,1],easeOut:[0,0,.58,1],easyEase:[.333,0,.667,1],quadOut:[.25,.46,.45,.94],cubicOut:[.215,.61,.355,1],expoIn:[.95,.05,.795,.035],expoOut:[.19,1,.22,1],expoInOut:[1,0,0,1],backOut:[.175,.885,.32,1.275],backIn:[.6,-.28,.735,.045]},_n=new Map,co=e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI/3))+1,po=e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,uo=(e,{stiffness:t=170,damping:n=18,mass:o=1}={})=>{let i=Math.sqrt(t/o),r=n/(2*Math.sqrt(t*o));if(r<1){let a=i*Math.sqrt(1-r*r);return 1-Math.exp(-r*i*e)*(Math.cos(a*e)+r*i/a*Math.sin(a*e))}return 1-Math.exp(-i*e)*(1+i*e)},Ce=(e,t,n=1)=>{if(!e||e==="linear")return t;if(e==="hold")return t>=1?1:0;if(e==="elasticOut")return co(t);if(e==="bounceOut")return po(t);if(typeof e=="object"&&!Array.isArray(e))return t>=1?1:uo(t*n,e.spring);let o=Array.isArray(e)?e:vn[e];if(!o)return t;let i=o.join(","),r=_n.get(i);return r||_n.set(i,r=lo(...o)),r(t)},wn=["linear","hold",...Object.keys(vn),"elasticOut","bounceOut"];var mo={white:"#ffffff",black:"#000000",red:"#ff0000",green:"#008000",blue:"#0000ff",yellow:"#ffff00",orange:"#ffa500",transparent:"#00000000",gray:"#808080",grey:"#808080"},ve=e=>{let t=(mo[e.trim().toLowerCase()]??e).trim();if(t.startsWith("#")){let o=t.slice(1);if((o.length===3||o.length===4)&&(o=[...o].map(r=>r+r).join("")),o.length!==6&&o.length!==8)return null;let i=r=>parseInt(o.slice(r,r+2),16);return[i(0),i(2),i(4),o.length===8?i(6)/255:1]}let n=t.match(/^rgba?\(([^)]+)\)$/i);if(n){let o=n[1].split(/[\s,\/]+/).filter(Boolean).map(Number);return[o[0],o[1],o[2],o[3]??1]}return null},$e=([e,t,n,o])=>`rgba(${Math.round(e)},${Math.round(t)},${Math.round(n)},${Math.max(0,Math.min(1,o)).toFixed(4)})`;var rt=(e,t,n)=>e+(t-e)*n,fo=(e,t,n)=>{if(typeof e=="number"&&typeof t=="number")return rt(e,t,n);if(Array.isArray(e)&&Array.isArray(t))return e.map((o,i)=>rt(o,t[i]??o,n));if(typeof e=="string"&&typeof t=="string"){let o=ve(e),i=ve(t);if(o&&i)return $e(o.map((r,a)=>rt(r,i[a],n)))}return n<1?e:t},xn=e=>{let t=Math.sin(e*127.1+311.7)*43758.5453;return t-Math.floor(t)},ho=(e,t)=>{let n=Math.floor(e),o=e-n,i=o*o*(3-2*o);return rt(xn(n+t*1e3)*2-1,xn(n+1+t*1e3)*2-1,i)},go=(e,t,n)=>{let o=i=>ho(t*n.freq,(n.seed??1)+i*17.3)*n.amp;return typeof e=="number"?e+o(0):Array.isArray(e)?e.map((i,r)=>i+o(r)):e},bo=(e,t)=>{if(e.length===0)throw new Error("empty keyframes");if(t<=e[0].t)return e[0].v;let n=e[e.length-1];if(t>=n.t)return n.v;let o=0;for(;o<e.length-2&&t>=e[o+1].t;)o++;let i=e[o],r=e[o+1],a=r.t-i.t,s=Ce(i.ease,a<=0?1:(t-i.t)/a,a);return fo(i.v,r.v,s)};function E(e,t,n){if(e==null)return n;if(!te(e))return e;let o=[...e.keyframes].sort((r,a)=>r.t-a.t),i=bo(o,t);return e.wiggle?go(i,t,e.wiggle):i}var it=e=>`/api/media?src=${encodeURIComponent(e)}&token=${ue.token}`,kn=(e,t,n=2e3)=>new Promise(o=>{let i=()=>{clearTimeout(r),e.removeEventListener(t,i),o()},r=setTimeout(i,n);e.addEventListener(t,i,{once:!0})}),at=class{defaultFont="Baloo 2";playing=!1;images=new Map;videos=new Map;frameNo=0;createCanvas(t,n){let o=document.createElement("canvas");return o.width=t,o.height=n,o}image(t){return this.images.has(t)||this.images.set(t,new Promise((n,o)=>{let i=new Image;i.onload=()=>n(i),i.onerror=()=>o(new Error(`Could not load ${t}`)),i.src=it(t)})),this.images.get(t)}async videoFrame(t,n,o,i,r){let a=`${t.id}|${t.src}`,s=this.videos.get(a);if(!s){let g=document.createElement("video");g.muted=!0,g.playsInline=!0,g.preload="auto",g.crossOrigin="anonymous",g.src=it(t.src),s={el:g,canvas:document.createElement("canvas"),used:0},this.videos.set(a,s),await kn(g,"loadeddata",5e3)}s.used=this.frameNo;let c=s.el,u=Math.max(0,Math.min(n,(c.duration||1/0)-.001));this.playing?(c.playbackRate=t.speed??1,Math.abs(c.currentTime-u)>.25&&(c.currentTime=u),c.paused&&c.play().catch(()=>{})):(c.paused||c.pause(),Math.abs(c.currentTime-u)>.5/r&&(c.currentTime=u,await kn(c,"seeked")));let p=s.canvas;(p.width!==o||p.height!==i)&&(p.width=o,p.height=i);let m=p.getContext("2d");m.clearRect(0,0,o,i);let h=c.videoWidth||o,d=c.videoHeight||i,f=t.fit??"cover";if(f==="fill")m.drawImage(c,0,0,o,i);else{let g=f==="cover"?Math.max(o/h,i/d):Math.min(o/h,i/d);m.drawImage(c,(o-h*g)/2,(i-d*g)/2,h*g,d*g)}return p}endFrame(){for(let t of this.videos.values())t.used!==this.frameNo&&!t.el.paused&&t.el.pause();this.frameNo++}stopAll(){for(let t of this.videos.values())t.el.pause()}},st=class{els=new Map;sync(t,n,o,i){let r=new Set;for(let a of n.layers){if(a.type!=="audio"&&!(a.type==="video"&&a.volume))continue;let s=a,c=`${s.id}|${s.src}`,u=this.els.get(c);u||(u=new Audio(it(s.src)),u.preload="auto",this.els.set(c,u)),r.add(c);let p=s.inPoint??0,m=s.outPoint??n.duration;if(!(i&&o>=p&&o<m)){u.paused||u.pause();continue}let d=s.type==="video"?s.speed??1:1,f=(s.trimIn??0)+(o-p)*d,g=Math.max(0,Math.min(1,E(s.volume,o,1)));s.type==="audio"&&(s.fadeIn&&o-p<s.fadeIn&&(g*=(o-p)/s.fadeIn),s.fadeOut&&m-o<s.fadeOut&&(g*=(m-o)/s.fadeOut)),u.volume=g,u.playbackRate=d,Math.abs(u.currentTime-f)>.2&&(u.currentTime=f),u.paused&&u.play().catch(()=>{})}for(let[a,s]of this.els)!r.has(a)&&!s.paused&&s.pause()}stop(){for(let t of this.els.values())t.pause()}},Cn=async e=>{let t=[new FontFace("Baloo 2","url(/fonts/Baloo2.ttf)",{weight:"400 800"}),new FontFace("Mukta","url(/fonts/Mukta-Bold.ttf)",{weight:"400 800"})];for(let[n,o]of Object.entries(e.fonts??{}))for(let i of o)t.push(new FontFace(n,`url(${it(i)})`));await Promise.all(t.map(async n=>{try{document.fonts.add(await n.load())}catch{}}))};var yo=0;function l(e,t,n,o,i,r){t||(t={});var a,s,c=t;if("ref"in c&&typeof e!="function")for(s in c={},t)s=="ref"?a=t[s]:c[s]=t[s];var u={type:e,props:c,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--yo,__i:-1,__u:0};return(i||r)&&(u.__source=i,u.__self=r),O.vnode&&O.vnode(u),u}var Pn=e=>Number.isInteger(e)?String(e):e.toFixed(Math.abs(e)<10?2:1),Te=({value:e,onChange:t,onDragStart:n,onDragEnd:o,step:i=1,min:r,max:a,title:s})=>{let[c,u]=Y(null),p=re(null),m=h=>Math.min(a??1/0,Math.max(r??-1/0,h));return c!==null?l("input",{class:"num editing",value:c,autoFocus:!0,title:s,onInput:h=>u(h.target.value),onBlur:()=>{let h=Number(c);Number.isFinite(h)&&t(m(h),!1),u(null)},onKeyDown:h=>{h.key==="Enter"&&h.target.blur(),h.key==="Escape"&&u(null),h.stopPropagation()}}):l("span",{class:"num",title:s??"Drag to scrub, click to type",onPointerDown:h=>{h.target.setPointerCapture(h.pointerId),p.current={x:h.clientX,v:e,moved:!1}},onPointerMove:h=>{let d=p.current;if(!d)return;let f=h.clientX-d.x;!d.moved&&Math.abs(f)>2&&(d.moved=!0,n?.()),d.moved&&t(m(+(d.v+f*i*(h.shiftKey?10:h.altKey?.1:1)).toFixed(4)),!0)},onPointerUp:()=>{let h=p.current;p.current=null,h?.moved?o?.():u(Pn(e))},children:Pn(e)})},De=({value:e,onChange:t,onDragStart:n,onDragEnd:o,step:i=1,labels:r=["x","y"]})=>l("span",{class:"vec",children:e.map((a,s)=>l("span",{class:"vec-item",children:[l("label",{children:r[s]}),l(Te,{value:a,step:i,onDragStart:n,onDragEnd:o,onChange:(c,u)=>t(e.map((p,m)=>m===s?c:p),u)})]},s))}),_o=e=>{if(/^#[0-9a-f]{6}$/i.test(e))return e;if(/^#[0-9a-f]{3}$/i.test(e))return`#${[...e.slice(1)].map(n=>n+n).join("")}`;let t=e.match(/rgba?\(([^)]+)\)/);return t?`#${t[1].split(",").slice(0,3).map(n=>Math.round(Number(n)).toString(16).padStart(2,"0")).join("")}`:"#ffffff"},$t=({value:e,onChange:t})=>l("span",{class:"color",children:[l("input",{type:"color",value:_o(e),onInput:n=>t(n.target.value)}),l("input",{class:"text",value:e,onChange:n=>t(n.target.value),onKeyDown:n=>n.stopPropagation()})]}),je=({value:e,onChange:t,multiline:n})=>n?l("textarea",{class:"text",value:e,rows:3,onChange:o=>t(o.target.value),onKeyDown:o=>o.stopPropagation()}):l("input",{class:"text",value:e,onChange:o=>t(o.target.value),onKeyDown:o=>o.stopPropagation()}),se=({value:e,options:t,onChange:n})=>l("select",{value:e,onChange:o=>n(o.target.value),children:t.map(o=>l("option",{value:o,children:o},o))});var F={project:null,rev:0,comp:"main",time:0,playing:!1,loop:!0,layer:null,key:null,expanded:{},zoom:120,status:"loading",message:"",warnings:[],render:{active:!1}},Tt=new Set,I=()=>F,S=e=>{F={...F,...e},Tt.forEach(t=>t())},A=e=>{let[,t]=Y(0);return ae(()=>{let n=()=>t(o=>o+1);return Tt.add(n),()=>{Tt.delete(n)}},[]),e(F)},jt=(e,t={})=>fetch(e,{...t,headers:{"Content-Type":"application/json","X-DTLY-Token":ue.token,...t.headers??{}}}),Me=[],Ve=[],vo=200,Mn,lt=()=>{S({status:"saving"}),clearTimeout(Mn),Mn=window.setTimeout(wo,250)},wo=async()=>{if(F.project)try{let e=await jt("/api/project",{method:"PUT",body:JSON.stringify({project:F.project})});if(!e.ok)throw new Error(await e.text());let{rev:t,warnings:n}=await e.json();S({rev:t,warnings:n,status:"saved",message:""})}catch(e){S({status:"error",message:`Save failed: ${e.message}`})}},z=e=>{if(!F.project)return;let t=JSON.stringify(F.project),n=JSON.parse(t);try{e(n)}catch(o){S({message:o.message});return}Me.push(t),Me.length>vo&&Me.shift(),Ve.length=0,S({project:n,message:""}),lt()},Pe=null,le=()=>{Pe=F.project?JSON.stringify(F.project):null},me=e=>{if(!Pe)return;let t=JSON.parse(Pe);try{e(t)}catch{return}S({project:t})},ce=()=>{Pe&&JSON.stringify(F.project)!==Pe&&(Me.push(Pe),Ve.length=0,lt()),Pe=null},At=()=>{let e=Me.pop();!e||!F.project||(Ve.push(JSON.stringify(F.project)),S({project:JSON.parse(e)}),lt())},ct=()=>{let e=Ve.pop();!e||!F.project||(Me.push(JSON.stringify(F.project)),S({project:JSON.parse(e)}),lt())},It=async(e=!1)=>{let t=await jt("/api/project"),{rev:n,project:o}=await t.json();e&&F.project&&(Me.push(JSON.stringify(F.project)),Ve.length=0);let i=o.comps.some(a=>a.id===F.comp)?F.comp:o.root,r=F.layer&&o.comps.some(a=>a.layers.some(s=>s.id===F.layer))?F.layer:null;S({project:o,rev:n,comp:i,layer:r,key:r?F.key:null,status:e?"reloaded":"saved",message:e?"Reloaded: the file changed on disk":""})},Sn=()=>{let e=new EventSource(`/api/events?token=${ue.token}`);e.addEventListener("project",t=>{let{rev:n}=JSON.parse(t.data);n>F.rev&&It(!0)}),e.addEventListener("render",t=>{let n=JSON.parse(t.data);n.error?S({render:{active:!1,error:n.error}}):n.finished?S({render:{active:!1,out:n.out},message:`Rendered ${n.out} in ${n.took?.toFixed(1)}s`}):S({render:{active:!0,done:n.done,total:n.total}})})},Ln=async()=>{S({render:{active:!0,done:0}});let e=await jt("/api/render",{method:"POST",body:JSON.stringify({comp:F.comp})});e.ok||S({render:{active:!1,error:await e.text()}})},Z=()=>F.project?.comps.find(e=>e.id===F.comp)??F.project?.comps[0],En=()=>Z()?.layers.find(e=>e.id===F.layer),Ot=e=>{let t=[],n=(o,i)=>{if(Array.isArray(o))o.forEach((r,a)=>typeof r=="object"&&r!==null&&n(r,`${i}.${a}`));else if(typeof o=="object"&&o!==null)if(te(o))t.push({path:i,keyframes:o.keyframes});else for(let[r,a]of Object.entries(o))r!=="animators"&&n(a,i?`${i}.${r}`:r)};return n(e,""),t},He=(e,t)=>t.split(".").reduce((n,o)=>n?.[o],e),H=(e,t)=>Math.round(Math.round(e*t)/t*1e3)/1e3;var W=({layer:e,path:t,label:n,kind:o,fallback:i,step:r=1,min:a,max:s})=>{let c=A(w=>w.time),u=Z(),p=He(e,t),m=te(p),h=E(p,c,i),d=H(c,u.fps),f=(w,$)=>m?q(w,e.id,t,d,$):Ne(w,e.id,t,$),g=(w,$)=>$?me(_=>f(_,w)):z(_=>f(_,w)),v=m?p.keyframes.map(w=>w.t):[],y=v.some(w=>Math.abs(w-d)<.001),k=[...v].reverse().find(w=>w<d-.001),L=v.find(w=>w>d+.001),b=()=>z(w=>m?Ne(w,e.id,t,h):q(w,e.id,t,d,h)),M=()=>z(w=>y?Re(w,e.id,t,d):q(w,e.id,t,d,h));return l("div",{class:"prop",children:[l("button",{class:`watch ${m?"on":""}`,title:m?"Stop animating (keep current value)":"Animate: add a keyframe at the playhead",onClick:b,children:"\u23F1"}),l("label",{children:n}),l("span",{class:"prop-value",children:[o==="num"&&l(Te,{value:Number(h??0),step:r,min:a,max:s,onChange:g,onDragStart:le,onDragEnd:ce}),o==="vec"&&l(De,{value:h??[0,0],step:r,onChange:g,onDragStart:le,onDragEnd:ce}),o==="color"&&l($t,{value:String(h??"#ffffff"),onChange:w=>g(w,!1)})]}),m&&l("span",{class:"keynav",children:[l("button",{disabled:k===void 0,onClick:()=>S({time:k}),children:"\u25C0"}),l("button",{class:y?"on":"",title:y?"Remove keyframe here":"Add keyframe here",onClick:M,children:"\u25C6"}),l("button",{disabled:L===void 0,onClick:()=>S({time:L}),children:"\u25B6"})]})]})},N=({label:e,children:t})=>l("div",{class:"prop",children:[l("span",{class:"watch-space"}),l("label",{children:e}),l("span",{class:"prop-value",children:t})]}),U=(e,t)=>z(n=>ee(n,e.id,t)),de=(e,t,n,o,i,r=1)=>l(N,{label:t,children:l(Te,{value:o??i,step:r,onChange:(a,s)=>s?me(c=>ee(c,e.id,{[n]:a})):U(e,{[n]:a}),onDragStart:le,onDragEnd:ce})}),ne=({title:e,children:t,open:n=!0})=>l("details",{class:"section",open:n,children:[l("summary",{children:e}),t]}),Se=({value:e,onApply:t,rows:n=8})=>{let o=JSON.stringify(e,null,2),[i,r]=Y(o),[a,s]=Y("");return ae(()=>{r(o),s("")},[o]),l("div",{class:"json",children:[l("textarea",{rows:n,value:i,spellcheck:!1,onInput:c=>r(c.target.value),onKeyDown:c=>c.stopPropagation()}),l("div",{class:"row",children:[a&&l("span",{class:"error",children:a}),l("button",{disabled:i===o,onClick:()=>{try{t(JSON.parse(i)),s("")}catch(c){s(c.message)}},children:"Apply"})]})]})},xo=()=>{let e=A(a=>a.key),t=A(a=>a.project);if(!e||!t)return null;let n;try{let{layer:a}=K(t,e.layer);n=He(a,e.path)?.keyframes?.find(s=>Math.abs(s.t-e.t)<.001)}catch{}if(!n)return null;let o=n.ease??"linear",i=typeof o=="string"?o:Array.isArray(o)?"bezier":"spring",r=a=>z(s=>Et(s,e.layer,e.path,e.t,a));return l(ne,{title:`Keyframe \xB7 ${e.path} @ ${e.t}s`,children:[l(N,{label:"Ease out",children:l(se,{value:i,options:[...wn,"bezier","spring"],onChange:a=>r(a==="bezier"?[.25,.1,.25,1]:a==="spring"?{spring:{stiffness:170,damping:18}}:a)})}),Array.isArray(o)&&l(N,{label:"Bezier",children:l(De,{value:o,step:.01,labels:["x1","y1","x2","y2"],onChange:(a,s)=>s?me(c=>Et(c,e.layer,e.path,e.t,a)):r(a),onDragStart:le,onDragEnd:ce})}),i==="spring"&&typeof o=="object"&&!Array.isArray(o)&&l(N,{label:"Spring",children:l(De,{value:[o.spring.stiffness??170,o.spring.damping??18],labels:["stiff","damp"],onChange:a=>r({spring:{stiffness:a[0],damping:a[1]}})})}),l(ko,{ease:o}),l(N,{label:"Value",children:l(Se,{value:n.v,rows:2,onApply:a=>z(s=>q(s,e.layer,e.path,e.t,a))})}),l("div",{class:"row",children:l("button",{onClick:()=>{z(a=>Re(a,e.layer,e.path,e.t)),S({key:null})},children:"Delete keyframe"})})]})},ko=({ease:e})=>{let t=[];for(let n=0;n<=40;n++){let o=n/40,i=Ce(e,o);t.push(`${(o*180+10).toFixed(1)},${(110-i*90).toFixed(1)}`)}return l("svg",{class:"ease-graph",viewBox:"0 0 200 130",children:[l("line",{x1:"10",y1:"110",x2:"190",y2:"110"}),l("line",{x1:"10",y1:"20",x2:"190",y2:"20",class:"guide"}),l("polyline",{points:t.join(" ")})]})},Co=(e,t)=>{if(e.type==="solid"||e.type==="image"||e.type==="video")return[(e.size?.[0]??t.width)/2,(e.size?.[1]??t.height)/2];if(e.type==="precomp"){let n=I().project?.comps.find(o=>o.id===e.comp);return[(n?.width??t.width)/2,(n?.height??t.height)/2]}return[0,0]},Po=({layer:e,comp:t})=>{let n=t.layers.filter(r=>r.id!==e.id),o=t.layers.indexOf(e),i=["Baloo 2","Mukta",...Object.keys(I().project?.fonts??{})];return l(ye,{children:[l(ne,{title:`${e.type} \xB7 ${e.id}`,children:[l(N,{label:"Name",children:l(je,{value:e.name??"",onChange:r=>U(e,{name:r||null})})}),de(e,"In","inPoint",e.inPoint,0,1/t.fps),de(e,"Out","outPoint",e.outPoint,t.duration,1/t.fps),l(N,{label:"Parent",children:l(se,{value:e.parent??"(none)",options:["(none)",...n.map(r=>r.id)],onChange:r=>U(e,{parent:r==="(none)"?null:r})})}),l(N,{label:"Blend",children:l(se,{value:e.blendMode??"normal",options:["normal","multiply","screen","overlay","add","darken","lighten","softLight","difference"],onChange:r=>U(e,{blendMode:r==="normal"?null:r})})}),l(N,{label:"Motion blur",children:l("input",{type:"checkbox",checked:!!e.motionBlur,onChange:r=>U(e,{motionBlur:r.target.checked?{samples:8}:null})})}),l("div",{class:"row",children:[l("button",{disabled:o<=0,onClick:()=>z(r=>St(r,e.id,o-1)),children:"Up"}),l("button",{disabled:o>=t.layers.length-1,onClick:()=>z(r=>St(r,e.id,o+1)),children:"Down"}),l("button",{onClick:()=>z(r=>{let a=nt(r,e.id);S({layer:a.id})}),children:"Duplicate"}),l("button",{class:"danger",onClick:()=>{z(r=>tt(r,e.id)),S({layer:null,key:null})},children:"Delete"})]})]}),e.type!=="audio"&&l(ne,{title:"Transform",children:[l(W,{layer:e,path:"transform.position",label:"Position",kind:"vec",fallback:[t.width/2,t.height/2]}),l(W,{layer:e,path:"transform.scale",label:"Scale %",kind:"vec",fallback:[100,100]}),l(W,{layer:e,path:"transform.rotation",label:"Rotation \xB0",kind:"num",fallback:0}),l(W,{layer:e,path:"transform.opacity",label:"Opacity %",kind:"num",fallback:100,min:0,max:100}),l(W,{layer:e,path:"transform.anchor",label:"Anchor",kind:"vec",fallback:Co(e,t)}),l(W,{layer:e,path:"transform.skew",label:"Skew \xB0",kind:"num",fallback:0})]}),e.type==="text"&&l(ne,{title:"Text",children:[l(N,{label:"Text",children:l(je,{multiline:!0,value:e.text,onChange:r=>U(e,{text:r})})}),l(W,{layer:e,path:"size",label:"Size",kind:"num",fallback:72,min:1}),l(W,{layer:e,path:"color",label:"Color",kind:"color",fallback:"#ffffff"}),l(W,{layer:e,path:"tracking",label:"Tracking",kind:"num",fallback:0}),l(N,{label:"Font",children:l(se,{value:e.font??"Baloo 2",options:i,onChange:r=>U(e,{font:r})})}),l(N,{label:"Weight",children:l(se,{value:String(e.weight??700),options:["400","500","600","700","800"],onChange:r=>U(e,{weight:Number(r)})})}),l(N,{label:"Align",children:l(se,{value:e.align??"center",options:["left","center","right"],onChange:r=>U(e,{align:r})})}),de(e,"Max width","maxWidth",e.maxWidth,0,5),de(e,"Line height","lineHeight",e.lineHeight,1.25,.01),l(N,{label:"Animators",children:l(Se,{value:e.animators??[],rows:6,onApply:r=>U(e,{animators:r})})}),l("div",{class:"presets",children:Object.entries(J).filter(([,r])=>r.kind==="text").map(([r])=>l("button",{title:J[r].description,onClick:()=>z(a=>J[r].apply(a,t.id,{layer:e.id})),children:r.slice(5)},r))})]}),e.type==="shape"&&l(ne,{title:"Shape",children:[l(N,{label:"Shape",children:l(se,{value:e.shape,options:["rect","ellipse","polygon","path","line"],onChange:r=>U(e,{shape:r})})}),(e.shape==="rect"||e.shape==="ellipse")&&l(W,{layer:e,path:"size",label:"Size",kind:"vec",fallback:[200,200]}),(e.shape==="rect"||e.shape==="polygon")&&l(W,{layer:e,path:"radius",label:"Radius",kind:"num",fallback:e.shape==="rect"?0:100}),(typeof e.fill=="string"||te(e.fill)||e.fill===void 0)&&l(W,{layer:e,path:"fill",label:"Fill",kind:"color",fallback:"#ffffff"}),l(W,{layer:e,path:"stroke",label:"Stroke",kind:"color",fallback:"#ffffff"}),l(W,{layer:e,path:"strokeWidth",label:"Stroke width",kind:"num",fallback:4,min:0}),l(W,{layer:e,path:"trim.start",label:"Trim start %",kind:"num",fallback:0,min:0,max:100}),l(W,{layer:e,path:"trim.end",label:"Trim end %",kind:"num",fallback:100,min:0,max:100})]}),e.type==="solid"&&l(ne,{title:"Solid",children:l(W,{layer:e,path:"color",label:"Color",kind:"color",fallback:"#000000"})}),(e.type==="image"||e.type==="video")&&l(ne,{title:e.type==="video"?"Video":"Image",children:[l(N,{label:"Source",children:l(je,{value:e.src,onChange:r=>U(e,{src:r})})}),l(N,{label:"Fit",children:l(se,{value:e.fit??"cover",options:["cover","contain","fill"],onChange:r=>U(e,{fit:r})})}),e.type==="video"&&de(e,"Trim in (s)","trimIn",e.trimIn,0,.05),e.type==="video"&&de(e,"Speed","speed",e.speed,1,.01),e.type==="video"&&l(W,{layer:e,path:"volume",label:"Volume",kind:"num",fallback:0,step:.01,min:0,max:1})]}),e.type==="audio"&&l(ne,{title:"Audio",children:[l(N,{label:"Source",children:l(je,{value:e.src,onChange:r=>U(e,{src:r})})}),de(e,"Trim in (s)","trimIn",e.trimIn,0,.05),l(W,{layer:e,path:"volume",label:"Volume",kind:"num",fallback:1,step:.01,min:0,max:1}),de(e,"Fade in (s)","fadeIn",e.fadeIn,0,.05),de(e,"Fade out (s)","fadeOut",e.fadeOut,0,.05)]}),e.type==="precomp"&&l(ne,{title:"Precomp",children:[l(N,{label:"Comp",children:l(se,{value:e.comp,options:I().project.comps.filter(r=>r.id!==t.id).map(r=>r.id),onChange:r=>U(e,{comp:r})})}),de(e,"Time offset","timeOffset",e.timeOffset,0,.05),l("div",{class:"row",children:l("button",{onClick:()=>S({comp:e.comp,layer:null,key:null,time:0}),children:"Open comp"})})]}),l(ne,{title:"Effects, masks & matte (JSON)",open:!1,children:[l(N,{label:"Effects",children:l(Se,{value:e.effects??[],rows:5,onApply:r=>U(e,{effects:r})})}),l(N,{label:"Masks",children:l(Se,{value:e.masks??[],rows:4,onApply:r=>U(e,{masks:r})})}),l(N,{label:"Matte",children:l(Se,{value:e.matte??null,rows:2,onApply:r=>U(e,{matte:r})})})]}),l(ne,{title:"Layer JSON",open:!1,children:l(Se,{value:e,rows:16,onApply:r=>z(a=>{let s=r;if(s.id!==e.id)throw new Error("The id cannot change here");let c=a.comps.find(u=>u.id===t.id);c.layers[c.layers.findIndex(u=>u.id===e.id)]=s})})})]})},Mo=({comp:e})=>{let t=I().project,n=o=>z(i=>hn(i,e.id,o));return l(ne,{title:`Composition \xB7 ${e.id}`,children:[l(N,{label:"Name",children:l(je,{value:e.name??"",onChange:o=>n({name:o||void 0})})}),l(N,{label:"Size",children:l(De,{value:[e.width,e.height],labels:["w","h"],onChange:o=>n({width:Math.round(o[0]),height:Math.round(o[1])})})}),l(N,{label:"FPS",children:l(Te,{value:e.fps,onChange:o=>n({fps:Math.max(1,Math.round(o))})})}),l(N,{label:"Duration (s)",children:l(Te,{value:e.duration,step:.1,min:.1,onChange:o=>n({duration:o})})}),l(N,{label:"Background",children:l($t,{value:e.background??"#000000",onChange:o=>n({background:o})})}),l(N,{label:"Markers",children:l(Se,{value:e.markers??[],rows:3,onApply:o=>n({markers:o})})}),t.root!==e.id&&l("div",{class:"row",children:l("button",{onClick:()=>z(o=>{o.root=e.id}),children:"Render this comp"})})]})},$n=()=>{let e=A(r=>r.project),t=A(r=>r.comp),n=A(r=>r.layer),o=e?.comps.find(r=>r.id===t);if(!o)return l("aside",{class:"inspector"});let i=o.layers.find(r=>r.id===n);return l("aside",{class:"inspector",children:[l(xo,{}),i?l(Po,{layer:i,comp:o},i.id):l(Mo,{comp:o})]})};var Ft=230,Tn={text:"#e0a84a",shape:"#5fb3a0",solid:"#9b7fd1",image:"#5b9bd5",video:"#d36c6c",audio:"#7fb35f",precomp:"#c78bc0",null:"#888"},So=e=>e.replace(/^transform\./,"").replace(/\.(\d+)\./g,"[$1]."),Lo=(e,t)=>{let o=[.1,.25,.5,1,2,5,10,30,60].find(r=>r*t>=60)??60,i=[];for(let r=0;r<=e+1e-6;r+=o)i.push(+r.toFixed(3));return{out:i,step:o}},jn=(e,t)=>{let n=()=>{window.removeEventListener("pointermove",e),window.removeEventListener("pointerup",n),t()};window.addEventListener("pointermove",e),window.addEventListener("pointerup",n)},An=e=>e.ease==="hold"?"hold":!e.ease||e.ease==="linear"?"linear":"eased",In=()=>{let e=A(b=>b.project),t=A(b=>b.comp),n=A(b=>b.time),o=A(b=>b.zoom),i=A(b=>b.layer),r=A(b=>b.key),a=A(b=>b.expanded),s=re(null),c=e?.comps.find(b=>b.id===t);if(!c)return l("div",{class:"timeline"});let u=c.duration*o+120,p=c.fps,m=b=>{let M=s.current.getBoundingClientRect();return Math.max(0,Math.min(c.duration,(b-M.left-Ft+s.current.scrollLeft)/o))},h=b=>{let M=I().time;return Math.abs(b-M)*o<6?M:H(b,p)},d=b=>{b.currentTarget.setPointerCapture(b.pointerId),S({time:H(m(b.clientX),p),playing:!1})},f=b=>{(b.buttons&1)!==0&&S({time:H(m(b.clientX),p)})},g=(b,M,w)=>{b.stopPropagation(),S({layer:M.id,key:null});let $=b.clientX,_=M.inPoint??0,x=M.outPoint??c.duration,C=!1;jn(T=>{let j=(T.clientX-$)/o;if(!C){if(Math.abs(T.clientX-$)<3)return;C=!0,le()}me(X=>{if(w==="move"){let oe=h(_+j);ze(X,M.id,oe-_)}else w==="in"?ee(X,M.id,{inPoint:Math.min(x-1/p,Math.max(0,h(_+j)))}):ee(X,M.id,{outPoint:Math.max(_+1/p,h(x+j))})})},()=>{C&&ce()})},v=(b,M,w,$)=>{b.stopPropagation(),S({layer:M.id,key:{layer:M.id,path:w,t:$.t},time:b.altKey?I().time:$.t,playing:!1});let _=b.clientX,x=$.t,C=!1;jn(T=>{if(!C){if(Math.abs(T.clientX-_)<3)return;C=!0,le()}let j=Math.max(0,h(x+(T.clientX-_)/o));me(X=>yn(X,M.id,w,x,j)),S({key:{layer:M.id,path:w,t:j},time:j})},()=>{C&&ce()})},y=(b,M,w)=>{let $=H(m(b.clientX),p),_=He(M,w),x=E(_,$,void 0);z(C=>q(C,M.id,w,$,x)),S({key:{layer:M.id,path:w,t:$},time:$})},{out:k}=Lo(c.duration,o);return l("div",{class:"timeline",children:l("div",{class:"tl-scroll",ref:s,onWheel:b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),S({zoom:Math.min(2e3,Math.max(10,o*(b.deltaY<0?1.15:1/1.15)))}))},children:l("div",{class:"tl-inner",style:{width:`${Ft+u}px`},children:[l("div",{class:"tl-ruler-row",children:[l("div",{class:"tl-label tl-corner",children:[c.name??c.id," \xB7 ",c.fps," fps"]}),l("div",{class:"tl-ruler",style:{width:`${u}px`},onPointerDown:d,onPointerMove:f,children:[k.map(b=>l("div",{class:"tick",style:{left:`${b*o}px`},children:l("span",{children:[b,"s"]})},b)),(c.markers??[]).map(b=>l("div",{class:"marker",style:{left:`${b.t*o}px`},title:b.label},b.t)),l("div",{class:"tl-end",style:{left:`${c.duration*o}px`}})]})]}),c.layers.map((b,M)=>{let w=b.inPoint??0,$=b.outPoint??c.duration,_=Ot(b),x=a[b.id];return l("div",{class:`tl-group ${i===b.id?"selected":""}`,children:[l("div",{class:"tl-row layer-row",children:[l("div",{class:"tl-label",onPointerDown:()=>S({layer:b.id,key:null}),children:[l("button",{class:`twirl ${x?"open":""} ${_.length?"":"empty"}`,onClick:C=>{C.stopPropagation(),S({expanded:{...a,[b.id]:!x}})},children:"\u25B8"}),l("button",{class:`eye ${b.hidden?"off":""}`,title:"Show/hide",onClick:C=>{C.stopPropagation(),z(P=>ee(P,b.id,{hidden:b.hidden?null:!0}))},children:"\u25CF"}),l("span",{class:"idx",children:M+1}),l("span",{class:"chip",style:{background:Tn[b.type]}}),l("span",{class:"name",title:b.id,children:b.name??b.id})]}),l("div",{class:"tl-track",style:{width:`${u}px`},onPointerDown:d,onPointerMove:f,children:[l("div",{class:`bar ${b.hidden?"hidden":""}`,style:{left:`${w*o}px`,width:`${Math.max(2,($-w)*o)}px`,background:Tn[b.type]},onPointerDown:C=>g(C,b,"move"),children:[l("span",{class:"handle in",onPointerDown:C=>g(C,b,"in")}),l("span",{class:"bar-name",children:b.type==="text"?b.text.split(`
2
+ `)[0]:b.name??b.id}),l("span",{class:"handle out",onPointerDown:C=>g(C,b,"out")})]}),!x&&_.flatMap(C=>C.keyframes.map(P=>l("span",{class:"mini-key",style:{left:`${P.t*o}px`}},`${C.path}${P.t}`)))]})]}),x&&_.map(C=>l("div",{class:"tl-row prop-row",children:[l("div",{class:"tl-label prop-label",title:C.path,children:So(C.path)}),l("div",{class:"tl-track",style:{width:`${u}px`},onPointerDown:d,onPointerMove:f,onDblClick:P=>y(P,b,C.path),children:[C.keyframes.map((P,T)=>{let j=C.keyframes[T+1];return j?l("span",{class:`seg ${An(P)}`,style:{left:`${P.t*o}px`,width:`${(j.t-P.t)*o}px`}},`seg${P.t}`):null}),C.keyframes.map((P,T)=>{let j=r&&r.layer===b.id&&r.path===C.path&&Math.abs(r.t-P.t)<.001;return l("span",{class:`key ${An(P)} ${j?"active":""}`,style:{left:`${P.t*o}px`},title:`${P.t}s = ${JSON.stringify(P.v)}${P.ease?` \xB7 ${typeof P.ease=="string"?P.ease:JSON.stringify(P.ease)}`:""}`,onPointerDown:X=>v(X,b,C.path,P)},T)})]})]},C.path))]},b.id)}),l("div",{class:"playhead",style:{left:`${Ft+n*o}px`}})]})})})},On=e=>{let t=I();if(!t.project)return[];let{layer:n}=K(t.project,e);return[...new Set(Ot(n).flatMap(o=>o.keyframes.map(i=>i.t)))].sort((o,i)=>o-i)};var Eo=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Fn=e=>[...Eo.segment(e)].map(t=>t.segment),zt=(e,t,n)=>`${e.weight??700} ${t}px "${e.font??n}"`,dt=new Map,Nt=(e,t,n,o,i)=>{let r=[t.text,i,o,t.maxWidth,t.align,t.lineHeight].join("|"),a=dt.get(r);if(a)return a;e.font=i;let s=e.measureText("|").width,c=y=>/\s$/.test(y)?e.measureText(`${y}|`).width-s:e.measureText(y).width,u=y=>c(y)+o*Math.max(0,Fn(y).length-1),p=(t.lineHeight??1.25)*n,m=[];for(let y of t.text.split(`
3
+ `)){if(!t.maxWidth){m.push(y);continue}let k="";for(let L of y.split(" ")){let b=k?`${k} ${L}`:L;k&&u(b)>t.maxWidth?(m.push(k),k=L):k=b}m.push(k)}let h=t.align??"center",d=-(m.length*p)/2,f={lines:[],graphemes:[],words:[],width:0,height:m.length*p,top:d,size:n},g=0,v=0;return m.forEach((y,k)=>{let L=u(y);f.width=Math.max(f.width,L);let b=h==="left"?0:h==="right"?-L:-L/2,M=d+k*p+p*.5+n*.32;f.lines.push({text:y,x:b,y:M,w:L});let w=Fn(y),$="",_=null,x="",C=P=>{_!==null&&f.words.push({text:x,x:_,y:M,w:P-_,line:k,word:v++,grapheme:g}),_=null,x=""};w.forEach((P,T)=>{let j=b+($?c($):0)+o*T,X=e.measureText(P).width;P===" "?C(j):(_===null&&(_=j),x+=P,f.graphemes.push({text:P,x:j,y:M,w:X,line:k,word:v,grapheme:g++})),$+=P}),C(b+L)}),dt.size>500&&dt.clear(),dt.set(r,f),f},$o=(e,t,n,o=1)=>{switch(n){case"reverse":return t-1-e;case"center":return Math.abs(e-(t-1)/2);case"edges":return(t-1)/2-Math.abs(e-(t-1)/2);case"random":return[...Array(t).keys()].sort((r,a)=>Math.sin(r*91.7+o)-Math.sin(a*91.7+o)).indexOf(e);default:return e}},To=(e,t,n,o,i,r)=>{let a={opacity:1,x:0,y:0,scale:1,rotation:0,blur:0,tracking:0};for(let s of e){let c=n[s.unit],u=t[s.unit],p=s.stagger??.05,m=s.duration??.5,h=s.delay??0,d=$o(u,c,s.order,s.seed),f=s.order==="center"||s.order==="edges"?(c-1)/2:c-1,g;if(s.mode==="out"){let k=i-h-m-(f-d)*p;g=1-Ce(s.ease??"easeIn",Math.min(1,Math.max(0,(o-k)/m)),m)}else{let k=h+d*p;g=Ce(s.ease??"cubicOut",Math.min(1,Math.max(0,(o-k)/m)),m)}let v=1-g,y=s.from;if(y.opacity!==void 0&&(a.opacity*=(y.opacity+(100-y.opacity)*g)/100),y.x&&(a.x+=y.x*v),y.y&&(a.y+=y.y*v),y.scale!==void 0&&(a.scale*=(y.scale+(100-y.scale)*g)/100),y.rotation&&(a.rotation+=y.rotation*v),y.blur&&(a.blur+=y.blur*v),y.tracking&&(a.tracking+=y.tracking*v),y.color){let k=ve(y.color),L=ve(r);k&&L&&(a.color=$e(k.map((b,M)=>b+(L[M]-b)*g)))}}return a},jo=(e,t,n,o,i,r)=>{e.beginPath(),e.roundRect(t,n,o,i,r)},zn=(e,t,n,o,i,r)=>{let a=E(t.size,n,72),s=E(t.tracking,n,0),c=E(t.color,n,"#ffffff"),u=zt(t,a,r),p=Nt(e,t,a,s,u);if(e.font=u,e.textAlign="left",e.textBaseline="alphabetic",t.box){let[w,$]=t.box.padding??[24,12],_=E(t.box.reveal,n,100)/100,x=Math.min(...p.lines.map(T=>T.x))-w,C=p.width+w*2,P=p.height+$*2;_>0&&(e.save(),e.beginPath(),e.rect(x,p.top-$,C*_,P),e.clip(),e.fillStyle=E(t.box.color,n,"#000"),jo(e,x,p.top-$,C,P,t.box.radius??12),e.fill(),e.restore())}t.shadow&&(e.shadowColor=t.shadow.color,e.shadowBlur=t.shadow.blur,e.shadowOffsetX=t.shadow.x??0,e.shadowOffsetY=t.shadow.y??0);let m=(w,$,_,x)=>{t.stroke&&(e.lineJoin="round",e.lineWidth=t.stroke.width,e.strokeStyle=t.stroke.color,e.strokeText(w,$,_)),e.fillStyle=x,e.fillText(w,$,_)},h=t.animators??[];if(h.length===0){for(let w of p.lines)m(w.text,w.x,w.y,c);return}let d=h.some(w=>w.unit==="grapheme")?"grapheme":h.some(w=>w.unit==="word")?"word":"line",f=d==="grapheme"?p.graphemes:d==="word"?p.words:p.lines.map((w,$)=>({...w,line:$,word:0,grapheme:0})),g={grapheme:p.graphemes.length,word:p.words.length,line:p.lines.length},v=n-o,y=i-o,k=h.some(w=>w.clip),L=p.height/p.lines.length,b=new Map;for(let w of f)b.set(w.line,(b.get(w.line)??0)+1);let M=new Map;for(let w of f){let $=M.get(w.line)??0;M.set(w.line,$+1);let _=To(h,{grapheme:w.grapheme,word:w.word,line:w.line},g,v,y,c);if(_.opacity<=.001)continue;e.save(),k&&(e.beginPath(),e.rect(-1e5,p.top+w.line*L,2e5,L),e.clip());let x=_.tracking*($-((b.get(w.line)??1)-1)/2),C=w.x+w.w/2+_.x+x,P=w.y-a*.35+_.y;e.translate(C,P),_.rotation&&e.rotate(_.rotation*Math.PI/180),_.scale!==1&&e.scale(_.scale,_.scale),e.globalAlpha*=_.opacity,_.blur>.1&&(e.filter=`blur(${_.blur.toFixed(2)}px)`),m(w.text,-w.w/2,a*.35,_.color??c),e.restore()}};var Be=(e,t)=>[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]],Nn={normal:"source-over",multiply:"multiply",screen:"screen",overlay:"overlay",add:"lighter",darken:"darken",lighten:"lighten",softLight:"soft-light",difference:"difference"},pt=class{constructor(t,n){this.project=t;this.host=n}project;host;pool=new Map;comp(t){let n=this.project.comps.find(o=>o.id===t);if(!n)throw new Error(`Unknown composition "${t}"`);return n}acquire(t,n){let i=this.pool.get(`${t}x${n}`)?.pop()??this.host.createCanvas(t,n),r=i.getContext("2d");return r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,t,n),i}release(t){let n=`${t.width}x${t.height}`;this.pool.has(n)||this.pool.set(n,[]),this.pool.get(n).push(t)}layerSize(t,n,o){switch(t.type){case"solid":return t.size??[n.width,n.height];case"image":case"video":return t.size??[n.width,n.height];case"precomp":{let i=this.comp(t.comp);return[i.width,i.height]}default:return[0,0]}}matrix(t,n,o,i=0){let r=t.transform??{},a=this.layerSize(t,n,o),s=E(r.anchor,o,[a[0]/2,a[1]/2]),c=E(r.position,o,[n.width/2,n.height/2]),[u,p]=E(r.scale,o,[100,100]),m=E(r.rotation,o,0)*Math.PI/180,h=Math.tan(E(r.skew,o,0)*Math.PI/180),d=Math.cos(m),f=Math.sin(m),g=[1,0,0,1,c[0],c[1]];if(g=Be(g,[d,f,-f,d,0,0]),g=Be(g,[1,0,h,1,0,0]),g=Be(g,[u/100,0,0,p/100,0,0]),g=Be(g,[1,0,0,1,-s[0],-s[1]]),t.parent&&i<20){let v=n.layers.find(y=>y.id===t.parent);v&&(g=Be(this.matrix(v,n,o,i+1),g))}return g}async renderComp(t,n,o,i=!0){i&&n.background&&(t.save(),t.setTransform(1,0,0,1,0,0),t.fillStyle=n.background,t.fillRect(0,0,n.width,n.height),t.restore());let r=new Set(n.layers.map(a=>a.matte?.layer).filter(Boolean));for(let a=n.layers.length-1;a>=0;a--){let s=n.layers[a];s.hidden||s.type==="audio"||s.type==="null"||r.has(s.id)||await this.renderLayer(t,s,n,o)}}isActive(t,n,o){return o>=(t.inPoint??0)&&o<(t.outPoint??n.duration)}async renderLayer(t,n,o,i){if(!this.isActive(n,o,i))return;let r=n.transform??{},a=E(r.opacity,i,100)/100;if(a<=0)return;let s=n.type==="video"?this.host.bakedVideoEffects?.(n):void 0,c=(n.effects??[]).filter(f=>!s?.has(f));if(!n.masks?.length&&!n.matte&&!n.motionBlur&&c.every(f=>Ao.has(f.type))){t.save(),t.globalAlpha*=a,t.globalCompositeOperation=Nn[n.blendMode??"normal"];let f=Rn(c,i);f&&(t.filter=f),this.applyShadow(t,c,i),t.setTransform(...this.matrix(n,o,i)),await this.drawContent(t,n,o,i),t.restore();return}let p=this.acquire(o.width,o.height),m=p.getContext("2d");if(n.motionBlur){let f=Math.max(2,n.motionBlur.samples??8),g=(n.motionBlur.shutter??180)/360/o.fps;for(let v=0;v<f;v++){let y=i-g/2+g*v/(f-1);m.save(),m.globalAlpha=1/(v+1),m.setTransform(...this.matrix(n,o,y)),await this.drawContent(m,n,o,y),m.restore()}}else m.save(),m.setTransform(...this.matrix(n,o,i)),await this.drawContent(m,n,o,i),m.restore();if(n.masks?.length){let f=this.matrix(n,o,i);for(let g of n.masks){if(m.save(),m.setTransform(...f),m.globalCompositeOperation=g.inverted?"destination-out":"destination-in",m.beginPath(),g.shape==="path"&&g.points?.length)g.points.forEach(([v,y],k)=>k?m.lineTo(v,y):m.moveTo(v,y)),m.closePath();else{let[v,y,k,L]=E(g.rect,i,[0,0,0,0]);g.shape==="ellipse"?m.ellipse(v+k/2,y+L/2,Math.abs(k/2),Math.abs(L/2),0,0,Math.PI*2):m.roundRect(v,y,k,L,g.radius??0)}m.fillStyle="#000",m.fill(),m.restore()}}for(let f of c)f.type==="fill"&&(m.save(),m.globalCompositeOperation="source-in",m.globalAlpha=E(f.opacity,i,100)/100,m.fillStyle=f.color,m.fillRect(0,0,o.width,o.height),m.restore());if(n.matte){let f=o.layers.find(g=>g.id===n.matte.layer);if(f){let g=this.acquire(o.width,o.height);await this.renderLayer(g.getContext("2d"),{...f,hidden:!1,matte:void 0},o,i),m.save(),m.globalCompositeOperation=n.matte.mode==="alphaInverted"?"destination-out":"destination-in",m.drawImage(g,0,0),m.restore(),this.release(g)}}t.save(),t.setTransform(1,0,0,1,0,0),t.globalAlpha*=a,t.globalCompositeOperation=Nn[n.blendMode??"normal"];let h=Rn(c,i);h&&(t.filter=h),this.applyShadow(t,c,i);let d=c.find(f=>f.type==="glow");if(d){let f=E(d.strength,i,100)/100;if(t.save(),t.shadowColor="transparent",t.filter=`blur(${E(d.radius,i,24)}px)`,t.globalCompositeOperation="lighter",t.globalAlpha*=f,d.color){let g=this.acquire(o.width,o.height),v=g.getContext("2d");v.drawImage(p,0,0),v.globalCompositeOperation="source-in",v.fillStyle=d.color,v.fillRect(0,0,o.width,o.height),t.drawImage(g,0,0),this.release(g)}else t.drawImage(p,0,0);t.restore()}t.drawImage(p,0,0),t.restore(),this.release(p)}applyShadow(t,n,o){let i=n.find(c=>c.type==="dropShadow");if(!i)return;let r=E(i.distance,o,8),a=(i.angle??135)*Math.PI/180,s=ve(i.color??"#000")??[0,0,0,1];t.shadowColor=$e([s[0],s[1],s[2],s[3]*(E(i.opacity,o,60)/100)]),t.shadowBlur=E(i.blur,o,16),t.shadowOffsetX=Math.sin(a)*r,t.shadowOffsetY=-Math.cos(a)*r}async drawContent(t,n,o,i){let r=n.inPoint??0;switch(n.type){case"solid":{let[a,s]=n.size??[o.width,o.height];t.fillStyle=E(n.color,i,"#000"),t.fillRect(0,0,a,s);return}case"shape":return Oo(t,n,i);case"text":return zn(t,n,i,r,n.outPoint??o.duration,this.project.fonts?Object.keys(this.project.fonts)[0]??this.host.defaultFont:this.host.defaultFont);case"image":{let a=await this.host.image(n.src),[s,c]=n.size??[o.width,o.height];Io(t,a,s,c,n.fit??"cover");return}case"video":{let[a,s]=n.size??[o.width,o.height],c=(n.trimIn??0)+(i-r)*(n.speed??1),u=await this.host.videoFrame(n,c,a,s,o.fps);t.drawImage(u,0,0,a,s);return}case"precomp":{let a=this.comp(n.comp),s=(i-r)*(n.speed??1)+(n.timeOffset??0),c=this.acquire(a.width,a.height);await this.renderComp(c.getContext("2d"),a,s,!0),t.drawImage(c,0,0),this.release(c);return}}}},Ao=new Set(["blur","brightness","saturate","contrast","dropShadow"]),Rn=(e,t)=>e.map(n=>{if(n.type==="blur"){let o=E(n.radius,t,0);return o>.05?`blur(${o}px)`:""}return n.type==="brightness"?`brightness(${E(n.amount,t,100)}%)`:n.type==="saturate"?`saturate(${E(n.amount,t,100)}%)`:n.type==="contrast"?`contrast(${E(n.amount,t,100)}%)`:""}).filter(Boolean).join(" "),Io=(e,t,n,o,i)=>{if(i==="fill")return e.drawImage(t,0,0,n,o);let r=i==="cover"?Math.max(n/t.width,o/t.height):Math.min(n/t.width,o/t.height),a=t.width*r,s=t.height*r;e.save(),e.beginPath(),e.rect(0,0,n,o),e.clip(),e.drawImage(t,(n-a)/2,(o-s)/2,a,s),e.restore()},Dn=(e,t)=>{let[n,o]=E(e.size,t,[200,200]);switch(e.shape){case"rect":return{pts:[[-n/2,-o/2],[n/2,-o/2],[n/2,o/2],[-n/2,o/2]],closed:!0};case"ellipse":return{pts:[...Array(96).keys()].map(i=>{let r=i/96*Math.PI*2-Math.PI/2;return[Math.cos(r)*n/2,Math.sin(r)*o/2]}),closed:!0};case"polygon":{let i=E(e.radius,t,100),r=e.sides??6;return{pts:[...Array(r).keys()].map(a=>{let s=a/r*Math.PI*2-Math.PI/2;return[Math.cos(s)*i,Math.sin(s)*i]}),closed:!0}}default:return{pts:e.points??[],closed:e.closed??e.shape==="path"}}},Oo=(e,t,n)=>{let o=E(t.trim?.start,n,0)/100,i=E(t.trim?.end,n,100)/100;if(e.beginPath(),t.trim&&(o>0||i<1)){let{pts:a,closed:s}=Dn(t,n),c=s?[...a,a[0]]:a,u=c.slice(1).map((g,v)=>Math.hypot(g[0]-c[v][0],g[1]-c[v][1])),p=u.reduce((g,v)=>g+v,0),m=Math.min(o,i)*p,h=Math.max(o,i)*p,d=0,f=!1;for(let g=0;g<u.length;g++){let v=d,y=d+u[g];if(d=y,y<m||v>h)continue;let k=M=>{let w=u[g]?(M-v)/u[g]:0;return[c[g][0]+(c[g+1][0]-c[g][0])*w,c[g][1]+(c[g+1][1]-c[g][1])*w]},L=k(Math.max(m,v)),b=k(Math.min(h,y));f||(e.moveTo(...L),f=!0),e.lineTo(...b)}}else if(t.shape==="rect"){let[a,s]=E(t.size,n,[200,200]);e.roundRect(-a/2,-s/2,a,s,E(t.radius,n,0))}else if(t.shape==="ellipse"){let[a,s]=E(t.size,n,[200,200]);e.ellipse(0,0,Math.abs(a/2),Math.abs(s/2),0,0,Math.PI*2)}else{let{pts:a,closed:s}=Dn(t,n);a.forEach((c,u)=>u?e.lineTo(...c):e.moveTo(...c)),s&&e.closePath()}let r=!!t.trim&&(o>0||i<1);if(t.fill&&!r&&t.shape!=="line"){if(typeof t.fill=="object"&&"linear"in t.fill){let a=e.createLinearGradient(...t.fill.linear.from,...t.fill.linear.to);for(let[s,c]of t.fill.linear.stops)a.addColorStop(s,c);e.fillStyle=a}else e.fillStyle=E(t.fill,n,"#fff");e.fill()}t.stroke&&(e.strokeStyle=E(t.stroke,n,"#fff"),e.lineWidth=E(t.strokeWidth,n,4),e.lineCap=t.lineCap??"round",e.lineJoin="round",e.stroke())};var Ke=(e,[t,n])=>[e[0]*t+e[2]*n+e[4],e[1]*t+e[3]*n+e[5]],Fo=e=>{let t=e[0]*e[3]-e[1]*e[2];return Math.abs(t)<1e-9?null:[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[3]*e[4])/t,(e[1]*e[4]-e[0]*e[5])/t]},Vn=(e,t,n,o,i)=>{switch(e.type){case"solid":case"image":case"video":case"precomp":{let[r,a]=o.layerSize(e,t,n);return[0,0,r,a]}case"shape":{if(e.shape==="rect"||e.shape==="ellipse"){let[u,p]=E(e.size,n,[200,200]);return[-u/2,-p/2,u,p]}if(e.shape==="polygon"){let u=E(e.radius,n,100);return[-u,-u,u*2,u*2]}let r=e.points??[];if(!r.length)return null;let a=r.map(u=>u[0]),s=r.map(u=>u[1]),c=E(e.strokeWidth,n,4)/2+4;return[Math.min(...a)-c,Math.min(...s)-c,Math.max(...a)-Math.min(...a)+c*2,Math.max(...s)-Math.min(...s)+c*2]}case"text":{let r=E(e.size,n,72),a=Nt(i,e,r,E(e.tracking,n,0),zt(e,r,o.host.defaultFont));return[Math.min(...a.lines.map(c=>c.x)),a.top,a.width,a.height]}default:return null}},Hn=(e,t,n,o,i)=>{let r=Vn(e,t,n,o,i);if(!r)return null;let a=o.matrix(e,t,n),[s,c,u,p]=r;return[Ke(a,[s,c]),Ke(a,[s+u,c]),Ke(a,[s+u,c+p]),Ke(a,[s,c+p])]},Bn=(e,t,n,o,i)=>{for(let r of t.layers){if(r.hidden||r.type==="audio"||r.type==="null"||!o.isActive(r,t,n))continue;let a=Vn(r,t,n,o,i),s=Fo(o.matrix(r,t,n));if(!a||!s)continue;let[c,u]=Ke(s,e);if(c>=a[0]&&c<=a[0]+a[2]&&u>=a[1]&&u<=a[1]+a[3])return r.id}return null};var We=new at,fe=null,Ae=document.createElement("canvas"),Kn=()=>{let e=A(_=>_.project),t=A(_=>_.time),n=A(_=>_.comp),o=A(_=>_.layer),i=A(_=>_.playing),r=re(null),a=re(null),s=re(null),[c,u]=Y({w:400,h:600}),[p,m]=Y(0),h=re(!1),d=re(!1),f=e?.comps.find(_=>_.id===n);ae(()=>{let _=r.current;if(!_)return;let x=new ResizeObserver(()=>u({w:_.clientWidth-24,h:_.clientHeight-24}));return x.observe(_),()=>x.disconnect()},[]);let g=f?Math.min(c.w/f.width,c.h/f.height):1,v=async()=>{if(h.current){d.current=!0;return}let _=I(),x=Z();if(!(!_.project||!x||!a.current)){h.current=!0;try{fe||(fe=new pt(_.project,We)),fe.project=_.project,We.playing=_.playing;let C=a.current;(Ae.width!==x.width||Ae.height!==x.height)&&(Ae.width=x.width,Ae.height=x.height);let P=Ae.getContext("2d"),T=performance.now();P.setTransform(1,0,0,1,0,0),P.clearRect(0,0,x.width,x.height),x.background||(P.fillStyle="#000",P.fillRect(0,0,x.width,x.height)),await fe.renderComp(P,x,_.time),We.endFrame(),(C.width!==x.width||C.height!==x.height)&&(C.width=x.width,C.height=x.height),C.getContext("2d").drawImage(Ae,0,0),C.dataset.time=String(_.time),m(performance.now()-T),y()}catch(C){S({message:`Preview error: ${C.message}`})}finally{h.current=!1,d.current&&(d.current=!1,v())}}},y=()=>{let _=I(),x=Z(),C=s.current;if(!C||!x||!fe)return;(C.width!==x.width||C.height!==x.height)&&(C.width=x.width,C.height=x.height);let P=C.getContext("2d");P.clearRect(0,0,C.width,C.height);let T=x.layers.find(he=>he.id===_.layer);if(!T||_.playing||!fe.isActive(T,x,_.time))return;let j=Hn(T,x,_.time,fe,P),X=2/g;P.strokeStyle="#4da3ff",P.lineWidth=X,j&&(P.beginPath(),j.forEach((he,Xn)=>Xn?P.lineTo(...he):P.moveTo(...he)),P.closePath(),P.stroke());let[oe,we]=E(T.transform?.position,_.time,[x.width/2,x.height/2]);P.beginPath(),P.arc(oe,we,6/g,0,Math.PI*2),P.moveTo(oe-12/g,we),P.lineTo(oe+12/g,we),P.moveTo(oe,we-12/g),P.lineTo(oe,we+12/g),P.stroke()};ae(()=>{v()},[e,t,n,i]),ae(()=>{y()},[o,g]);let k=_=>{let x=s.current.getBoundingClientRect();return[(_.clientX-x.left)/x.width*f.width,(_.clientY-x.top)/x.height*f.height]},L=re(null),b=_=>{if(!f||!fe)return;let x=k(_),C=I(),P=s.current.getContext("2d"),T=Bn(x,f,C.time,fe,P);if(S({layer:T,key:null}),!T)return;let j=f.layers.find(X=>X.id===T);_.target.setPointerCapture(_.pointerId),L.current={start:x,pos:E(j.transform?.position,C.time,[f.width/2,f.height/2]),layer:T,moved:!1}},M=_=>{let x=L.current;if(!x||!f)return;let C=k(_),P=C[0]-x.start[0],T=C[1]-x.start[1];if(!x.moved&&Math.hypot(P,T)*g<3)return;x.moved||(x.moved=!0,le());let j=H(I().time,f.fps),X=[Math.round(x.pos[0]+P),Math.round(x.pos[1]+(_.shiftKey?0:T))];me(oe=>{let we=oe.comps.find(he=>he.id===f.id).layers.find(he=>he.id===x.layer);te(we.transform?.position)?q(oe,x.layer,"transform.position",j,X):Ne(oe,x.layer,"transform.position",X)})},w=()=>{L.current?.moved&&ce(),L.current=null};if(!f)return l("div",{class:"viewer",ref:r});let $={width:`${f.width*g}px`,height:`${f.height*g}px`};return l("div",{class:"viewer",ref:r,children:[l("div",{class:"stage",style:$,children:[l("canvas",{ref:a,class:"frame",style:$}),l("canvas",{ref:s,class:"overlay",style:$,onPointerDown:b,onPointerMove:M,onPointerUp:w})]}),l("div",{class:"viewer-info",children:[f.width,"\xD7",f.height," \xB7 ",Math.round(g*100),"% \xB7 ",p.toFixed(0)," ms/frame"]})]})};var Un=new st,Rt=0,qn=()=>{let e=Z();if(!e)return;I().time>=e.duration-1/e.fps&&S({time:0});let t=performance.now()-I().time*1e3;S({playing:!0});let n=o=>{let i=I(),r=Z();if(!i.playing||!r)return;let a=(o-t)/1e3;if(a>=r.duration){if(i.loop){a=0,Ue(),S({time:0}),qn();return}Ue(),S({time:H(r.duration-1/r.fps,r.fps)});return}S({time:a}),Un.sync(i.project,r,a,!0),Rt=requestAnimationFrame(n)};Rt=requestAnimationFrame(n)},Ue=()=>{cancelAnimationFrame(Rt);let e=Z();S({playing:!1,time:e?H(I().time,e.fps):I().time}),Un.stop(),We.stopAll()},Jn=()=>I().playing?Ue():qn(),Ie=e=>{let t=Z(),n="";z(o=>{n=ie(o,t.id,{inPoint:H(I().time,t.fps),...e}).id}),n&&S({layer:n,key:null})},zo={Text:()=>Ie({type:"text",name:"Text",text:"Your text",size:Math.round(Z().width/10),color:"#ffffff",weight:800}),Shape:()=>Ie({type:"shape",name:"Shape",shape:"ellipse",size:[300,300],fill:"#E8692A"}),Solid:()=>Ie({type:"solid",name:"Solid",color:"#1f2933"}),Null:()=>Ie({type:"null",name:"Null"}),"Image / video / audio\u2026":()=>{let e=prompt("Path to the file, relative to the project file:");if(!e)return;let t=/\.(mp4|mov|webm|m4v)$/i.test(e)?"video":/\.(mp3|wav|m4a|aac|ogg)$/i.test(e)?"audio":"image";Ie({type:t,name:e.split("/").pop(),src:e})},"New comp (precomp)\u2026":()=>{let e=prompt("Id for the new composition:");if(!e)return;let t=Z();z(n=>{fn(n,{id:e,name:e,duration:t.duration,width:t.width,height:t.height,fps:t.fps})}),Ie({type:"precomp",name:e,comp:e})}},No=({onClose:e})=>{let t=En(),[n,o]=Y(t?.type==="text"?"text.fadeUp":"opener.logoReveal"),i=J[n],r=m=>J[m].kind==="text"||m==="element.highlightWord"?{layer:I().layer??""}:m==="opener.logoReveal"||m==="opener.bars"?{title:"Your Brand",start:H(I().time,30)}:m==="kinetic.sequence"?{phrases:["Make","it","move"],start:H(I().time,30),style:"slam"}:m==="element.lowerThird"?{name:"Your Name",title:"Your title",start:H(I().time,30)}:m==="transition.between"?{from:"",to:"",type:"push",duration:.5}:m==="slides.slideshow"?{items:[{src:"photo1.jpg",caption:"Caption"}],each:3,transition:"push"}:{},[a,s]=Y(JSON.stringify(r(n),null,2)),[c,u]=Y("");return l("div",{class:"modal",onClick:e,children:l("div",{class:"dialog",onClick:m=>m.stopPropagation(),onKeyDown:m=>m.stopPropagation(),children:[l("div",{class:"dialog-list",children:["text","kinetic","opener","slides","transition","element"].map(m=>l("div",{children:[l("div",{class:"group",children:m}),Object.entries(J).filter(([,h])=>h.kind===m).map(([h])=>l("button",{class:h===n?"active":"",onClick:()=>{o(h),s(JSON.stringify(r(h),null,2)),u("")},children:h.split(".")[1]},h))]},m))}),l("div",{class:"dialog-body",children:[l("h3",{children:n}),l("p",{children:i.description}),l("p",{class:"hint",children:["Params: ",i.params]}),l("textarea",{rows:10,value:a,spellcheck:!1,onInput:m=>s(m.target.value)}),c&&l("div",{class:"error",children:c}),l("div",{class:"row",children:[l("button",{onClick:e,children:"Cancel"}),l("button",{class:"primary",onClick:()=>{try{let m=JSON.parse(a),h=[],d=I().project;if(z(f=>{h=i.apply(f,I().comp,m).created}),I().project===d)throw new Error(I().message||"Preset failed");h[0]&&S({layer:h[0]}),e()}catch(m){u(m.message)}},children:"Apply"})]})]})]})})},Wn=e=>{if(e.target.closest?.("input, textarea, select"))return;let n=I(),o=Z();if(!o)return;let i=e.metaKey||e.ctrlKey,r=1/o.fps,a=s=>S({time:Math.max(0,Math.min(o.duration,H(s,o.fps))),playing:!1});if(e.code==="Space")e.preventDefault(),Jn();else if(i&&e.key.toLowerCase()==="z")e.preventDefault(),e.shiftKey?ct():At();else if(i&&e.key.toLowerCase()==="y")e.preventDefault(),ct();else if(i&&e.key.toLowerCase()==="d"&&n.layer)e.preventDefault(),z(s=>{let c=nt(s,n.layer);S({layer:c.id})});else if(e.key==="ArrowLeft")e.preventDefault(),a(n.time-r*(e.shiftKey?10:1));else if(e.key==="ArrowRight")e.preventDefault(),a(n.time+r*(e.shiftKey?10:1));else if(e.key==="Home")a(0);else if(e.key==="End")a(o.duration-r);else if((e.key==="j"||e.key==="k")&&n.layer){let s=On(n.layer),c=e.key==="j"?[...s].reverse().find(u=>u<n.time-.001):s.find(u=>u>n.time+.001);c!==void 0&&a(c)}else e.key==="["&&n.layer?z(s=>{let c=s.comps.find(u=>u.id===o.id).layers.find(u=>u.id===n.layer);ze(s,n.layer,H(n.time,o.fps)-(c.inPoint??0))}):e.key==="]"&&n.layer?z(s=>ee(s,n.layer,{outPoint:H(n.time,o.fps)})):e.key==="Delete"||e.key==="Backspace"?n.key?(z(s=>Re(s,n.key.layer,n.key.path,n.key.t)),S({key:null})):n.layer&&(z(s=>tt(s,n.layer)),S({layer:null})):e.key==="Escape"?S({layer:null,key:null}):e.key==="="||e.key==="+"?S({zoom:Math.min(2e3,n.zoom*1.25)}):e.key==="-"&&S({zoom:Math.max(10,n.zoom/1.25)})},Ro=(e,t)=>{let n=Math.round(e*t),o=Math.floor(n/t);return`${String(Math.floor(o/60)).padStart(2,"0")}:${String(o%60).padStart(2,"0")}:${String(n%t).padStart(2,"0")}`},Do=()=>{let e=A(r=>r.time),t=A(r=>r.playing),n=A(r=>r.loop),o=A(r=>r.zoom),i=Z();return i?l("div",{class:"transport",children:[l("button",{title:"Start (Home)",onClick:()=>S({time:0}),children:"\u23EE"}),l("button",{title:"Previous frame (\u2190)",onClick:()=>S({time:Math.max(0,H(e-1/i.fps,i.fps))}),children:"\u25C0\uFE0E"}),l("button",{class:"play",title:"Play / pause (Space)",onClick:Jn,children:t?"\u275A\u275A":"\u25B6"}),l("button",{title:"Next frame (\u2192)",onClick:()=>S({time:Math.min(i.duration,H(e+1/i.fps,i.fps))}),children:"\u25B6\uFE0E"}),l("button",{class:n?"on":"",title:"Loop",onClick:()=>S({loop:!n}),children:"\u27F2"}),l("span",{class:"timecode",children:Ro(e,i.fps)}),l("span",{class:"muted",children:[e.toFixed(2),"s / ",i.duration,"s"]}),l("span",{class:"spacer"}),l("span",{class:"muted",children:"Zoom"}),l("button",{onClick:()=>S({zoom:Math.max(10,o/1.25)}),children:"\u2212"}),l("button",{onClick:()=>S({zoom:Math.min(2e3,o*1.25)}),children:"+"})]}):null},Vo=({onPresets:e})=>{let t=A(u=>u.project),n=A(u=>u.comp),o=A(u=>u.status),i=A(u=>u.message),r=A(u=>u.warnings),a=A(u=>u.render),[s,c]=Y(!1);return l("header",{class:"topbar",children:[l("div",{class:"brand",children:[l("b",{children:"DT.ly"})," Studio ",l("span",{class:"muted",children:["\xB7 ",ue.file]})]}),l("nav",{class:"comps",children:t?.comps.map(u=>l("button",{class:u.id===n?"active":"",onClick:()=>{Ue(),S({comp:u.id,layer:null,key:null,time:0})},children:[u.name??u.id,t.root===u.id?" \u2605":""]},u.id))}),l("div",{class:"actions",children:[l("div",{class:"menu-wrap",children:[l("button",{onClick:()=>c(!s),children:"+ Layer \u25BE"}),s&&l("div",{class:"menu",onMouseLeave:()=>c(!1),children:Object.entries(zo).map(([u,p])=>l("button",{onClick:()=>{c(!1),p()},children:u},u))})]}),l("button",{onClick:e,children:"Presets\u2026"}),l("button",{title:"Undo (\u2318Z)",onClick:At,children:"\u21B6"}),l("button",{title:"Redo (\u21E7\u2318Z)",onClick:ct,children:"\u21B7"}),l("button",{class:"primary",disabled:a.active,onClick:()=>{Ue(),Ln()},children:a.active?`Rendering ${a.total?Math.round((a.done??0)/a.total*100):0}%`:"Render MP4"})]}),l("div",{class:`status ${o}`,title:r.join(`
4
+ `),children:[i||(o==="saving"?"Saving\u2026":o==="error"?"Save failed":o==="reloaded"?"Reloaded from disk":"Saved"),r.length>0&&l("span",{class:"warn",children:[" \xB7 ",r.length," warning",r.length>1?"s":""]}),a.out&&!a.active&&l("a",{href:`/api/media?src=${encodeURIComponent(a.out)}&token=${ue.token}`,target:"_blank",children:[" \xB7 open ",a.out]}),a.error&&l("span",{class:"error",children:[" \xB7 render failed: ",a.error]})]})]})},Ho=()=>{let e=A(o=>o.project),[t,n]=Y(!1);return ae(()=>(document.addEventListener("keydown",Wn),()=>document.removeEventListener("keydown",Wn)),[]),e?l("div",{class:"app",children:[l(Vo,{onPresets:()=>n(!0)}),l("main",{class:"workspace",children:[l(Kn,{}),l($n,{})]}),l("section",{class:"bottom",children:[l(Do,{}),l(In,{})]}),t&&l(No,{onClose:()=>n(!1)})]}):l("div",{class:"loading",children:"Loading project\u2026"})};(async()=>{document.title=`${ue.file} \u2014 DT.ly Studio`,await It();let e=Z();e&&S({zoom:Math.max(20,Math.min(400,(window.innerWidth-260)/e.duration))}),await Cn(I().project),Sn(),Zt(l(Ho,{}),document.getElementById("root"))})();
5
+ //# sourceMappingURL=app.js.map