framefields 2.3.2 → 2.4.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 (266) hide show
  1. package/README.md +24 -1
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BNnEclHU.d.mts → audio-C6toT7F3.d.mts} +3 -3
  5. package/dist/{audio-BNnEclHU.d.mts.map → audio-C6toT7F3.d.mts.map} +1 -1
  6. package/dist/{audio-C7Kn5xBm.mjs → audio-DXwNhi1z.mjs} +3 -3
  7. package/dist/{audio-C7Kn5xBm.mjs.map → audio-DXwNhi1z.mjs.map} +1 -1
  8. package/dist/{dist-CPUIfrtw.mjs → dist-Cl0mvShy.mjs} +2 -2
  9. package/dist/{dist-CPUIfrtw.mjs.map → dist-Cl0mvShy.mjs.map} +1 -1
  10. package/dist/{dist-CturBK2Z.mjs → dist-DRB6Vg5u.mjs} +1188 -743
  11. package/dist/dist-DRB6Vg5u.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +34 -34
  14. package/dist/{effects-CW1VgdI5.mjs → effects-lBqG-vd1.mjs} +2 -2
  15. package/dist/{effects-CW1VgdI5.mjs.map → effects-lBqG-vd1.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-EgMNL8KE.mjs → fonts-DlRJD6NS.mjs} +2 -2
  18. package/dist/{fonts-EgMNL8KE.mjs.map → fonts-DlRJD6NS.mjs.map} +1 -1
  19. package/dist/{gpu-CN14e7Bi.mjs → gpu-DOQX1W2q.mjs} +2 -2
  20. package/dist/{gpu-CN14e7Bi.mjs.map → gpu-DOQX1W2q.mjs.map} +1 -1
  21. package/dist/{index-QmkcUL3W.d.mts → index-BHqdtJbN.d.mts} +2 -2
  22. package/dist/{index-QmkcUL3W.d.mts.map → index-BHqdtJbN.d.mts.map} +1 -1
  23. package/dist/{index-CeRv1KC0.d.mts → index-BONyHjZX.d.mts} +3 -3
  24. package/dist/{index-CeRv1KC0.d.mts.map → index-BONyHjZX.d.mts.map} +1 -1
  25. package/dist/{index-Cg2ptXcs.d.mts → index-CaiZ5p6q.d.mts} +2 -2
  26. package/dist/{index-Cg2ptXcs.d.mts.map → index-CaiZ5p6q.d.mts.map} +1 -1
  27. package/dist/{index-BU51pxZO.d.mts → index-Cf1pVxn0.d.mts} +4 -4
  28. package/dist/{index-BU51pxZO.d.mts.map → index-Cf1pVxn0.d.mts.map} +1 -1
  29. package/dist/{index-AdrZIWT0.d.mts → index-DEODKaL6.d.mts} +13 -1
  30. package/dist/index-DEODKaL6.d.mts.map +1 -0
  31. package/dist/{index-B3BwLHa6.d.mts → index-DN9oXO-X.d.mts} +3 -3
  32. package/dist/{index-B3BwLHa6.d.mts.map → index-DN9oXO-X.d.mts.map} +1 -1
  33. package/dist/index.d.mts +177 -9
  34. package/dist/index.d.mts.map +1 -1
  35. package/dist/index.mjs +485 -90
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/preview/index.d.mts +2 -2
  38. package/dist/preview/index.mjs +10 -10
  39. package/dist/{preview-1sjnhHQL.mjs → preview-Ca4tF5Ro.mjs} +2 -2
  40. package/dist/{preview-1sjnhHQL.mjs.map → preview-Ca4tF5Ro.mjs.map} +1 -1
  41. package/dist/preview-engine/chunk-7QJUC6YY.mjs +1525 -0
  42. package/dist/preview-engine/framefields.mjs +32 -25
  43. package/dist/preview-engine/player.mjs +1 -1
  44. package/dist/preview-engine/{renderers-WP2LBR5U.mjs → renderers-HQEKSUNR.mjs} +3 -3
  45. package/dist/{program-DtiNMTxO.mjs → program-CJEg2wMa.mjs} +2 -2
  46. package/dist/{program-DtiNMTxO.mjs.map → program-CJEg2wMa.mjs.map} +1 -1
  47. package/dist/renderer/index.d.mts +2 -2
  48. package/dist/renderer/index.mjs +2 -2
  49. package/dist/renderer--IHe-yqK.mjs +5 -0
  50. package/dist/{renderer-CMzd3BrW.mjs → renderer-445i0uxs.mjs} +2 -2
  51. package/dist/{renderer-CMzd3BrW.mjs.map → renderer-445i0uxs.mjs.map} +1 -1
  52. package/dist/{renderer-MS70wrQB.mjs → renderer-5tQ7ImPk.mjs} +2 -2
  53. package/dist/{renderer-MS70wrQB.mjs.map → renderer-5tQ7ImPk.mjs.map} +1 -1
  54. package/dist/{renderer-Dw1e5phO.mjs → renderer-Ai5nZsof.mjs} +3 -3
  55. package/dist/{renderer-Dw1e5phO.mjs.map → renderer-Ai5nZsof.mjs.map} +1 -1
  56. package/dist/renderer-B16iwR0_.mjs +5 -0
  57. package/dist/renderer-B3EEYpx6.mjs +5 -0
  58. package/dist/renderer-B3Si5IB4.mjs +5 -0
  59. package/dist/{renderer-ktpusVT2.mjs → renderer-B4JmNa_T.mjs} +3 -3
  60. package/dist/{renderer-ktpusVT2.mjs.map → renderer-B4JmNa_T.mjs.map} +1 -1
  61. package/dist/{renderer-CBG6ewNf.mjs → renderer-B6UqWjtH.mjs} +3 -3
  62. package/dist/{renderer-CBG6ewNf.mjs.map → renderer-B6UqWjtH.mjs.map} +1 -1
  63. package/dist/{renderer-BmWH4dK1.mjs → renderer-B8v8iEkB.mjs} +7 -6
  64. package/dist/{renderer-BmWH4dK1.mjs.map → renderer-B8v8iEkB.mjs.map} +1 -1
  65. package/dist/{renderer-dJcu7WqI.mjs → renderer-BFWRUTov.mjs} +3 -3
  66. package/dist/{renderer-dJcu7WqI.mjs.map → renderer-BFWRUTov.mjs.map} +1 -1
  67. package/dist/renderer-BH8vZKmX.mjs +5 -0
  68. package/dist/renderer-BHZie6Pa.mjs +5 -0
  69. package/dist/renderer-BHpJ1e15.mjs +5 -0
  70. package/dist/{renderer-CRYO5HQw.mjs → renderer-BL36f2IQ.mjs} +2 -2
  71. package/dist/{renderer-CRYO5HQw.mjs.map → renderer-BL36f2IQ.mjs.map} +1 -1
  72. package/dist/{renderer-Bq9jXYJ5.mjs → renderer-BOvCstdU.mjs} +3 -3
  73. package/dist/{renderer-Bq9jXYJ5.mjs.map → renderer-BOvCstdU.mjs.map} +1 -1
  74. package/dist/renderer-BPJ79b47.mjs +5 -0
  75. package/dist/renderer-BPbM_6WR.mjs +5 -0
  76. package/dist/{renderer-DjwF10p2.mjs → renderer-BPsi7Q7Z.mjs} +3 -3
  77. package/dist/{renderer-DjwF10p2.mjs.map → renderer-BPsi7Q7Z.mjs.map} +1 -1
  78. package/dist/{renderer-BYj8x8YM.mjs → renderer-BTJyO6ov.mjs} +2 -2
  79. package/dist/{renderer-BYj8x8YM.mjs.map → renderer-BTJyO6ov.mjs.map} +1 -1
  80. package/dist/{renderer-DmOewVsB.mjs → renderer-BZCLdb8F.mjs} +3 -3
  81. package/dist/{renderer-DmOewVsB.mjs.map → renderer-BZCLdb8F.mjs.map} +1 -1
  82. package/dist/{renderer-CbNW0KHh.mjs → renderer-BZF48o1T.mjs} +3 -3
  83. package/dist/{renderer-CbNW0KHh.mjs.map → renderer-BZF48o1T.mjs.map} +1 -1
  84. package/dist/{renderer-_Fh9IBlE.mjs → renderer-BZWiY6Jw.mjs} +3 -3
  85. package/dist/{renderer-_Fh9IBlE.mjs.map → renderer-BZWiY6Jw.mjs.map} +1 -1
  86. package/dist/{renderer-Fm2brScz.mjs → renderer-BZvWlGsa.mjs} +3 -3
  87. package/dist/{renderer-Fm2brScz.mjs.map → renderer-BZvWlGsa.mjs.map} +1 -1
  88. package/dist/{renderer-DL4oR40b.mjs → renderer-BaBluD-r.mjs} +2 -2
  89. package/dist/{renderer-DL4oR40b.mjs.map → renderer-BaBluD-r.mjs.map} +1 -1
  90. package/dist/{renderer-DacnnTjY.mjs → renderer-BaHEN_Kv.mjs} +3 -3
  91. package/dist/{renderer-DacnnTjY.mjs.map → renderer-BaHEN_Kv.mjs.map} +1 -1
  92. package/dist/{renderer-Mdyv_W8K.mjs → renderer-BhZutM8K.mjs} +3 -3
  93. package/dist/{renderer-Mdyv_W8K.mjs.map → renderer-BhZutM8K.mjs.map} +1 -1
  94. package/dist/renderer-Bn-WnRh9.mjs +5 -0
  95. package/dist/renderer-BqHvDAUe.mjs +5 -0
  96. package/dist/{renderer-D8tdGi2P.mjs → renderer-BtJ6XYN7.mjs} +3 -3
  97. package/dist/{renderer-D8tdGi2P.mjs.map → renderer-BtJ6XYN7.mjs.map} +1 -1
  98. package/dist/{renderer-F410V727.mjs → renderer-BzgnTEvf.mjs} +3 -3
  99. package/dist/{renderer-F410V727.mjs.map → renderer-BzgnTEvf.mjs.map} +1 -1
  100. package/dist/{renderer-D-eTVnDS.mjs → renderer-C-La-IAt.mjs} +2 -2
  101. package/dist/{renderer-D-eTVnDS.mjs.map → renderer-C-La-IAt.mjs.map} +1 -1
  102. package/dist/{renderer-BFHgl-0f.mjs → renderer-C2ZIAhdJ.mjs} +2 -2
  103. package/dist/{renderer-BFHgl-0f.mjs.map → renderer-C2ZIAhdJ.mjs.map} +1 -1
  104. package/dist/{renderer-BebePsG7.mjs → renderer-C9pl21Zb.mjs} +2 -2
  105. package/dist/{renderer-BebePsG7.mjs.map → renderer-C9pl21Zb.mjs.map} +1 -1
  106. package/dist/renderer-CAtXDNsh.mjs +5 -0
  107. package/dist/{renderer-BkXqFmNO.mjs → renderer-CCCitH4J.mjs} +2 -2
  108. package/dist/{renderer-BkXqFmNO.mjs.map → renderer-CCCitH4J.mjs.map} +1 -1
  109. package/dist/{renderer-QMGrRiab.mjs → renderer-CCu1Q8ib.mjs} +2 -2
  110. package/dist/{renderer-QMGrRiab.mjs.map → renderer-CCu1Q8ib.mjs.map} +1 -1
  111. package/dist/{renderer-DvoPplvC.mjs → renderer-CG4TmDWH.mjs} +2 -2
  112. package/dist/{renderer-S6ez0leJ.mjs → renderer-CJmZURPQ.mjs} +2 -2
  113. package/dist/{renderer-S6ez0leJ.mjs.map → renderer-CJmZURPQ.mjs.map} +1 -1
  114. package/dist/{renderer-CPNLkir4.mjs → renderer-CN3iCli4.mjs} +2 -2
  115. package/dist/{renderer-CPNLkir4.mjs.map → renderer-CN3iCli4.mjs.map} +1 -1
  116. package/dist/{renderer--S2cNYXS.mjs → renderer-CNS8LA2_.mjs} +3 -3
  117. package/dist/{renderer--S2cNYXS.mjs.map → renderer-CNS8LA2_.mjs.map} +1 -1
  118. package/dist/renderer-C_5nfVce.mjs +5 -0
  119. package/dist/{renderer-ButaUWLr.mjs → renderer-CduDa1qf.mjs} +3 -3
  120. package/dist/{renderer-ButaUWLr.mjs.map → renderer-CduDa1qf.mjs.map} +1 -1
  121. package/dist/{renderer-Ch1rv1XP.mjs → renderer-CduL1AOK.mjs} +2 -2
  122. package/dist/{renderer-Ch1rv1XP.mjs.map → renderer-CduL1AOK.mjs.map} +1 -1
  123. package/dist/{renderer-z3YOOR3k.mjs → renderer-Cfto0m0-.mjs} +3 -3
  124. package/dist/{renderer-z3YOOR3k.mjs.map → renderer-Cfto0m0-.mjs.map} +1 -1
  125. package/dist/{renderer-CJwgsecF.mjs → renderer-CgZ1G37H.mjs} +2 -2
  126. package/dist/{renderer-CJwgsecF.mjs.map → renderer-CgZ1G37H.mjs.map} +1 -1
  127. package/dist/renderer-Cie7KKeQ.mjs +5 -0
  128. package/dist/{renderer-BaOC1Pd1.mjs → renderer-CjTxu89O.mjs} +3 -3
  129. package/dist/{renderer-BaOC1Pd1.mjs.map → renderer-CjTxu89O.mjs.map} +1 -1
  130. package/dist/{renderer-C2Ff-9u_.mjs → renderer-CoN2JgLO.mjs} +2 -2
  131. package/dist/{renderer-C2Ff-9u_.mjs.map → renderer-CoN2JgLO.mjs.map} +1 -1
  132. package/dist/{renderer-DjPC9l3w.mjs → renderer-CoO2j8AC.mjs} +3 -3
  133. package/dist/{renderer-DjPC9l3w.mjs.map → renderer-CoO2j8AC.mjs.map} +1 -1
  134. package/dist/{renderer-BRWpn3dT.mjs → renderer-CoX23zo_.mjs} +3 -3
  135. package/dist/{renderer-BRWpn3dT.mjs.map → renderer-CoX23zo_.mjs.map} +1 -1
  136. package/dist/renderer-CuoxvPsX.mjs +5 -0
  137. package/dist/renderer-Cvd3oIJQ.mjs +5 -0
  138. package/dist/renderer-CxAgpBrJ.mjs +5 -0
  139. package/dist/{renderer-C4puWDLK.mjs → renderer-CxSH3F_n.mjs} +2 -2
  140. package/dist/{renderer-C4puWDLK.mjs.map → renderer-CxSH3F_n.mjs.map} +1 -1
  141. package/dist/{renderer-B6c_Rk_2.mjs → renderer-Cz9fzS11.mjs} +3 -3
  142. package/dist/{renderer-B6c_Rk_2.mjs.map → renderer-Cz9fzS11.mjs.map} +1 -1
  143. package/dist/{renderer-BAmGO6Hj.mjs → renderer-D-IcBLT0.mjs} +3 -3
  144. package/dist/{renderer-BAmGO6Hj.mjs.map → renderer-D-IcBLT0.mjs.map} +1 -1
  145. package/dist/renderer-D-cWBX0r.mjs +5 -0
  146. package/dist/{renderer-DqlvbOUt.mjs → renderer-D-e3vDnO.mjs} +3 -3
  147. package/dist/{renderer-DqlvbOUt.mjs.map → renderer-D-e3vDnO.mjs.map} +1 -1
  148. package/dist/renderer-D0q2VyJR.mjs +5 -0
  149. package/dist/{renderer-BqSiWRoD.mjs → renderer-D4E8Yf61.mjs} +2 -2
  150. package/dist/{renderer-BqSiWRoD.mjs.map → renderer-D4E8Yf61.mjs.map} +1 -1
  151. package/dist/renderer-D6NXn3Ky.mjs +5 -0
  152. package/dist/renderer-D9bp2jor.mjs +5 -0
  153. package/dist/{renderer-GlyeFl5R.mjs → renderer-DA1brg35.mjs} +3 -3
  154. package/dist/{renderer-GlyeFl5R.mjs.map → renderer-DA1brg35.mjs.map} +1 -1
  155. package/dist/{renderer-DNhOjz6C.mjs → renderer-DAFi5TC_.mjs} +2 -2
  156. package/dist/{renderer-DNhOjz6C.mjs.map → renderer-DAFi5TC_.mjs.map} +1 -1
  157. package/dist/renderer-DEzIOIB7.mjs +5 -0
  158. package/dist/{renderer-B5Icb0XW.mjs → renderer-DFX2V9Dp.mjs} +2 -2
  159. package/dist/{renderer-B5Icb0XW.mjs.map → renderer-DFX2V9Dp.mjs.map} +1 -1
  160. package/dist/{renderer-w8LKBg_5.mjs → renderer-DH0wkQkR.mjs} +2 -2
  161. package/dist/{renderer-w8LKBg_5.mjs.map → renderer-DH0wkQkR.mjs.map} +1 -1
  162. package/dist/{renderer-BXCZev4l.mjs → renderer-DOZJeWM4.mjs} +3 -3
  163. package/dist/{renderer-BXCZev4l.mjs.map → renderer-DOZJeWM4.mjs.map} +1 -1
  164. package/dist/{renderer-Cz11KJmQ.mjs → renderer-DOkEalxy.mjs} +2 -2
  165. package/dist/{renderer-Cz11KJmQ.mjs.map → renderer-DOkEalxy.mjs.map} +1 -1
  166. package/dist/renderer-DSSTVulw.mjs +5 -0
  167. package/dist/renderer-DUmTURPu.mjs +5 -0
  168. package/dist/{renderer-BI1nmIqA.mjs → renderer-DVaVVz-D.mjs} +3 -3
  169. package/dist/{renderer-BI1nmIqA.mjs.map → renderer-DVaVVz-D.mjs.map} +1 -1
  170. package/dist/renderer-DXCAgI9m.mjs +5 -0
  171. package/dist/{renderer-BlafvK-L.mjs → renderer-DY8fPeH3.mjs} +2 -2
  172. package/dist/renderer-DZ9j3fQj.mjs +5 -0
  173. package/dist/{renderer-6QAlE1Mp.mjs → renderer-DZndEvZN.mjs} +3 -3
  174. package/dist/{renderer-6QAlE1Mp.mjs.map → renderer-DZndEvZN.mjs.map} +1 -1
  175. package/dist/{renderer-B3x-uogM.mjs → renderer-DaV95CAd.mjs} +3 -3
  176. package/dist/{renderer-B3x-uogM.mjs.map → renderer-DaV95CAd.mjs.map} +1 -1
  177. package/dist/{renderer-YtRSM2cv.mjs → renderer-DautVsW4.mjs} +2 -2
  178. package/dist/{renderer-YtRSM2cv.mjs.map → renderer-DautVsW4.mjs.map} +1 -1
  179. package/dist/renderer-Dd1G_VKM.mjs +5 -0
  180. package/dist/renderer-Dee8079X.mjs +5 -0
  181. package/dist/{renderer-B48vtpou.mjs → renderer-Dg5yLAM9.mjs} +3 -3
  182. package/dist/{renderer-B48vtpou.mjs.map → renderer-Dg5yLAM9.mjs.map} +1 -1
  183. package/dist/renderer-DgWh5noB.mjs +5 -0
  184. package/dist/{renderer-DlESyfg7.d.mts → renderer-Dim2ZlfK.d.mts} +2 -2
  185. package/dist/{renderer-DlESyfg7.d.mts.map → renderer-Dim2ZlfK.d.mts.map} +1 -1
  186. package/dist/{renderer-R0sJId_6.mjs → renderer-Dk0dnuHr.mjs} +2 -2
  187. package/dist/{renderer-R0sJId_6.mjs.map → renderer-Dk0dnuHr.mjs.map} +1 -1
  188. package/dist/{renderer-Bf4BdBtb.mjs → renderer-DkM_wN8j.mjs} +2 -2
  189. package/dist/{renderer-Bf4BdBtb.mjs.map → renderer-DkM_wN8j.mjs.map} +1 -1
  190. package/dist/{renderer-DS64UaYK.mjs → renderer-DkYiOWPJ.mjs} +3 -3
  191. package/dist/{renderer-DS64UaYK.mjs.map → renderer-DkYiOWPJ.mjs.map} +1 -1
  192. package/dist/{renderer-ITtBRR4o.mjs → renderer-DqgduGiO.mjs} +3 -3
  193. package/dist/{renderer-ITtBRR4o.mjs.map → renderer-DqgduGiO.mjs.map} +1 -1
  194. package/dist/renderer-DuD9QRix.mjs +5 -0
  195. package/dist/{renderer--Da6pAJ4.mjs → renderer-Edn9xltT.mjs} +2 -2
  196. package/dist/renderer-KtG5p44R.mjs +5 -0
  197. package/dist/{renderer-DDBmBmQN.mjs → renderer-Tf1AS1aO.mjs} +2 -2
  198. package/dist/{renderer-DDBmBmQN.mjs.map → renderer-Tf1AS1aO.mjs.map} +1 -1
  199. package/dist/{renderer-_-MCpvGq.mjs → renderer-TyZu7nQ2.mjs} +69 -69
  200. package/dist/{renderer-_-MCpvGq.mjs.map → renderer-TyZu7nQ2.mjs.map} +1 -1
  201. package/dist/{renderer-CgEMtLOL.mjs → renderer-eWBBsCv2.mjs} +2 -2
  202. package/dist/{renderer-CgEMtLOL.mjs.map → renderer-eWBBsCv2.mjs.map} +1 -1
  203. package/dist/{renderer-ClK7_Yzz.mjs → renderer-fXRwAdO2.mjs} +2 -2
  204. package/dist/{renderer-ClK7_Yzz.mjs.map → renderer-fXRwAdO2.mjs.map} +1 -1
  205. package/dist/renderer-fdVdNIhL.mjs +5 -0
  206. package/dist/renderer-gBKWL0_E.mjs +5 -0
  207. package/dist/{renderer-D90PpIKG.mjs → renderer-gbBgGPNL.mjs} +2 -2
  208. package/dist/{renderer-Kj9AhRCc.mjs → renderer-h9sJnoxw.mjs} +3 -3
  209. package/dist/{renderer-Kj9AhRCc.mjs.map → renderer-h9sJnoxw.mjs.map} +1 -1
  210. package/dist/renderer-hmWhsR6C.mjs +5 -0
  211. package/dist/{renderer-Rg1BFv8B.mjs → renderer-i4RJ-_sx.mjs} +2 -2
  212. package/dist/{renderer-Rg1BFv8B.mjs.map → renderer-i4RJ-_sx.mjs.map} +1 -1
  213. package/dist/renderer-jkL9FU2W.mjs +6 -0
  214. package/dist/{renderer-8k-TR_Cy.mjs → renderer-nMnE_T2y.mjs} +3 -3
  215. package/dist/{renderer-8k-TR_Cy.mjs.map → renderer-nMnE_T2y.mjs.map} +1 -1
  216. package/dist/{renderer-CczmOPAO.mjs → renderer-q971j1BW.mjs} +3 -3
  217. package/dist/{renderer-CczmOPAO.mjs.map → renderer-q971j1BW.mjs.map} +1 -1
  218. package/dist/{renderer-DJWQWN1E.mjs → renderer-wFyrVuuj.mjs} +3 -3
  219. package/dist/{renderer-DJWQWN1E.mjs.map → renderer-wFyrVuuj.mjs.map} +1 -1
  220. package/dist/renderer-yAWv-daq.mjs +5 -0
  221. package/dist/{renderer-DYo_a5-8.mjs → renderer-yGARXwV0.mjs} +2 -2
  222. package/dist/{renderer-DYo_a5-8.mjs.map → renderer-yGARXwV0.mjs.map} +1 -1
  223. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs → renderers-CP8CFWDs-DoVn7dbW.mjs} +2 -2
  224. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs.map → renderers-CP8CFWDs-DoVn7dbW.mjs.map} +1 -1
  225. package/dist/signals/index.d.mts +5 -5
  226. package/dist/signals/index.mjs +4 -4
  227. package/package.json +57 -56
  228. package/dist/dist-CturBK2Z.mjs.map +0 -1
  229. package/dist/index-AdrZIWT0.d.mts.map +0 -1
  230. package/dist/preview-engine/chunk-U7NIY7UC.mjs +0 -1522
  231. package/dist/renderer-1hypa-l7.mjs +0 -5
  232. package/dist/renderer-6D8M4DRu.mjs +0 -5
  233. package/dist/renderer-APrj6tdP.mjs +0 -5
  234. package/dist/renderer-BF8wlbN1.mjs +0 -5
  235. package/dist/renderer-BOUcMCJB.mjs +0 -5
  236. package/dist/renderer-BSwn6KmG.mjs +0 -5
  237. package/dist/renderer-BUxvuC5A.mjs +0 -5
  238. package/dist/renderer-BYOsmJ8F.mjs +0 -5
  239. package/dist/renderer-Bp7LqSTt.mjs +0 -5
  240. package/dist/renderer-CD0amH_Q.mjs +0 -5
  241. package/dist/renderer-CIJGjrt7.mjs +0 -5
  242. package/dist/renderer-CNFTl94b.mjs +0 -5
  243. package/dist/renderer-CTJ0gHPS.mjs +0 -5
  244. package/dist/renderer-Cc3INn7w.mjs +0 -5
  245. package/dist/renderer-CeHh2lKY.mjs +0 -5
  246. package/dist/renderer-CfjwkQP4.mjs +0 -5
  247. package/dist/renderer-CiuOB-Md.mjs +0 -5
  248. package/dist/renderer-Cor66Y2X.mjs +0 -5
  249. package/dist/renderer-CtIM0LWe.mjs +0 -5
  250. package/dist/renderer-CyqgTsnx.mjs +0 -5
  251. package/dist/renderer-D2QG9yIW.mjs +0 -5
  252. package/dist/renderer-D2woU27o.mjs +0 -6
  253. package/dist/renderer-DAhDiQQY.mjs +0 -5
  254. package/dist/renderer-DIjxOQFi.mjs +0 -5
  255. package/dist/renderer-DRzalGhU.mjs +0 -5
  256. package/dist/renderer-DY6S1jWp.mjs +0 -5
  257. package/dist/renderer-DeW0KNQV.mjs +0 -5
  258. package/dist/renderer-DsVSVFkl.mjs +0 -5
  259. package/dist/renderer-DxvcIgEU.mjs +0 -5
  260. package/dist/renderer-F0MKqmol.mjs +0 -5
  261. package/dist/renderer-OkbovcAc.mjs +0 -5
  262. package/dist/renderer-QyBeWMEL.mjs +0 -5
  263. package/dist/renderer-hSh5IrDp.mjs +0 -5
  264. package/dist/renderer-puLncHft.mjs +0 -5
  265. package/dist/renderer-wnFCaw7j.mjs +0 -5
  266. package/dist/renderer-xjtlyGS1.mjs +0 -5
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ### Compositing, motion graphics, and 3D for code-first video — one npm package that AI agents drive with code.
8
8
 
