framefields 2.0.11 → 2.1.1

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 (564) hide show
  1. package/README.md +22 -5
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +13 -12
  4. package/dist/{audio-BHanw8Jb.d.mts → audio-CfBpzxn9.d.mts} +3 -3
  5. package/dist/{audio-BHanw8Jb.d.mts.map → audio-CfBpzxn9.d.mts.map} +1 -1
  6. package/dist/{audio-TAvPwzLR.mjs → audio-DJeVoE8b.mjs} +1 -1
  7. package/dist/{audio-TAvPwzLR.mjs.map → audio-DJeVoE8b.mjs.map} +1 -1
  8. package/dist/{audio-COOMNwL5.mjs → audio-GGuQ_JI0.mjs} +4 -4
  9. package/dist/{audio-COOMNwL5.mjs.map → audio-GGuQ_JI0.mjs.map} +1 -1
  10. package/dist/{chunk-GMkBE123.mjs → chunk-GBe2k3y8.mjs} +1 -4
  11. package/dist/{dist-C_hjvkdN.mjs → dist-0QGroRYZ.mjs} +1 -1
  12. package/dist/{dist-C_hjvkdN.mjs.map → dist-0QGroRYZ.mjs.map} +1 -1
  13. package/dist/{dist-BYqNNwsl.mjs → dist-BY0bIWgr.mjs} +10 -2
  14. package/dist/dist-BY0bIWgr.mjs.map +1 -0
  15. package/dist/{dist-BAVZdFEJ.mjs → dist-Bb8BoMiw.mjs} +76 -626
  16. package/dist/dist-Bb8BoMiw.mjs.map +1 -0
  17. package/dist/{dist-Cxi68OuY.mjs → dist-DkuDAIrG.mjs} +26862 -25638
  18. package/dist/dist-DkuDAIrG.mjs.map +1 -0
  19. package/dist/{dist-CbG3QxDw.mjs → dist-fjKpBYkc.mjs} +12 -27
  20. package/dist/dist-fjKpBYkc.mjs.map +1 -0
  21. package/dist/effects/index.d.mts +4 -4
  22. package/dist/effects/index.mjs +36 -34
  23. package/dist/{effects-DzbjFhyA.mjs → effects-D6wFg2FR.mjs} +3 -3
  24. package/dist/{effects-DzbjFhyA.mjs.map → effects-D6wFg2FR.mjs.map} +1 -1
  25. package/dist/fonts/index.d.mts +1 -1
  26. package/dist/fonts/index.mjs +3 -1
  27. package/dist/{fonts-C0W6TgJk.mjs → fonts-CZMYtbP7.mjs} +24 -11
  28. package/dist/fonts-CZMYtbP7.mjs.map +1 -0
  29. package/dist/gpu-DG3gI88-.mjs +215 -0
  30. package/dist/gpu-DG3gI88-.mjs.map +1 -0
  31. package/dist/{index-DRZu3ezy.d.mts → index--0vVZDPM.d.mts} +3 -3
  32. package/dist/{index-DRZu3ezy.d.mts.map → index--0vVZDPM.d.mts.map} +1 -1
  33. package/dist/{index-DnWsbbuZ.d.mts → index-BcA8rep0.d.mts} +7 -2
  34. package/dist/index-BcA8rep0.d.mts.map +1 -0
  35. package/dist/{index-DGJp1d30.d.mts → index-BzQc812z.d.mts} +3 -3
  36. package/dist/{index-DGJp1d30.d.mts.map → index-BzQc812z.d.mts.map} +1 -1
  37. package/dist/{index-DDEPvMww.d.mts → index-Cpkzy5XR.d.mts} +3452 -1675
  38. package/dist/index-Cpkzy5XR.d.mts.map +1 -0
  39. package/dist/{index-CDoTrMs1.d.mts → index-D__HdInU.d.mts} +8 -8
  40. package/dist/{index-CDoTrMs1.d.mts.map → index-D__HdInU.d.mts.map} +1 -1
  41. package/dist/{index-CYGpSVsf.d.mts → index-DpWia6iH.d.mts} +4 -11
  42. package/dist/index-DpWia6iH.d.mts.map +1 -0
  43. package/dist/{index-9B8CJowc.d.mts → index-Fciq8bcC.d.mts} +10 -2
  44. package/dist/index-Fciq8bcC.d.mts.map +1 -0
  45. package/dist/index.d.mts +29 -1842
  46. package/dist/index.d.mts.map +1 -1
  47. package/dist/index.mjs +79 -66
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/preview/index.d.mts +2 -2
  50. package/dist/preview/index.mjs +12 -13
  51. package/dist/{preview-BV2C4Fk6.mjs → preview--rOXbBxl.mjs} +3 -4
  52. package/dist/preview--rOXbBxl.mjs.map +1 -0
  53. package/dist/preview-engine/audio.mjs +1 -1
  54. package/dist/preview-engine/chunk-2MZXSWVT.mjs +118 -0
  55. package/dist/preview-engine/{chunk-Y6HWYPKX.mjs → chunk-3GNP7TJH.mjs} +3 -3
  56. package/dist/preview-engine/chunk-3UPI4EPV.mjs +69 -0
  57. package/dist/preview-engine/{chunk-6JW37VJA.mjs → chunk-5AUB4Y3L.mjs} +3 -23
  58. package/dist/preview-engine/chunk-5DOD2NVY.mjs +26 -0
  59. package/dist/preview-engine/chunk-5FC7GOWW.mjs +474 -0
  60. package/dist/preview-engine/chunk-5W4AFQP7.mjs +97 -0
  61. package/dist/preview-engine/chunk-63SFBHEH.mjs +1 -0
  62. package/dist/preview-engine/{chunk-25IW7NYO.mjs → chunk-7EPDVSCL.mjs} +1 -1
  63. package/dist/preview-engine/chunk-7EPIRODI.mjs +91 -0
  64. package/dist/preview-engine/chunk-7J2FWGVD.mjs +1 -0
  65. package/dist/preview-engine/chunk-AXHB4J37.mjs +147 -0
  66. package/dist/preview-engine/chunk-AXQZX3TC.mjs +450 -0
  67. package/dist/preview-engine/chunk-B43Z3J7J.mjs +5 -0
  68. package/dist/preview-engine/chunk-BWJS6G7R.mjs +314 -0
  69. package/dist/preview-engine/{chunk-ECPP3UG6.mjs → chunk-E3HC4GRQ.mjs} +3 -23
  70. package/dist/preview-engine/{chunk-AEK5BO3J.mjs → chunk-E4RAFHZM.mjs} +1 -1
  71. package/dist/preview-engine/chunk-ENKKLU7B.mjs +22 -0
  72. package/dist/preview-engine/{chunk-IYVN2QEL.mjs → chunk-FLPSWDX4.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-24DXIKXL.mjs → chunk-FPRXK2WD.mjs} +2 -2
  74. package/dist/preview-engine/chunk-FU7AIAMM.mjs +88 -0
  75. package/dist/preview-engine/{chunk-CBM7B7EW.mjs → chunk-GMGGDADT.mjs} +1 -1
  76. package/dist/preview-engine/chunk-GSFN4WCH.mjs +62 -0
  77. package/dist/preview-engine/chunk-IQC2I5A5.mjs +1 -0
  78. package/dist/preview-engine/chunk-IUPDOATX.mjs +114 -0
  79. package/dist/preview-engine/{chunk-GHMCGTJ2.mjs → chunk-J2R5R7YY.mjs} +3 -23
  80. package/dist/preview-engine/chunk-JAJOZG5P.mjs +1 -0
  81. package/dist/preview-engine/{chunk-XLFYM7KH.mjs → chunk-K773AOF3.mjs} +2 -2
  82. package/dist/preview-engine/{chunk-RJUAM52F.mjs → chunk-L3CHEZMZ.mjs} +3 -23
  83. package/dist/preview-engine/chunk-LBRVQ4GE.mjs +84 -0
  84. package/dist/preview-engine/chunk-LGVEFPOG.mjs +3 -0
  85. package/dist/preview-engine/{chunk-AMBSW6OA.mjs → chunk-NEE3KQTX.mjs} +2 -2
  86. package/dist/preview-engine/chunk-NPD6W3RP.mjs +1 -0
  87. package/dist/preview-engine/{chunk-V6VU46ZG.mjs → chunk-O2RNIQXT.mjs} +1 -1
  88. package/dist/preview-engine/{server-utils-2FAIV45N.mjs → chunk-OCX5AD23.mjs} +1 -1
  89. package/dist/preview-engine/chunk-OJ2PKBXE.mjs +40 -0
  90. package/dist/preview-engine/chunk-OKH2VU2U.mjs +97 -0
  91. package/dist/preview-engine/chunk-PAQNDZQB.mjs +83 -0
  92. package/dist/preview-engine/chunk-PEWYB6WP.mjs +43 -0
  93. package/dist/preview-engine/{chunk-MDDF2GCF.mjs → chunk-PFA427ZC.mjs} +3 -23
  94. package/dist/preview-engine/chunk-PL4IH5V4.mjs +89 -0
  95. package/dist/preview-engine/chunk-PNB3ERR3.mjs +1 -0
  96. package/dist/preview-engine/{chunk-PQD5UPHG.mjs → chunk-PR2BUYCL.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-QYRDQMNB.mjs → chunk-PXT52LEH.mjs} +3 -23
  98. package/dist/preview-engine/{chunk-ZSIJB76A.mjs → chunk-Q2DPNVIA.mjs} +2 -2
  99. package/dist/preview-engine/chunk-Q4Z54DQ7.mjs +1 -0
  100. package/dist/preview-engine/{chunk-6256GQFP.mjs → chunk-QY7MHWZW.mjs} +1 -1
  101. package/dist/preview-engine/chunk-RQLMW6MA.mjs +4 -0
  102. package/dist/preview-engine/chunk-RSMO7NPN.mjs +1 -0
  103. package/dist/preview-engine/chunk-RW2F3XLQ.mjs +90 -0
  104. package/dist/preview-engine/chunk-SGPRLTNF.mjs +52 -0
  105. package/dist/preview-engine/{chunk-Y6FEU4TV.mjs → chunk-SZW5J72T.mjs} +3 -23
  106. package/dist/preview-engine/{chunk-LIHUEYI5.mjs → chunk-VO2R3DWV.mjs} +2 -2
  107. package/dist/preview-engine/{chunk-BJKH76OM.mjs → chunk-VXS5SIEC.mjs} +3 -23
  108. package/dist/preview-engine/chunk-WFGJXCZT.mjs +53 -0
  109. package/dist/preview-engine/chunk-WH5Q2NFN.mjs +32 -0
  110. package/dist/preview-engine/chunk-WSIURGP2.mjs +121 -0
  111. package/dist/preview-engine/{chunk-AWTH2WZO.mjs → chunk-WUKH7BD7.mjs} +1 -1
  112. package/dist/preview-engine/chunk-XC5WZNOY.mjs +1448 -0
  113. package/dist/preview-engine/chunk-YQZOGEPZ.mjs +186 -0
  114. package/dist/preview-engine/{chunk-D3TETPLI.mjs → chunk-ZH5MZQTZ.mjs} +1 -1
  115. package/dist/preview-engine/chunk-ZIIFTWDH.mjs +58 -0
  116. package/dist/preview-engine/{chunk-EQ4QZRXB.mjs → chunk-ZNL4W4DK.mjs} +2 -2
  117. package/dist/preview-engine/effects.mjs +1 -1
  118. package/dist/preview-engine/fonts.mjs +1 -1
  119. package/dist/preview-engine/framefields.mjs +127 -130
  120. package/dist/preview-engine/player.mjs +6 -6
  121. package/dist/preview-engine/renderers-2H7YEUTD.mjs +1 -0
  122. package/dist/preview-engine/renderers-2P6KXWEZ.mjs +1 -0
  123. package/dist/preview-engine/renderers-2SVWAB42.mjs +1 -0
  124. package/dist/preview-engine/renderers-3RC5FDWX.mjs +1 -0
  125. package/dist/preview-engine/renderers-3T7Q4SPP.mjs +1 -0
  126. package/dist/preview-engine/renderers-4DV4REGM.mjs +1 -0
  127. package/dist/preview-engine/renderers-57WDL6XN.mjs +1 -0
  128. package/dist/preview-engine/renderers-6WH7NZCC.mjs +1 -0
  129. package/dist/preview-engine/renderers-7JTNJE7M.mjs +1 -0
  130. package/dist/preview-engine/renderers-7VJN5L3Z.mjs +1 -0
  131. package/dist/preview-engine/{renderers-WLH4HRUE.mjs → renderers-A7VH3ON5.mjs} +1 -1
  132. package/dist/preview-engine/renderers-CQXQHOW2.mjs +1 -0
  133. package/dist/preview-engine/{renderers-2US2NIUG.mjs → renderers-D2EJULOJ.mjs} +3 -23
  134. package/dist/preview-engine/renderers-DXHJAMZR.mjs +1 -0
  135. package/dist/preview-engine/{renderers-W5CVDJVH.mjs → renderers-F55XFVMP.mjs} +1 -1
  136. package/dist/preview-engine/renderers-FWGMNPYB.mjs +1 -0
  137. package/dist/preview-engine/renderers-HXFRTIJD.mjs +1 -0
  138. package/dist/preview-engine/renderers-IWQ3V6AJ.mjs +1 -0
  139. package/dist/preview-engine/renderers-IXGM55XK.mjs +1 -0
  140. package/dist/preview-engine/renderers-KVHUVWSN.mjs +1 -0
  141. package/dist/preview-engine/renderers-KZWGSKRF.mjs +1 -0
  142. package/dist/preview-engine/renderers-LVDUZZ75.mjs +1 -0
  143. package/dist/preview-engine/renderers-M7R2ZJUP.mjs +1 -0
  144. package/dist/preview-engine/renderers-NWHS7N2L.mjs +1 -0
  145. package/dist/preview-engine/{renderers-CAUWP4XH.mjs → renderers-O2DZPBOJ.mjs} +3 -23
  146. package/dist/preview-engine/renderers-OT7D3BUA.mjs +1 -0
  147. package/dist/preview-engine/renderers-P4S7GL64.mjs +104 -0
  148. package/dist/preview-engine/renderers-PMOO7DLX.mjs +1 -0
  149. package/dist/preview-engine/renderers-Q4OFCMXI.mjs +1 -0
  150. package/dist/preview-engine/renderers-QCCPCH73.mjs +1 -0
  151. package/dist/preview-engine/renderers-RJO6H4FC.mjs +1 -0
  152. package/dist/preview-engine/renderers-RRXFJRGI.mjs +1 -0
  153. package/dist/preview-engine/renderers-SCJ6OKTB.mjs +1 -0
  154. package/dist/preview-engine/renderers-T4JMJXWL.mjs +1 -0
  155. package/dist/preview-engine/renderers-TAWT3ZSS.mjs +1 -0
  156. package/dist/preview-engine/{renderers-JQHUBWLL.mjs → renderers-TFZST6WW.mjs} +3 -23
  157. package/dist/preview-engine/renderers-UHTO6BQA.mjs +1 -0
  158. package/dist/preview-engine/renderers-UPKB5OLS.mjs +100 -0
  159. package/dist/preview-engine/renderers-UPTJJE5F.mjs +1 -0
  160. package/dist/preview-engine/renderers-VLMQR3DW.mjs +1 -0
  161. package/dist/preview-engine/renderers-WVTTRCVI.mjs +1 -0
  162. package/dist/preview-engine/renderers-X5PUIPU5.mjs +1 -0
  163. package/dist/preview-engine/renderers-XCMVZ2XG.mjs +35 -0
  164. package/dist/preview-engine/renderers-XHTMRXC5.mjs +1 -0
  165. package/dist/preview-engine/renderers-YDCDY3BR.mjs +1 -0
  166. package/dist/preview-engine/renderers-YECY2YFT.mjs +1 -0
  167. package/dist/preview-engine/renderers-YJNQ4B7B.mjs +1 -0
  168. package/dist/preview-engine/renderers-YMN6QXK7.mjs +1 -0
  169. package/dist/preview-engine/renderers-YZEVPHPQ.mjs +228 -0
  170. package/dist/preview-engine/renderers-Z7YQUFAY.mjs +1 -0
  171. package/dist/preview-engine/renderers-ZANPE3OK.mjs +1 -0
  172. package/dist/preview-engine/renderers-ZJTRANIX.mjs +1 -0
  173. package/dist/preview-engine/signals.mjs +1 -1
  174. package/dist/preview-engine/skia-canvas-QBXAOGPB.mjs +1 -0
  175. package/dist/{program-BmNKgzja.mjs → program-Cc5AsBHz.mjs} +93 -2335
  176. package/dist/program-Cc5AsBHz.mjs.map +1 -0
  177. package/dist/renderer/index.d.mts +2 -2
  178. package/dist/renderer/index.mjs +3 -4
  179. package/dist/renderer-1VSi7Vum.mjs +5 -0
  180. package/dist/renderer-4BlpUHQT.mjs +5 -0
  181. package/dist/{renderer-Bv21DbWy.mjs → renderer-9L0p8IT3.mjs} +3 -1
  182. package/dist/renderer-AzSX2-mZ.mjs +5 -0
  183. package/dist/renderer-B-cxK24t.mjs +5 -0
  184. package/dist/{renderer-DxTs4Iyi.mjs → renderer-B1Zn91xt.mjs} +40 -142
  185. package/dist/renderer-B1Zn91xt.mjs.map +1 -0
  186. package/dist/renderer-B5d5oM_D.mjs +5 -0
  187. package/dist/renderer-B8BdNjaN.mjs +5 -0
  188. package/dist/{renderer-Bhdf90Zq.mjs → renderer-BI5rvAyo.mjs} +51 -163
  189. package/dist/renderer-BI5rvAyo.mjs.map +1 -0
  190. package/dist/renderer-BKEfeg-4.mjs +5 -0
  191. package/dist/{renderer-CI7sG_cv.mjs → renderer-BKf1qDwL.mjs} +83 -266
  192. package/dist/renderer-BKf1qDwL.mjs.map +1 -0
  193. package/dist/renderer-BLLOkeFB.mjs +5 -0
  194. package/dist/renderer-BSitV56h.mjs +268 -0
  195. package/dist/renderer-BSitV56h.mjs.map +1 -0
  196. package/dist/renderer-BTvov1NH.mjs +5 -0
  197. package/dist/renderer-BVun05IK.mjs +5 -0
  198. package/dist/{renderer-B2ieylQ3.mjs → renderer-BWVsBB3t.mjs} +56 -167
  199. package/dist/renderer-BWVsBB3t.mjs.map +1 -0
  200. package/dist/{renderer-ChdLYS-G.mjs → renderer-BXQQxeNC.mjs} +20 -87
  201. package/dist/renderer-BXQQxeNC.mjs.map +1 -0
  202. package/dist/renderer-B_3h5nhy.mjs +5 -0
  203. package/dist/renderer-BaZjoFYK.mjs +5 -0
  204. package/dist/{renderer-CfC_aiew.mjs → renderer-BaaOR3Ao.mjs} +57 -192
  205. package/dist/renderer-BaaOR3Ao.mjs.map +1 -0
  206. package/dist/{renderer-bZU_ndxf.mjs → renderer-BajIOuZH.mjs} +2 -2
  207. package/dist/{renderer-bZU_ndxf.mjs.map → renderer-BajIOuZH.mjs.map} +1 -1
  208. package/dist/{renderer-CWTpc4ff.mjs → renderer-Bb8T5eRX.mjs} +76 -210
  209. package/dist/renderer-Bb8T5eRX.mjs.map +1 -0
  210. package/dist/{renderer-D2nCGcjv.mjs → renderer-Bc6J0iVG.mjs} +3 -3
  211. package/dist/{renderer-D2nCGcjv.mjs.map → renderer-Bc6J0iVG.mjs.map} +1 -1
  212. package/dist/renderer-BcApaCVe.mjs +5 -0
  213. package/dist/{renderer-D_1oDOCP.mjs → renderer-Bg7647VN.mjs} +14 -69
  214. package/dist/renderer-Bg7647VN.mjs.map +1 -0
  215. package/dist/{renderer-ho_jXJ0H.mjs → renderer-BhKIZDsm.mjs} +23 -117
  216. package/dist/renderer-BhKIZDsm.mjs.map +1 -0
  217. package/dist/{renderer-dncoIVdd.mjs → renderer-BhhSyHKF.mjs} +3 -1
  218. package/dist/{renderer-CXn5HAnK.mjs → renderer-Br9BOkQs.mjs} +10 -16
  219. package/dist/renderer-Br9BOkQs.mjs.map +1 -0
  220. package/dist/{renderer-BTdOMMEx.d.mts → renderer-Bs_f_App.d.mts} +2 -2
  221. package/dist/{renderer-BTdOMMEx.d.mts.map → renderer-Bs_f_App.d.mts.map} +1 -1
  222. package/dist/{renderer-DZGtBUCx.mjs → renderer-BygIYH8s.mjs} +35 -185
  223. package/dist/renderer-BygIYH8s.mjs.map +1 -0
  224. package/dist/{renderer-Bv6q84TU.mjs → renderer-C--Dqe-3.mjs} +61 -208
  225. package/dist/renderer-C--Dqe-3.mjs.map +1 -0
  226. package/dist/renderer-C14mKYCw.mjs +5 -0
  227. package/dist/{renderer-CnXW28b9.mjs → renderer-C27RfwXN.mjs} +85 -279
  228. package/dist/renderer-C27RfwXN.mjs.map +1 -0
  229. package/dist/{renderer-Dy0utCl7.mjs → renderer-C5caYAA3.mjs} +10 -17
  230. package/dist/renderer-C5caYAA3.mjs.map +1 -0
  231. package/dist/{renderer-Bfgd4N0O.mjs → renderer-C5zpaQed.mjs} +9 -16
  232. package/dist/renderer-C5zpaQed.mjs.map +1 -0
  233. package/dist/{renderer-cgxO2xN6.mjs → renderer-C7UZLOYk.mjs} +10 -17
  234. package/dist/renderer-C7UZLOYk.mjs.map +1 -0
  235. package/dist/{renderer-BJ1aTkZf.mjs → renderer-C92mwhZz.mjs} +99 -282
  236. package/dist/renderer-C92mwhZz.mjs.map +1 -0
  237. package/dist/{renderer-CepMDQ06.mjs → renderer-CAJe9eLS.mjs} +19 -106
  238. package/dist/renderer-CAJe9eLS.mjs.map +1 -0
  239. package/dist/renderer-CFqhAXkH.mjs +5 -0
  240. package/dist/renderer-CK-spD4j.mjs +5 -0
  241. package/dist/renderer-CLLzQTIk.mjs +5 -0
  242. package/dist/{renderer-CtyD_Xju.mjs → renderer-CMsjnZ0G.mjs} +59 -194
  243. package/dist/renderer-CMsjnZ0G.mjs.map +1 -0
  244. package/dist/renderer-COwa6xlF.mjs +5 -0
  245. package/dist/renderer-CQPuuoVf.mjs +6 -0
  246. package/dist/renderer-CRd-cDqZ.mjs +5 -0
  247. package/dist/renderer-CTVnQAUm.mjs +5 -0
  248. package/dist/renderer-CbiEBSGx.mjs +5 -0
  249. package/dist/renderer-Cl7PruQ1.mjs +5 -0
  250. package/dist/renderer-CmuGGUDR.mjs +5 -0
  251. package/dist/renderer-CoGP4Mvf.mjs +148 -0
  252. package/dist/renderer-CoGP4Mvf.mjs.map +1 -0
  253. package/dist/renderer-CoNRrfqx.mjs +5 -0
  254. package/dist/{renderer-BREIjsUU.mjs → renderer-CrAqu3Rg.mjs} +14 -40
  255. package/dist/renderer-CrAqu3Rg.mjs.map +1 -0
  256. package/dist/renderer-CvIGa0mE.mjs +5 -0
  257. package/dist/renderer-CwMDPv0p.mjs +5 -0
  258. package/dist/{renderer-BIIWCg_J.mjs → renderer-CydWqyf0.mjs} +11 -18
  259. package/dist/renderer-CydWqyf0.mjs.map +1 -0
  260. package/dist/{renderer-bsWnRNpJ.mjs → renderer-CzBQgGD2.mjs} +29 -98
  261. package/dist/renderer-CzBQgGD2.mjs.map +1 -0
  262. package/dist/{renderer-CdciwwMI.mjs → renderer-D0aZNkQE.mjs} +161 -457
  263. package/dist/renderer-D0aZNkQE.mjs.map +1 -0
  264. package/dist/{renderer-B8UaFNqb.mjs → renderer-D2BRlqof.mjs} +62 -209
  265. package/dist/renderer-D2BRlqof.mjs.map +1 -0
  266. package/dist/{renderer-B8-kzZdP.mjs → renderer-D2FFvxsq.mjs} +41 -140
  267. package/dist/renderer-D2FFvxsq.mjs.map +1 -0
  268. package/dist/{renderer-Ctk2zzfy.mjs → renderer-D8-zNjyz.mjs} +57 -197
  269. package/dist/renderer-D8-zNjyz.mjs.map +1 -0
  270. package/dist/{renderer-DML9qpmS.mjs → renderer-DDqwds9R.mjs} +52 -202
  271. package/dist/renderer-DDqwds9R.mjs.map +1 -0
  272. package/dist/{renderer-BSaYG8aw.mjs → renderer-DGtBOdst.mjs} +3 -1
  273. package/dist/{renderer-CzPWB0Ss.mjs → renderer-DKqG9Lek.mjs} +13 -45
  274. package/dist/renderer-DKqG9Lek.mjs.map +1 -0
  275. package/dist/renderer-DOHbhGPu.mjs +5 -0
  276. package/dist/renderer-DOmA6IKc.mjs +5 -0
  277. package/dist/{renderer-DirxsOjq.mjs → renderer-DUhXH5Tz.mjs} +80 -258
  278. package/dist/renderer-DUhXH5Tz.mjs.map +1 -0
  279. package/dist/{renderer-kwmlLQOO.mjs → renderer-DVnVnS3c.mjs} +4 -4
  280. package/dist/{renderer-kwmlLQOO.mjs.map → renderer-DVnVnS3c.mjs.map} +1 -1
  281. package/dist/{renderer-CaaOKMSd.mjs → renderer-DWEvQ-hQ.mjs} +63 -190
  282. package/dist/renderer-DWEvQ-hQ.mjs.map +1 -0
  283. package/dist/renderer-DX2qEJTL.mjs +2173 -0
  284. package/dist/renderer-DX2qEJTL.mjs.map +1 -0
  285. package/dist/{renderer-1VuQTY1Z.mjs → renderer-DX8aBDqR.mjs} +236 -96
  286. package/dist/renderer-DX8aBDqR.mjs.map +1 -0
  287. package/dist/{renderer-DEJwPRkR.mjs → renderer-DYIPWN_B.mjs} +15 -51
  288. package/dist/renderer-DYIPWN_B.mjs.map +1 -0
  289. package/dist/{renderer-Djlb4TLO.mjs → renderer-DZD2G76E.mjs} +8 -15
  290. package/dist/renderer-DZD2G76E.mjs.map +1 -0
  291. package/dist/{renderer-WSGuj_V6.mjs → renderer-Da06_9FZ.mjs} +4 -3
  292. package/dist/{renderer-WSGuj_V6.mjs.map → renderer-Da06_9FZ.mjs.map} +1 -1
  293. package/dist/{renderer-BM05sB8m.mjs → renderer-DkyXqrQ6.mjs} +11 -74
  294. package/dist/renderer-DkyXqrQ6.mjs.map +1 -0
  295. package/dist/renderer-DmCWc4JL.mjs +5 -0
  296. package/dist/{renderer-BDbTWSpP.mjs → renderer-Dno-fujw.mjs} +58 -234
  297. package/dist/renderer-Dno-fujw.mjs.map +1 -0
  298. package/dist/{renderer-D2XD4QYk.mjs → renderer-DoYdfDEA.mjs} +34 -147
  299. package/dist/renderer-DoYdfDEA.mjs.map +1 -0
  300. package/dist/{renderer-_uvdg48N.mjs → renderer-DqjITuT-.mjs} +24 -93
  301. package/dist/renderer-DqjITuT-.mjs.map +1 -0
  302. package/dist/renderer-DuuOlYIG.mjs +3 -0
  303. package/dist/{renderer-DIgsilTw.mjs → renderer-Dy-DBU0X.mjs} +5 -4
  304. package/dist/{renderer-DIgsilTw.mjs.map → renderer-Dy-DBU0X.mjs.map} +1 -1
  305. package/dist/{renderer-CpkiHRhh.mjs → renderer-DyzNM721.mjs} +17 -99
  306. package/dist/renderer-DyzNM721.mjs.map +1 -0
  307. package/dist/{renderer-C_TPMHiH.mjs → renderer-DzrM1KMN.mjs} +81 -221
  308. package/dist/renderer-DzrM1KMN.mjs.map +1 -0
  309. package/dist/{renderer-Bc04fivZ.mjs → renderer-FHyZn0em.mjs} +99 -287
  310. package/dist/renderer-FHyZn0em.mjs.map +1 -0
  311. package/dist/renderer-GSFP7v2z.mjs +3 -0
  312. package/dist/{renderer-DpGc-N3G.mjs → renderer-NXdm6HLb.mjs} +24 -104
  313. package/dist/renderer-NXdm6HLb.mjs.map +1 -0
  314. package/dist/renderer-OLaYikwi.mjs +5 -0
  315. package/dist/renderer-Q75RC5Uz.mjs +5 -0
  316. package/dist/renderer-T0LJ4Po3.mjs +5 -0
  317. package/dist/renderer-VuXt1hfq.mjs +5 -0
  318. package/dist/{renderer-BfAWZziM.mjs → renderer-_1xGBbxn.mjs} +58 -225
  319. package/dist/renderer-_1xGBbxn.mjs.map +1 -0
  320. package/dist/{renderer-B1YMwl2B.mjs → renderer-c4AorKyw.mjs} +3 -1
  321. package/dist/renderer-hY_2WLt3.mjs +5 -0
  322. package/dist/{renderer-BhZZEyFX.mjs → renderer-mp1NN5zk.mjs} +4 -4
  323. package/dist/{renderer-BhZZEyFX.mjs.map → renderer-mp1NN5zk.mjs.map} +1 -1
  324. package/dist/{renderer-D7zvPHKn.mjs → renderer-qsg-JMuN.mjs} +18 -28
  325. package/dist/renderer-qsg-JMuN.mjs.map +1 -0
  326. package/dist/{renderer-vqkKWqa5.mjs → renderer-timEC0Gl.mjs} +23 -107
  327. package/dist/renderer-timEC0Gl.mjs.map +1 -0
  328. package/dist/renderer-y4EqE06a.mjs +5 -0
  329. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs → renderers-CP8CFWDs-CMYe4kvZ.mjs} +4 -4
  330. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs.map → renderers-CP8CFWDs-CMYe4kvZ.mjs.map} +1 -1
  331. package/dist/signals/index.d.mts +6 -6
  332. package/dist/signals/index.mjs +8 -8
  333. package/dist/{signals-Bv1OweKd.mjs → signals-DGRs6ddH.mjs} +4 -4
  334. package/dist/{signals-Bv1OweKd.mjs.map → signals-DGRs6ddH.mjs.map} +1 -1
  335. package/package.json +55 -55
  336. package/dist/client-CwRhflHE.mjs +0 -66
  337. package/dist/client-CwRhflHE.mjs.map +0 -1
  338. package/dist/dist-BAVZdFEJ.mjs.map +0 -1
  339. package/dist/dist-BYqNNwsl.mjs.map +0 -1
  340. package/dist/dist-CbG3QxDw.mjs.map +0 -1
  341. package/dist/dist-Cxi68OuY.mjs.map +0 -1
  342. package/dist/dist-cjs--lfMLs3U.mjs +0 -66
  343. package/dist/dist-cjs--lfMLs3U.mjs.map +0 -1
  344. package/dist/dist-cjs--pxyGFw2.mjs +0 -43
  345. package/dist/dist-cjs--pxyGFw2.mjs.map +0 -1
  346. package/dist/dist-cjs-3pon9kTt.mjs +0 -6
  347. package/dist/dist-cjs-BDpO-TH_.mjs +0 -51
  348. package/dist/dist-cjs-BDpO-TH_.mjs.map +0 -1
  349. package/dist/dist-cjs-BiKQozdJ.mjs +0 -64
  350. package/dist/dist-cjs-BiKQozdJ.mjs.map +0 -1
  351. package/dist/dist-cjs-BmyyWYWv.mjs +0 -153
  352. package/dist/dist-cjs-BmyyWYWv.mjs.map +0 -1
  353. package/dist/dist-cjs-CND_ghfH.mjs +0 -98
  354. package/dist/dist-cjs-CND_ghfH.mjs.map +0 -1
  355. package/dist/dist-cjs-CQwmMllY.mjs +0 -137
  356. package/dist/dist-cjs-CQwmMllY.mjs.map +0 -1
  357. package/dist/dist-cjs-CgFzrgj8.mjs +0 -85
  358. package/dist/dist-cjs-CgFzrgj8.mjs.map +0 -1
  359. package/dist/dist-cjs-CsU2sZoX.mjs +0 -323
  360. package/dist/dist-cjs-CsU2sZoX.mjs.map +0 -1
  361. package/dist/dist-cjs-DJ8fcQEe.mjs +0 -9069
  362. package/dist/dist-cjs-DJ8fcQEe.mjs.map +0 -1
  363. package/dist/dist-cjs-DT2jJlcK.mjs +0 -181
  364. package/dist/dist-cjs-DT2jJlcK.mjs.map +0 -1
  365. package/dist/dist-cjs-DjzmP0-x.mjs +0 -1091
  366. package/dist/dist-cjs-DjzmP0-x.mjs.map +0 -1
  367. package/dist/dist-cjs-DzjrlfbE.mjs +0 -437
  368. package/dist/dist-cjs-DzjrlfbE.mjs.map +0 -1
  369. package/dist/dist-cjs-M-8QOgS_.mjs +0 -209
  370. package/dist/dist-cjs-M-8QOgS_.mjs.map +0 -1
  371. package/dist/dist-cjs-TsA8LFXC.mjs +0 -48
  372. package/dist/dist-cjs-TsA8LFXC.mjs.map +0 -1
  373. package/dist/dist-cjs-agQl9T8M.mjs +0 -5015
  374. package/dist/dist-cjs-agQl9T8M.mjs.map +0 -1
  375. package/dist/event-streams-BaNGaLxh.mjs +0 -204
  376. package/dist/event-streams-BaNGaLxh.mjs.map +0 -1
  377. package/dist/fonts-C0W6TgJk.mjs.map +0 -1
  378. package/dist/index-9B8CJowc.d.mts.map +0 -1
  379. package/dist/index-CYGpSVsf.d.mts.map +0 -1
  380. package/dist/index-DDEPvMww.d.mts.map +0 -1
  381. package/dist/index-DnWsbbuZ.d.mts.map +0 -1
  382. package/dist/package-XpCRbTOA.mjs +0 -6
  383. package/dist/package-XpCRbTOA.mjs.map +0 -1
  384. package/dist/preview-BV2C4Fk6.mjs.map +0 -1
  385. package/dist/preview-engine/chunk-36YGYLKD.mjs +0 -58
  386. package/dist/preview-engine/chunk-7O24H4YT.mjs +0 -117
  387. package/dist/preview-engine/chunk-AUFSM5KI.mjs +0 -141
  388. package/dist/preview-engine/chunk-BHFI3Y4T.mjs +0 -1
  389. package/dist/preview-engine/chunk-BQ65MU6H.mjs +0 -138
  390. package/dist/preview-engine/chunk-BWDARDO6.mjs +0 -117
  391. package/dist/preview-engine/chunk-DLXQDDIN.mjs +0 -46
  392. package/dist/preview-engine/chunk-EJGLUZMW.mjs +0 -1
  393. package/dist/preview-engine/chunk-FE6RSVKZ.mjs +0 -73
  394. package/dist/preview-engine/chunk-FGHOHCFG.mjs +0 -110
  395. package/dist/preview-engine/chunk-HPIULG7P.mjs +0 -111
  396. package/dist/preview-engine/chunk-HRIKNYPF.mjs +0 -60
  397. package/dist/preview-engine/chunk-IMV5SBQV.mjs +0 -1
  398. package/dist/preview-engine/chunk-JPXQPP6J.mjs +0 -1
  399. package/dist/preview-engine/chunk-K52S5DJX.mjs +0 -109
  400. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +0 -474
  401. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +0 -3
  402. package/dist/preview-engine/chunk-MJM3NFEC.mjs +0 -315
  403. package/dist/preview-engine/chunk-NFAGEP43.mjs +0 -1448
  404. package/dist/preview-engine/chunk-NRHSNPZV.mjs +0 -182
  405. package/dist/preview-engine/chunk-OWOSYNMF.mjs +0 -104
  406. package/dist/preview-engine/chunk-Q66QQI6N.mjs +0 -8
  407. package/dist/preview-engine/chunk-QGBSLNFI.mjs +0 -52
  408. package/dist/preview-engine/chunk-QM3XFEJN.mjs +0 -63
  409. package/dist/preview-engine/chunk-R3ZH7YF3.mjs +0 -89
  410. package/dist/preview-engine/chunk-R6YNSBKL.mjs +0 -108
  411. package/dist/preview-engine/chunk-S4CSX6K5.mjs +0 -610
  412. package/dist/preview-engine/chunk-SNYAHQ25.mjs +0 -186
  413. package/dist/preview-engine/chunk-SRT2OCQW.mjs +0 -1
  414. package/dist/preview-engine/chunk-SUUUYXXT.mjs +0 -1
  415. package/dist/preview-engine/chunk-T6COGNOW.mjs +0 -134
  416. package/dist/preview-engine/chunk-XFYXT76H.mjs +0 -52
  417. package/dist/preview-engine/chunk-XUM42I4R.mjs +0 -1
  418. package/dist/preview-engine/chunk-YITWSOG4.mjs +0 -103
  419. package/dist/preview-engine/chunk-ZDCA6NVT.mjs +0 -82
  420. package/dist/preview-engine/chunk-ZNGOAGAI.mjs +0 -1
  421. package/dist/preview-engine/renderers-27Q5X3U6.mjs +0 -1
  422. package/dist/preview-engine/renderers-4AHH6BHF.mjs +0 -1
  423. package/dist/preview-engine/renderers-5BV6JGTU.mjs +0 -248
  424. package/dist/preview-engine/renderers-6PRVCTYV.mjs +0 -1
  425. package/dist/preview-engine/renderers-76PQY2SO.mjs +0 -1
  426. package/dist/preview-engine/renderers-7X2W6QWX.mjs +0 -1
  427. package/dist/preview-engine/renderers-B52QT6MT.mjs +0 -55
  428. package/dist/preview-engine/renderers-BE6RVJSE.mjs +0 -1
  429. package/dist/preview-engine/renderers-BMM2BH56.mjs +0 -1
  430. package/dist/preview-engine/renderers-CHOGQHVQ.mjs +0 -1
  431. package/dist/preview-engine/renderers-CRKRWR2Y.mjs +0 -1
  432. package/dist/preview-engine/renderers-DEYDSGJX.mjs +0 -1
  433. package/dist/preview-engine/renderers-DZTNRCR7.mjs +0 -1
  434. package/dist/preview-engine/renderers-ELO3KWTK.mjs +0 -1
  435. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +0 -1
  436. package/dist/preview-engine/renderers-F2KJNDWA.mjs +0 -124
  437. package/dist/preview-engine/renderers-FCV4COVB.mjs +0 -1
  438. package/dist/preview-engine/renderers-G5KQISVL.mjs +0 -1
  439. package/dist/preview-engine/renderers-GJSUN5HU.mjs +0 -1
  440. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +0 -1
  441. package/dist/preview-engine/renderers-GXCRINGC.mjs +0 -1
  442. package/dist/preview-engine/renderers-IHKORHMT.mjs +0 -1
  443. package/dist/preview-engine/renderers-JA4SLMG3.mjs +0 -1
  444. package/dist/preview-engine/renderers-JLN77CFZ.mjs +0 -1
  445. package/dist/preview-engine/renderers-KBFW7B5F.mjs +0 -1
  446. package/dist/preview-engine/renderers-LJRJMFCR.mjs +0 -1
  447. package/dist/preview-engine/renderers-LPAPZ5QS.mjs +0 -1
  448. package/dist/preview-engine/renderers-NQUDQEHY.mjs +0 -1
  449. package/dist/preview-engine/renderers-NS3AIJVG.mjs +0 -1
  450. package/dist/preview-engine/renderers-NSY2SDIE.mjs +0 -1
  451. package/dist/preview-engine/renderers-PW4OJWHF.mjs +0 -120
  452. package/dist/preview-engine/renderers-PWLWOZY4.mjs +0 -1
  453. package/dist/preview-engine/renderers-Q3MD34JN.mjs +0 -1
  454. package/dist/preview-engine/renderers-RXGNA2Q7.mjs +0 -1
  455. package/dist/preview-engine/renderers-TVTQ2R74.mjs +0 -1
  456. package/dist/preview-engine/renderers-VTTGFO55.mjs +0 -1
  457. package/dist/preview-engine/renderers-W3VVM5HB.mjs +0 -1
  458. package/dist/preview-engine/renderers-WG7QBD4D.mjs +0 -1
  459. package/dist/preview-engine/renderers-WLLJFZTF.mjs +0 -1
  460. package/dist/preview-engine/renderers-WN4SYFCU.mjs +0 -1
  461. package/dist/preview-engine/renderers-WSMLLSWX.mjs +0 -1
  462. package/dist/preview-engine/renderers-XFBSGTHU.mjs +0 -1
  463. package/dist/preview-engine/renderers-XFC6ZPO5.mjs +0 -1
  464. package/dist/preview-engine/renderers-XUHRY3XH.mjs +0 -1
  465. package/dist/preview-engine/renderers-YAOB5XU6.mjs +0 -1
  466. package/dist/preview-engine/renderers-YTB4FOHT.mjs +0 -1
  467. package/dist/preview-engine/renderers-ZIMBODX6.mjs +0 -1
  468. package/dist/program-BmNKgzja.mjs.map +0 -1
  469. package/dist/renderer-1VuQTY1Z.mjs.map +0 -1
  470. package/dist/renderer-6oMSare3.mjs +0 -3
  471. package/dist/renderer-B1ComPb2.mjs +0 -3
  472. package/dist/renderer-B2XzjK0z.mjs +0 -3
  473. package/dist/renderer-B2ieylQ3.mjs.map +0 -1
  474. package/dist/renderer-B8-kzZdP.mjs.map +0 -1
  475. package/dist/renderer-B8UaFNqb.mjs.map +0 -1
  476. package/dist/renderer-BDbTWSpP.mjs.map +0 -1
  477. package/dist/renderer-BIIWCg_J.mjs.map +0 -1
  478. package/dist/renderer-BJ1aTkZf.mjs.map +0 -1
  479. package/dist/renderer-BM05sB8m.mjs.map +0 -1
  480. package/dist/renderer-BQ5Bz5D0.mjs +0 -3
  481. package/dist/renderer-BREIjsUU.mjs.map +0 -1
  482. package/dist/renderer-BTu2EVhF.mjs +0 -3
  483. package/dist/renderer-BZcn_iBl.mjs +0 -3
  484. package/dist/renderer-Bc04fivZ.mjs.map +0 -1
  485. package/dist/renderer-BfAWZziM.mjs.map +0 -1
  486. package/dist/renderer-BfJSUjPN.mjs +0 -3
  487. package/dist/renderer-Bfgd4N0O.mjs.map +0 -1
  488. package/dist/renderer-Bhdf90Zq.mjs.map +0 -1
  489. package/dist/renderer-Bp6sDMa6.mjs +0 -3
  490. package/dist/renderer-Bt7_sb_Y.mjs +0 -3
  491. package/dist/renderer-Bv6q84TU.mjs.map +0 -1
  492. package/dist/renderer-C-H680_l.mjs +0 -3
  493. package/dist/renderer-C606ZPUn.mjs +0 -3
  494. package/dist/renderer-C9jyKn1i.mjs +0 -3
  495. package/dist/renderer-CDLrNgfo.mjs +0 -3
  496. package/dist/renderer-CERfcxgv.mjs +0 -3
  497. package/dist/renderer-CG5PzNkv.mjs +0 -3
  498. package/dist/renderer-CI7sG_cv.mjs.map +0 -1
  499. package/dist/renderer-CPoIMVdk.mjs +0 -3
  500. package/dist/renderer-CQdVj2JS.mjs +0 -3
  501. package/dist/renderer-CQiTodg9.mjs +0 -337
  502. package/dist/renderer-CQiTodg9.mjs.map +0 -1
  503. package/dist/renderer-CWTpc4ff.mjs.map +0 -1
  504. package/dist/renderer-CXn5HAnK.mjs.map +0 -1
  505. package/dist/renderer-CZgB5st8.mjs +0 -3
  506. package/dist/renderer-C_TPMHiH.mjs.map +0 -1
  507. package/dist/renderer-Ca7L1EOp.mjs +0 -3
  508. package/dist/renderer-CaaOKMSd.mjs.map +0 -1
  509. package/dist/renderer-CdciwwMI.mjs.map +0 -1
  510. package/dist/renderer-CepMDQ06.mjs.map +0 -1
  511. package/dist/renderer-CfC_aiew.mjs.map +0 -1
  512. package/dist/renderer-ChdLYS-G.mjs.map +0 -1
  513. package/dist/renderer-CkykdR_D.mjs +0 -3
  514. package/dist/renderer-Cl6GkeHx.mjs +0 -3
  515. package/dist/renderer-ClcjrFyo.mjs +0 -3
  516. package/dist/renderer-CnXW28b9.mjs.map +0 -1
  517. package/dist/renderer-CpkiHRhh.mjs.map +0 -1
  518. package/dist/renderer-CtVkU_GA.mjs +0 -44
  519. package/dist/renderer-CtVkU_GA.mjs.map +0 -1
  520. package/dist/renderer-Ctk2zzfy.mjs.map +0 -1
  521. package/dist/renderer-CtyD_Xju.mjs.map +0 -1
  522. package/dist/renderer-CySUP_wk.mjs +0 -3
  523. package/dist/renderer-CzPWB0Ss.mjs.map +0 -1
  524. package/dist/renderer-D2XD4QYk.mjs.map +0 -1
  525. package/dist/renderer-D2l_Odyg.mjs +0 -3
  526. package/dist/renderer-D7zvPHKn.mjs.map +0 -1
  527. package/dist/renderer-D9NnIx7o.mjs +0 -3
  528. package/dist/renderer-DCPCYySt.mjs +0 -3
  529. package/dist/renderer-DEJwPRkR.mjs.map +0 -1
  530. package/dist/renderer-DIkpJEOZ.mjs +0 -3
  531. package/dist/renderer-DML9qpmS.mjs.map +0 -1
  532. package/dist/renderer-DNSXPkf_.mjs +0 -3
  533. package/dist/renderer-DP-CvZ_Z.mjs +0 -3
  534. package/dist/renderer-DZGtBUCx.mjs.map +0 -1
  535. package/dist/renderer-D_1oDOCP.mjs.map +0 -1
  536. package/dist/renderer-DeXb8R6h.mjs +0 -3
  537. package/dist/renderer-DezO-ZaP.mjs +0 -4
  538. package/dist/renderer-DhXe04fC.mjs +0 -3
  539. package/dist/renderer-DirxsOjq.mjs.map +0 -1
  540. package/dist/renderer-Djlb4TLO.mjs.map +0 -1
  541. package/dist/renderer-DnH3SI7w.mjs +0 -3
  542. package/dist/renderer-DpGc-N3G.mjs.map +0 -1
  543. package/dist/renderer-Dpw4oi33.mjs +0 -3
  544. package/dist/renderer-DxTs4Iyi.mjs.map +0 -1
  545. package/dist/renderer-Dy0utCl7.mjs.map +0 -1
  546. package/dist/renderer-Md-ytU0v.mjs +0 -3
  547. package/dist/renderer-RKsXlF_0.mjs +0 -23900
  548. package/dist/renderer-RKsXlF_0.mjs.map +0 -1
  549. package/dist/renderer-U-bhWO9Q.mjs +0 -3
  550. package/dist/renderer-_uvdg48N.mjs.map +0 -1
  551. package/dist/renderer-bsWnRNpJ.mjs.map +0 -1
  552. package/dist/renderer-cgxO2xN6.mjs.map +0 -1
  553. package/dist/renderer-d5-F_48R.mjs +0 -3
  554. package/dist/renderer-ho_jXJ0H.mjs.map +0 -1
  555. package/dist/renderer-vqkKWqa5.mjs.map +0 -1
  556. package/dist/renderer-zA5okHds.mjs +0 -3
  557. package/dist/signin-Db08vl-g.mjs +0 -865
  558. package/dist/signin-Db08vl-g.mjs.map +0 -1
  559. package/dist/sso-oidc-CpLz_lIu.mjs +0 -1051
  560. package/dist/sso-oidc-CpLz_lIu.mjs.map +0 -1
  561. package/dist/sts-BQefGuml.mjs +0 -6
  562. package/dist/sts-Dgl0kH-t.mjs +0 -1395
  563. package/dist/sts-Dgl0kH-t.mjs.map +0 -1
  564. /package/dist/{renderer-C2n-EHxg.mjs → renderer-B-BcgA6d.mjs} +0 -0
