etro 0.13.0 → 0.14.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 (275) hide show
  1. package/.github/workflows/nodejs.yml +4 -0
  2. package/.github/workflows/shipjs-trigger.yml +2 -1
  3. package/.husky/pre-commit +1 -1
  4. package/AGENTS.md +106 -0
  5. package/CHANGELOG.md +17 -0
  6. package/CONTRIBUTING.md +5 -5
  7. package/README.md +7 -12
  8. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/index.html +50 -50
  9. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/custom-array.ts.html +11 -11
  10. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/base.ts.html +57 -9
  11. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/brightness.ts.html +1 -1
  12. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/channels.ts.html +1 -1
  13. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/chroma-key.ts.html +1 -1
  14. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/contrast.ts.html +1 -1
  15. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/elliptical-mask.ts.html +1 -1
  16. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/gaussian-blur.ts.html +1 -1
  17. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/grayscale.ts.html +1 -1
  18. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/index.html +21 -21
  19. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/index.ts.html +1 -1
  20. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/pixelate.ts.html +1 -1
  21. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/shader.ts.html +3 -3
  22. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/stack.ts.html +1 -1
  23. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/transform.ts.html +1 -1
  24. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/effect/visual.ts.html +1 -1
  25. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/etro.ts.html +1 -1
  26. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/event.ts.html +29 -29
  27. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/index.html +20 -20
  28. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/index.ts.html +1 -1
  29. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/audio-source.ts.html +47 -47
  30. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/audio.ts.html +4 -4
  31. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/base.ts.html +88 -34
  32. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/image.ts.html +1 -1
  33. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/index.html +20 -20
  34. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/index.ts.html +1 -1
  35. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/text.ts.html +1 -1
  36. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/video.ts.html +1 -1
  37. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/visual-source.ts.html +1 -1
  38. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/layer/visual.ts.html +10 -10
  39. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/movie/effects.ts.html +4 -4
  40. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/movie/index.html +19 -19
  41. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/movie/index.ts.html +1 -1
  42. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/movie/layers.ts.html +5 -5
  43. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/movie/movie.ts.html +467 -128
  44. package/coverage/{Firefox 148.0 (Mac OS 10.15) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/src/util.ts.html +380 -68
  45. package/coverage/Firefox 151.0 (Mac OS 10.15)/html/index.html +161 -0
  46. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/custom-array.ts.html +34 -34
  47. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/base.ts.html +92 -44
  48. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/brightness.ts.html +17 -17
  49. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/channels.ts.html +17 -17
  50. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/chroma-key.ts.html +21 -21
  51. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/contrast.ts.html +17 -17
  52. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/elliptical-mask.ts.html +1 -1
  53. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/gaussian-blur.ts.html +98 -98
  54. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/grayscale.ts.html +13 -13
  55. package/coverage/Firefox 151.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  56. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/index.ts.html +1 -1
  57. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/pixelate.ts.html +24 -24
  58. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/shader.ts.html +369 -369
  59. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/stack.ts.html +46 -46
  60. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/transform.ts.html +104 -104
  61. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/effect/visual.ts.html +1 -1
  62. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/etro.ts.html +1 -1
  63. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/event.ts.html +60 -60
  64. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/index.html +42 -42
  65. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/index.ts.html +1 -1
  66. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/audio-source.ts.html +50 -50
  67. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/audio.ts.html +4 -4
  68. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/base.ts.html +95 -41
  69. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/image.ts.html +14 -14
  70. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/index.html +51 -51
  71. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/index.ts.html +1 -1
  72. package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/text.ts.html +1 -1
  73. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/video.ts.html +1 -1
  74. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/visual-source.ts.html +58 -58
  75. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/layer/visual.ts.html +84 -84
  76. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/movie/effects.ts.html +13 -13
  77. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/movie/index.html +28 -28
  78. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/movie/index.ts.html +1 -1
  79. package/coverage/{Firefox 120.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/movie/layers.ts.html +5 -5
  80. package/coverage/{Firefox 121.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/movie/movie.ts.html +605 -266
  81. package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/src/util.ts.html +408 -69
  82. package/dist/custom-array.d.ts +10 -10
  83. package/dist/effect/base.d.ts +61 -60
  84. package/dist/effect/brightness.d.ts +16 -16
  85. package/dist/effect/channels.d.ts +23 -23
  86. package/dist/effect/chroma-key.d.ts +23 -23
  87. package/dist/effect/contrast.d.ts +15 -15
  88. package/dist/effect/elliptical-mask.d.ts +31 -31
  89. package/dist/effect/gaussian-blur.d.ts +60 -60
  90. package/dist/effect/grayscale.d.ts +7 -7
  91. package/dist/effect/index.d.ts +16 -16
  92. package/dist/effect/pixelate.d.ts +18 -18
  93. package/dist/effect/shader.d.ts +109 -109
  94. package/dist/effect/stack.d.ts +27 -27
  95. package/dist/effect/transform.d.ts +73 -73
  96. package/dist/effect/visual.d.ts +17 -17
  97. package/dist/etro-cjs.js +3583 -3553
  98. package/dist/etro-iife.js +3583 -3553
  99. package/dist/etro.d.ts +7 -7
  100. package/dist/event.d.ts +40 -40
  101. package/dist/index.d.ts +6 -6
  102. package/dist/layer/audio-source.d.ts +28 -28
  103. package/dist/layer/audio.d.ts +27 -27
  104. package/dist/layer/base.d.ts +129 -128
  105. package/dist/layer/image.d.ts +20 -20
  106. package/dist/layer/index.d.ts +11 -11
  107. package/dist/layer/text.d.ts +78 -78
  108. package/dist/layer/video.d.ts +23 -23
  109. package/dist/layer/visual-source.d.ts +47 -47
  110. package/dist/layer/visual.d.ts +62 -62
  111. package/dist/movie/effects.d.ts +6 -6
  112. package/dist/movie/index.d.ts +1 -1
  113. package/dist/movie/layers.d.ts +6 -6
  114. package/dist/movie/movie.d.ts +280 -278
  115. package/dist/object.d.ts +19 -19
  116. package/dist/util.d.ts +128 -123
  117. package/karma.conf.js +61 -3
  118. package/package.json +13 -15
  119. package/ship.config.js +9 -11
  120. package/src/effect/base.ts +16 -0
  121. package/src/layer/base.ts +19 -1
  122. package/src/movie/movie.ts +116 -3
  123. package/src/util.ts +104 -0
  124. package/tsconfig.json +3 -2
  125. package/.husky/commit-msg +0 -4
  126. package/.husky/prepare-commit-msg +0 -11
  127. package/commitlint.config.ts +0 -39
  128. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/index.html +0 -176
  129. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/custom-array.ts.html +0 -214
  130. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/base.ts.html +0 -433
  131. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/brightness.ts.html +0 -214
  132. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/channels.ts.html +0 -235
  133. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/contrast.ts.html +0 -211
  134. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/elliptical-mask.ts.html +0 -310
  135. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/grayscale.ts.html +0 -187
  136. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/index.html +0 -311
  137. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/pixelate.ts.html +0 -259
  138. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/shader.ts.html +0 -1774
  139. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/stack.ts.html +0 -358
  140. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/transform.ts.html +0 -685
  141. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/visual.ts.html +0 -148
  142. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/event.ts.html +0 -691
  143. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.html +0 -176
  144. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.ts.html +0 -109
  145. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/audio-source.ts.html +0 -835
  146. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/base.ts.html +0 -772
  147. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/image.ts.html +0 -181
  148. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/index.html +0 -236
  149. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/video.ts.html +0 -211
  150. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual-source.ts.html +0 -721
  151. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual.ts.html +0 -760
  152. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/effects.ts.html +0 -163
  153. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.html +0 -161
  154. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.ts.html +0 -88
  155. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/layers.ts.html +0 -163
  156. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/movie.ts.html +0 -2692
  157. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/util.ts.html +0 -1426
  158. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/index.html +0 -176
  159. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/custom-array.ts.html +0 -214
  160. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/base.ts.html +0 -433
  161. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +0 -235
  162. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +0 -331
  163. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +0 -211
  164. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +0 -796
  165. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +0 -187
  166. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/index.html +0 -311
  167. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +0 -259
  168. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +0 -1948
  169. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +0 -685
  170. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/event.ts.html +0 -691
  171. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +0 -835
  172. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +0 -241
  173. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/base.ts.html +0 -772
  174. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/image.ts.html +0 -181
  175. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/index.ts.html +0 -124
  176. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/text.ts.html +0 -658
  177. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/video.ts.html +0 -211
  178. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +0 -760
  179. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +0 -163
  180. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.html +0 -161
  181. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.ts.html +0 -88
  182. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +0 -163
  183. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +0 -2692
  184. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/base.css +0 -224
  185. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/block-navigation.js +0 -87
  186. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/favicon.png +0 -0
  187. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/index.html +0 -176
  188. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.css +0 -1
  189. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.js +0 -2
  190. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  191. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sorter.js +0 -196
  192. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +0 -214
  193. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +0 -331
  194. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +0 -790
  195. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.html +0 -311
  196. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.ts.html +0 -154
  197. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +0 -259
  198. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +0 -1948
  199. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +0 -358
  200. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +0 -685
  201. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/etro.ts.html +0 -163
  202. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/index.html +0 -176
  203. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/image.ts.html +0 -181
  204. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/index.html +0 -236
  205. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/text.ts.html +0 -658
  206. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +0 -721
  207. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +0 -2692
  208. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/util.ts.html +0 -1426
  209. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/base.css +0 -224
  210. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/block-navigation.js +0 -87
  211. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/favicon.png +0 -0
  212. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/index.html +0 -176
  213. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.css +0 -1
  214. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.js +0 -2
  215. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  216. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sorter.js +0 -196
  217. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/custom-array.ts.html +0 -214
  218. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/base.ts.html +0 -433
  219. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +0 -214
  220. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +0 -235
  221. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +0 -331
  222. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +0 -211
  223. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +0 -310
  224. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +0 -796
  225. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +0 -187
  226. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.html +0 -311
  227. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.ts.html +0 -154
  228. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +0 -358
  229. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +0 -148
  230. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/etro.ts.html +0 -163
  231. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/event.ts.html +0 -691
  232. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.html +0 -176
  233. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.ts.html +0 -109
  234. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +0 -835
  235. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +0 -241
  236. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/base.ts.html +0 -772
  237. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.html +0 -236
  238. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.ts.html +0 -124
  239. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +0 -721
  240. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +0 -760
  241. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +0 -163
  242. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/index.html +0 -161
  243. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +0 -163
  244. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/util.ts.html +0 -1453
  245. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/base.css +0 -224
  246. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/block-navigation.js +0 -87
  247. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/favicon.png +0 -0
  248. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.css +0 -1
  249. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.js +0 -2
  250. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  251. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sorter.js +0 -196
  252. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +0 -310
  253. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/index.ts.html +0 -154
  254. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +0 -148
  255. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/etro.ts.html +0 -163
  256. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/index.ts.html +0 -109
  257. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +0 -241
  258. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/index.ts.html +0 -124
  259. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/text.ts.html +0 -658
  260. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/video.ts.html +0 -211
  261. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/index.ts.html +0 -88
  262. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/base.css +0 -0
  263. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/block-navigation.js +0 -0
  264. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/favicon.png +0 -0
  265. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/prettify.css +0 -0
  266. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/prettify.js +0 -0
  267. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/sort-arrow-sprite.png +0 -0
  268. /package/coverage/{Chrome Headless 79.0.3945.0 (Mac OS 10.16.0) → Chrome Headless 148.0.0.0 (Mac OS 10.15.7)}/html/sorter.js +0 -0
  269. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/base.css +0 -0
  270. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/block-navigation.js +0 -0
  271. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/favicon.png +0 -0
  272. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/prettify.css +0 -0
  273. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/prettify.js +0 -0
  274. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/sort-arrow-sprite.png +0 -0
  275. /package/coverage/{Firefox 118.0 (Mac OS 10.15) → Firefox 151.0 (Mac OS 10.15)}/html/sorter.js +0 -0
@@ -39,7 +39,11 @@ jobs:
39
39
  run: xvfb-run --auto-servernum npm run test:unit
40
40
  env:
41
41
  CI: true
42
+ # Force Mesa's software renderer so headless Firefox has WebGL on
43
+ # GPU-less runners (Chrome uses SwiftShader via its launcher flags).
44
+ LIBGL_ALWAYS_SOFTWARE: true
42
45
  - name: run smoke tests
43
46
  run: xvfb-run --auto-servernum npm run test:smoke
44
47
  env:
45
48
  CI: true
49
+ LIBGL_ALWAYS_SOFTWARE: true
@@ -13,8 +13,9 @@ jobs:
13
13
  with:
14
14
  fetch-depth: 0
15
15
  ref: master
16
- - uses: actions/setup-node@v1
16
+ - uses: actions/setup-node@v6
17
17
  with:
18
+ node-version: 24
18
19
  registry-url: "https://registry.npmjs.org"
19
20
  - run: |
20
21
  if [ -f "yarn.lock" ]; then
package/.husky/pre-commit CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env sh
2
2
  . "$(dirname -- "$0")/_/husky.sh"
3
3
 
4
- npm run lint
4
+ npm run fix
5
5
 
6
6
  if [ -z "$SKIP_TESTS" ]; then
7
7
  npm run test:unit
package/AGENTS.md ADDED
@@ -0,0 +1,106 @@
1
+ # AGENTS.md — Etro Contributor Context
2
+
3
+ ## What is Etro?
4
+
5
+ Etro is a TypeScript video-editing framework for the browser. It composites
6
+ layers (video, audio, image, text, or custom) onto an HTML `<canvas>`, applies
7
+ GPU-accelerated GLSL shader effects, and outputs via `play()`, `stream()`
8
+ (WebRTC), or `record()` (Blob). Audio routes through the Web Audio API.
9
+
10
+ ## Repository Layout
11
+
12
+ ```
13
+ src/
14
+ spec/ # Tests (Karma + Jasmine)
15
+ ├── unit/ # Mocked unit tests
16
+ ├── smoke/ # End-to-end without audio (runs in CI)
17
+ ├── integration/ # End-to-end with audio (local only)
18
+ ├── mocks/ # Shared mock factories (dom, movie, layer, effect)
19
+ └── assets/ # Test fixtures (images, audio, video, effect references)
20
+ examples/ # Browser demos (hello-world, keyframes, effects, webcam)
21
+ scripts/effect/ # Effect sample generation tooling
22
+ dist/ # Build output (gitignored)
23
+ ```
24
+
25
+ ## Architecture Concepts
26
+
27
+ - **Movie** — the root composition. Owns a `<canvas>`, an `AudioContext`, a
28
+ `layers` list, and an `effects` list. Renders via `play()`, `stream()`,
29
+ `record()`, or `refresh()`.
30
+ - **Layer** — a time-sliced content source (`startTime` + `duration`). Visual
31
+ layers draw to the canvas; audio layers route through Web Audio.
32
+ - **Effect** — a filter applied to a layer or to the movie globally. Visual
33
+ effects use WebGL fragment shaders.
34
+ - **Dynamic Properties** — layer/effect properties can be a constant, a
35
+ `KeyFrame` animation, or a function `(element, time) => value`. Evaluate
36
+ with `etro.val(obj, 'prop', time)`.
37
+ - **Events** (deprecated) — pub/sub via `event.publish` / `event.subscribe`.
38
+ New code should prefer async callbacks (`onDraw`, `onStart`, etc.).
39
+
40
+ ## Build & Dev
41
+
42
+ | Command | Purpose |
43
+ |----------------------------|-----------------------------------------------|
44
+ | `npm run build` | Rollup → `dist/etro-cjs.js` + `dist/etro-iife.js` |
45
+ | `npm run lint` | ESLint (StandardJS + TypeScript rules) |
46
+ | `npm run fix` | ESLint with `--fix` |
47
+ | `npm run test:unit` | Unit tests (mocked DOM, runs in CI) |
48
+ | `npm run test:smoke` | Smoke tests (real browser, no audio, runs in CI) |
49
+ | `npm run test:integration` | Integration tests (audio required, local only)|
50
+ | `npm run doc` | Typedoc → `docs/` |
51
+ | `npm run effects` | Regenerate effect reference images |
52
+
53
+ Tests run in **headless Chrome and/or Firefox** via Karma (depending on local
54
+ browser availability). The test suite is selected by the `TEST_SUITE` env var
55
+ (`unit`, `smoke`, or `integration`).
56
+
57
+ ## Code Conventions
58
+
59
+ - **Language**: TypeScript, compiled to ES6. Target `"lib": ["es2016", "DOM"]`.
60
+ - **Style**: [StandardJS](https://standardjs.com/rules.html) — no semicolons,
61
+ 2-space indent, `1tbs` brace style, `curly: all`.
62
+ - **Commits**: Husky pre-commit runs lint + build + tests automatically.
63
+ - **Branching**: Work on a feature branch, never commit directly to master.
64
+ Rebase onto upstream/master before opening a PR.
65
+
66
+ ## Adding / Modifying Effects
67
+
68
+ 1. Create or edit the effect class in `src/effect/`.
69
+ 2. Effects with visual output should extend `etro.effect.Shader` (for custom
70
+ GLSL) or `etro.effect.Visual`.
71
+ 3. Register the effect in `src/effect/index.ts`.
72
+ 4. Add the effect to `scripts/gen-effect-samples.html`.
73
+ 5. Run `npm run effects` and review generated images in
74
+ `spec/integration/assets/effect/`.
75
+ 6. Add unit tests in `spec/unit/effect/` and smoke tests in `spec/smoke/effect/`.
76
+
77
+ ## Adding / Modifying Layers
78
+
79
+ 1. Create or edit the layer class in `src/layer/`.
80
+ 2. Visual layers should extend `etro.layer.Visual`; audio layers extend
81
+ `etro.layer.Base` and implement audio routing.
82
+ 3. Register the layer in `src/layer/index.ts`.
83
+ 4. Add unit tests in `spec/unit/layer/` using the mock factories in
84
+ `spec/unit/mocks/`.
85
+
86
+ ## Key Patterns
87
+
88
+ - Use `applyOptions()` (from `util.ts`) to merge constructor options with
89
+ defaults — though this is deprecated; new code should assign defaults
90
+ directly in the constructor.
91
+ - The `Dynamic<T>` type and `val()` helper enable keyframe-animated and
92
+ functional properties. Any property that should support animation must use
93
+ this pattern.
94
+ - Layers and effects use `tryAttach` / `tryDetach` lifecycle hooks when
95
+ added to or removed from a movie. Use `attach()` for setup and `detach()`
96
+ for teardown.
97
+ - The `publicExcludes` array on layers/effects controls which properties are
98
+ excluded from serialization.
99
+
100
+ ## Useful Links
101
+
102
+ - Docs: https://etrojs.dev/
103
+ - API Reference: https://etrojs.dev/docs/reference/movie
104
+ - Dynamic Properties: https://etrojs.dev/docs/reference/dynamic-properties
105
+ - Discord: https://discord.gg/myrBsQ8Cht
106
+ - CONTRIBUTING.md for full workflow details
package/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
+ ## [0.14.0] - 2026-06-06
9
+ ### Added
10
+ - Movie serialization and deserialization ([#340](https://github.com/etro-js/etro/pull/340) by [@G3RRYGL3Z](https://github.com/G3RRYGL3Z)).
11
+
12
+ ### Changed
13
+ - Bump rollup-plugin-typescript2 to 0.37.0.
14
+ - Bump karma to 6.4.4.
15
+
16
+ ### Security
17
+ - Bump handlebars from 4.7.7 to 4.7.9 ([#329](https://github.com/etro-js/etro/pull/329)).
18
+ - Bump shipjs, tmp ([#343](https://github.com/etro-js/etro/pull/343)).
19
+ - Bump body-parser, qs ([#337](https://github.com/etro-js/etro/pull/337)).
20
+ - Bump rollup to 4.61.1.
21
+ - Bump typedoc to 0.28.19.
22
+ - Bump karma-jasmine to 5.1.0.
23
+
8
24
  ## [0.13.0] - 2026-03-18
9
25
  ### Added
10
26
  - `Movie#play()` option `onDraw()` ([#266](https://github.com/etro-js/etro/pull/266)).
@@ -336,6 +352,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
336
352
  - Gaussian blur
337
353
  - Transform
338
354
 
355
+ [0.14.0]: https://github.com/etro-js/etro/compare/v0.13.0...v0.14.0
339
356
  [0.13.0]: https://github.com/etro-js/etro/compare/v0.12.1...v0.13.0
340
357
  [0.12.1]: https://github.com/etro-js/etro/compare/v0.12.0...v0.12.1
341
358
  [0.12.0]: https://github.com/etro-js/etro/compare/v0.11.0...v0.12.0
package/CONTRIBUTING.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Introduction
6
6
 
7
- Thank you for considering contributing to Etro! There are many ways you can contribute to Etro, like creating issues for features or bugs, improving the docs or wiki, or writing the code for the library. This page covers how to make changes to the repository files (either code or jsdocs).
7
+ Thank you for considering contributing to Etro! There are many ways to contribute, such as reporting bugs, suggesting features, improving the documentation, or writing code. This guide covers how to make changes to the repository files (code or documentation).
8
8
 
9
9
  [Join our Discord](https://discord.gg/myrBsQ8Cht)
10
10
 
@@ -23,7 +23,7 @@ Thank you for considering contributing to Etro! There are many ways you can cont
23
23
 
24
24
  ## Making your changes
25
25
 
26
- - Make some changes and update tests
26
+ - Make your changes and update the relevant tests
27
27
  - If you are writing code, the linter uses [StandardJS](https://standardjs.com/rules.html) for style conventions
28
28
  - If you're adding or updating an effect:
29
29
  - Add your effect to **scripts/gen-effect-samples.html**
@@ -44,13 +44,13 @@ Thank you for considering contributing to Etro! There are many ways you can cont
44
44
 
45
45
  ## Submitting your changes
46
46
 
47
- - Before pushing to your fork, rebase (please avoid merging) to integrate your work with any new changes in the main repository
47
+ - Before pushing to your fork, please rebase onto the latest upstream changes (rather than merging) to keep the history clean:
48
48
  ```
49
49
  git fetch upstream
50
50
  git rebase upstream/master
51
51
  ```
52
- - Open a pull request from the branch in your fork to the main repository. If you changed any core functionality, make sure you explain your motives for those changes
53
- - A large part of the submission process is receiving feedback on how you can improve you pull request. If you need to change your pull request, feel free to push more commits.
52
+ - Open a pull request from the branch in your fork to the main repository. If your changes affect core functionality, please explain the reasoning behind them.
53
+ - We may provide feedback to help refine your pull request. Feel free to push additional commits to address any suggestions.
54
54
 
55
55
  ## Tests
56
56
 
package/README.md CHANGED
@@ -4,10 +4,10 @@
4
4
  [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fetro-js%2Fetro%2Fbadge&style=flat)](https://actions-badge.atrox.dev/etro-js/etro/goto)
5
5
  [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?style=flat&logo=discord&logoColor=white)](https://discord.gg/myrBsQ8Cht)
6
6
 
7
- Etro is a typescript framework for programmatically editing videos. It lets you
8
- composite layers and add filters (effects). Etro comes shipped with text, video,
9
- audio and image layers, along with a bunch of GLSL effects. You can also define
10
- your own layers and effects with javascript and GLSL.
7
+ Etro is a framework-agnostic TypeScript library for programmatically editing
8
+ videos. It lets you composite layers and add filters. Etro includes text, video,
9
+ audio and image layers, along with a variety of GLSL filters. You can also
10
+ define your own layers and filters with TypeScript and GLSL.
11
11
 
12
12
  ## Features
13
13
 
@@ -17,6 +17,7 @@ your own layers and effects with javascript and GLSL.
17
17
  - Manipulate audio with the web audio API *(audio effects coming soon)*
18
18
  - Define layer and effect parameters as keyframes or custom functions
19
19
  - Render to a blob in realtime *(offline rendering coming soon)*
20
+ - UI framework agnostic
20
21
 
21
22
  ## Installation
22
23
 
@@ -24,12 +25,6 @@ your own layers and effects with javascript and GLSL.
24
25
  npm i etro
25
26
  ```
26
27
 
27
- ### System Dependencies
28
-
29
- - `node-canvas`
30
-
31
- _If you have problems while installing `etro` you may need to manually install additional dependencies. See: [compiling node-canvas](https://github.com/Automattic/node-canvas?tab=readme-ov-file#compiling)_
32
-
33
28
  ## Basic Usage
34
29
 
35
30
  Let's look at an example:
@@ -84,8 +79,8 @@ To use Etro in Node, see the [wrapper](https://github.com/etro-js/etro-node):
84
79
 
85
80
  ## Running the Examples
86
81
 
87
- Start the development server (only used for convenience while developing; you
88
- don't need a server to use Etro):
82
+ Start the development server (used for convenience during development; Etro does
83
+ not require a server):
89
84
 
90
85
  ```
91
86
  npm i
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">51.16% </span>
26
+ <span class="strong">47.23% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>791/1546</span>
28
+ <span class='fraction'>802/1698</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">26.98% </span>
33
+ <span class="strong">23.71% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>180/667</span>
35
+ <span class='fraction'>185/780</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">48.68% </span>
40
+ <span class="strong">45.96% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>148/304</span>
42
+ <span class='fraction'>148/322</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">50.1% </span>
47
+ <span class="strong">46.36% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>714/1425</span>
49
+ <span class='fraction'>726/1566</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line low'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -79,63 +79,63 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file medium" data-value="src"><a href="src/index.html">src</a></td>
83
- <td data-value="51.17" class="pic medium">
84
- <div class="chart"><div class="cover-fill" style="width: 51%"></div><div class="cover-empty" style="width: 49%"></div></div>
82
+ <td class="file low" data-value="src"><a href="src/index.html">src</a></td>
83
+ <td data-value="44.5" class="pic low">
84
+ <div class="chart"><div class="cover-fill" style="width: 44%"></div><div class="cover-empty" style="width: 56%"></div></div>
85
85
  </td>
86
- <td data-value="51.17" class="pct medium">51.17%</td>
87
- <td data-value="299" class="abs medium">153/299</td>
88
- <td data-value="29.8" class="pct low">29.8%</td>
89
- <td data-value="151" class="abs low">45/151</td>
90
- <td data-value="61.36" class="pct medium">61.36%</td>
91
- <td data-value="44" class="abs medium">27/44</td>
92
- <td data-value="51.82" class="pct medium">51.82%</td>
93
- <td data-value="274" class="abs medium">142/274</td>
86
+ <td data-value="44.5" class="pct low">44.5%</td>
87
+ <td data-value="355" class="abs low">158/355</td>
88
+ <td data-value="22.72" class="pct low">22.72%</td>
89
+ <td data-value="198" class="abs low">45/198</td>
90
+ <td data-value="52.94" class="pct medium">52.94%</td>
91
+ <td data-value="51" class="abs medium">27/51</td>
92
+ <td data-value="44.54" class="pct low">44.54%</td>
93
+ <td data-value="330" class="abs low">147/330</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
97
97
  <td class="file low" data-value="src/effect"><a href="src/effect/index.html">src/effect</a></td>
98
- <td data-value="31.47" class="pic low">
98
+ <td data-value="31.04" class="pic low">
99
99
  <div class="chart"><div class="cover-fill" style="width: 31%"></div><div class="cover-empty" style="width: 69%"></div></div>
100
100
  </td>
101
- <td data-value="31.47" class="pct low">31.47%</td>
102
- <td data-value="556" class="abs low">175/556</td>
103
- <td data-value="1.58" class="pct low">1.58%</td>
104
- <td data-value="189" class="abs low">3/189</td>
105
- <td data-value="22" class="pct low">22%</td>
106
- <td data-value="100" class="abs low">22/100</td>
107
- <td data-value="28.11" class="pct low">28.11%</td>
108
- <td data-value="505" class="abs low">142/505</td>
101
+ <td data-value="31.04" class="pct low">31.04%</td>
102
+ <td data-value="567" class="abs low">176/567</td>
103
+ <td data-value="1.51" class="pct low">1.51%</td>
104
+ <td data-value="198" class="abs low">3/198</td>
105
+ <td data-value="21.56" class="pct low">21.56%</td>
106
+ <td data-value="102" class="abs low">22/102</td>
107
+ <td data-value="27.9" class="pct low">27.9%</td>
108
+ <td data-value="516" class="abs low">144/516</td>
109
109
  </tr>
110
110
 
111
111
  <tr>
112
112
  <td class="file medium" data-value="src/layer"><a href="src/layer/index.html">src/layer</a></td>
113
- <td data-value="58.52" class="pic medium">
114
- <div class="chart"><div class="cover-fill" style="width: 58%"></div><div class="cover-empty" style="width: 42%"></div></div>
113
+ <td data-value="56.71" class="pic medium">
114
+ <div class="chart"><div class="cover-fill" style="width: 56%"></div><div class="cover-empty" style="width: 44%"></div></div>
115
115
  </td>
116
- <td data-value="58.52" class="pct medium">58.52%</td>
117
- <td data-value="352" class="abs medium">206/352</td>
118
- <td data-value="25.32" class="pct low">25.32%</td>
119
- <td data-value="154" class="abs low">39/154</td>
120
- <td data-value="53.76" class="pct medium">53.76%</td>
121
- <td data-value="93" class="abs medium">50/93</td>
122
- <td data-value="58.03" class="pct medium">58.03%</td>
123
- <td data-value="336" class="abs medium">195/336</td>
116
+ <td data-value="56.71" class="pct medium">56.71%</td>
117
+ <td data-value="365" class="abs medium">207/365</td>
118
+ <td data-value="23.92" class="pct low">23.92%</td>
119
+ <td data-value="163" class="abs low">39/163</td>
120
+ <td data-value="52.63" class="pct medium">52.63%</td>
121
+ <td data-value="95" class="abs medium">50/95</td>
122
+ <td data-value="56.32" class="pct medium">56.32%</td>
123
+ <td data-value="348" class="abs medium">196/348</td>
124
124
  </tr>
125
125
 
126
126
  <tr>
127
127
  <td class="file medium" data-value="src/movie"><a href="src/movie/index.html">src/movie</a></td>
128
- <td data-value="75.81" class="pic medium">
129
- <div class="chart"><div class="cover-fill" style="width: 75%"></div><div class="cover-empty" style="width: 25%"></div></div>
128
+ <td data-value="63.5" class="pic medium">
129
+ <div class="chart"><div class="cover-fill" style="width: 63%"></div><div class="cover-empty" style="width: 37%"></div></div>
130
130
  </td>
131
- <td data-value="75.81" class="pct medium">75.81%</td>
132
- <td data-value="339" class="abs medium">257/339</td>
133
- <td data-value="53.75" class="pct medium">53.75%</td>
134
- <td data-value="173" class="abs medium">93/173</td>
135
- <td data-value="73.13" class="pct medium">73.13%</td>
136
- <td data-value="67" class="abs medium">49/67</td>
137
- <td data-value="75.8" class="pct medium">75.8%</td>
138
- <td data-value="310" class="abs medium">235/310</td>
131
+ <td data-value="63.5" class="pct medium">63.5%</td>
132
+ <td data-value="411" class="abs medium">261/411</td>
133
+ <td data-value="44.34" class="pct low">44.34%</td>
134
+ <td data-value="221" class="abs low">98/221</td>
135
+ <td data-value="66.21" class="pct medium">66.21%</td>
136
+ <td data-value="74" class="abs medium">49/74</td>
137
+ <td data-value="64.24" class="pct medium">64.24%</td>
138
+ <td data-value="372" class="abs medium">239/372</td>
139
139
  </tr>
140
140
 
141
141
  </tbody>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-03-18T02:03:15.743Z
149
+ at 2026-06-06T05:34:26.433Z
150
150
  </div>
151
151
  <script src="prettify.js"></script>
152
152
  <script>
@@ -116,14 +116,14 @@
116
116
  <span class="cline-any cline-neutral">&nbsp;</span>
117
117
  <span class="cline-any cline-yes">1x</span>
118
118
  <span class="cline-any cline-neutral">&nbsp;</span>
119
- <span class="cline-any cline-yes">6x</span>
119
+ <span class="cline-any cline-yes">9x</span>
120
120
  <span class="cline-any cline-neutral">&nbsp;</span>
121
- <span class="cline-any cline-yes">12x</span>
121
+ <span class="cline-any cline-yes">18x</span>
122
122
  <span class="cline-any cline-no">&nbsp;</span>
123
123
  <span class="cline-any cline-neutral">&nbsp;</span>
124
124
  <span class="cline-any cline-neutral">&nbsp;</span>
125
125
  <span class="cline-any cline-neutral">&nbsp;</span>
126
- <span class="cline-any cline-yes">6x</span>
126
+ <span class="cline-any cline-yes">9x</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
128
  <span class="cline-any cline-no">&nbsp;</span>
129
129
  <span class="cline-any cline-no">&nbsp;</span>
@@ -132,19 +132,19 @@
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
133
133
  <span class="cline-any cline-neutral">&nbsp;</span>
134
134
  <span class="cline-any cline-neutral">&nbsp;</span>
135
- <span class="cline-any cline-yes">10x</span>
136
- <span class="cline-any cline-yes">10x</span>
135
+ <span class="cline-any cline-yes">15x</span>
136
+ <span class="cline-any cline-yes">15x</span>
137
137
  <span class="cline-any cline-neutral">&nbsp;</span>
138
138
  <span class="cline-any cline-neutral">&nbsp;</span>
139
- <span class="cline-any cline-yes">10x</span>
140
- <span class="cline-any cline-yes">4x</span>
139
+ <span class="cline-any cline-yes">15x</span>
140
+ <span class="cline-any cline-yes">6x</span>
141
141
  <span class="cline-any cline-no">&nbsp;</span>
142
142
  <span class="cline-any cline-neutral">&nbsp;</span>
143
143
  <span class="cline-any cline-neutral">&nbsp;</span>
144
- <span class="cline-any cline-yes">4x</span>
144
+ <span class="cline-any cline-yes">6x</span>
145
145
  <span class="cline-any cline-neutral">&nbsp;</span>
146
146
  <span class="cline-any cline-neutral">&nbsp;</span>
147
- <span class="cline-any cline-yes">10x</span>
147
+ <span class="cline-any cline-yes">15x</span>
148
148
  <span class="cline-any cline-neutral">&nbsp;</span>
149
149
  <span class="cline-any cline-neutral">&nbsp;</span>
150
150
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -167,7 +167,7 @@ export class CustomArray&lt;T&gt; extends Array&lt;T&gt; {
167
167
  &nbsp;
168
168
  // Create proxy
169
169
  return new Proxy(target, {
170
- <span class="fstat-no" title="function not covered" > deleteProperty </span>(target, property): boolean {
170
+ deleteProperty<span class="fstat-no" title="function not covered" > (t</span>arget, property): boolean {
171
171
  const value = <span class="cstat-no" title="statement not covered" >target[property]</span>
172
172
  <span class="cstat-no" title="statement not covered" > delete target[property]</span>
173
173
  <span class="cstat-no" title="statement not covered" > listener.onRemove(value)</span>
@@ -199,7 +199,7 @@ export class CustomArray&lt;T&gt; extends Array&lt;T&gt; {
199
199
  <div class='footer quiet pad2 space-top1 center small'>
200
200
  Code coverage generated by
201
201
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
202
- at 2026-03-18T02:03:15.743Z
202
+ at 2026-06-06T05:34:26.433Z
203
203
  </div>
204
204
  <script src="../prettify.js"></script>
205
205
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">48.57% </span>
26
+ <span class="strong">40.42% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>17/35</span>
28
+ <span class='fraction'>19/47</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/10</span>
35
+ <span class='fraction'>0/19</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">7.69% </span>
40
+ <span class="strong">6.66% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/13</span>
42
+ <span class='fraction'>1/15</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">47.05% </span>
47
+ <span class="strong">40% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>16/34</span>
49
+ <span class='fraction'>18/45</span>
50
50
  </div>
51
51
 
52
52
 
@@ -179,9 +179,26 @@
179
179
  <a name='L114'></a><a href='#L114'>114</a>
180
180
  <a name='L115'></a><a href='#L115'>115</a>
181
181
  <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
183
199
  <span class="cline-any cline-neutral">&nbsp;</span>
184
200
  <span class="cline-any cline-neutral">&nbsp;</span>
201
+ <span class="cline-any cline-yes">1x</span>
185
202
  <span class="cline-any cline-neutral">&nbsp;</span>
186
203
  <span class="cline-any cline-neutral">&nbsp;</span>
187
204
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -289,6 +306,21 @@
289
306
  <span class="cline-any cline-yes">1x</span>
290
307
  <span class="cline-any cline-no">&nbsp;</span>
291
308
  <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-yes">1x</span>
311
+ <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
324
  <span class="cline-any cline-yes">1x</span>
293
325
  <span class="cline-any cline-neutral">&nbsp;</span>
294
326
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -298,6 +330,7 @@
298
330
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Movie } from '../movie'
299
331
  import { Base as BaseLayer } from '../layer/index'
300
332
  import BaseObject from '../object'
333
+ import { serializeProperty } from '../util'
301
334
  &nbsp;
302
335
  /**
303
336
  * @deprecated All visual effects now inherit from `Visual` instead
@@ -405,6 +438,21 @@ export class Base implements BaseObject {
405
438
  <span class="fstat-no" title="function not covered" > getDefaultOptions </span>(): Record&lt;string, unknown&gt; {
406
439
  <span class="cstat-no" title="statement not covered" > return {}</span>
407
440
  }
441
+ &nbsp;
442
+ <span class="fstat-no" title="function not covered" > toJSON </span>(): object {
443
+ const json: any = <span class="cstat-no" title="statement not covered" >{ type: `effect.${this.constructor.name}` }</span>
444
+ const exclude<span class="cstat-no" title="statement not covered" > = ['type', 'publicExcludes', 'propertyFilters', 'movie', 'ready', 'parent', 'currentTime', ...this.publicExcludes]</span>
445
+ <span class="cstat-no" title="statement not covered" > for (const key in this) {</span>
446
+ <span class="cstat-no" title="statement not covered" > if (key.startsWith('_') || exclude.indexOf(key) !== -1 || typeof (this as any)[key] === 'function') {</span>
447
+ <span class="cstat-no" title="statement not covered" > continue</span>
448
+ }
449
+ <span class="cstat-no" title="statement not covered" > json[key] = serializeProperty((this as any)[key])</span>
450
+ }
451
+ <span class="cstat-no" title="statement not covered" > if ((this as any).effects &amp;&amp; (this as any).effects.length &gt; 0) {</span>
452
+ <span class="cstat-no" title="statement not covered" > json.effects = (this as any).effects.map(<span class="fstat-no" title="function not covered" >(e</span>: any) =&gt; <span class="cstat-no" title="statement not covered" >e.toJSON())</span></span>
453
+ }
454
+ <span class="cstat-no" title="statement not covered" > return json</span>
455
+ }
408
456
  }
409
457
  // id for events (independent of instance, but easy to access when on prototype
410
458
  // chain)
@@ -418,7 +466,7 @@ Base.prototype.propertyFilters = {}
418
466
  <div class='footer quiet pad2 space-top1 center small'>
419
467
  Code coverage generated by
420
468
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
421
- at 2026-03-18T02:03:15.743Z
469
+ at 2026-06-06T05:34:26.433Z
422
470
  </div>
423
471
  <script src="../../prettify.js"></script>
424
472
  <script>
@@ -199,7 +199,7 @@ export class Brightness extends Shader {
199
199
  <div class='footer quiet pad2 space-top1 center small'>
200
200
  Code coverage generated by
201
201
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
202
- at 2026-03-18T02:03:15.743Z
202
+ at 2026-06-06T05:34:26.433Z
203
203
  </div>
204
204
  <script src="../../prettify.js"></script>
205
205
  <script>
@@ -220,7 +220,7 @@ export class Channels extends Shader {
220
220
  <div class='footer quiet pad2 space-top1 center small'>
221
221
  Code coverage generated by
222
222
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
223
- at 2026-03-18T02:03:15.743Z
223
+ at 2026-06-06T05:34:26.433Z
224
224
  </div>
225
225
  <script src="../../prettify.js"></script>
226
226
  <script>