framefields 2.0.10 → 2.0.11

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 (238) hide show
  1. package/README.md +17 -6
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BxA0sL9z.d.mts → audio-BHanw8Jb.d.mts} +3 -3
  5. package/dist/{audio-BxA0sL9z.d.mts.map → audio-BHanw8Jb.d.mts.map} +1 -1
  6. package/dist/{audio-B7Al-W_0.mjs → audio-COOMNwL5.mjs} +4 -4
  7. package/dist/{audio-B7Al-W_0.mjs.map → audio-COOMNwL5.mjs.map} +1 -1
  8. package/dist/{dist-BFjSQP7i.mjs → dist-BAVZdFEJ.mjs} +3 -3
  9. package/dist/{dist-BFjSQP7i.mjs.map → dist-BAVZdFEJ.mjs.map} +1 -1
  10. package/dist/{dist-DzUJmIHt.mjs → dist-BYqNNwsl.mjs} +2 -2
  11. package/dist/{dist-DzUJmIHt.mjs.map → dist-BYqNNwsl.mjs.map} +1 -1
  12. package/dist/{dist-B9Afsv83.mjs → dist-CbG3QxDw.mjs} +651 -2
  13. package/dist/dist-CbG3QxDw.mjs.map +1 -0
  14. package/dist/{dist-B9PkqWnN.mjs → dist-Cxi68OuY.mjs} +5322 -3274
  15. package/dist/dist-Cxi68OuY.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +4 -4
  17. package/dist/effects/index.mjs +25 -25
  18. package/dist/{effects-CREopCyP.mjs → effects-DzbjFhyA.mjs} +3 -3
  19. package/dist/{effects-CREopCyP.mjs.map → effects-DzbjFhyA.mjs.map} +1 -1
  20. package/dist/fonts/index.d.mts +2 -2
  21. package/dist/fonts/index.mjs +1 -1
  22. package/dist/{fonts-DhEQ5h6E.mjs → fonts-C0W6TgJk.mjs} +52 -5
  23. package/dist/fonts-C0W6TgJk.mjs.map +1 -0
  24. package/dist/{index-J9CIK_nu.d.mts → index-9B8CJowc.d.mts} +2 -2
  25. package/dist/{index-J9CIK_nu.d.mts.map → index-9B8CJowc.d.mts.map} +1 -1
  26. package/dist/{index-CvDVpaKn.d.mts → index-CDoTrMs1.d.mts} +4 -4
  27. package/dist/{index-CvDVpaKn.d.mts.map → index-CDoTrMs1.d.mts.map} +1 -1
  28. package/dist/{index-BXNNJVs8.d.mts → index-CYGpSVsf.d.mts} +2 -2
  29. package/dist/{index-BXNNJVs8.d.mts.map → index-CYGpSVsf.d.mts.map} +1 -1
  30. package/dist/{index-D1zaOwEU.d.mts → index-DDEPvMww.d.mts} +520 -71
  31. package/dist/index-DDEPvMww.d.mts.map +1 -0
  32. package/dist/{index-oodg5k9K.d.mts → index-DGJp1d30.d.mts} +3 -3
  33. package/dist/{index-oodg5k9K.d.mts.map → index-DGJp1d30.d.mts.map} +1 -1
  34. package/dist/{index-fo4E7A6C.d.mts → index-DRZu3ezy.d.mts} +3 -3
  35. package/dist/{index-fo4E7A6C.d.mts.map → index-DRZu3ezy.d.mts.map} +1 -1
  36. package/dist/{index-CQcdKyxF.d.mts → index-DnWsbbuZ.d.mts} +54 -2
  37. package/dist/index-DnWsbbuZ.d.mts.map +1 -0
  38. package/dist/index.d.mts +398 -18
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +633 -57
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/preview/index.d.mts +2 -2
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-9ifxywUM.mjs → preview-BV2C4Fk6.mjs} +2 -2
  45. package/dist/{preview-9ifxywUM.mjs.map → preview-BV2C4Fk6.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-VVLM6LZ3.mjs → chunk-6256GQFP.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-YG35X5R5.mjs → chunk-AWTH2WZO.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-7DIAFPQP.mjs → chunk-ECPP3UG6.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-5JD65JSJ.mjs → chunk-FGHOHCFG.mjs} +1 -1
  50. package/dist/preview-engine/chunk-IMV5SBQV.mjs +1 -0
  51. package/dist/preview-engine/chunk-IQKIHFNZ.mjs +1 -0
  52. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +474 -0
  53. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +3 -0
  54. package/dist/preview-engine/chunk-NFAGEP43.mjs +1448 -0
  55. package/dist/preview-engine/{chunk-AG5JNZYQ.mjs → chunk-Q66QQI6N.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-JAOXXYXG.mjs → chunk-QYRDQMNB.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-XCYFPA34.mjs → chunk-RJUAM52F.mjs} +1 -1
  58. package/dist/preview-engine/chunk-VRGREB3V.mjs +1 -0
  59. package/dist/preview-engine/{chunk-AW7HNZKR.mjs → chunk-Y6HWYPKX.mjs} +1 -1
  60. package/dist/preview-engine/effects.mjs +1 -1
  61. package/dist/preview-engine/fonts.mjs +1 -1
  62. package/dist/preview-engine/framefields.mjs +27 -27
  63. package/dist/preview-engine/player.mjs +1 -1
  64. package/dist/preview-engine/renderers-5BV6JGTU.mjs +248 -0
  65. package/dist/preview-engine/renderers-7X2W6QWX.mjs +1 -0
  66. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +1 -0
  67. package/dist/preview-engine/renderers-G5KQISVL.mjs +1 -0
  68. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +1 -0
  69. package/dist/preview-engine/renderers-TVTQ2R74.mjs +1 -0
  70. package/dist/preview-engine/renderers-ZIMBODX6.mjs +1 -0
  71. package/dist/{program-xRfFoPxe.mjs → program-BmNKgzja.mjs} +281 -23
  72. package/dist/program-BmNKgzja.mjs.map +1 -0
  73. package/dist/renderer/index.d.mts +2 -2
  74. package/dist/renderer/index.mjs +2 -2
  75. package/dist/{renderer-D-4Yh-RK.mjs → renderer-1VuQTY1Z.mjs} +2 -2
  76. package/dist/{renderer-D-4Yh-RK.mjs.map → renderer-1VuQTY1Z.mjs.map} +1 -1
  77. package/dist/renderer-6oMSare3.mjs +3 -0
  78. package/dist/renderer-B1ComPb2.mjs +3 -0
  79. package/dist/{renderer-CgmFh6MY.mjs → renderer-B1YMwl2B.mjs} +1 -1
  80. package/dist/{renderer-BtRfKx5N.mjs → renderer-B2ieylQ3.mjs} +2 -2
  81. package/dist/{renderer-BtRfKx5N.mjs.map → renderer-B2ieylQ3.mjs.map} +1 -1
  82. package/dist/{renderer-DYm4duFr.mjs → renderer-B8-kzZdP.mjs} +2 -2
  83. package/dist/{renderer-DYm4duFr.mjs.map → renderer-B8-kzZdP.mjs.map} +1 -1
  84. package/dist/{renderer-Dju9CaeL.mjs → renderer-B8UaFNqb.mjs} +3 -3
  85. package/dist/{renderer-Dju9CaeL.mjs.map → renderer-B8UaFNqb.mjs.map} +1 -1
  86. package/dist/{renderer-BA8YwBRQ.mjs → renderer-BDbTWSpP.mjs} +3 -3
  87. package/dist/{renderer-BA8YwBRQ.mjs.map → renderer-BDbTWSpP.mjs.map} +1 -1
  88. package/dist/{renderer-DxtHmyAa.mjs → renderer-BIIWCg_J.mjs} +3 -3
  89. package/dist/{renderer-DxtHmyAa.mjs.map → renderer-BIIWCg_J.mjs.map} +1 -1
  90. package/dist/{renderer-CJNyhr_S.mjs → renderer-BJ1aTkZf.mjs} +3 -3
  91. package/dist/{renderer-CJNyhr_S.mjs.map → renderer-BJ1aTkZf.mjs.map} +1 -1
  92. package/dist/renderer-BQ5Bz5D0.mjs +3 -0
  93. package/dist/{renderer-DBlPbsgi.mjs → renderer-BSaYG8aw.mjs} +1 -1
  94. package/dist/{renderer-2NQWaZd7.d.mts → renderer-BTdOMMEx.d.mts} +2 -2
  95. package/dist/{renderer-2NQWaZd7.d.mts.map → renderer-BTdOMMEx.d.mts.map} +1 -1
  96. package/dist/renderer-BZcn_iBl.mjs +3 -0
  97. package/dist/{renderer-CroHPOsX.mjs → renderer-Bc04fivZ.mjs} +3 -3
  98. package/dist/{renderer-CroHPOsX.mjs.map → renderer-Bc04fivZ.mjs.map} +1 -1
  99. package/dist/{renderer-xKOVmd2O.mjs → renderer-BfAWZziM.mjs} +193 -12
  100. package/dist/renderer-BfAWZziM.mjs.map +1 -0
  101. package/dist/{renderer-DTvfYkI9.mjs → renderer-Bfgd4N0O.mjs} +3 -3
  102. package/dist/{renderer-DTvfYkI9.mjs.map → renderer-Bfgd4N0O.mjs.map} +1 -1
  103. package/dist/{renderer-b6sZN90h.mjs → renderer-BhZZEyFX.mjs} +2 -2
  104. package/dist/{renderer-b6sZN90h.mjs.map → renderer-BhZZEyFX.mjs.map} +1 -1
  105. package/dist/{renderer-wVldKtFU.mjs → renderer-Bhdf90Zq.mjs} +2 -2
  106. package/dist/{renderer-wVldKtFU.mjs.map → renderer-Bhdf90Zq.mjs.map} +1 -1
  107. package/dist/renderer-Bp6sDMa6.mjs +3 -0
  108. package/dist/renderer-Bt7_sb_Y.mjs +3 -0
  109. package/dist/{renderer-BiSALMQy.mjs → renderer-Bv21DbWy.mjs} +1 -1
  110. package/dist/{renderer-CoZKST2Y.mjs → renderer-Bv6q84TU.mjs} +2 -2
  111. package/dist/{renderer-CoZKST2Y.mjs.map → renderer-Bv6q84TU.mjs.map} +1 -1
  112. package/dist/renderer-C606ZPUn.mjs +3 -0
  113. package/dist/renderer-C9jyKn1i.mjs +3 -0
  114. package/dist/renderer-CERfcxgv.mjs +3 -0
  115. package/dist/renderer-CG5PzNkv.mjs +3 -0
  116. package/dist/{renderer-BGXbGqY4.mjs → renderer-CI7sG_cv.mjs} +2 -2
  117. package/dist/{renderer-BGXbGqY4.mjs.map → renderer-CI7sG_cv.mjs.map} +1 -1
  118. package/dist/renderer-CPoIMVdk.mjs +3 -0
  119. package/dist/{renderer-DCkSR2Ne.mjs → renderer-CWTpc4ff.mjs} +2 -2
  120. package/dist/{renderer-DCkSR2Ne.mjs.map → renderer-CWTpc4ff.mjs.map} +1 -1
  121. package/dist/{renderer-D7ztfQHX.mjs → renderer-CXn5HAnK.mjs} +3 -3
  122. package/dist/{renderer-D7ztfQHX.mjs.map → renderer-CXn5HAnK.mjs.map} +1 -1
  123. package/dist/{renderer-DjTiNeAp.mjs → renderer-C_TPMHiH.mjs} +2 -2
  124. package/dist/{renderer-DjTiNeAp.mjs.map → renderer-C_TPMHiH.mjs.map} +1 -1
  125. package/dist/renderer-Ca7L1EOp.mjs +3 -0
  126. package/dist/{renderer-DAMJZNtX.mjs → renderer-CaaOKMSd.mjs} +2 -2
  127. package/dist/{renderer-DAMJZNtX.mjs.map → renderer-CaaOKMSd.mjs.map} +1 -1
  128. package/dist/{renderer-CIYcdZuZ.mjs → renderer-CdciwwMI.mjs} +3 -3
  129. package/dist/{renderer-CIYcdZuZ.mjs.map → renderer-CdciwwMI.mjs.map} +1 -1
  130. package/dist/{renderer-BZmfKIom.mjs → renderer-CfC_aiew.mjs} +3 -3
  131. package/dist/{renderer-BZmfKIom.mjs.map → renderer-CfC_aiew.mjs.map} +1 -1
  132. package/dist/{renderer-8qpGxSSO.mjs → renderer-ChdLYS-G.mjs} +3 -3
  133. package/dist/{renderer-8qpGxSSO.mjs.map → renderer-ChdLYS-G.mjs.map} +1 -1
  134. package/dist/renderer-Cl6GkeHx.mjs +3 -0
  135. package/dist/renderer-ClcjrFyo.mjs +3 -0
  136. package/dist/{renderer-BgdkEFmv.mjs → renderer-CnXW28b9.mjs} +2 -2
  137. package/dist/{renderer-BgdkEFmv.mjs.map → renderer-CnXW28b9.mjs.map} +1 -1
  138. package/dist/{renderer-6GeDT4Mx.mjs → renderer-Ctk2zzfy.mjs} +3 -3
  139. package/dist/{renderer-6GeDT4Mx.mjs.map → renderer-Ctk2zzfy.mjs.map} +1 -1
  140. package/dist/{renderer-But0u-xi.mjs → renderer-CtyD_Xju.mjs} +2 -2
  141. package/dist/{renderer-But0u-xi.mjs.map → renderer-CtyD_Xju.mjs.map} +1 -1
  142. package/dist/renderer-CySUP_wk.mjs +3 -0
  143. package/dist/renderer-D2l_Odyg.mjs +3 -0
  144. package/dist/{renderer-BJ6Y-7ke.mjs → renderer-D2nCGcjv.mjs} +2 -2
  145. package/dist/{renderer-BJ6Y-7ke.mjs.map → renderer-D2nCGcjv.mjs.map} +1 -1
  146. package/dist/renderer-DCPCYySt.mjs +3 -0
  147. package/dist/{renderer-BnvqEqvE.mjs → renderer-DIgsilTw.mjs} +3 -3
  148. package/dist/{renderer-BnvqEqvE.mjs.map → renderer-DIgsilTw.mjs.map} +1 -1
  149. package/dist/renderer-DIkpJEOZ.mjs +3 -0
  150. package/dist/{renderer-BpCxKWQm.mjs → renderer-DML9qpmS.mjs} +2 -2
  151. package/dist/{renderer-BpCxKWQm.mjs.map → renderer-DML9qpmS.mjs.map} +1 -1
  152. package/dist/renderer-DNSXPkf_.mjs +3 -0
  153. package/dist/renderer-DP-CvZ_Z.mjs +3 -0
  154. package/dist/renderer-DeXb8R6h.mjs +3 -0
  155. package/dist/renderer-DezO-ZaP.mjs +4 -0
  156. package/dist/renderer-DhXe04fC.mjs +3 -0
  157. package/dist/{renderer-jkZ_IQnW.mjs → renderer-DirxsOjq.mjs} +2 -2
  158. package/dist/{renderer-jkZ_IQnW.mjs.map → renderer-DirxsOjq.mjs.map} +1 -1
  159. package/dist/{renderer-CfeoxM_3.mjs → renderer-Djlb4TLO.mjs} +3 -3
  160. package/dist/{renderer-CfeoxM_3.mjs.map → renderer-Djlb4TLO.mjs.map} +1 -1
  161. package/dist/renderer-DnH3SI7w.mjs +3 -0
  162. package/dist/{renderer-DdVBt8Rz.mjs → renderer-DpGc-N3G.mjs} +3 -3
  163. package/dist/{renderer-DdVBt8Rz.mjs.map → renderer-DpGc-N3G.mjs.map} +1 -1
  164. package/dist/renderer-Dpw4oi33.mjs +3 -0
  165. package/dist/{renderer-CcU7dVn9.mjs → renderer-DxTs4Iyi.mjs} +2 -2
  166. package/dist/{renderer-CcU7dVn9.mjs.map → renderer-DxTs4Iyi.mjs.map} +1 -1
  167. package/dist/{renderer-CNF10fCq.mjs → renderer-Dy0utCl7.mjs} +3 -3
  168. package/dist/{renderer-CNF10fCq.mjs.map → renderer-Dy0utCl7.mjs.map} +1 -1
  169. package/dist/renderer-Md-ytU0v.mjs +3 -0
  170. package/dist/{renderer-CStktK20.mjs → renderer-RKsXlF_0.mjs} +43 -43
  171. package/dist/{renderer-CStktK20.mjs.map → renderer-RKsXlF_0.mjs.map} +1 -1
  172. package/dist/renderer-U-bhWO9Q.mjs +3 -0
  173. package/dist/{renderer-5h0llpx7.mjs → renderer-WSGuj_V6.mjs} +2 -2
  174. package/dist/{renderer-5h0llpx7.mjs.map → renderer-WSGuj_V6.mjs.map} +1 -1
  175. package/dist/{renderer-_bygZSKk.mjs → renderer-bsWnRNpJ.mjs} +2 -2
  176. package/dist/{renderer-_bygZSKk.mjs.map → renderer-bsWnRNpJ.mjs.map} +1 -1
  177. package/dist/{renderer-DNNqpK7t.mjs → renderer-cgxO2xN6.mjs} +3 -3
  178. package/dist/{renderer-DNNqpK7t.mjs.map → renderer-cgxO2xN6.mjs.map} +1 -1
  179. package/dist/{renderer-DryPrxYc.mjs → renderer-dncoIVdd.mjs} +1 -1
  180. package/dist/{renderer-DffynBHa.mjs → renderer-kwmlLQOO.mjs} +3 -3
  181. package/dist/{renderer-DffynBHa.mjs.map → renderer-kwmlLQOO.mjs.map} +1 -1
  182. package/dist/{renderer-9wp5R7PL.mjs → renderer-vqkKWqa5.mjs} +2 -2
  183. package/dist/{renderer-9wp5R7PL.mjs.map → renderer-vqkKWqa5.mjs.map} +1 -1
  184. package/dist/renderer-zA5okHds.mjs +3 -0
  185. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs → renderers-CP8CFWDs-DwQTx8S7.mjs} +3 -3
  186. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs.map → renderers-CP8CFWDs-DwQTx8S7.mjs.map} +1 -1
  187. package/dist/signals/index.d.mts +5 -5
  188. package/dist/signals/index.mjs +6 -6
  189. package/dist/{signals-CsxqD2AA.mjs → signals-Bv1OweKd.mjs} +3 -3
  190. package/dist/{signals-CsxqD2AA.mjs.map → signals-Bv1OweKd.mjs.map} +1 -1
  191. package/package.json +55 -55
  192. package/dist/dist-B9Afsv83.mjs.map +0 -1
  193. package/dist/dist-B9PkqWnN.mjs.map +0 -1
  194. package/dist/fonts-DhEQ5h6E.mjs.map +0 -1
  195. package/dist/index-CQcdKyxF.d.mts.map +0 -1
  196. package/dist/index-D1zaOwEU.d.mts.map +0 -1
  197. package/dist/preview-engine/chunk-CNSHAFEA.mjs +0 -1
  198. package/dist/preview-engine/chunk-QTKJXDIW.mjs +0 -997
  199. package/dist/preview-engine/chunk-RNOO4UR5.mjs +0 -3
  200. package/dist/preview-engine/chunk-T6CC2KCZ.mjs +0 -418
  201. package/dist/preview-engine/chunk-UC7CSW2A.mjs +0 -1
  202. package/dist/preview-engine/renderers-32PIFHPS.mjs +0 -1
  203. package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +0 -1
  204. package/dist/preview-engine/renderers-7HNVXNAI.mjs +0 -248
  205. package/dist/preview-engine/renderers-CHJWUJVI.mjs +0 -1
  206. package/dist/preview-engine/renderers-CI2GXWLP.mjs +0 -1
  207. package/dist/preview-engine/renderers-EE2GFG7J.mjs +0 -1
  208. package/dist/preview-engine/renderers-UGZUPONY.mjs +0 -1
  209. package/dist/program-xRfFoPxe.mjs.map +0 -1
  210. package/dist/renderer-B4F6wL68.mjs +0 -3
  211. package/dist/renderer-B4i1jmiT.mjs +0 -3
  212. package/dist/renderer-B5ylY3uM.mjs +0 -3
  213. package/dist/renderer-BPw23wiR.mjs +0 -3
  214. package/dist/renderer-BghW-bSZ.mjs +0 -3
  215. package/dist/renderer-Bw3oZ9YT.mjs +0 -3
  216. package/dist/renderer-C2009W-_.mjs +0 -3
  217. package/dist/renderer-C36yoGXG.mjs +0 -3
  218. package/dist/renderer-CL3evUmF.mjs +0 -3
  219. package/dist/renderer-CM1_2ZWA.mjs +0 -3
  220. package/dist/renderer-CWlzudP8.mjs +0 -3
  221. package/dist/renderer-Cd5vzrGs.mjs +0 -3
  222. package/dist/renderer-CeJ_vDXI.mjs +0 -3
  223. package/dist/renderer-CjY77sB_.mjs +0 -3
  224. package/dist/renderer-D5Z6mda5.mjs +0 -3
  225. package/dist/renderer-DCJa7OGk.mjs +0 -3
  226. package/dist/renderer-DGwSl7g1.mjs +0 -3
  227. package/dist/renderer-DNoRNfMm.mjs +0 -3
  228. package/dist/renderer-DOZ8bpyY.mjs +0 -3
  229. package/dist/renderer-DRHyRNU8.mjs +0 -3
  230. package/dist/renderer-DlD85Xoi.mjs +0 -3
  231. package/dist/renderer-Dr0bgOrW.mjs +0 -3
  232. package/dist/renderer-DurtG-Hc.mjs +0 -3
  233. package/dist/renderer-eFv9HBmL.mjs +0 -3
  234. package/dist/renderer-iuV6wQoL.mjs +0 -4
  235. package/dist/renderer-n-uuWPF4.mjs +0 -3
  236. package/dist/renderer-rzccTFuY.mjs +0 -3
  237. package/dist/renderer-xKOVmd2O.mjs.map +0 -1
  238. package/dist/renderer-y9eGFPFL.mjs +0 -3