9
- [**Documentation**](https://framefields.dev/docs)  ·  [**Website**](https://framefields.dev)  ·  [**Discord**](https://discord.gg/cbqMGGme5)  ·  [**Examples**](https://github.com/gatewai-dev/framefields/blob/main/examples)
9
+ [**Documentation**](https://framefields.dev/docs)  ·  [**Website**](https://framefields.dev)  ·  [**Models**](https://framefields.dev/models)  ·  [**Discord**](https://discord.gg/cbqMGGme5)  ·  [**Examples**](https://github.com/gatewai-dev/framefields/blob/main/examples)
10
10
 
11
11
  [![npm](https://img.shields.io/badge/npm-framefields-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/framefields)
12
12
  [![docs](https://img.shields.io/badge/docs-framefields.dev%2Fdocs-6366f1)](https://framefields.dev/docs)
@@ -165,10 +165,33 @@ process.exit(0);
165
165
 
166
166
  ---
167
167
 
168
+ ## AI Gateway
169
+
170
+ Framefields includes optional, built-in access to the [**framefields.dev AI Gateway**](https://framefields.dev/models), letting agents and developers generate creative media—cinematic images, video footage, background music, voiceovers, and sound effects—directly from code. Authenticated via `FRAMEFIELDS_API_KEY` (an `ff_live_…` key from your [dashboard](https://framefields.dev/dashboard/keys)), the built-in `ai` client provides a unified interface (`run`, `subscribe`, `stream`, and `queue`) across hundreds of creative foundation models like Flux, Seedance, OpenAI, Nano Banana, Kling, Minimax, Suno, and ElevenLabs without configuring separate provider accounts or billing.
171
+
172
+ To get started, store your API key in `.env` and create a dedicated script (such as `src/generate.ts`) that calls `ai.subscribe()` to render media into `assets/`. Because AI generation is asynchronous and billed per execution, assets are generated once, saved locally, and tracked with Git LFS—ready to be loaded cleanly into `Layer.image()`, `Layer.video()`, or `Layer.audio()` inside your frame-accurate compositions without recurring cost or latency during previews and renders. Browse the full model catalog and schemas at [**framefields.dev/models**](https://framefields.dev/models).
173
+
174
+ ```typescript
175
+ import { ai } from "framefields";
176
+
177
+ // 1. Generate an image asset with Flux Schnell
178
+ const still = await ai.subscribe<{ images: { url: string }[] }>("flux/schnell", {
179
+ input: { prompt: "Cyberpunk alley in the rain, volumetric neon, 35mm", image_size: "landscape_16_9" },
180
+ });
181
+
182
+ // 2. Animate it into video with Kling or generate music & voiceovers
183
+ const clip = await ai.subscribe<{ video: { url: string } }>("kling-video/v2.1/standard/image-to-video", {
184
+ input: { prompt: "Slow forward tracking shot through neon rain", image_url: still.data.images[0].url, duration: "5" },
185
+ });
186
+ ```
187
+
188
+ ---
189
+
168
190
  ## Documentation
169
191
 
170
192
  Everything else—including full API references, interactive tutorials, and guides—is available at [**framefields.dev/docs**](https://framefields.dev/docs):
171
193
 
194
+ - **[AI Gateway & Asset Generation](https://framefields.dev/models)** — Unified SDK for generating images, video clips, music, and voice via hundreds of hosted models
172
195
  - **[Typography & Animators](https://framefields.dev/docs)** — Slug analytic vector text, After Effects-style range animators, and typewriter cadence
173
196
  - **[WebGPU 2D VFX](https://framefields.dev/docs)** — 50+ shaders: 3D LUTs, Curves, Film Grain, Glassmorphism, and Blur
174
197
  - **[Unified 3D Scenes](https://framefields.dev/docs)** — LookAt cameras, PBR materials, studio lighting, shadows, and glTF/GLB models
@@ -1,5 +1,5 @@
1
- import { N as WebGPUAudioProcessor } from "../index-AdrZIWT0.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-CeRv1KC0.mjs";
3
- import "../index-Cg2ptXcs.mjs";
4
- import { t as _default$1 } from "../renderer-DlESyfg7.mjs";
1
+ import { N as WebGPUAudioProcessor } from "../index-DEODKaL6.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-BONyHjZX.mjs";
3
+ import "../index-CaiZ5p6q.mjs";
4
+ import { t as _default$1 } from "../renderer-Dim2ZlfK.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,15 +1,15 @@
1
1
  import "../chunk-GBe2k3y8.mjs";
2
- import { g as WebGPUAudioProcessor } from "../dist-CturBK2Z.mjs";
3
- import { t as renderers_default$1 } from "../renderers-CP8CFWDs-DXiR_PLR.mjs";
4
- import { i as mixAudioTracks } from "../dist-CPUIfrtw.mjs";
5
- import { t as renderers_default$2 } from "../renderer-Rg1BFv8B.mjs";
6
- import { t as renderers_default$3 } from "../renderer-BebePsG7.mjs";
7
- import { t as renderers_default } from "../renderer-DYo_a5-8.mjs";
8
- import { t as renderers_default$4 } from "../renderer-QMGrRiab.mjs";
9
- import { t as renderers_default$5 } from "../renderer-BkXqFmNO.mjs";
10
- import { t as renderers_default$6 } from "../renderer-Cz11KJmQ.mjs";
2
+ import { g as WebGPUAudioProcessor } from "../dist-DRB6Vg5u.mjs";
3
+ import { t as renderers_default$1 } from "../renderers-CP8CFWDs-DoVn7dbW.mjs";
4
+ import { i as mixAudioTracks } from "../dist-Cl0mvShy.mjs";
5
+ import { t as renderers_default$2 } from "../renderer-i4RJ-_sx.mjs";
6
+ import { t as renderers_default$3 } from "../renderer-C9pl21Zb.mjs";
7
+ import { t as renderers_default } from "../renderer-yGARXwV0.mjs";
8
+ import { t as renderers_default$4 } from "../renderer-CCu1Q8ib.mjs";
9
+ import { t as renderers_default$5 } from "../renderer-CCCitH4J.mjs";
10
+ import { t as renderers_default$6 } from "../renderer-DOkEalxy.mjs";
11
11
  import "../renderer-B-BcgA6d.mjs";
12
- import { t as renderers_default$7 } from "../renderer-DDBmBmQN.mjs";
12
+ import { t as renderers_default$7 } from "../renderer-Tf1AS1aO.mjs";
13
13
  import { i as softLimit, n as mixSfxInto, r as renderSfx, t as encodeStereoWav } from "../audio-DJeVoE8b.mjs";
14
14
 
15
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 { Ci as FrameSignal, o as AudioSignalComputeConfig } from "./index-AdrZIWT0.mjs";
2
- import { n as NodeRendererPlugin } from "./index-Cg2ptXcs.mjs";
1
+ import { Ci as FrameSignal, o as AudioSignalComputeConfig } from "./index-DEODKaL6.mjs";
2
+ import { n as NodeRendererPlugin } from "./index-CaiZ5p6q.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-BNnEclHU.d.mts.map
37
+ //# sourceMappingURL=audio-C6toT7F3.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-BNnEclHU.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-C6toT7F3.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,6 +1,6 @@
1
1
  import { xt as frameArraySignal } from "./dist-fjKpBYkc.mjs";
2
- import { A as ensureDevice, St as AudioSignalComputePipeline } from "./dist-CturBK2Z.mjs";
3
- import { n as decodeAudioSource } from "./dist-CPUIfrtw.mjs";
2
+ import { A as ensureDevice, St as AudioSignalComputePipeline } from "./dist-DRB6Vg5u.mjs";
3
+ import { n as decodeAudioSource } from "./dist-Cl0mvShy.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-C7Kn5xBm.mjs.map
85
+ //# sourceMappingURL=audio-DXwNhi1z.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-C7Kn5xBm.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-DXwNhi1z.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,6 +1,6 @@
1
1
  import { Ot as getMediaType, Pt as isSignal, on as updateClockSignals, p as DEFAULT_DURATION_MS, qt as resolveMediaMimeType, wt as getActiveMediaMetadata } from "./dist-fjKpBYkc.mjs";
2
2
  import { t as audioRegistry, u as webgpuRegistry } from "./renderer-BSitV56h.mjs";
3
- import { C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, L as inputStore, N as getHeadlessFontPath, Nn as signalRegistry, O as drawSvgNode, Q as registerHeadlessFont, S as drawCaptionNode, T as drawLottieNode, at as resolveMediaSourceUrl, et as shaderStore, it as GetFontAssetUrl, k as drawVideoNode, m as SlugGeometry, p as SlugFontCache, w as drawImageNode } from "./dist-CturBK2Z.mjs";
3
+ import { C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, L as inputStore, N as getHeadlessFontPath, Nn as signalRegistry, O as drawSvgNode, Q as registerHeadlessFont, S as drawCaptionNode, T as drawLottieNode, at as resolveMediaSourceUrl, et as shaderStore, it as GetFontAssetUrl, k as drawVideoNode, m as SlugGeometry, p as SlugFontCache, w as drawImageNode } from "./dist-DRB6Vg5u.mjs";
4
4
  import { AudioSampleSink } from "mediabunny";
5
5
 
6
6
  //#region ../renderers/dist/index.mjs
@@ -1361,4 +1361,4 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1361
1361
 
1362
1362
  //#endregion
1363
1363
  export { spring as _, resolveLayerDuration as a, computeStrokeRect as c, measureSpring as d, measureText as f, requiresIsolation as g, preloadFont as h, mixAudioTracks as i, interpolate as l, preloadCompositionFonts as m, decodeAudioSource as n, Easing as o, measureTextAsync as p, drawCompositionTree as r, bezier as s, compositionStateStore as t, mapBlendModeToSkia as u, springCalculation as v };
1364
- //# sourceMappingURL=dist-CPUIfrtw.mjs.map
1364
+ //# sourceMappingURL=dist-Cl0mvShy.mjs.map