package/README.md CHANGED
@@ -16,8 +16,6 @@
16
16
  [![gpu](https://img.shields.io/badge/GPU-Dawn%20%C2%B7%20Metal%20%C2%B7%20Vulkan-8b5cf6)](#monorepo-architecture)
17
17
  [![vision](https://img.shields.io/badge/vision-RTMDet%20%C2%B7%20RTMO%20%C2%B7%20ONNX-ff5a1f)](#6-on-device-vision--tracking)
18
18
 
19
- > **⚠️ Beta:** framefields is under active development. APIs may change between releases and some features may be incomplete or unstable.
20
-
21
19
  Framefields is built for coding agents. It packs the work people usually split across three desktop apps (Photoshop-inspired compositing and VFX, After Effects-style motion, typography and keyframing, and Blender-style 3D scenes, cameras and models) into one lightweight npm package. Your agent writes a TypeScript composition, checks frames, and renders an MP4, and nobody has to install or license a multi-gigabyte creative suite.
22
20
 
23
21
  **Code-first video as pure software engineering** — no headless browser, no DOM reflow, no screenshot pipeline.
@@ -178,7 +176,25 @@ Layer.chart(
178
176
  );
179
177
  ```
180
178
 
181
- ### 6. On-Device Vision & Tracking
179
+ ### 6. Vector Animations & Lottie
180
+ [`Layer.lottie`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/index.ts) plays Lottie JSON (`.json`) and dotLottie (`.lottie`) vector animations natively via ThorVG without browser overhead:
181
+ - **Headless vector decoding** — renders directly on WebGPU in Node.js via WASM/ThorVG.
182
+ - **Unified compositing** — positions with flex/box layout, animates with `LayerAnimation`, tilts into 3D scenes, masks (`.withMatte`), and applies GPU post-processing effects.
183
+ - **Configurable playback** — supports `fit` (`"contain"` | `"cover"` | `"fill"`), `loop`, `speed`, `autoplay`, and lifecycle frames.
184
+ - **Strict format boundary** — raster formats (`.png`, `.jpg`, `.webp`) use `Layer.image()`; passing `.json` or `.lottie` to `Layer.image()` throws/warns and is flagged by `comp.lint()`.
185
+
186
+ ```typescript
187
+ comp.add(
188
+ Layer.lottie("assets/animations/badge.json", {
189
+ width: 400,
190
+ height: 400,
191
+ fit: "contain",
192
+ loop: true,
193
+ })
194
+ );
195
+ ```
196
+
197
+ ### 7. On-Device Vision & Tracking
182
198
  [`@framefields/vision`](https://github.com/gatewai-dev/framefields/blob/main/packages/vision) runs ONNX models via `onnxruntime-node` (CPU) or `onnxruntime-web` (WebGPU) and wires every result into the same reactive signal surface the rest of Framefields consumes.
183
199
 
184
200
  > [!TIP]
@@ -244,11 +260,11 @@ Project normalized landmarks to screen space with a configurable camera FOV, the
244
260
  - **Clear failures** — a model that is the wrong size, fails its checksum, or lacks an expected output raises an error naming the model and its source.
245
261
  - **Browser entry** — `@framefields/vision/web` re-exports the engine plus `createWebGPUProvider()` / `hasWebGPU()`; `onnxruntime-web` is an optional lazy peer.
246
262
 
247
- ### 7. Headless Conformance & FrameGrid Testing
263
+ ### 8. Headless Conformance & FrameGrid Testing
248
264
  - **Pixel-sampling invariant assertions** — test compositions in Vitest with `skia-canvas` to verify shader math, font coverage, and Mean Squared Error (MSE) temporal deltas.
249
265
  - **FrameGrid contact sheets** — `comp.renderFrameGrid(...)` outputs sequential-frame contact sheets for instant review of easing, kinetic type, and transitions.
250
266
 
251
- ### 8. Live Preview in the Browser
267
+ ### 9. Live Preview in the Browser
252
268
  - **Runs your composition, not a video** — `startPreview({ entry, export })` serves a localhost WebGPU player that loads the composition's own module and renders its frames live in the browser. Nothing is streamed: the server only hands over the bundle, the project's assets, and the soundtrack mixed by the export engine.
253
269
  - **Timeline, waveform & frame stepping** — play/pause, scrub, step frame by frame, and read resolution, FPS, duration, and audio status at a glance.
254
270
  - **One stable URL per project** — the port is derived from the working directory, so re-running the preview replaces the running server and any open tab reloads into the new version by itself. Close the tab and the server shuts down about five seconds later. A reload comes back at the same moment, and `#t=12.5` links to one.
@@ -591,6 +607,7 @@ console.log(`Video rendered successfully to: ${filePath}`);
591
607
  3. **Carrier match cuts** — carry a visual element (badge, card, cursor, container) across scene boundaries with continuous velocity and position to avoid jarring cuts.
592
608
  4. **Physical easing vocabulary** — `back.out(1.4–1.7)` for snap-overshoot entrances, `spring` / `expo.out` for decelerating motion, `power2.in` for exits. Reserve `linear` for infinite spinners and time counters.
593
609
  5. **Headless invariant verification** — verify shader transforms, glyph coverage, and temporal MSE deltas with `skia-canvas` pixel sampling in Vitest before shipping.
610
+ 6. **Image vs. Lottie layers** — raster images (`.png`, `.jpg`, `.webp`) use `Layer.image()`. Vector animations (`.json`, `.lottie`) must use `Layer.lottie()` — passing `.json` or `.lottie` to `Layer.image()` throws/warns and is rejected by `comp.lint()` with `unsupported_image_format`.
594
611
 
595
612
  ---
596
613
 
@@ -1,5 +1,5 @@
1
- import { L as WebGPUAudioProcessor } from "../index-DDEPvMww.mjs";
2
- import { a as SfxTrigger, c as softLimit, d as _default$5, f as _default$4, g as mixAudioTracks, h as _default$2, i as SfxRenderContext, l as _default$7, m as _default$3, n as encodeStereoWav, o as mixSfxInto, p as _default, r as RenderedSfx, s as renderSfx, t as EncodeWavOptions, u as _default$6 } from "../index-DRZu3ezy.mjs";
3
- import "../index-9B8CJowc.mjs";
4
- import { t as _default$1 } from "../renderer-BTdOMMEx.mjs";
1
+ import { M as WebGPUAudioProcessor } from "../index-Cpkzy5XR.mjs";
2
+ import { a as SfxTrigger, c as softLimit, d as _default$5, f as _default$4, g as mixAudioTracks, h as _default$2, i as SfxRenderContext, l as _default$7, m as _default$3, n as encodeStereoWav, o as mixSfxInto, p as _default, r as RenderedSfx, s as renderSfx, t as EncodeWavOptions, u as _default$6 } from "../index--0vVZDPM.mjs";
3
+ import "../index-Fciq8bcC.mjs";
4
+ import { t as _default$1 } from "../renderer-Bs_f_App.mjs";
5
5
  export { EncodeWavOptions, RenderedSfx, SfxRenderContext, SfxTrigger, WebGPUAudioProcessor, _default as audioFadeRenderer, _default$1 as audioSignalExtractorRenderer, _default$2 as compressorRenderer, _default$3 as delayRenderer, encodeStereoWav, mixAudioTracks, mixSfxInto, _default$4 as noiseGateRenderer, _default$5 as parametricEqRenderer, renderSfx, _default$6 as reverbRenderer, softLimit, _default$7 as stereoPanningRenderer };
@@ -1,14 +1,15 @@
1
- import { C as WebGPUAudioProcessor } from "../dist-Cxi68OuY.mjs";
2
- import { t as renderers_default$1 } from "../renderers-CP8CFWDs-DwQTx8S7.mjs";
3
- import { i as mixAudioTracks } from "../dist-BAVZdFEJ.mjs";
4
- import { t as renderers_default$2 } from "../renderer-BIIWCg_J.mjs";
5
- import { t as renderers_default$3 } from "../renderer-Bfgd4N0O.mjs";
6
- import { t as renderers_default } from "../renderer-CXn5HAnK.mjs";
7
- import { t as renderers_default$4 } from "../renderer-cgxO2xN6.mjs";
8
- import { t as renderers_default$5 } from "../renderer-Djlb4TLO.mjs";
9
- import { t as renderers_default$6 } from "../renderer-Dy0utCl7.mjs";
10
- import "../renderer-C2n-EHxg.mjs";
11
- import { t as renderers_default$7 } from "../renderer-kwmlLQOO.mjs";
12
- import { i as softLimit, n as mixSfxInto, r as renderSfx, t as encodeStereoWav } from "../audio-TAvPwzLR.mjs";
1
+ import "../chunk-GBe2k3y8.mjs";
2
+ import { g as WebGPUAudioProcessor } from "../dist-DkuDAIrG.mjs";
3
+ import { t as renderers_default$1 } from "../renderers-CP8CFWDs-CMYe4kvZ.mjs";
4
+ import { i as mixAudioTracks } from "../dist-Bb8BoMiw.mjs";
5
+ import { t as renderers_default$2 } from "../renderer-CydWqyf0.mjs";
6
+ import { t as renderers_default$3 } from "../renderer-C5zpaQed.mjs";
7
+ import { t as renderers_default } from "../renderer-Br9BOkQs.mjs";
8
+ import { t as renderers_default$4 } from "../renderer-C7UZLOYk.mjs";
9
+ import { t as renderers_default$5 } from "../renderer-DZD2G76E.mjs";
10
+ import { t as renderers_default$6 } from "../renderer-C5caYAA3.mjs";
11
+ import "../renderer-B-BcgA6d.mjs";
12
+ import { t as renderers_default$7 } from "../renderer-DVnVnS3c.mjs";
13
+ import { i as softLimit, n as mixSfxInto, r as renderSfx, t as encodeStereoWav } from "../audio-DJeVoE8b.mjs";
13
14
 
14
15
  export { WebGPUAudioProcessor, renderers_default as audioFadeRenderer, renderers_default$1 as audioSignalExtractorRenderer, renderers_default$2 as compressorRenderer, renderers_default$3 as delayRenderer, encodeStereoWav, mixAudioTracks, mixSfxInto, renderers_default$4 as noiseGateRenderer, renderers_default$5 as parametricEqRenderer, renderSfx, renderers_default$6 as reverbRenderer, softLimit, renderers_default$7 as stereoPanningRenderer };
@@ -1,5 +1,5 @@
1
- import { Wt as FrameSignal, o as AudioSignalComputeConfig } from "./index-DDEPvMww.mjs";
2
- import { n as NodeRendererPlugin } from "./index-9B8CJowc.mjs";
1
+ import { o as AudioSignalComputeConfig, xi as FrameSignal } from "./index-Cpkzy5XR.mjs";
2
+ import { n as NodeRendererPlugin } from "./index-Fciq8bcC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-modulate/dist/renderer.d.mts
5
5
  //#region src/renderers/index.d.ts
@@ -34,4 +34,4 @@ declare const AudioSignal: {
34
34
  };
35
35
  //#endregion
36
36
  export { _default as i, AudioSignalOptions as n, ExtractedAudioSignalsBundle as r, AudioSignal as t };
37
- //# sourceMappingURL=audio-BHanw8Jb.d.mts.map
37
+ //# sourceMappingURL=audio-CfBpzxn9.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-BHanw8Jb.d.mts","names":["_framefields_node_sdk_renderer0","_default","NodeRendererPlugin","Readonly","default"],"sources":["../../../nodes/node-modulate/dist/renderer.d.mts","../src/signals/audio.ts"],"sourcesContent":["import * as _framefields_node_sdk_renderer0 from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/index.d.ts\ndeclare const _default: Readonly<_framefields_node_sdk_renderer0.NodeRendererPlugin>;\n//#endregion\nexport { _default as default };\n//# sourceMappingURL=renderer.d.mts.map"],"mappings":";;;;;cAGcC,UAAUE,SAASH;AAHiD;;;UCYjE,kBAAA,SAA2B;;EDT9BC,WAAsE,CAAA,EAAA,MAAA;;;UCenE,2BAAA;EANA,OAAA,EAOP,WAPO,CAAmB,MAAA,CAAA;EAMnB,IAAA,EAEV,WAFU,CAAA,MAAA,CAAA;EACP,IAAA,EAEH,WAFG,CAAA,MAAA,CAAA;EACH,MAAA,EAEE,WAFF,CAAA,MAAA,CAAA;EACA,WAAA,EAAA,MAAA;EACE,SAAA,EAAA,MAAA;EAAW,UAAA,EAAA,MAAA;EAaP,WAAA,EAAA,OAuGZ;EArGW,OAAA,EAAA,OAAA;EAED,aAAA,EAAA,OAAA;EACC,UAAA,EAAA,OAAA;EAAR,UAAA,EAAA,OAAA;EAoFO,YAAA,EAAA,OAAA;EACC,SAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;AAAD,cA1FE,WA0FF,EAAA;gCAxFC,8CAED,qBACP,QAAQ;oCAoFD,qBACP,QAAQ"}
1
+ {"version":3,"file":"audio-CfBpzxn9.d.mts","names":["_framefields_node_sdk_renderer0","_default","NodeRendererPlugin","Readonly","default"],"sources":["../../../nodes/node-modulate/dist/renderer.d.mts","../src/signals/audio.ts"],"sourcesContent":["import * as _framefields_node_sdk_renderer0 from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/index.d.ts\ndeclare const _default: Readonly<_framefields_node_sdk_renderer0.NodeRendererPlugin>;\n//#endregion\nexport { _default as default };\n//# sourceMappingURL=renderer.d.mts.map"],"mappings":";;;;;cAGcC,UAAUE,SAASH;AAHiD;;;UCYjE,kBAAA,SAA2B;;EDT9BC,WAAsE,CAAA,EAAA,MAAA;;;UCenE,2BAAA;EANA,OAAA,EAOP,WAPO,CAAmB,MAAA,CAAA;EAMnB,IAAA,EAEV,WAFU,CAAA,MAAA,CAAA;EACP,IAAA,EAEH,WAFG,CAAA,MAAA,CAAA;EACH,MAAA,EAEE,WAFF,CAAA,MAAA,CAAA;EACA,WAAA,EAAA,MAAA;EACE,SAAA,EAAA,MAAA;EAAW,UAAA,EAAA,MAAA;EAaP,WAAA,EAAA,OAuGZ;EArGW,OAAA,EAAA,OAAA;EAED,aAAA,EAAA,OAAA;EACC,UAAA,EAAA,OAAA;EAAR,UAAA,EAAA,OAAA;EAoFO,YAAA,EAAA,OAAA;EACC,SAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;AAAD,cA1FE,WA0FF,EAAA;gCAxFC,8CAED,qBACP,QAAQ;oCAoFD,qBACP,QAAQ"}
@@ -211,4 +211,4 @@ function encodeStereoWav(channels, options = {}) {
211
211
 
212
212
  //#endregion
213
213
  export { softLimit as i, mixSfxInto as n, renderSfx as r, encodeStereoWav as t };
214
- //# sourceMappingURL=audio-TAvPwzLR.mjs.map
214
+ //# sourceMappingURL=audio-DJeVoE8b.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-TAvPwzLR.mjs","names":[],"sources":["../src/audio/synth/sfx.ts","../src/audio/synth/wav-encoder.ts"],"sourcesContent":["/**\n * @file packages/framefields/src/audio/synth/sfx.ts\n * Deterministic procedural transition effects (whoosh, riser, impact, downshifter, glitch).\n * Pure CPU DSP: the same trigger always renders the same samples.\n */\n\n/**\n * Procedural sound effect transition event, synthesized deterministically on the CPU.\n * Default durations: whoosh 0.7s, riser 2s, impact 1.8s, downshifter 1.2s, glitch 0.35s.\n */\nexport interface SfxTrigger {\n\ttype: \"whoosh\" | \"riser\" | \"impact\" | \"downshifter\" | \"glitch\";\n\t/** Bar (fractional allowed) where the effect *starts*. A riser landing on a cut starts `durationSec` earlier. */\n\tatBar: number;\n\tdurationSec?: number;\n\tvolume?: number;\n}\n\nexport type StereoBuffer = [Float32Array, Float32Array];\n\nexport interface RenderedSfx {\n\t/** First sample of the effect on the score timeline. */\n\tstartSample: number;\n\tchannels: StereoBuffer;\n}\n\nexport interface SfxRenderContext {\n\tsampleRate: number;\n\tsecondsPerBar: number;\n\t/** Distinguishes otherwise identical triggers so noise differs between them. */\n\tseed: number;\n}\n\nconst DEFAULT_DURATION_SEC: Record<SfxTrigger[\"type\"], number> = {\n\twhoosh: 0.7,\n\triser: 2,\n\timpact: 1.8,\n\tdownshifter: 1.2,\n\tglitch: 0.35,\n};\n\n/** Small, fast, seedable PRNG returning values in [-1, 1). */\nfunction createNoise(seed: number): () => number {\n\tlet state = (seed ^ 0x9e3779b9) >>> 0;\n\treturn () => {\n\t\tstate = (state + 0x6d2b79f5) >>> 0;\n\t\tlet t = state;\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1);\n\t\tt ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n\t\treturn (((t ^ (t >>> 14)) >>> 0) / 4294967296) * 2 - 1;\n\t};\n}\n\n/** Chamberlin state-variable filter; returns the band-pass output of one sample. */\nclass BandPass {\n\tprivate low = 0;\n\tprivate band = 0;\n\n\tpublic process(\n\t\tinput: number,\n\t\tfreq: number,\n\t\tq: number,\n\t\tsampleRate: number,\n\t): number {\n\t\tconst f =\n\t\t\t2 * Math.sin((Math.PI * Math.min(freq, sampleRate * 0.45)) / sampleRate);\n\t\tthis.low += f * this.band;\n\t\tconst high = input - this.low - q * this.band;\n\t\tthis.band += f * high;\n\t\treturn this.band;\n\t}\n}\n\n/** Exponential sweep from `a` to `b` as `x` moves 0 → 1. */\nconst expSweep = (a: number, b: number, x: number): number => a * (b / a) ** x;\n\n/** Fast rise, longer fall: a bell centred at `peak` in 0..1. */\nconst bell = (x: number, peak: number): number =>\n\tx < peak\n\t\t? Math.sin((x / peak) * (Math.PI / 2)) ** 2\n\t\t: Math.cos(((x - peak) / (1 - peak)) * (Math.PI / 2)) ** 2;\n\nfunction whoosh(\n\tn: number,\n\tsr: number,\n\tnoise: () => number,\n\treverse: boolean,\n): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst filter = new BandPass();\n\tfor (let i = 0; i < n; i++) {\n\t\tconst x = i / n;\n\t\tconst sweep = reverse ? 1 - x : x;\n\t\tconst env = bell(x, reverse ? 0.35 : 0.6);\n\t\tconst s =\n\t\t\tfilter.process(noise(), expSweep(250, 7000, sweep), 0.35, sr) * env * 0.9;\n\t\tconst pan = (reverse ? 1 - x : x) * 2 - 1;\n\t\tleft[i] = s * Math.sqrt((1 - pan) / 2) * 1.4;\n\t\tright[i] = s * Math.sqrt((1 + pan) / 2) * 1.4;\n\t}\n\treturn [left, right];\n}\n\nfunction riser(\n\tn: number,\n\tsr: number,\n\tnoise: () => number,\n\treverse: boolean,\n): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst air = new BandPass();\n\tlet phase = 0;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst x = i / n;\n\t\tconst sweep = reverse ? 1 - x : x;\n\t\tconst env = reverse ? (1 - x) ** 1.5 : x ** 2.2;\n\t\tconst freq = expSweep(110, 880, sweep);\n\t\tphase += (2 * Math.PI * freq) / sr;\n\t\t// Band-limited enough at these pitches: two detuned-free partials of a saw.\n\t\tconst tone =\n\t\t\t(Math.sin(phase) +\n\t\t\t\t0.5 * Math.sin(phase * 2) +\n\t\t\t\t0.25 * Math.sin(phase * 3)) *\n\t\t\t0.3;\n\t\tconst hiss =\n\t\t\tair.process(noise(), expSweep(300, 9000, sweep), 0.5, sr) * 1.2;\n\t\tconst s = (tone + hiss) * env * 0.6;\n\t\tleft[i] = s;\n\t\tright[i] = s;\n\t}\n\treturn [left, right];\n}\n\nfunction impact(n: number, sr: number, noise: () => number): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst burst = new BandPass();\n\tlet phase = 0;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst t = i / sr;\n\t\tconst freq = 38 + 62 * Math.exp(-t * 14);\n\t\tphase += (2 * Math.PI * freq) / sr;\n\t\tconst sub = Math.sin(phase) * Math.exp(-t * 2.6);\n\t\tconst body =\n\t\t\tburst.process(noise(), 900 * Math.exp(-t * 6) + 120, 0.6, sr) *\n\t\t\tMath.exp(-t * 9) *\n\t\t\t1.6;\n\t\tconst click = i < 96 ? noise() * (1 - i / 96) * 0.5 : 0;\n\t\tconst s = (sub * 1.1 + body + click) * 0.85;\n\t\t// Slight decorrelated tail widens the hit without smearing the transient.\n\t\tconst tail = noise() * Math.exp(-t * 5) * 0.08;\n\t\tleft[i] = s + tail;\n\t\tright[i] = s - tail;\n\t}\n\treturn [left, right];\n}\n\nfunction glitch(n: number, sr: number, noise: () => number): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst slice = Math.max(1, Math.round(sr * 0.022));\n\tlet held = 0;\n\tlet gate = 1;\n\tlet crush = 1;\n\tfor (let i = 0; i < n; i++) {\n\t\tif (i % slice === 0) {\n\t\t\tgate = noise() > -0.2 ? 1 : 0;\n\t\t\tcrush = 2 + Math.floor((noise() + 1) * 6);\n\t\t}\n\t\tif (i % crush === 0) held = noise() > 0 ? 1 : -1;\n\t\tconst env = 1 - i / n;\n\t\tconst s = held * gate * env * 0.45;\n\t\tleft[i] = s;\n\t\tright[i] = gate ? -s * 0.6 : 0;\n\t}\n\treturn [left, right];\n}\n\n/**\n * Renders one trigger to stereo PCM positioned at `atBar` on the score timeline.\n * `atBar` is where the effect *starts*; a riser meant to land on a cut starts\n * `durationSec / secondsPerBar` bars before it.\n */\nexport function renderSfx(\n\ttrigger: SfxTrigger,\n\tctx: SfxRenderContext,\n): RenderedSfx {\n\tconst durationSec = trigger.durationSec ?? DEFAULT_DURATION_SEC[trigger.type];\n\tconst sr = ctx.sampleRate;\n\tconst n = Math.max(1, Math.round(durationSec * sr));\n\tconst noise = createNoise(ctx.seed + n);\n\n\tlet channels: StereoBuffer;\n\tswitch (trigger.type) {\n\t\tcase \"whoosh\":\n\t\t\tchannels = whoosh(n, sr, noise, false);\n\t\t\tbreak;\n\t\tcase \"riser\":\n\t\t\tchannels = riser(n, sr, noise, false);\n\t\t\tbreak;\n\t\tcase \"downshifter\":\n\t\t\tchannels = riser(n, sr, noise, true);\n\t\t\tbreak;\n\t\tcase \"impact\":\n\t\t\tchannels = impact(n, sr, noise);\n\t\t\tbreak;\n\t\tcase \"glitch\":\n\t\t\tchannels = glitch(n, sr, noise);\n\t\t\tbreak;\n\t}\n\n\tconst gain = trigger.volume ?? 0.8;\n\tfor (const channel of channels) {\n\t\tfor (let i = 0; i < n; i++)\n\t\t\tchannel[i] = Math.tanh((channel[i] ?? 0) * gain);\n\t}\n\treturn {\n\t\tstartSample: Math.max(\n\t\t\t0,\n\t\t\tMath.round(trigger.atBar * ctx.secondsPerBar * sr),\n\t\t),\n\t\tchannels,\n\t};\n}\n\n/** Adds rendered effects into `target` in place, clipping to its length. */\nexport function mixSfxInto(\n\ttarget: StereoBuffer,\n\teffects: readonly RenderedSfx[],\n): void {\n\tfor (const fx of effects) {\n\t\tfor (let c = 0; c < 2; c++) {\n\t\t\tconst dst = target[c];\n\t\t\tconst src = fx.channels[c];\n\t\t\tif (!dst || !src) continue;\n\t\t\tconst limit = Math.min(src.length, dst.length - fx.startSample);\n\t\t\tfor (let i = 0; i < limit; i++) {\n\t\t\t\tconst val = dst[fx.startSample + i];\n\t\t\t\tconst s = src[i];\n\t\t\t\tif (val !== undefined && s !== undefined) {\n\t\t\t\t\tdst[fx.startSample + i] = val + s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Soft-knee limiter for sums that may exceed full scale (impacts stacked on a\n * loud mix): transparent below the knee, asymptotically bounded by 1.0 above it.\n */\nexport function softLimit(\n\ttarget: StereoBuffer,\n\tknee = 0.7,\n\tceiling = 0.97,\n): void {\n\tconst headroom = ceiling - knee;\n\tfor (const channel of target) {\n\t\tfor (let i = 0; i < channel.length; i++) {\n\t\t\tconst x = channel[i] ?? 0;\n\t\t\tconst a = Math.abs(x);\n\t\t\tif (a > knee)\n\t\t\t\tchannel[i] =\n\t\t\t\t\tMath.sign(x) * (knee + headroom * Math.tanh((a - knee) / headroom));\n\t\t}\n\t}\n}\n","/**\n * @file packages/framefields/src/audio/synth/wav-encoder.ts\n * High-performance 16-bit PCM RIFF/WAVE stereo audio encoder.\n */\n\nexport interface EncodeWavOptions {\n\tsampleRate?: number;\n}\n\n/**\n * Encodes stereo Float32Array PCM channels (-1.0 to +1.0) into a standard 16-bit RIFF/WAVE Buffer.\n */\nexport function encodeStereoWav(\n\tchannels: [Float32Array, Float32Array],\n\toptions: EncodeWavOptions = {},\n): Buffer {\n\tconst sampleRate = options.sampleRate ?? 48000;\n\tconst numChannels = 2;\n\tconst left = channels[0];\n\tconst right = channels[1];\n\tconst numSamples = Math.min(left.length, right.length);\n\n\tconst bytesPerSample = 2; // 16-bit\n\tconst blockAlign = numChannels * bytesPerSample;\n\tconst byteRate = sampleRate * blockAlign;\n\tconst dataSize = numSamples * blockAlign;\n\tconst totalSize = 44 + dataSize;\n\n\tconst buffer = Buffer.alloc(totalSize);\n\n\t// RIFF Header\n\tbuffer.write(\"RIFF\", 0, \"ascii\");\n\tbuffer.writeUInt32LE(36 + dataSize, 4);\n\tbuffer.write(\"WAVE\", 8, \"ascii\");\n\n\t// \"fmt \" chunk\n\tbuffer.write(\"fmt \", 12, \"ascii\");\n\tbuffer.writeUInt32LE(16, 16); // PCM header size\n\tbuffer.writeUInt16LE(1, 20); // AudioFormat 1 = PCM\n\tbuffer.writeUInt16LE(numChannels, 22);\n\tbuffer.writeUInt32LE(sampleRate, 24);\n\tbuffer.writeUInt32LE(byteRate, 28);\n\tbuffer.writeUInt16LE(blockAlign, 32);\n\tbuffer.writeUInt16LE(16, 34); // Bits per sample\n\n\t// \"data\" chunk\n\tbuffer.write(\"data\", 36, \"ascii\");\n\tbuffer.writeUInt32LE(dataSize, 40);\n\n\tlet offset = 44;\n\tfor (let i = 0; i < numSamples; i++) {\n\t\t// Left channel\n\t\tconst sl = Math.max(-1, Math.min(1, left[i] ?? 0));\n\t\tconst intL = sl < 0 ? sl * 0x8000 : sl * 0x7fff;\n\t\tbuffer.writeInt16LE(Math.round(intL), offset);\n\t\toffset += 2;\n\n\t\t// Right channel\n\t\tconst sr = Math.max(-1, Math.min(1, right[i] ?? 0));\n\t\tconst intR = sr < 0 ? sr * 0x8000 : sr * 0x7fff;\n\t\tbuffer.writeInt16LE(Math.round(intR), offset);\n\t\toffset += 2;\n\t}\n\n\treturn buffer;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"audio-DJeVoE8b.mjs","names":[],"sources":["../src/audio/synth/sfx.ts","../src/audio/synth/wav-encoder.ts"],"sourcesContent":["/**\n * @file packages/framefields/src/audio/synth/sfx.ts\n * Deterministic procedural transition effects (whoosh, riser, impact, downshifter, glitch).\n * Pure CPU DSP: the same trigger always renders the same samples.\n */\n\n/**\n * Procedural sound effect transition event, synthesized deterministically on the CPU.\n * Default durations: whoosh 0.7s, riser 2s, impact 1.8s, downshifter 1.2s, glitch 0.35s.\n */\nexport interface SfxTrigger {\n\ttype: \"whoosh\" | \"riser\" | \"impact\" | \"downshifter\" | \"glitch\";\n\t/** Bar (fractional allowed) where the effect *starts*. A riser landing on a cut starts `durationSec` earlier. */\n\tatBar: number;\n\tdurationSec?: number;\n\tvolume?: number;\n}\n\nexport type StereoBuffer = [Float32Array, Float32Array];\n\nexport interface RenderedSfx {\n\t/** First sample of the effect on the score timeline. */\n\tstartSample: number;\n\tchannels: StereoBuffer;\n}\n\nexport interface SfxRenderContext {\n\tsampleRate: number;\n\tsecondsPerBar: number;\n\t/** Distinguishes otherwise identical triggers so noise differs between them. */\n\tseed: number;\n}\n\nconst DEFAULT_DURATION_SEC: Record<SfxTrigger[\"type\"], number> = {\n\twhoosh: 0.7,\n\triser: 2,\n\timpact: 1.8,\n\tdownshifter: 1.2,\n\tglitch: 0.35,\n};\n\n/** Small, fast, seedable PRNG returning values in [-1, 1). */\nfunction createNoise(seed: number): () => number {\n\tlet state = (seed ^ 0x9e3779b9) >>> 0;\n\treturn () => {\n\t\tstate = (state + 0x6d2b79f5) >>> 0;\n\t\tlet t = state;\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1);\n\t\tt ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n\t\treturn (((t ^ (t >>> 14)) >>> 0) / 4294967296) * 2 - 1;\n\t};\n}\n\n/** Chamberlin state-variable filter; returns the band-pass output of one sample. */\nclass BandPass {\n\tprivate low = 0;\n\tprivate band = 0;\n\n\tpublic process(\n\t\tinput: number,\n\t\tfreq: number,\n\t\tq: number,\n\t\tsampleRate: number,\n\t): number {\n\t\tconst f =\n\t\t\t2 * Math.sin((Math.PI * Math.min(freq, sampleRate * 0.45)) / sampleRate);\n\t\tthis.low += f * this.band;\n\t\tconst high = input - this.low - q * this.band;\n\t\tthis.band += f * high;\n\t\treturn this.band;\n\t}\n}\n\n/** Exponential sweep from `a` to `b` as `x` moves 0 → 1. */\nconst expSweep = (a: number, b: number, x: number): number => a * (b / a) ** x;\n\n/** Fast rise, longer fall: a bell centred at `peak` in 0..1. */\nconst bell = (x: number, peak: number): number =>\n\tx < peak\n\t\t? Math.sin((x / peak) * (Math.PI / 2)) ** 2\n\t\t: Math.cos(((x - peak) / (1 - peak)) * (Math.PI / 2)) ** 2;\n\nfunction whoosh(\n\tn: number,\n\tsr: number,\n\tnoise: () => number,\n\treverse: boolean,\n): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst filter = new BandPass();\n\tfor (let i = 0; i < n; i++) {\n\t\tconst x = i / n;\n\t\tconst sweep = reverse ? 1 - x : x;\n\t\tconst env = bell(x, reverse ? 0.35 : 0.6);\n\t\tconst s =\n\t\t\tfilter.process(noise(), expSweep(250, 7000, sweep), 0.35, sr) * env * 0.9;\n\t\tconst pan = (reverse ? 1 - x : x) * 2 - 1;\n\t\tleft[i] = s * Math.sqrt((1 - pan) / 2) * 1.4;\n\t\tright[i] = s * Math.sqrt((1 + pan) / 2) * 1.4;\n\t}\n\treturn [left, right];\n}\n\nfunction riser(\n\tn: number,\n\tsr: number,\n\tnoise: () => number,\n\treverse: boolean,\n): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst air = new BandPass();\n\tlet phase = 0;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst x = i / n;\n\t\tconst sweep = reverse ? 1 - x : x;\n\t\tconst env = reverse ? (1 - x) ** 1.5 : x ** 2.2;\n\t\tconst freq = expSweep(110, 880, sweep);\n\t\tphase += (2 * Math.PI * freq) / sr;\n\t\t// Band-limited enough at these pitches: two detuned-free partials of a saw.\n\t\tconst tone =\n\t\t\t(Math.sin(phase) +\n\t\t\t\t0.5 * Math.sin(phase * 2) +\n\t\t\t\t0.25 * Math.sin(phase * 3)) *\n\t\t\t0.3;\n\t\tconst hiss =\n\t\t\tair.process(noise(), expSweep(300, 9000, sweep), 0.5, sr) * 1.2;\n\t\tconst s = (tone + hiss) * env * 0.6;\n\t\tleft[i] = s;\n\t\tright[i] = s;\n\t}\n\treturn [left, right];\n}\n\nfunction impact(n: number, sr: number, noise: () => number): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst burst = new BandPass();\n\tlet phase = 0;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst t = i / sr;\n\t\tconst freq = 38 + 62 * Math.exp(-t * 14);\n\t\tphase += (2 * Math.PI * freq) / sr;\n\t\tconst sub = Math.sin(phase) * Math.exp(-t * 2.6);\n\t\tconst body =\n\t\t\tburst.process(noise(), 900 * Math.exp(-t * 6) + 120, 0.6, sr) *\n\t\t\tMath.exp(-t * 9) *\n\t\t\t1.6;\n\t\tconst click = i < 96 ? noise() * (1 - i / 96) * 0.5 : 0;\n\t\tconst s = (sub * 1.1 + body + click) * 0.85;\n\t\t// Slight decorrelated tail widens the hit without smearing the transient.\n\t\tconst tail = noise() * Math.exp(-t * 5) * 0.08;\n\t\tleft[i] = s + tail;\n\t\tright[i] = s - tail;\n\t}\n\treturn [left, right];\n}\n\nfunction glitch(n: number, sr: number, noise: () => number): StereoBuffer {\n\tconst left = new Float32Array(n);\n\tconst right = new Float32Array(n);\n\tconst slice = Math.max(1, Math.round(sr * 0.022));\n\tlet held = 0;\n\tlet gate = 1;\n\tlet crush = 1;\n\tfor (let i = 0; i < n; i++) {\n\t\tif (i % slice === 0) {\n\t\t\tgate = noise() > -0.2 ? 1 : 0;\n\t\t\tcrush = 2 + Math.floor((noise() + 1) * 6);\n\t\t}\n\t\tif (i % crush === 0) held = noise() > 0 ? 1 : -1;\n\t\tconst env = 1 - i / n;\n\t\tconst s = held * gate * env * 0.45;\n\t\tleft[i] = s;\n\t\tright[i] = gate ? -s * 0.6 : 0;\n\t}\n\treturn [left, right];\n}\n\n/**\n * Renders one trigger to stereo PCM positioned at `atBar` on the score timeline.\n * `atBar` is where the effect *starts*; a riser meant to land on a cut starts\n * `durationSec / secondsPerBar` bars before it.\n */\nexport function renderSfx(\n\ttrigger: SfxTrigger,\n\tctx: SfxRenderContext,\n): RenderedSfx {\n\tconst durationSec = trigger.durationSec ?? DEFAULT_DURATION_SEC[trigger.type];\n\tconst sr = ctx.sampleRate;\n\tconst n = Math.max(1, Math.round(durationSec * sr));\n\tconst noise = createNoise(ctx.seed + n);\n\n\tlet channels: StereoBuffer;\n\tswitch (trigger.type) {\n\t\tcase \"whoosh\":\n\t\t\tchannels = whoosh(n, sr, noise, false);\n\t\t\tbreak;\n\t\tcase \"riser\":\n\t\t\tchannels = riser(n, sr, noise, false);\n\t\t\tbreak;\n\t\tcase \"downshifter\":\n\t\t\tchannels = riser(n, sr, noise, true);\n\t\t\tbreak;\n\t\tcase \"impact\":\n\t\t\tchannels = impact(n, sr, noise);\n\t\t\tbreak;\n\t\tcase \"glitch\":\n\t\t\tchannels = glitch(n, sr, noise);\n\t\t\tbreak;\n\t}\n\n\tconst gain = trigger.volume ?? 0.8;\n\tfor (const channel of channels) {\n\t\tfor (let i = 0; i < n; i++)\n\t\t\tchannel[i] = Math.tanh((channel[i] ?? 0) * gain);\n\t}\n\treturn {\n\t\tstartSample: Math.max(\n\t\t\t0,\n\t\t\tMath.round(trigger.atBar * ctx.secondsPerBar * sr),\n\t\t),\n\t\tchannels,\n\t};\n}\n\n/** Adds rendered effects into `target` in place, clipping to its length. */\nexport function mixSfxInto(\n\ttarget: StereoBuffer,\n\teffects: readonly RenderedSfx[],\n): void {\n\tfor (const fx of effects) {\n\t\tfor (let c = 0; c < 2; c++) {\n\t\t\tconst dst = target[c];\n\t\t\tconst src = fx.channels[c];\n\t\t\tif (!dst || !src) continue;\n\t\t\tconst limit = Math.min(src.length, dst.length - fx.startSample);\n\t\t\tfor (let i = 0; i < limit; i++) {\n\t\t\t\tconst val = dst[fx.startSample + i];\n\t\t\t\tconst s = src[i];\n\t\t\t\tif (val !== undefined && s !== undefined) {\n\t\t\t\t\tdst[fx.startSample + i] = val + s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Soft-knee limiter for sums that may exceed full scale (impacts stacked on a\n * loud mix): transparent below the knee, asymptotically bounded by 1.0 above it.\n */\nexport function softLimit(\n\ttarget: StereoBuffer,\n\tknee = 0.7,\n\tceiling = 0.97,\n): void {\n\tconst headroom = ceiling - knee;\n\tfor (const channel of target) {\n\t\tfor (let i = 0; i < channel.length; i++) {\n\t\t\tconst x = channel[i] ?? 0;\n\t\t\tconst a = Math.abs(x);\n\t\t\tif (a > knee)\n\t\t\t\tchannel[i] =\n\t\t\t\t\tMath.sign(x) * (knee + headroom * Math.tanh((a - knee) / headroom));\n\t\t}\n\t}\n}\n","/**\n * @file packages/framefields/src/audio/synth/wav-encoder.ts\n * High-performance 16-bit PCM RIFF/WAVE stereo audio encoder.\n */\n\nexport interface EncodeWavOptions {\n\tsampleRate?: number;\n}\n\n/**\n * Encodes stereo Float32Array PCM channels (-1.0 to +1.0) into a standard 16-bit RIFF/WAVE Buffer.\n */\nexport function encodeStereoWav(\n\tchannels: [Float32Array, Float32Array],\n\toptions: EncodeWavOptions = {},\n): Buffer {\n\tconst sampleRate = options.sampleRate ?? 48000;\n\tconst numChannels = 2;\n\tconst left = channels[0];\n\tconst right = channels[1];\n\tconst numSamples = Math.min(left.length, right.length);\n\n\tconst bytesPerSample = 2; // 16-bit\n\tconst blockAlign = numChannels * bytesPerSample;\n\tconst byteRate = sampleRate * blockAlign;\n\tconst dataSize = numSamples * blockAlign;\n\tconst totalSize = 44 + dataSize;\n\n\tconst buffer = Buffer.alloc(totalSize);\n\n\t// RIFF Header\n\tbuffer.write(\"RIFF\", 0, \"ascii\");\n\tbuffer.writeUInt32LE(36 + dataSize, 4);\n\tbuffer.write(\"WAVE\", 8, \"ascii\");\n\n\t// \"fmt \" chunk\n\tbuffer.write(\"fmt \", 12, \"ascii\");\n\tbuffer.writeUInt32LE(16, 16); // PCM header size\n\tbuffer.writeUInt16LE(1, 20); // AudioFormat 1 = PCM\n\tbuffer.writeUInt16LE(numChannels, 22);\n\tbuffer.writeUInt32LE(sampleRate, 24);\n\tbuffer.writeUInt32LE(byteRate, 28);\n\tbuffer.writeUInt16LE(blockAlign, 32);\n\tbuffer.writeUInt16LE(16, 34); // Bits per sample\n\n\t// \"data\" chunk\n\tbuffer.write(\"data\", 36, \"ascii\");\n\tbuffer.writeUInt32LE(dataSize, 40);\n\n\tlet offset = 44;\n\tfor (let i = 0; i < numSamples; i++) {\n\t\t// Left channel\n\t\tconst sl = Math.max(-1, Math.min(1, left[i] ?? 0));\n\t\tconst intL = sl < 0 ? sl * 0x8000 : sl * 0x7fff;\n\t\tbuffer.writeInt16LE(Math.round(intL), offset);\n\t\toffset += 2;\n\n\t\t// Right channel\n\t\tconst sr = Math.max(-1, Math.min(1, right[i] ?? 0));\n\t\tconst intR = sr < 0 ? sr * 0x8000 : sr * 0x7fff;\n\t\tbuffer.writeInt16LE(Math.round(intR), offset);\n\t\toffset += 2;\n\t}\n\n\treturn buffer;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { xt as frameArraySignal } from "./dist-CbG3QxDw.mjs";
2
- import { F as ensureDevice, i as AudioSignalComputePipeline } from "./dist-Cxi68OuY.mjs";
3
- import { n as decodeAudioSource } from "./dist-BAVZdFEJ.mjs";
1
+ import { xt as frameArraySignal } from "./dist-fjKpBYkc.mjs";
2
+ import { D as ensureDevice, yt as AudioSignalComputePipeline } from "./dist-DkuDAIrG.mjs";
3
+ import { n as decodeAudioSource } from "./dist-Bb8BoMiw.mjs";
4
4
 
5
5
  //#region src/signals/audio.ts
6
6
  const AudioSignal = {
@@ -82,4 +82,4 @@ const AudioSignal = {
82
82
 
83
83
  //#endregion
84
84
  export { AudioSignal as t };
85
- //# sourceMappingURL=audio-COOMNwL5.mjs.map
85
+ //# sourceMappingURL=audio-GGuQ_JI0.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-COOMNwL5.mjs","names":[],"sources":["../src/signals/audio.ts"],"sourcesContent":["import { decodeAudioSource } from \"@framefields/compositions\";\nimport {\n\ttype FrameSignal,\n\tframeArraySignal,\n\ttype GPUTextureBinding,\n} from \"@framefields/core\";\nimport {\n\ttype AudioSignalComputeConfig,\n\tAudioSignalComputePipeline,\n\tensureDevice,\n} from \"@framefields/webgpu-renderers\";\n\nexport interface AudioSignalOptions extends AudioSignalComputeConfig {\n\tfps?: number;\n\ttargetWidth?: number;\n\tpreviewMode?: \"waveform\" | \"envelope\" | \"beat_markers\" | \"spectrum\";\n}\n\nexport interface ExtractedAudioSignalsBundle {\n\tprimary: FrameSignal<number>;\n\tbeat: FrameSignal<number>;\n\tbass: FrameSignal<number>;\n\tenergy: FrameSignal<number>;\n\tdurationSec: number;\n\tnumFrames: number;\n\tsampleRate: number;\n\ttextureView: unknown;\n\ttexture: unknown;\n\tprimaryBuffer: unknown;\n\tbeatBuffer: unknown;\n\tbassBuffer: unknown;\n\tenergyBuffer: unknown;\n\tseekFrame(frame: number): void;\n}\n\nexport const AudioSignal = {\n\tasync extractFromChannels(\n\t\tchannels: Float32Array[],\n\t\tsampleRate: number,\n\t\toptions: AudioSignalOptions = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\tconst device = await ensureDevice();\n\t\tconst fps = options.fps ?? 24;\n\t\tconst targetWidth = options.targetWidth ?? 512;\n\n\t\tconst extracted = await AudioSignalComputePipeline.extractFeatures(\n\t\t\tdevice,\n\t\t\tchannels,\n\t\t\tsampleRate,\n\t\t\tfps,\n\t\t\toptions,\n\t\t\ttargetWidth,\n\t\t);\n\n\t\tconst samples = extracted.channelSamples ?? {\n\t\t\tprimary: new Float32Array(extracted.numFrames),\n\t\t\tbeat: new Float32Array(extracted.numFrames),\n\t\t\tbass: new Float32Array(extracted.numFrames),\n\t\t\tenergy: new Float32Array(extracted.numFrames),\n\t\t};\n\n\t\tconst primaryBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_primary\",\n\t\t\tchannel: \"primary\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.primaryBuffer,\n\t\t\tstats: extracted.stats.primary,\n\t\t};\n\t\tconst beatBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_beat\",\n\t\t\tchannel: \"beat\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.beatBuffer,\n\t\t\tstats: extracted.stats.beat,\n\t\t};\n\t\tconst bassBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_bass\",\n\t\t\tchannel: \"bass\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.bassBuffer,\n\t\t\tstats: extracted.stats.bass,\n\t\t};\n\t\tconst energyBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_energy\",\n\t\t\tchannel: \"energy\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.energyBuffer,\n\t\t\tstats: extracted.stats.energy,\n\t\t};\n\n\t\tconst primary = frameArraySignal(samples.primary, fps, primaryBinding);\n\t\tconst beat = frameArraySignal(samples.beat, fps, beatBinding);\n\t\tconst bass = frameArraySignal(samples.bass, fps, bassBinding);\n\t\tconst energy = frameArraySignal(samples.energy, fps, energyBinding);\n\n\t\treturn {\n\t\t\tprimary,\n\t\t\tbeat,\n\t\t\tbass,\n\t\t\tenergy,\n\t\t\tdurationSec: extracted.durationSec,\n\t\t\tnumFrames: extracted.numFrames,\n\t\t\tsampleRate,\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tprimaryBuffer: extracted.primaryBuffer,\n\t\t\tbeatBuffer: extracted.beatBuffer,\n\t\t\tbassBuffer: extracted.bassBuffer,\n\t\t\tenergyBuffer: extracted.energyBuffer,\n\t\t\tseekFrame(frame: number) {\n\t\t\t\tprimary.seekFrame?.(frame);\n\t\t\t\tbeat.seekFrame?.(frame);\n\t\t\t\tbass.seekFrame?.(frame);\n\t\t\t\tenergy.seekFrame?.(frame);\n\t\t\t},\n\t\t};\n\t},\n\n\tasync extract(\n\t\tsource: string,\n\t\toptions: AudioSignalOptions = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\tconst decoded = await decodeAudioSource(source);\n\t\tif (!decoded || decoded.channels.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to decode audio source for feature extraction: ${source}`,\n\t\t\t);\n\t\t}\n\t\treturn AudioSignal.extractFromChannels(\n\t\t\tdecoded.channels,\n\t\t\tdecoded.sampleRate,\n\t\t\toptions,\n\t\t);\n\t},\n};\n"],"mappings":";;;;;AAmCA,MAAa,cAAc;CAC1B,MAAM,oBACL,UACA,YACA,UAA8B,EAAE,EACO;EACvC,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,MAAM,QAAQ,OAAO;EAC3B,MAAM,cAAc,QAAQ,eAAe;EAE3C,MAAM,YAAY,MAAM,2BAA2B,gBAClD,QACA,UACA,YACA,KACA,SACA,YACA;EAED,MAAM,UAAU,UAAU,kBAAkB;GAC3C,SAAS,IAAI,aAAa,UAAU,UAAU;GAC9C,MAAM,IAAI,aAAa,UAAU,UAAU;GAC3C,MAAM,IAAI,aAAa,UAAU,UAAU;GAC3C,QAAQ,IAAI,aAAa,UAAU,UAAU;GAC7C;EAED,MAAM,iBAAoC;GACzC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,cAAiC;GACtC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,cAAiC;GACtC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,gBAAmC;GACxC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EAED,MAAM,UAAU,iBAAiB,QAAQ,SAAS,KAAK,eAAe;EACtE,MAAM,OAAO,iBAAiB,QAAQ,MAAM,KAAK,YAAY;EAC7D,MAAM,OAAO,iBAAiB,QAAQ,MAAM,KAAK,YAAY;EAC7D,MAAM,SAAS,iBAAiB,QAAQ,QAAQ,KAAK,cAAc;AAEnE,SAAO;GACN;GACA;GACA;GACA;GACA,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB;GACA,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,eAAe,UAAU;GACzB,YAAY,UAAU;GACtB,YAAY,UAAU;GACtB,cAAc,UAAU;GACxB,UAAU,OAAe;AACxB,YAAQ,YAAY,MAAM;AAC1B,SAAK,YAAY,MAAM;AACvB,SAAK,YAAY,MAAM;AACvB,WAAO,YAAY,MAAM;;GAE1B;;CAGF,MAAM,QACL,QACA,UAA8B,EAAE,EACO;EACvC,MAAM,UAAU,MAAM,kBAAkB,OAAO;AAC/C,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW,EAC3C,OAAM,IAAI,MACT,yDAAyD,SACzD;AAEF,SAAO,YAAY,oBAClB,QAAQ,UACR,QAAQ,YACR,QACA;;CAEF"}
1
+ {"version":3,"file":"audio-GGuQ_JI0.mjs","names":[],"sources":["../src/signals/audio.ts"],"sourcesContent":["import { decodeAudioSource } from \"@framefields/compositions\";\nimport {\n\ttype FrameSignal,\n\tframeArraySignal,\n\ttype GPUTextureBinding,\n} from \"@framefields/core\";\nimport {\n\ttype AudioSignalComputeConfig,\n\tAudioSignalComputePipeline,\n\tensureDevice,\n} from \"@framefields/webgpu-renderers\";\n\nexport interface AudioSignalOptions extends AudioSignalComputeConfig {\n\tfps?: number;\n\ttargetWidth?: number;\n\tpreviewMode?: \"waveform\" | \"envelope\" | \"beat_markers\" | \"spectrum\";\n}\n\nexport interface ExtractedAudioSignalsBundle {\n\tprimary: FrameSignal<number>;\n\tbeat: FrameSignal<number>;\n\tbass: FrameSignal<number>;\n\tenergy: FrameSignal<number>;\n\tdurationSec: number;\n\tnumFrames: number;\n\tsampleRate: number;\n\ttextureView: unknown;\n\ttexture: unknown;\n\tprimaryBuffer: unknown;\n\tbeatBuffer: unknown;\n\tbassBuffer: unknown;\n\tenergyBuffer: unknown;\n\tseekFrame(frame: number): void;\n}\n\nexport const AudioSignal = {\n\tasync extractFromChannels(\n\t\tchannels: Float32Array[],\n\t\tsampleRate: number,\n\t\toptions: AudioSignalOptions = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\tconst device = await ensureDevice();\n\t\tconst fps = options.fps ?? 24;\n\t\tconst targetWidth = options.targetWidth ?? 512;\n\n\t\tconst extracted = await AudioSignalComputePipeline.extractFeatures(\n\t\t\tdevice,\n\t\t\tchannels,\n\t\t\tsampleRate,\n\t\t\tfps,\n\t\t\toptions,\n\t\t\ttargetWidth,\n\t\t);\n\n\t\tconst samples = extracted.channelSamples ?? {\n\t\t\tprimary: new Float32Array(extracted.numFrames),\n\t\t\tbeat: new Float32Array(extracted.numFrames),\n\t\t\tbass: new Float32Array(extracted.numFrames),\n\t\t\tenergy: new Float32Array(extracted.numFrames),\n\t\t};\n\n\t\tconst primaryBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_primary\",\n\t\t\tchannel: \"primary\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.primaryBuffer,\n\t\t\tstats: extracted.stats.primary,\n\t\t};\n\t\tconst beatBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_beat\",\n\t\t\tchannel: \"beat\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.beatBuffer,\n\t\t\tstats: extracted.stats.beat,\n\t\t};\n\t\tconst bassBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_bass\",\n\t\t\tchannel: \"bass\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.bassBuffer,\n\t\t\tstats: extracted.stats.bass,\n\t\t};\n\t\tconst energyBinding: GPUTextureBinding = {\n\t\t\tnodeId: \"audio_energy\",\n\t\t\tchannel: \"energy\",\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tbuffer: extracted.energyBuffer,\n\t\t\tstats: extracted.stats.energy,\n\t\t};\n\n\t\tconst primary = frameArraySignal(samples.primary, fps, primaryBinding);\n\t\tconst beat = frameArraySignal(samples.beat, fps, beatBinding);\n\t\tconst bass = frameArraySignal(samples.bass, fps, bassBinding);\n\t\tconst energy = frameArraySignal(samples.energy, fps, energyBinding);\n\n\t\treturn {\n\t\t\tprimary,\n\t\t\tbeat,\n\t\t\tbass,\n\t\t\tenergy,\n\t\t\tdurationSec: extracted.durationSec,\n\t\t\tnumFrames: extracted.numFrames,\n\t\t\tsampleRate,\n\t\t\ttextureView: extracted.textureView,\n\t\t\ttexture: extracted.texture,\n\t\t\tprimaryBuffer: extracted.primaryBuffer,\n\t\t\tbeatBuffer: extracted.beatBuffer,\n\t\t\tbassBuffer: extracted.bassBuffer,\n\t\t\tenergyBuffer: extracted.energyBuffer,\n\t\t\tseekFrame(frame: number) {\n\t\t\t\tprimary.seekFrame?.(frame);\n\t\t\t\tbeat.seekFrame?.(frame);\n\t\t\t\tbass.seekFrame?.(frame);\n\t\t\t\tenergy.seekFrame?.(frame);\n\t\t\t},\n\t\t};\n\t},\n\n\tasync extract(\n\t\tsource: string,\n\t\toptions: AudioSignalOptions = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\tconst decoded = await decodeAudioSource(source);\n\t\tif (!decoded || decoded.channels.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to decode audio source for feature extraction: ${source}`,\n\t\t\t);\n\t\t}\n\t\treturn AudioSignal.extractFromChannels(\n\t\t\tdecoded.channels,\n\t\t\tdecoded.sampleRate,\n\t\t\toptions,\n\t\t);\n\t},\n};\n"],"mappings":";;;;;AAmCA,MAAa,cAAc;CAC1B,MAAM,oBACL,UACA,YACA,UAA8B,EAAE,EACO;EACvC,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,MAAM,QAAQ,OAAO;EAC3B,MAAM,cAAc,QAAQ,eAAe;EAE3C,MAAM,YAAY,MAAM,2BAA2B,gBAClD,QACA,UACA,YACA,KACA,SACA,YACA;EAED,MAAM,UAAU,UAAU,kBAAkB;GAC3C,SAAS,IAAI,aAAa,UAAU,UAAU;GAC9C,MAAM,IAAI,aAAa,UAAU,UAAU;GAC3C,MAAM,IAAI,aAAa,UAAU,UAAU;GAC3C,QAAQ,IAAI,aAAa,UAAU,UAAU;GAC7C;EAED,MAAM,iBAAoC;GACzC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,cAAiC;GACtC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,cAAiC;GACtC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EACD,MAAM,gBAAmC;GACxC,QAAQ;GACR,SAAS;GACT,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,OAAO,UAAU,MAAM;GACvB;EAED,MAAM,UAAU,iBAAiB,QAAQ,SAAS,KAAK,eAAe;EACtE,MAAM,OAAO,iBAAiB,QAAQ,MAAM,KAAK,YAAY;EAC7D,MAAM,OAAO,iBAAiB,QAAQ,MAAM,KAAK,YAAY;EAC7D,MAAM,SAAS,iBAAiB,QAAQ,QAAQ,KAAK,cAAc;AAEnE,SAAO;GACN;GACA;GACA;GACA;GACA,aAAa,UAAU;GACvB,WAAW,UAAU;GACrB;GACA,aAAa,UAAU;GACvB,SAAS,UAAU;GACnB,eAAe,UAAU;GACzB,YAAY,UAAU;GACtB,YAAY,UAAU;GACtB,cAAc,UAAU;GACxB,UAAU,OAAe;AACxB,YAAQ,YAAY,MAAM;AAC1B,SAAK,YAAY,MAAM;AACvB,SAAK,YAAY,MAAM;AACvB,WAAO,YAAY,MAAM;;GAE1B;;CAGF,MAAM,QACL,QACA,UAA8B,EAAE,EACO;EACvC,MAAM,UAAU,MAAM,kBAAkB,OAAO;AAC/C,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW,EAC3C,OAAM,IAAI,MACT,yDAAyD,SACzD;AAEF,SAAO,YAAY,oBAClB,QAAQ,UACR,QAAQ,YACR,QACA;;CAEF"}
@@ -7,7 +7,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
8
  var __getProtoOf = Object.getPrototypeOf;
9
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
11
10
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
12
11
  var __exportAll = (all, symbols) => {
13
12
  let target = {};
@@ -40,8 +39,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
40
39
  value: mod,
41
40
  enumerable: true
42
41
  }) : target, mod));
43
- var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
44
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
45
42
 
46
43
  //#endregion
47
- export { __toCommonJS as a, __require as i, __esmMin as n, __toESM as o, __exportAll as r, __commonJSMin as t };
44
+ export { __exportAll as n, __toESM as r, __commonJSMin as t };
@@ -2217,4 +2217,4 @@ var TensorPipeline = class TensorPipeline$1 {
2217
2217
 
2218
2218
  //#endregion
2219
2219
  export { PoseSkeletonComputePipeline as a, OpticalFlowComputePipeline as i, ControlNetMultiplexer as n, TemporalDeflickerPipeline as o, DepthNormalsComputePipeline as r, TensorPipeline as s, CannyComputePipeline as t };
2220
- //# sourceMappingURL=dist-C_hjvkdN.mjs.map
2220
+ //# sourceMappingURL=dist-0QGroRYZ.mjs.map