package/README.md CHANGED
@@ -31,17 +31,24 @@ Every frame of these films is rendered by framefields from TypeScript in [`examp
31
31
 
32
32
  <table>
33
33
  <tr>
34
- <td width="33%" align="center">
34
+ <td width="50%" align="center">
35
+ <a href="https://youtu.be/k2lgbdL6_TA"><img src="https://raw.githubusercontent.com/gatewai-dev/framefields/main/assets/showcase/mac-keyboard.jpg" alt="Mac keyboard from 3D primitives" width="100%"></a>
36
+ <br><a href="https://youtu.be/k2lgbdL6_TA"><b>Mac Keyboard</b></a>
37
+ <br><sub><a href="https://github.com/gatewai-dev/framefields/blob/main/examples/26_mac_keyboard_from_3d_primitives"><code>26_mac_keyboard_from_3d_primitives</code></a></sub>
38
+ </td>
39
+ <td width="50%" align="center">
35
40
  <a href="https://youtu.be/FVXTqAozAv8"><img src="https://raw.githubusercontent.com/gatewai-dev/framefields/main/assets/showcase/framefields-launch.jpg" alt="Framefields launch film" width="100%"></a>
36
41
  <br><a href="https://youtu.be/FVXTqAozAv8"><b>Framefields launch</b></a>
37
42
  <br><sub><a href="https://github.com/gatewai-dev/framefields/blob/main/examples/22_framefields_launch"><code>22_framefields_launch</code></a></sub>
38
43
  </td>
39
- <td width="33%" align="center">
44
+ </tr>
45
+ <tr>
46
+ <td width="50%" align="center">
40
47
  <a href="https://youtu.be/9BF1snfmg3o"><img src="https://raw.githubusercontent.com/gatewai-dev/framefields/main/assets/showcase/full-circle.jpg" alt="Full Circle film" width="100%"></a>
41
48
  <br><a href="https://youtu.be/9BF1snfmg3o"><b>Full Circle</b></a>
42
49
  <br><sub><a href="https://github.com/gatewai-dev/framefields/blob/main/examples/21_full_circle"><code>21_full_circle</code></a></sub>
43
50
  </td>
44
- <td width="33%" align="center">
51
+ <td width="50%" align="center">
45
52
  <a href="https://youtu.be/RQ3yi_lzPqI"><img src="https://raw.githubusercontent.com/gatewai-dev/framefields/main/assets/showcase/dancer.jpg" alt="Dancer showcase film" width="100%"></a>
46
53
  <br><a href="https://youtu.be/RQ3yi_lzPqI"><b>Dancer showcase</b></a>
47
54
  <br><sub><a href="https://github.com/gatewai-dev/framefields/blob/main/examples/19_framefields_film"><code>19_framefields_film</code></a></sub>
@@ -107,7 +114,7 @@ Modern automated video generation is usually constrained by the architectures of
107
114
  | 🎯 | **Deterministic Frame-Accurate Clock** | Absolute frame clocks, discrete sample points, and frame-accurate audio BeatGrids. No floating timers, no drift, no dropped frames. |
108
115
  | 🔠 | **Analytic, Resolution-Independent Type** | The Slug algorithm evaluates glyph contours per-pixel in WGSL — no texture atlases, no scaling artifacts, razor-sharp from 10 px to 10,000 px. |
109
116
  | 🎨 | **Photoshop-Inspired Tonal & Spatial VFX** | 50+ modular GPU shaders: Curves, Levels, Selective Color, 3D LUTs, Halftone, Film Grain, Unsharp Mask, Mesh Warp, and Screen-Space Relighting. |
110
- | 🧊 | **Unified 3D & 2D Depth Compositing** | Nest 2D flex/box trees inside 3D homography planes, multiplane rigs, and meshes (OBJ, FBX, glTF/GLB, STL, PLY, VOX, 3DS, OFF), with PBR glass and SSAO. |
117
+ | 🧊 | **Unified 3D & 2D Depth Compositing** | Nest 2D flex/box trees inside 3D homography planes, multiplane rigs, and meshes (OBJ, FBX, glTF/GLB, STL, PLY, VOX, 3DS, OFF), with GGX PBR, image-based light, shadows, bloom and SSAO. |
111
118
  | 🔊 | **Built-in Procedural Audio DSP** | Multi-track soundtracks, deterministic procedural transition SFX (whoosh, impact, riser), and reactive signals that drive visuals from audio. |
112
119
  | 👁️ | **On-Device Neural Vision** | Object tracking, instance segmentation, multi-person pose, and person mattes from Apache-2.0 ONNX models — feeding reactive signals without a round trip to disk. |
113
120
  | ☁️ | **Cloud-Native & CI/CD Ready** | ~200–400 MB RAM per worker (vs. 2–4 GB for Chromium), ideal for serverless GPU render clusters (AWS G4/G5, Modal, RunPod, Kubernetes). |
@@ -130,12 +137,15 @@ A comprehensive suite of professional image/video shader nodes in [`nodes/`](htt
130
137
  - **Stylization & grain** — Film Grain (Gaussian emulsion with spatial seed variation), Halftone (mono/RGB/CMYK, adjustable dot shape & angle), Gradient Map, High Pass.
131
138
  - **Optics & lens** — Bilateral Gaussian Blur, Unsharp Mask, Vignette, Refraction Caustics, PBR Glassmorphism with chromatic dispersion ([`PBRGlass`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/effects)).
132
139
  - **Distortion & warping** — Displacement Maps, Liquify, Mesh Warp, Corner Pin homography.
140
+ - **Gradients, mattes & transitions** — CSS `linear-` / `radial-` / `conic-gradient()` strings as any background or fill (blended in OKLab), track mattes (`node.withMatte(layer, "alpha" | "luma" …)`) for wipes, reveals and video-in-type, and [`Layer.sequence`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/transitions.ts) with `Transition.push` / `wipe` / `iris` / `crossfade` / `zoom` / `whip` between scenes.
133
141
 
134
142
  ### 3. Unified 3D Scene Graph, Camera & Mesh Shading
135
143
  - **Calibrated camera rig** — LookAt and Turntable cameras ([`Camera3D`](https://github.com/gatewai-dev/framefields/blob/main/packages/webgpu-renderers/src/math3d/camera3d.ts)) calibrated so `z = 0` matches 2D canvas pixel coordinates 1:1.
136
- - **3D layout primitives** — [`Layer3D.cube`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/shapes3d.ts), `carousel`, `prism`, `plane`, `grid` with unified depth-buffer testing.
144
+ - **3D layout primitives** — [`Layer3D.cube`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/shapes3d.ts), `carousel`, `prism`, `plane`, `grid` with unified depth-buffer testing, plus solid smooth-shaded meshes: `roundedBox` (with `taper`, for keycaps and device bodies), `sphere` and `cylinder`.
137
145
  - **Zero-dependency model parsers** — OBJ, FBX, glTF/GLB, STL, PLY, VOX, 3DS, OFF.
138
- - **Skeletal animation & shading** — 128-bone Linear Blend Skinning, Blinn-Phong & PBR multi-light shading, PCSS/Poisson contact shadows, SSAO, and optical DoF.
146
+ - **Physically based look** — add [`Layer.environment("studio")`](https://github.com/gatewai-dev/framefields/blob/main/packages/webgpu-renderers/src/math3d/environment3d.ts) and the scene shades in linear light with GGX `roughness` / `metallic`, a procedural studio environment for image-based light and reflections, `emissive` surfaces, exposure, and Khronos PBR Neutral / AgX / ACES tone mapping. Scenes without one keep the classic Blinn-Phong look.
147
+ - **Shadows, bloom & fog** — soft PCF shadow maps from a `castShadow` directional or spot light, HDR bloom that only takes light brighter than white, and distance fog that fades into the background color. [`Lighting.studio()`](https://github.com/gatewai-dev/framefields/blob/main/packages/framefields/src/lighting.ts) / `soft` / `sunset` / `dramatic` rigs set all of it up in one call.
148
+ - **Skeletal animation & materials** — 128-bone Linear Blend Skinning; glTF base color, normal, metallic-roughness, occlusion and emissive maps; SSAO and optical DoF.
139
149
  - **Physical motion blur** — 180° shutter motion blur with per-vertex velocity vectors packed into `rg16float` MRT buffers.
140
150
 
141
151
  ### 4. Audio Layers, Procedural SFX & Reactive Signals
@@ -669,6 +679,7 @@ The [`examples/`](https://github.com/gatewai-dev/framefields/blob/main/examples)
669
679
  | [`19_framefields_film`](https://github.com/gatewai-dev/framefields/blob/main/examples/19_framefields_film) | The 30-second master brand film — full pipeline, audio, VFX, 3D |
670
680
  | [`21_full_circle`](https://github.com/gatewai-dev/framefields/blob/main/examples/21_full_circle) | Multi-scene narrative composition |
671
681
  | [`22_framefields_launch`](https://github.com/gatewai-dev/framefields/blob/main/examples/22_framefields_launch) | Launch/product-motion composition |
682
+ | [`26_mac_keyboard_from_3d_primitives`](https://github.com/gatewai-dev/framefields/blob/main/examples/26_mac_keyboard_from_3d_primitives) | Mac keyboard product shot from 3D primitives — procedural keycap tapers, typing choreography, and light waves |
672
683
 
673
684
  ---
674
685
 
@@ -1,5 +1,5 @@
1
- import { P as WebGPUAudioProcessor } from "../index-D1zaOwEU.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-fo4E7A6C.mjs";
3
- import "../index-J9CIK_nu.mjs";
4
- import { t as _default$1 } from "../renderer-2NQWaZd7.mjs";
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";
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,14 @@
1
- import { C as WebGPUAudioProcessor } from "../dist-B9PkqWnN.mjs";
2
- import { t as renderers_default$1 } from "../renderers-CP8CFWDs-BLgwUYX2.mjs";
3
- import { i as mixAudioTracks } from "../dist-BFjSQP7i.mjs";
4
- import { t as renderers_default$2 } from "../renderer-DxtHmyAa.mjs";
5
- import { t as renderers_default$3 } from "../renderer-DTvfYkI9.mjs";
6
- import { t as renderers_default } from "../renderer-D7ztfQHX.mjs";
7
- import { t as renderers_default$4 } from "../renderer-DNNqpK7t.mjs";
8
- import { t as renderers_default$5 } from "../renderer-CfeoxM_3.mjs";
9
- import { t as renderers_default$6 } from "../renderer-CNF10fCq.mjs";
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
10
  import "../renderer-C2n-EHxg.mjs";
11
- import { t as renderers_default$7 } from "../renderer-DffynBHa.mjs";
11
+ import { t as renderers_default$7 } from "../renderer-kwmlLQOO.mjs";
12
12
  import { i as softLimit, n as mixSfxInto, r as renderSfx, t as encodeStereoWav } from "../audio-TAvPwzLR.mjs";
13
13
 
14
14
  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 { o as AudioSignalComputeConfig, zt as FrameSignal } from "./index-D1zaOwEU.mjs";
2
- import { n as NodeRendererPlugin } from "./index-J9CIK_nu.mjs";
1
+ import { Wt as FrameSignal, o as AudioSignalComputeConfig } from "./index-DDEPvMww.mjs";
2
+ import { n as NodeRendererPlugin } from "./index-9B8CJowc.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-BxA0sL9z.d.mts.map
37
+ //# sourceMappingURL=audio-BHanw8Jb.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-BxA0sL9z.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-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,6 +1,6 @@
1
- import { _t as frameArraySignal } from "./dist-B9Afsv83.mjs";
2
- import { F as ensureDevice, i as AudioSignalComputePipeline } from "./dist-B9PkqWnN.mjs";
3
- import { n as decodeAudioSource } from "./dist-BFjSQP7i.mjs";
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";
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-B7Al-W_0.mjs.map
85
+ //# sourceMappingURL=audio-COOMNwL5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-B7Al-W_0.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-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,6 +1,6 @@
1
- import { Ft as resolveMediaMimeType, Kt as updateClockSignals, Ot as isSignal, bt as getActiveMediaMetadata, f as DEFAULT_DURATION_MS, wt as getMediaType } from "./dist-B9Afsv83.mjs";
1
+ import { Ot as getMediaType, Pt as isSignal, on as updateClockSignals, p as DEFAULT_DURATION_MS, qt as resolveMediaMimeType, wt as getActiveMediaMetadata } from "./dist-CbG3QxDw.mjs";
2
2
  import { i as webgpuRegistry, t as audioRegistry } from "./renderer-CtVkU_GA.mjs";
3
- import { A as drawLottieNode, B as inputStore, D as drawCaptionNode, L as getHeadlessFontPath, M as drawSignalNode, N as drawSvgNode, O as drawGifNode, P as drawVideoNode, at as GetFontAssetUrl, b as SlugGeometry, et as registerHeadlessFont, j as drawParagraphNode, k as drawImageNode, nt as signalRegistry, ot as getEnv, st as resolveMediaSourceUrl, tt as shaderStore, y as SlugFontCache } from "./dist-B9PkqWnN.mjs";
3
+ import { A as drawLottieNode, D as drawCaptionNode, L as getHeadlessFontPath, M as drawSignalNode, N as drawSvgNode, O as drawGifNode, P as drawVideoNode, V as inputStore, b as SlugGeometry, ct as resolveMediaSourceUrl, j as drawParagraphNode, k as drawImageNode, nt as shaderStore, ot as GetFontAssetUrl, rt as signalRegistry, st as getEnv, tt as registerHeadlessFont, y as SlugFontCache } from "./dist-Cxi68OuY.mjs";
4
4
  import { AudioSampleSink } from "mediabunny";
5
5
 
6
6
  //#region ../renderers/dist/index.mjs
@@ -1909,4 +1909,4 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1909
1909
 
1910
1910
  //#endregion
1911
1911
  export { springCalculation as C, spring as S, measureTextAsync as _, resolveLayerDuration as a, preloadFont as b, MAX_LIGHTS as c, bezier as d, computeStrokeRect as f, measureText as g, measureSpring as h, mixAudioTracks as i, Matrix4Math as l, mapBlendModeToSkia as m, decodeAudioSource as n, Easing as o, interpolate as p, drawCompositionTree as r, LIGHT_UNIFORM_SIZE_BYTES as s, compositionStateStore as t, Vector3Math as u, parseColorToRgb as v, requiresIsolation as x, preloadCompositionFonts as y };
1912
- //# sourceMappingURL=dist-BFjSQP7i.mjs.map
1912
+ //# sourceMappingURL=dist-BAVZdFEJ.mjs.map