framefields 2.12.0 → 2.13.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 (387) hide show
  1. package/README.md +9 -4
  2. package/dist/audio/index.d.mts +6 -5
  3. package/dist/audio/index.mjs +13 -13
  4. package/dist/{audio-afTBdB3U.d.mts → audio-C4B9p_yq.d.mts} +3 -4
  5. package/dist/audio-C4B9p_yq.d.mts.map +1 -0
  6. package/dist/{audio-DHLoNcxD.mjs → audio-DIvi6hTD.mjs} +4 -4
  7. package/dist/{audio-DHLoNcxD.mjs.map → audio-DIvi6hTD.mjs.map} +1 -1
  8. package/dist/{audio-KHBadECb.mjs → audio-DS9Jg2ls.mjs} +1 -1
  9. package/dist/{audio-KHBadECb.mjs.map → audio-DS9Jg2ls.mjs.map} +1 -1
  10. package/dist/{check-result-Culfu7Nx.mjs → check-result-DZWx73V8.mjs} +1 -1
  11. package/dist/{check-result-Culfu7Nx.mjs.map → check-result-DZWx73V8.mjs.map} +1 -1
  12. package/dist/cli/check-worker.mjs +51 -51
  13. package/dist/cli/check-worker.mjs.map +1 -1
  14. package/dist/cli/local-worker.d.mts +28 -0
  15. package/dist/cli/local-worker.d.mts.map +1 -0
  16. package/dist/cli/local-worker.mjs +83 -0
  17. package/dist/cli/local-worker.mjs.map +1 -0
  18. package/dist/cli.mjs +229 -54
  19. package/dist/cli.mjs.map +1 -1
  20. package/dist/cloud/index.d.mts +2 -0
  21. package/dist/cloud/index.d.mts.map +1 -1
  22. package/dist/cloud/index.mjs +1 -1
  23. package/dist/{cloud-COid1Ipa.mjs → cloud-Cj1TIme8.mjs} +306 -7
  24. package/dist/cloud-Cj1TIme8.mjs.map +1 -0
  25. package/dist/components/index.d.mts +15 -14
  26. package/dist/components/index.mjs +47 -47
  27. package/dist/{dist-CySGkG54.mjs → dist-BSKAbyea.mjs} +2 -2
  28. package/dist/{dist-CySGkG54.mjs.map → dist-BSKAbyea.mjs.map} +1 -1
  29. package/dist/{dist-BwtxciN4.mjs → dist-B_rSWeOz.mjs} +1 -1
  30. package/dist/{dist-Bf2_efYP.mjs → dist-C8XSqfTx.mjs} +1 -1
  31. package/dist/{dist-Bf2_efYP.mjs.map → dist-C8XSqfTx.mjs.map} +1 -1
  32. package/dist/{dist-BSqeChht.mjs → dist-CCrYOkcc.mjs} +145 -84
  33. package/dist/dist-CCrYOkcc.mjs.map +1 -0
  34. package/dist/dist-CiTgmfUw.mjs +502 -0
  35. package/dist/dist-CiTgmfUw.mjs.map +1 -0
  36. package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
  37. package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
  38. package/dist/{dist-B-OPY7Cs.mjs → dist-DtPPPsZV.mjs} +356 -145
  39. package/dist/dist-DtPPPsZV.mjs.map +1 -0
  40. package/dist/{dist-2_lT3Dwc.mjs → dist-Kbf-JTry.mjs} +2 -2
  41. package/dist/{dist-2_lT3Dwc.mjs.map → dist-Kbf-JTry.mjs.map} +1 -1
  42. package/dist/effects/index.d.mts +6 -6
  43. package/dist/effects/index.mjs +36 -36
  44. package/dist/{effects-C8CL9cOq.mjs → effects-B-L3rLs6.mjs} +3 -3
  45. package/dist/{effects-C8CL9cOq.mjs.map → effects-B-L3rLs6.mjs.map} +1 -1
  46. package/dist/fonts/index.d.mts +1 -1
  47. package/dist/fonts/index.mjs +3 -3
  48. package/dist/{fonts-BQrDjnpV.mjs → fonts-k5ll8NTE.mjs} +2 -2
  49. package/dist/{fonts-BQrDjnpV.mjs.map → fonts-k5ll8NTE.mjs.map} +1 -1
  50. package/dist/{gpu-DHa-3Dou.mjs → gpu-D2HT3KcE.mjs} +2 -2
  51. package/dist/{gpu-DHa-3Dou.mjs.map → gpu-D2HT3KcE.mjs.map} +1 -1
  52. package/dist/{index-CTv9ZieD.d.mts → index-B08eSpaI.d.mts} +3 -30
  53. package/dist/index-B08eSpaI.d.mts.map +1 -0
  54. package/dist/index-BFTtXosj.d.mts +63 -0
  55. package/dist/index-BFTtXosj.d.mts.map +1 -0
  56. package/dist/{index-Drk6HC2k.d.mts → index-BGlaws7-.d.mts} +3 -3
  57. package/dist/{index-Drk6HC2k.d.mts.map → index-BGlaws7-.d.mts.map} +1 -1
  58. package/dist/{index-CAuNuvIg.d.mts → index-ByhlTwxh.d.mts} +5 -5
  59. package/dist/{index-CAuNuvIg.d.mts.map → index-ByhlTwxh.d.mts.map} +1 -1
  60. package/dist/{index-Fliv2Z-w.d.mts → index-C2yaponf.d.mts} +132 -7
  61. package/dist/index-C2yaponf.d.mts.map +1 -0
  62. package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
  63. package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
  64. package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
  65. package/dist/index-CnZhBlob.d.mts.map +1 -0
  66. package/dist/{index-BNClElng.d.mts → index-CtKUQ2VG.d.mts} +281 -283
  67. package/dist/index-CtKUQ2VG.d.mts.map +1 -0
  68. package/dist/{index-WwuuX8ZJ.d.mts → index-DBh3WphX.d.mts} +2 -2
  69. package/dist/{index-WwuuX8ZJ.d.mts.map → index-DBh3WphX.d.mts.map} +1 -1
  70. package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
  71. package/dist/index-DQ1U3HC3.d.mts.map +1 -0
  72. package/dist/{index-COYNQ_mf.d.mts → index-a6JrbAK0.d.mts} +1 -1
  73. package/dist/{index-COYNQ_mf.d.mts.map → index-a6JrbAK0.d.mts.map} +1 -1
  74. package/dist/{index-DQa7mhzq.d.mts → index-rtCXNxGO.d.mts} +2 -2
  75. package/dist/{index-DQa7mhzq.d.mts.map → index-rtCXNxGO.d.mts.map} +1 -1
  76. package/dist/index.d.mts +16 -15
  77. package/dist/index.mjs +58 -58
  78. package/dist/preview/index.d.mts +5 -4
  79. package/dist/preview/index.mjs +12 -12
  80. package/dist/preview-engine/audio.mjs +1 -1
  81. package/dist/preview-engine/{chunk-FJTURGJV.mjs → chunk-3C2XT64C.mjs} +1 -1
  82. package/dist/preview-engine/chunk-52X7SURQ.mjs +494 -0
  83. package/dist/preview-engine/{chunk-4JNIEQS2.mjs → chunk-5ZS46EFB.mjs} +1 -1
  84. package/dist/preview-engine/{chunk-KBCZKIIQ.mjs → chunk-CYM75INB.mjs} +1 -1
  85. package/dist/preview-engine/chunk-FZ4RD7HV.mjs +1 -0
  86. package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
  87. package/dist/preview-engine/{chunk-RGKS6YIA.mjs → chunk-N2VISDTG.mjs} +1 -1
  88. package/dist/preview-engine/chunk-N3XTDAL6.mjs +2227 -0
  89. package/dist/preview-engine/{chunk-O75BFM4S.mjs → chunk-NVXFEDJS.mjs} +1 -1
  90. package/dist/preview-engine/chunk-OBIJIQCZ.mjs +1 -0
  91. package/dist/preview-engine/{chunk-VUO4K52B.mjs → chunk-PD2HKW2S.mjs} +1 -1
  92. package/dist/preview-engine/{chunk-HTAHYSCW.mjs → chunk-R4H52Q7S.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-6O7UDVNL.mjs → chunk-RYSV44B4.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-TKXOSEIJ.mjs → chunk-SV3ZNZQU.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-JAUMCOOJ.mjs → chunk-UBY2UYEL.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
  97. package/dist/preview-engine/{chunk-M4QVCQ3O.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-EYKN2VET.mjs → chunk-XCPRRMMW.mjs} +31 -31
  99. package/dist/preview-engine/components.mjs +1 -1
  100. package/dist/preview-engine/effects.mjs +1 -1
  101. package/dist/preview-engine/framefields.mjs +1 -1
  102. package/dist/preview-engine/player.mjs +5 -5
  103. package/dist/preview-engine/{renderers-L6GFGHS6.mjs → renderers-AFTUFMQQ.mjs} +1 -1
  104. package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -1
  105. package/dist/preview-engine/{renderers-PREFONJG.mjs → renderers-EPSF5CSQ.mjs} +1 -1
  106. package/dist/preview-engine/{renderers-R22CDFO4.mjs → renderers-OJWWIVNW.mjs} +1 -1
  107. package/dist/preview-engine/{renderers-TS32FDV7.mjs → renderers-RHMRWX46.mjs} +1 -1
  108. package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
  109. package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
  110. package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
  111. package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
  112. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +228 -0
  113. package/dist/preview-engine/signals.mjs +1 -1
  114. package/dist/preview-engine/{src-GPF7RIBU.mjs → src-YXNX4MLK.mjs} +1 -1
  115. package/dist/{preview-BUtt481A.mjs → preview-lHH8Tv4j.mjs} +323 -35
  116. package/dist/preview-lHH8Tv4j.mjs.map +1 -0
  117. package/dist/{program-Cvv_nb9T.mjs → program-BfiB9ttP.mjs} +17 -4
  118. package/dist/program-BfiB9ttP.mjs.map +1 -0
  119. package/dist/renderer/index.d.mts +4 -3
  120. package/dist/renderer/index.mjs +3 -3
  121. package/dist/renderer-0rLmztAv.mjs +5 -0
  122. package/dist/{renderer-D3QPNBEj.mjs → renderer-4nsuReW2.mjs} +5 -5
  123. package/dist/{renderer-D3QPNBEj.mjs.map → renderer-4nsuReW2.mjs.map} +1 -1
  124. package/dist/{renderer-DO1SZ5xY.mjs → renderer-7xQmXXMH.mjs} +5 -5
  125. package/dist/{renderer-DO1SZ5xY.mjs.map → renderer-7xQmXXMH.mjs.map} +1 -1
  126. package/dist/renderer-B0pjOXFY.mjs +5 -0
  127. package/dist/{renderer-BSsKlcHk.mjs → renderer-B10HDC13.mjs} +5 -5
  128. package/dist/{renderer-BSsKlcHk.mjs.map → renderer-B10HDC13.mjs.map} +1 -1
  129. package/dist/{renderer-DaY04IyU.mjs → renderer-B2IUPjhw.mjs} +5 -5
  130. package/dist/{renderer-DaY04IyU.mjs.map → renderer-B2IUPjhw.mjs.map} +1 -1
  131. package/dist/{renderer-O4y02xkD.mjs → renderer-B3_GddgJ.mjs} +4 -4
  132. package/dist/{renderer-O4y02xkD.mjs.map → renderer-B3_GddgJ.mjs.map} +1 -1
  133. package/dist/{renderer-DQJHjU0L.mjs → renderer-B3un4Pdi.mjs} +5 -5
  134. package/dist/{renderer-DQJHjU0L.mjs.map → renderer-B3un4Pdi.mjs.map} +1 -1
  135. package/dist/{renderer-PnnkUWm-.mjs → renderer-B6bK9rXm.mjs} +4 -4
  136. package/dist/{renderer-PnnkUWm-.mjs.map → renderer-B6bK9rXm.mjs.map} +1 -1
  137. package/dist/renderer-B7J13reL.mjs +5 -0
  138. package/dist/{renderer-HXw4cJZx.mjs → renderer-BEhZiOT4.mjs} +3 -3
  139. package/dist/{renderer-HXw4cJZx.mjs.map → renderer-BEhZiOT4.mjs.map} +1 -1
  140. package/dist/{renderer-xNOKSN3V.mjs → renderer-BEuXJY-C.mjs} +5 -5
  141. package/dist/{renderer-xNOKSN3V.mjs.map → renderer-BEuXJY-C.mjs.map} +1 -1
  142. package/dist/{renderer-IAffbHXx.mjs → renderer-BGchUBW_.mjs} +4 -4
  143. package/dist/{renderer-IAffbHXx.mjs.map → renderer-BGchUBW_.mjs.map} +1 -1
  144. package/dist/{renderer-CZClDMgF.mjs → renderer-BIKkxw_Z.mjs} +5 -5
  145. package/dist/{renderer-CZClDMgF.mjs.map → renderer-BIKkxw_Z.mjs.map} +1 -1
  146. package/dist/{renderer-BvRM3OZ6.mjs → renderer-BM19iK8v.mjs} +3 -3
  147. package/dist/{renderer-BvRM3OZ6.mjs.map → renderer-BM19iK8v.mjs.map} +1 -1
  148. package/dist/{renderer-CtpEzVBn.mjs → renderer-BOlHW3Mi.mjs} +3 -3
  149. package/dist/{renderer-CtpEzVBn.mjs.map → renderer-BOlHW3Mi.mjs.map} +1 -1
  150. package/dist/renderer-BPGIKGgl.mjs +5 -0
  151. package/dist/{renderer-4uZGSmUD.mjs → renderer-BTwuM9u-.mjs} +5 -5
  152. package/dist/{renderer-4uZGSmUD.mjs.map → renderer-BTwuM9u-.mjs.map} +1 -1
  153. package/dist/{renderer-DO_zXwMJ.mjs → renderer-BZMh2io2.mjs} +5 -5
  154. package/dist/{renderer-DO_zXwMJ.mjs.map → renderer-BZMh2io2.mjs.map} +1 -1
  155. package/dist/{renderer-rKw5_EjG.mjs → renderer-BZX932Lj.mjs} +4 -4
  156. package/dist/{renderer-rKw5_EjG.mjs.map → renderer-BZX932Lj.mjs.map} +1 -1
  157. package/dist/{renderer-5fGj_tqN.mjs → renderer-BhcTYhaP.mjs} +6 -6
  158. package/dist/{renderer-5fGj_tqN.mjs.map → renderer-BhcTYhaP.mjs.map} +1 -1
  159. package/dist/{renderer-DL3o_lG1.mjs → renderer-BmyFfvVA.mjs} +5 -5
  160. package/dist/{renderer-DL3o_lG1.mjs.map → renderer-BmyFfvVA.mjs.map} +1 -1
  161. package/dist/{renderer-DX60Kr20.mjs → renderer-BrEeUw7T.mjs} +3 -3
  162. package/dist/{renderer-DX60Kr20.mjs.map → renderer-BrEeUw7T.mjs.map} +1 -1
  163. package/dist/{renderer-Bf7Z7WT5.mjs → renderer-BsrKj6Td.mjs} +4 -4
  164. package/dist/{renderer-Bf7Z7WT5.mjs.map → renderer-BsrKj6Td.mjs.map} +1 -1
  165. package/dist/{renderer-BOg8i8eF.mjs → renderer-BuvKGwk3.mjs} +1 -1
  166. package/dist/{renderer-BOg8i8eF.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
  167. package/dist/renderer-Bv-Artj1.mjs +5 -0
  168. package/dist/{renderer-_KIBvES8.mjs → renderer-BvBqTAtk.mjs} +5 -5
  169. package/dist/{renderer-_KIBvES8.mjs.map → renderer-BvBqTAtk.mjs.map} +1 -1
  170. package/dist/renderer-BvLjbhcL.mjs +5 -0
  171. package/dist/{renderer-BC_Nse6h.mjs → renderer-Bw-_GZVw.mjs} +4 -4
  172. package/dist/{renderer-BC_Nse6h.mjs.map → renderer-Bw-_GZVw.mjs.map} +1 -1
  173. package/dist/{renderer-CLTRTtQ8.mjs → renderer-Bw0O--gW.mjs} +5 -5
  174. package/dist/{renderer-CLTRTtQ8.mjs.map → renderer-Bw0O--gW.mjs.map} +1 -1
  175. package/dist/renderer-By6awWaf.mjs +5 -0
  176. package/dist/{renderer-DsPLMzy1.mjs → renderer-C-3qhk5x.mjs} +2 -2
  177. package/dist/{renderer-DsPLMzy1.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
  178. package/dist/renderer-C0rvsz7m.mjs +5 -0
  179. package/dist/{renderer-DP9ScNM6.mjs → renderer-C4hd6Cqi.mjs} +3 -3
  180. package/dist/{renderer-DP9ScNM6.mjs.map → renderer-C4hd6Cqi.mjs.map} +1 -1
  181. package/dist/{renderer-B09I95bo.mjs → renderer-C64_B8It.mjs} +3 -3
  182. package/dist/{renderer-DrL3J9ci.mjs → renderer-C98XwEIr.mjs} +4 -4
  183. package/dist/{renderer-DrL3J9ci.mjs.map → renderer-C98XwEIr.mjs.map} +1 -1
  184. package/dist/{renderer-6g1ri445.mjs → renderer-CC22Djgi.mjs} +5 -5
  185. package/dist/{renderer-6g1ri445.mjs.map → renderer-CC22Djgi.mjs.map} +1 -1
  186. package/dist/renderer-CDgud_HB.mjs +5 -0
  187. package/dist/renderer-CDiRF3bG.mjs +6 -0
  188. package/dist/{renderer-FvvywNvv.mjs → renderer-CHCRcCKw.mjs} +3 -3
  189. package/dist/{renderer-FvvywNvv.mjs.map → renderer-CHCRcCKw.mjs.map} +1 -1
  190. package/dist/renderer-CIIEQd4B.mjs +5 -0
  191. package/dist/renderer-CJblwOA9.mjs +5 -0
  192. package/dist/renderer-CNMOXtXE.mjs +5 -0
  193. package/dist/{renderer-D3YbHjRG.mjs → renderer-CO4NGvAh.mjs} +95 -80
  194. package/dist/renderer-CO4NGvAh.mjs.map +1 -0
  195. package/dist/{renderer-ByFPmHBC.mjs → renderer-CO9vE3sd.mjs} +4 -4
  196. package/dist/{renderer-ByFPmHBC.mjs.map → renderer-CO9vE3sd.mjs.map} +1 -1
  197. package/dist/renderer-COeSeNGg.mjs +5 -0
  198. package/dist/{renderer-CN-mCIoI.mjs → renderer-CQ4h8n7p.mjs} +5 -5
  199. package/dist/{renderer-CN-mCIoI.mjs.map → renderer-CQ4h8n7p.mjs.map} +1 -1
  200. package/dist/{renderer-DEoerd-j.mjs → renderer-CRhEGqW4.mjs} +4 -4
  201. package/dist/{renderer-DEoerd-j.mjs.map → renderer-CRhEGqW4.mjs.map} +1 -1
  202. package/dist/{renderer-CiHVnhUk.mjs → renderer-CSu_vYPn.mjs} +5 -5
  203. package/dist/{renderer-CiHVnhUk.mjs.map → renderer-CSu_vYPn.mjs.map} +1 -1
  204. package/dist/{renderer-BJEexai1.mjs → renderer-CU6WT5jW.mjs} +5 -5
  205. package/dist/{renderer-BJEexai1.mjs.map → renderer-CU6WT5jW.mjs.map} +1 -1
  206. package/dist/renderer-CUfElmtZ.mjs +5 -0
  207. package/dist/{renderer-BwJ0nXXu.mjs → renderer-CXrnzihz.mjs} +5 -5
  208. package/dist/{renderer-BwJ0nXXu.mjs.map → renderer-CXrnzihz.mjs.map} +1 -1
  209. package/dist/renderer-CYh2lFoJ.mjs +5 -0
  210. package/dist/renderer-CYtVZYMH.mjs +5 -0
  211. package/dist/{renderer-BwV-o_1b.mjs → renderer-CdXBRdFf.mjs} +4 -4
  212. package/dist/{renderer-BwV-o_1b.mjs.map → renderer-CdXBRdFf.mjs.map} +1 -1
  213. package/dist/{renderer-DrK6pyfz.mjs → renderer-Cfx_FCSf.mjs} +5 -5
  214. package/dist/{renderer-DrK6pyfz.mjs.map → renderer-Cfx_FCSf.mjs.map} +1 -1
  215. package/dist/renderer-CjxZlkjb.mjs +5 -0
  216. package/dist/{renderer-CInMMs5x.mjs → renderer-CkTehyRX.mjs} +6 -6
  217. package/dist/{renderer-CInMMs5x.mjs.map → renderer-CkTehyRX.mjs.map} +1 -1
  218. package/dist/{renderer-DGXqspB9.mjs → renderer-CldjJmRR.mjs} +3 -3
  219. package/dist/{renderer-HhJPFidU.mjs → renderer-CoC64eam.mjs} +5 -5
  220. package/dist/{renderer-HhJPFidU.mjs.map → renderer-CoC64eam.mjs.map} +1 -1
  221. package/dist/renderer-Cpd6TvTC.mjs +5 -0
  222. package/dist/{renderer-DLaUT6JZ.mjs → renderer-Cv9CKKWG.mjs} +4 -4
  223. package/dist/{renderer-DLaUT6JZ.mjs.map → renderer-Cv9CKKWG.mjs.map} +1 -1
  224. package/dist/renderer-CzgcZXKH.mjs +3 -0
  225. package/dist/{renderer-DCMoBppL.mjs → renderer-D-GWBoVT.mjs} +3 -3
  226. package/dist/{renderer-DCMoBppL.mjs.map → renderer-D-GWBoVT.mjs.map} +1 -1
  227. package/dist/{renderer-C3CGYjrC.mjs → renderer-D-mX1EVA.mjs} +5 -5
  228. package/dist/{renderer-C3CGYjrC.mjs.map → renderer-D-mX1EVA.mjs.map} +1 -1
  229. package/dist/{renderer-C2kFIZ4r.mjs → renderer-D0h1hTOo.mjs} +4 -4
  230. package/dist/{renderer-C2kFIZ4r.mjs.map → renderer-D0h1hTOo.mjs.map} +1 -1
  231. package/dist/{renderer-C_gR2H3R.mjs → renderer-D0xM67cK.mjs} +3 -3
  232. package/dist/{renderer-C_gR2H3R.mjs.map → renderer-D0xM67cK.mjs.map} +1 -1
  233. package/dist/renderer-D3ziOPhX.mjs +5 -0
  234. package/dist/renderer-D5yp74NL.mjs +3 -0
  235. package/dist/{renderer-BTd6tFcS.mjs → renderer-DCrKEVjb.mjs} +5 -5
  236. package/dist/{renderer-BTd6tFcS.mjs.map → renderer-DCrKEVjb.mjs.map} +1 -1
  237. package/dist/{renderer-Dak_wVh9.mjs → renderer-DGOMfyh8.mjs} +2 -2
  238. package/dist/{renderer-Dak_wVh9.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
  239. package/dist/renderer-DKJOon6y.d.mts +1 -0
  240. package/dist/renderer-DL-phtL5.mjs +5 -0
  241. package/dist/{renderer-uA0UCxjA.mjs → renderer-DNynPM6X.mjs} +4 -4
  242. package/dist/{renderer-uA0UCxjA.mjs.map → renderer-DNynPM6X.mjs.map} +1 -1
  243. package/dist/renderer-DSnmYnHg.mjs +5 -0
  244. package/dist/renderer-DUGfsT-E.mjs +5 -0
  245. package/dist/renderer-DW5af9x1.mjs +5 -0
  246. package/dist/{renderer-CMCmljb0.mjs → renderer-DWYmJSrl.mjs} +3 -3
  247. package/dist/{renderer-CMCmljb0.mjs.map → renderer-DWYmJSrl.mjs.map} +1 -1
  248. package/dist/renderer-DYMrol1t.mjs +5 -0
  249. package/dist/{renderer-CGpi8CDT.mjs → renderer-DYeNNc_G.mjs} +4 -4
  250. package/dist/{renderer-CGpi8CDT.mjs.map → renderer-DYeNNc_G.mjs.map} +1 -1
  251. package/dist/{renderer-DKFaVaRJ.mjs → renderer-DYlx7VHo.mjs} +4 -4
  252. package/dist/{renderer-DKFaVaRJ.mjs.map → renderer-DYlx7VHo.mjs.map} +1 -1
  253. package/dist/{renderer-DZIxduEt.mjs → renderer-D_m6Qbsi.mjs} +3 -3
  254. package/dist/{renderer-DZIxduEt.mjs.map → renderer-D_m6Qbsi.mjs.map} +1 -1
  255. package/dist/renderer-DekeUHaz.mjs +5 -0
  256. package/dist/{renderer-snjhPaP-.mjs → renderer-DhGZ41hQ.mjs} +4 -4
  257. package/dist/{renderer-snjhPaP-.mjs.map → renderer-DhGZ41hQ.mjs.map} +1 -1
  258. package/dist/{renderer-BXGuCnCJ.mjs → renderer-DiZkZ0Pr.mjs} +4 -4
  259. package/dist/{renderer-BXGuCnCJ.mjs.map → renderer-DiZkZ0Pr.mjs.map} +1 -1
  260. package/dist/{renderer-BBjkX0Vt.mjs → renderer-Dm57W73p.mjs} +3 -3
  261. package/dist/renderer-Dt5uyJdZ.mjs +5 -0
  262. package/dist/{renderer-DwH5e3hx.mjs → renderer-DtFZbE1j.mjs} +3 -3
  263. package/dist/{renderer-Bxiiar50.mjs → renderer-DvHi_wXE.mjs} +4 -4
  264. package/dist/{renderer-Bxiiar50.mjs.map → renderer-DvHi_wXE.mjs.map} +1 -1
  265. package/dist/{renderer-DaLy1dFA.mjs → renderer-Dv_iRIyx.mjs} +21 -21
  266. package/dist/renderer-Dv_iRIyx.mjs.map +1 -0
  267. package/dist/renderer-DwLQAnaK.mjs +5 -0
  268. package/dist/{renderer-qVJdxbXB.mjs → renderer-DzON3wDZ.mjs} +4 -4
  269. package/dist/{renderer-qVJdxbXB.mjs.map → renderer-DzON3wDZ.mjs.map} +1 -1
  270. package/dist/{renderer-Dj54y3h3.mjs → renderer-GIlQ9lZq.mjs} +3 -3
  271. package/dist/{renderer-Dj54y3h3.mjs.map → renderer-GIlQ9lZq.mjs.map} +1 -1
  272. package/dist/{renderer-b0H3oDae.mjs → renderer-HKv5cBdp.mjs} +3 -3
  273. package/dist/{renderer-b0H3oDae.mjs.map → renderer-HKv5cBdp.mjs.map} +1 -1
  274. package/dist/renderer-IXQP2CWM.mjs +5 -0
  275. package/dist/renderer-K-Pkw63O.mjs +5 -0
  276. package/dist/renderer-MPw2KH9P.mjs +5 -0
  277. package/dist/{renderer-t1sXDiqm.mjs → renderer-QbSrnPZU.mjs} +3 -3
  278. package/dist/{renderer-t1sXDiqm.mjs.map → renderer-QbSrnPZU.mjs.map} +1 -1
  279. package/dist/renderer-RPu8RMav.mjs +5 -0
  280. package/dist/{renderer-Dp9FQKVP.mjs → renderer-TfeohPxt.mjs} +5 -5
  281. package/dist/{renderer-Dp9FQKVP.mjs.map → renderer-TfeohPxt.mjs.map} +1 -1
  282. package/dist/{renderer-BzTj_CeK.mjs → renderer-Y1kjtOto.mjs} +4 -4
  283. package/dist/{renderer-BzTj_CeK.mjs.map → renderer-Y1kjtOto.mjs.map} +1 -1
  284. package/dist/{renderer-LrAldCWN.mjs → renderer-YONlI6W-.mjs} +5 -5
  285. package/dist/{renderer-LrAldCWN.mjs.map → renderer-YONlI6W-.mjs.map} +1 -1
  286. package/dist/{renderer-tRi3KNoG.mjs → renderer-_J9JcCMR.mjs} +5 -5
  287. package/dist/{renderer-tRi3KNoG.mjs.map → renderer-_J9JcCMR.mjs.map} +1 -1
  288. package/dist/renderer-dCqxd5N2.mjs +5 -0
  289. package/dist/{renderer-CcmxR6Fy.d.mts → renderer-fG8Jy8Rx.d.mts} +2 -2
  290. package/dist/{renderer-CcmxR6Fy.d.mts.map → renderer-fG8Jy8Rx.d.mts.map} +1 -1
  291. package/dist/renderer-lhjmE-Fp.mjs +5 -0
  292. package/dist/{renderer-TiaHrU5z.mjs → renderer-mDBoz0zT.mjs} +5 -5
  293. package/dist/{renderer-TiaHrU5z.mjs.map → renderer-mDBoz0zT.mjs.map} +1 -1
  294. package/dist/{renderer-smP1F57W.mjs → renderer-pn52dzZz.mjs} +4 -4
  295. package/dist/{renderer-smP1F57W.mjs.map → renderer-pn52dzZz.mjs.map} +1 -1
  296. package/dist/renderer-u9cmBuvM.mjs +5 -0
  297. package/dist/{renderer-CNpq7rL-.mjs → renderer-uER8kn7f.mjs} +3 -3
  298. package/dist/{renderer-CNpq7rL-.mjs.map → renderer-uER8kn7f.mjs.map} +1 -1
  299. package/dist/{renderer-sMFJtt_H.mjs → renderer-uzU6dsdR.mjs} +3 -3
  300. package/dist/{renderer-sMFJtt_H.mjs.map → renderer-uzU6dsdR.mjs.map} +1 -1
  301. package/dist/renderer-vH12jcpz.mjs +5 -0
  302. package/dist/{renderer-oBgCEqaM.mjs → renderer-yNWYqvvq.mjs} +4 -4
  303. package/dist/{renderer-oBgCEqaM.mjs.map → renderer-yNWYqvvq.mjs.map} +1 -1
  304. package/dist/{renderer-Dy1xQOTu.mjs → renderer-zLi2qFGT.mjs} +4 -4
  305. package/dist/{renderer-Dy1xQOTu.mjs.map → renderer-zLi2qFGT.mjs.map} +1 -1
  306. package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs → renderers-CP8CFWDs-BufiCyn7.mjs} +4 -4
  307. package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs.map → renderers-CP8CFWDs-BufiCyn7.mjs.map} +1 -1
  308. package/dist/sam/index.d.mts +3 -3
  309. package/dist/sam/index.mjs +1 -1
  310. package/dist/signals/index.d.mts +7 -7
  311. package/dist/signals/index.mjs +8 -8
  312. package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
  313. package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
  314. package/dist/{src-BU6vm9sP-DFJ3phW0.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +3 -3
  315. package/dist/{src-BU6vm9sP-DFJ3phW0.mjs.map → src-BU6vm9sP-DdTHmCr4.mjs.map} +1 -1
  316. package/dist/{src-D7M8VTzv.mjs → src-DrP7fGJX.mjs} +41 -16
  317. package/dist/{src-D7M8VTzv.mjs.map → src-DrP7fGJX.mjs.map} +1 -1
  318. package/dist/storage/index.d.mts +206 -0
  319. package/dist/storage/index.d.mts.map +1 -0
  320. package/dist/storage/index.mjs +3 -0
  321. package/package.json +67 -59
  322. package/dist/audio-afTBdB3U.d.mts.map +0 -1
  323. package/dist/cloud-COid1Ipa.mjs.map +0 -1
  324. package/dist/dist-B-OPY7Cs.mjs.map +0 -1
  325. package/dist/dist-BSqeChht.mjs.map +0 -1
  326. package/dist/index-BNClElng.d.mts.map +0 -1
  327. package/dist/index-CTv9ZieD.d.mts.map +0 -1
  328. package/dist/index-CdCrae-I.d.mts.map +0 -1
  329. package/dist/index-Fliv2Z-w.d.mts.map +0 -1
  330. package/dist/index-gOVtTm-P.d.mts.map +0 -1
  331. package/dist/preview-BUtt481A.mjs.map +0 -1
  332. package/dist/preview-engine/chunk-5SLBE2FX.mjs +0 -1
  333. package/dist/preview-engine/chunk-74J4DJQA.mjs +0 -1
  334. package/dist/preview-engine/chunk-KIPXBOYG.mjs +0 -1974
  335. package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
  336. package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
  337. package/dist/preview-engine/chunk-UKZVUYB6.mjs +0 -483
  338. package/dist/preview-engine/renderers-PSBTV2DO.mjs +0 -228
  339. package/dist/preview-engine/renderers-TEKHQHCL.mjs +0 -1
  340. package/dist/preview-engine/renderers-U3RLYFCN.mjs +0 -1
  341. package/dist/preview-engine/renderers-V5HM6PZ2.mjs +0 -1
  342. package/dist/preview-engine/renderers-ZGX3A3QZ.mjs +0 -1
  343. package/dist/program-Cvv_nb9T.mjs.map +0 -1
  344. package/dist/renderer--RJepuOy.mjs +0 -5
  345. package/dist/renderer-B1U6YRRV.d.mts +0 -117
  346. package/dist/renderer-B1U6YRRV.d.mts.map +0 -1
  347. package/dist/renderer-B4NFnaty.mjs +0 -5
  348. package/dist/renderer-B6g4ts0e.mjs +0 -5
  349. package/dist/renderer-BGoAr-tl.mjs +0 -5
  350. package/dist/renderer-BSOdBgdE.mjs +0 -5
  351. package/dist/renderer-BU6O0fpM.mjs +0 -5
  352. package/dist/renderer-BZ97iidG.mjs +0 -5
  353. package/dist/renderer-B_Klh1VT.mjs +0 -5
  354. package/dist/renderer-BaWQM1y-.mjs +0 -5
  355. package/dist/renderer-Bc0jvAj0.mjs +0 -5
  356. package/dist/renderer-Bd-NuU3M.mjs +0 -3
  357. package/dist/renderer-Bm077kZ6.mjs +0 -5
  358. package/dist/renderer-BtzE_e_Y.mjs +0 -5
  359. package/dist/renderer-C225eCAo.mjs +0 -5
  360. package/dist/renderer-CC4fhNup.mjs +0 -3
  361. package/dist/renderer-CLXdR4vz.mjs +0 -5
  362. package/dist/renderer-CszM8B3C.mjs +0 -5
  363. package/dist/renderer-Ctp8ZYfk.mjs +0 -5
  364. package/dist/renderer-CxQdSp8I.mjs +0 -5
  365. package/dist/renderer-D3YbHjRG.mjs.map +0 -1
  366. package/dist/renderer-D4GMRtDd.mjs +0 -6
  367. package/dist/renderer-DEsGIvTZ.mjs +0 -5
  368. package/dist/renderer-DIaUQ0EP.mjs +0 -5
  369. package/dist/renderer-DLjqcNzQ.mjs +0 -5
  370. package/dist/renderer-DMuQZa51.mjs +0 -5
  371. package/dist/renderer-DOgi2aF2.mjs +0 -5
  372. package/dist/renderer-DSh7cvi4.mjs +0 -5
  373. package/dist/renderer-DV1LVBBP.mjs +0 -5
  374. package/dist/renderer-DaLy1dFA.mjs.map +0 -1
  375. package/dist/renderer-Dhrj2bJz.mjs +0 -5
  376. package/dist/renderer-DoFUu1R4.mjs +0 -5
  377. package/dist/renderer-DsydX3cx.mjs +0 -5
  378. package/dist/renderer-DxVSoeYi.mjs +0 -5
  379. package/dist/renderer-Nc9bHb0n.mjs +0 -5
  380. package/dist/renderer-TFaSD2Db.mjs +0 -5
  381. package/dist/renderer-Z61ctppe.mjs +0 -5
  382. package/dist/renderer-awXf3sNS.mjs +0 -5
  383. package/dist/renderer-cHT28oYI.mjs +0 -5
  384. package/dist/renderer-g7Y3bFot.mjs +0 -5
  385. package/dist/renderer-qVv0OzVc.mjs +0 -5
  386. /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
  387. /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
@@ -1 +1 @@
1
- import{a as l,b as m,c as n,d as o}from"./chunk-D6LM7DTJ.mjs";import"./chunk-4YT5YJIF.mjs";import{a as p}from"./chunk-FJTURGJV.mjs";import{a as k}from"./chunk-AKVRG7UU.mjs";import"./chunk-3DXMWDQ3.mjs";import"./chunk-GH77FX2Y.mjs";import"./chunk-3QTHW2CD.mjs";import"./chunk-A6OAPDIA.mjs";import"./chunk-UVEDFIPN.mjs";import"./chunk-5SLBE2FX.mjs";import"./chunk-HOV6DDBZ.mjs";import"./chunk-6FULVULN.mjs";import"./chunk-UZTA2EUU.mjs";import"./chunk-P4Y3PMJF.mjs";import"./chunk-RECQ74RP.mjs";import"./chunk-32WC4FRR.mjs";import"./chunk-XOF6UTZX.mjs";import{b as g,c as h,d as i,e as j}from"./chunk-GXFYRMJZ.mjs";import"./chunk-77MT33VR.mjs";import{i as a,k as b,q as c,r as d,s as e,t as f}from"./chunk-ULOFDFHJ.mjs";import"./chunk-Y4NIR77Z.mjs";export{p as AudioSignal,g as AudioSignalComputePipeline,l as AudioSignalExtractorNode,f as Signal,n as SignalGateNode,o as SignalMathNode,m as SignalNode,i as SignalRegistry,h as buildWGSLSignalFn,b as computed,e as cosineSignal,k as modulateRenderer,a as signal,c as signalBuilder,j as signalRegistry,d as sineSignal};
1
+ import{a as l,b as m,c as n,d as o}from"./chunk-D6LM7DTJ.mjs";import"./chunk-4YT5YJIF.mjs";import{a as p}from"./chunk-3C2XT64C.mjs";import{a as k}from"./chunk-AKVRG7UU.mjs";import"./chunk-3DXMWDQ3.mjs";import"./chunk-GH77FX2Y.mjs";import"./chunk-3QTHW2CD.mjs";import"./chunk-A6OAPDIA.mjs";import"./chunk-UVEDFIPN.mjs";import"./chunk-OBIJIQCZ.mjs";import"./chunk-HOV6DDBZ.mjs";import"./chunk-RECQ74RP.mjs";import"./chunk-UE7Y65C3.mjs";import"./chunk-6FULVULN.mjs";import"./chunk-XOF6UTZX.mjs";import"./chunk-LZNHGH56.mjs";import"./chunk-UZTA2EUU.mjs";import{b as g,c as h,d as i,e as j}from"./chunk-GXFYRMJZ.mjs";import"./chunk-77MT33VR.mjs";import{i as a,k as b,q as c,r as d,s as e,t as f}from"./chunk-ULOFDFHJ.mjs";import"./chunk-Y4NIR77Z.mjs";export{p as AudioSignal,g as AudioSignalComputePipeline,l as AudioSignalExtractorNode,f as Signal,n as SignalGateNode,o as SignalMathNode,m as SignalNode,i as SignalRegistry,h as buildWGSLSignalFn,b as computed,e as cosineSignal,k as modulateRenderer,a as signal,c as signalBuilder,j as signalRegistry,d as sineSignal};
@@ -1,4 +1,4 @@
1
- import{T as Ee,U as Fe,Y as Q,da as ee}from"./chunk-PH3UUX6A.mjs";import"./chunk-BREZX5L5.mjs";import"./chunk-EAHJZDOJ.mjs";import"./chunk-CJ4CSVU3.mjs";import"./chunk-6ISHV73H.mjs";import{a as ze,b as L,c as Te,d as $e,e as G,f as te,g,h as M,j as Ce,m as K}from"./chunk-PIHG6HJO.mjs";import"./chunk-CSLSWUUT.mjs";import"./chunk-GH77FX2Y.mjs";import"./chunk-HOV6DDBZ.mjs";import{a as A}from"./chunk-6FULVULN.mjs";import"./chunk-RECQ74RP.mjs";import"./chunk-ULOFDFHJ.mjs";import"./chunk-VEDMJBJV.mjs";import"./chunk-QEWDIPJ7.mjs";import"./chunk-OGPJTUAL.mjs";import"./chunk-5RRKGN2U.mjs";import"./chunk-BDZ3TSOT.mjs";import{f as S,g as y}from"./chunk-Y4NIR77Z.mjs";y();y();var $t="https://github.com/facebookresearch/sam3/blob/main/LICENSE";function Ne(e="SAM 3",t){if(!t?.acceptLicense&&!(typeof S<"u"&&S.env?.FRAMEFIELDS_ACCEPT_SAM_LICENSE==="1"))throw new Error(`Meta SAM License agreement required for ${e}:
1
+ import{T as Ee,U as Fe,Y as Q,da as ee}from"./chunk-PH3UUX6A.mjs";import"./chunk-BREZX5L5.mjs";import"./chunk-EAHJZDOJ.mjs";import"./chunk-CJ4CSVU3.mjs";import"./chunk-6ISHV73H.mjs";import{a as ze,b as L,c as Te,d as $e,e as G,f as te,g,h as M,j as Ce,m as K}from"./chunk-PIHG6HJO.mjs";import"./chunk-CSLSWUUT.mjs";import"./chunk-GH77FX2Y.mjs";import"./chunk-HOV6DDBZ.mjs";import"./chunk-RECQ74RP.mjs";import{a as A}from"./chunk-6FULVULN.mjs";import"./chunk-ULOFDFHJ.mjs";import"./chunk-VEDMJBJV.mjs";import"./chunk-QEWDIPJ7.mjs";import"./chunk-OGPJTUAL.mjs";import"./chunk-5RRKGN2U.mjs";import"./chunk-BDZ3TSOT.mjs";import{f as S,g as y}from"./chunk-Y4NIR77Z.mjs";y();y();var $t="https://github.com/facebookresearch/sam3/blob/main/LICENSE";function Ne(e="SAM 3",t){if(!t?.acceptLicense&&!(typeof S<"u"&&S.env?.FRAMEFIELDS_ACCEPT_SAM_LICENSE==="1"))throw new Error(`Meta SAM License agreement required for ${e}:
2
2
  SAM 3's model weights are subject to Meta's SAM License.
3
3
  Review terms at: ${$t}
4
4
  To download and run SAM 3 in Framefields, you must explicitly accept the terms by:
@@ -1,5 +1,7 @@
1
- import { t as encodeStereoWav } from "./audio-KHBadECb.mjs";
2
- import { s as HeadlessMediaRenderer } from "./renderer-D3YbHjRG.mjs";
1
+ import { z as inputStore } from "./dist-DtPPPsZV.mjs";
2
+ import { t as encodeStereoWav } from "./audio-DS9Jg2ls.mjs";
3
+ import { s as HeadlessMediaRenderer } from "./renderer-CO4NGvAh.mjs";
4
+ import { h as openAssetLocator } from "./dist-CiTgmfUw.mjs";
3
5
  import { createRequire, isBuiltin } from "node:module";
4
6
  import fs from "node:fs";
5
7
  import path from "node:path";
@@ -154,9 +156,10 @@ async function bundleProject(options) {
154
156
  namespace: "framefields-preview"
155
157
  }, () => ({
156
158
  contents: [
157
- `import { startPlayer } from ${JSON.stringify(`${ENGINE_URL}/player.mjs`)};`,
159
+ `import { startAudioMixer, startPlayer } from ${JSON.stringify(`${ENGINE_URL}/player.mjs`)};`,
158
160
  `import * as mod from ${JSON.stringify(entry)};`,
159
- `startPlayer(mod, ${JSON.stringify(options.exportName)}, ${JSON.stringify(settings)});`
161
+ `if (typeof document === "undefined") startAudioMixer(mod, ${JSON.stringify(options.exportName)});`,
162
+ `else startPlayer(mod, ${JSON.stringify(options.exportName)}, ${JSON.stringify(settings)});`
160
163
  ].join("\n"),
161
164
  resolveDir: path.dirname(entry),
162
165
  loader: "js"
@@ -880,7 +883,7 @@ const previewPage = `<!doctype html>
880
883
  }
881
884
 
882
885
  // ── Audio ──
883
- var audio = { state: "mixing", error: "", buffer: null, peaks: null, ctx: null, gain: null, src: null, muted: false, volume: 0.9 };
886
+ var audio = { mode: "browser", state: "mixing", error: "", buffer: null, peaks: null, ctx: null, gain: null, src: null, muted: false, volume: 0.9 };
884
887
  var AUDIO_LABEL = { mixing: "Mixing audio", loading: "Loading audio", ready: "Audio ready", none: "No audio", error: "Audio failed" };
885
888
  var offline = false;
886
889
 
@@ -901,26 +904,252 @@ const previewPage = `<!doctype html>
901
904
  ws.replaceChildren();
902
905
  if (busy) ws.append(el("span", "spinner"));
903
906
  ws.append(document.createTextNode(state === "none" ? "No audio in this composition" : state === "error" ? "Audio could not be mixed" : AUDIO_LABEL[state]));
904
- var usable = state === "ready" && !!audio.buffer;
907
+ var usable = state === "ready" && (!!audio.buffer || !!stream);
905
908
  $("mute").disabled = !usable;
906
909
  $("volume").disabled = !usable;
907
910
  renderChip();
908
911
  drawWave();
909
912
  }
913
+ function ensureAudioContext() {
914
+ if (audio.ctx) return;
915
+ var Ctx = window.AudioContext || window.webkitAudioContext;
916
+ audio.ctx = new Ctx();
917
+ audio.gain = audio.ctx.createGain();
918
+ audio.gain.connect(audio.ctx.destination);
919
+ applyVolume();
920
+ }
921
+ // ── Soundtrack, streamed. The page mixes it with the export's mixer in
922
+ // BLOCK_SEC blocks: the ones at the playhead first, as it plays, the rest
923
+ // in the background (which draws the waveform and finds the film's loudest
924
+ // sample for the master gain). Blocks play back to back on the
925
+ // AudioContext clock. Sources stream straight from where they live, pinned
926
+ // assets from their bucket. The mixing runs in a worker with its own GPU
927
+ // device, so it never holds up drawing; if the worker can't, the page mixes,
928
+ // and if that fails too, the server does. ──
929
+ var BLOCK_SEC = 2, AHEAD_SEC = 4, KEEP_BLOCKS = 64, PEAK_BINS = 1200, SILENT = 0.001;
930
+ var stream = null, playback = null;
931
+ function filmSec() { return meta.frameCount / meta.fps; }
932
+ // The project's bundle, loaded as a worker, runs the mixer instead of a player.
933
+ function mixerWorker() {
934
+ var worker;
935
+ try { worker = new Worker("/@framefields/player.js", { type: "module" }); } catch (e) { return null; }
936
+ var calls = new Map(), next = 0, failed = null;
937
+ var fail = function (err) {
938
+ failed = failed || err;
939
+ calls.forEach(function (c) { c.reject(failed); });
940
+ calls.clear();
941
+ };
942
+ var ready = new Promise(function (resolve, reject) {
943
+ worker.onmessage = function (e) {
944
+ var d = e.data;
945
+ if ("ready" in d) { if (d.ready) resolve(); else { reject(new Error(d.error)); fail(new Error(d.error)); } return; }
946
+ var call = calls.get(d.id);
947
+ if (!call) return;
948
+ calls.delete(d.id);
949
+ if (d.error) call.reject(new Error(d.error)); else call.resolve(d.mix);
950
+ };
951
+ worker.onerror = function (e) {
952
+ var err = new Error(e.message || "the mixing worker failed");
953
+ reject(err);
954
+ fail(err);
955
+ };
956
+ });
957
+ return {
958
+ mix: function (range, chain) {
959
+ return ready.then(function () {
960
+ if (failed) throw failed;
961
+ return new Promise(function (resolve, reject) {
962
+ var id = ++next;
963
+ calls.set(id, { resolve: resolve, reject: reject });
964
+ worker.postMessage({ id: id, range: range, chain: chain });
965
+ });
966
+ });
967
+ },
968
+ stop: function () { worker.terminate(); fail(new Error("stopped")); }
969
+ };
970
+ }
971
+ function beginStream(p) {
972
+ if (stream && stream.worker) stream.worker.stop();
973
+ stopClock();
974
+ audio.buffer = null;
975
+ audio.peaks = new Array(PEAK_BINS).fill(0);
976
+ stream = { player: p, worker: mixerWorker(), blocks: new Map(), order: [], pending: new Map(), queue: [], busy: false,
977
+ seen: new Set(), peak: 0, gain: 1, fill: 0, filling: false, total: Math.max(1, Math.ceil(filmSec() / BLOCK_SEC)) };
978
+ ensureAudioContext();
979
+ setAudioStatus("mixing");
980
+ var s = stream;
981
+ streamBlock(s, Math.floor(frame / meta.fps / BLOCK_SEC), true).then(function () {
982
+ if (stream === s && audio.state === "mixing") setAudioStatus("ready");
983
+ }, function () {});
984
+ }
985
+ // Blocks mix on two chains, each continuing its own effect state from the
986
+ // block before: "fill" runs through the film from its start, so its blocks
987
+ // are exactly the export's; "play" starts at a seek with a lead-in and
988
+ // carries on from there. An exact block is never replaced by a lead-in one.
989
+ function streamBlock(s, i, urgent) {
990
+ var have = s.blocks.get(i);
991
+ if (have) return Promise.resolve(have);
992
+ var waiting = s.pending.get(i);
993
+ if (waiting) {
994
+ if (urgent) promote(s, i);
995
+ return waiting;
996
+ }
997
+ waiting = enqueue(s, i, i === s.fill ? "fill" : "play", urgent, true);
998
+ pumpStream(s);
999
+ return waiting;
1000
+ }
1001
+ function enqueue(s, i, chain, urgent, own) {
1002
+ if (chain === "fill") s.filling = true;
1003
+ var waiting = new Promise(function (resolve, reject) {
1004
+ var job = { i: i, chain: chain, own: own, resolve: resolve, reject: reject };
1005
+ if (urgent) s.queue.unshift(job); else s.queue.push(job);
1006
+ });
1007
+ if (own) s.pending.set(i, waiting);
1008
+ else waiting.catch(function () {});
1009
+ return waiting;
1010
+ }
1011
+ function promote(s, i) {
1012
+ var at = s.queue.findIndex(function (j) { return j.i === i; });
1013
+ if (at > 0) s.queue.unshift(s.queue.splice(at, 1)[0]);
1014
+ }
1015
+ function pumpStream(s) {
1016
+ if (s.busy || stream !== s) return;
1017
+ if (!s.queue.length) { fillStream(s); if (!s.queue.length) return; }
1018
+ s.busy = true;
1019
+ var job = s.queue.shift();
1020
+ var range = { startSec: job.i * BLOCK_SEC, endSec: Math.min(filmSec(), (job.i + 1) * BLOCK_SEC) };
1021
+ mixBlock(s, range, job.chain).then(function (mix) {
1022
+ if (stream === s) keepBlock(s, job.i, { left: mix.left, right: mix.right, sampleRate: mix.sampleRate, exact: mix.exact }, mix.peak);
1023
+ if (job.chain === "fill") { s.fill = job.i + 1; s.filling = false; }
1024
+ job.resolve(s.blocks.get(job.i));
1025
+ }, function (err) {
1026
+ if (job.chain === "fill") s.filling = false;
1027
+ job.reject(err);
1028
+ streamFailed(s, err);
1029
+ }).then(function () {
1030
+ if (job.own) s.pending.delete(job.i);
1031
+ s.busy = false;
1032
+ pumpStream(s);
1033
+ });
1034
+ }
1035
+ // In the worker; on the page itself once the worker has failed.
1036
+ function mixBlock(s, range, chain) {
1037
+ if (!s.worker) return s.player.mixAudio(range, chain);
1038
+ return s.worker.mix(range, chain).catch(function (err) {
1039
+ if (s.worker) {
1040
+ console.warn("The soundtrack's mixing worker failed, so the page mixes it:", err);
1041
+ s.worker.stop();
1042
+ s.worker = null;
1043
+ }
1044
+ return s.player.mixAudio(range, chain);
1045
+ });
1046
+ }
1047
+ // Idle: the fill chain mixes its next block, every block in order, so
1048
+ // its effect state runs on unbroken from the film's start.
1049
+ function fillStream(s) {
1050
+ if (s.filling || s.fill >= s.total) return;
1051
+ enqueue(s, s.fill, "fill", false, !s.pending.has(s.fill));
1052
+ }
1053
+ function keepBlock(s, i, block, peak) {
1054
+ var had = s.blocks.get(i);
1055
+ if (!had || !had.exact || block.exact) {
1056
+ s.blocks.set(i, block);
1057
+ s.order.push(i);
1058
+ while (s.order.length > KEEP_BLOCKS) s.blocks.delete(s.order.shift());
1059
+ }
1060
+ if (s.seen.has(i)) return;
1061
+ s.seen.add(i);
1062
+ s.peak = Math.max(s.peak, peak);
1063
+ var dur = filmSec(), from = Math.floor((i * BLOCK_SEC / dur) * PEAK_BINS);
1064
+ var to = Math.min(PEAK_BINS, Math.ceil((Math.min(dur, (i + 1) * BLOCK_SEC) / dur) * PEAK_BINS));
1065
+ var perBin = (dur / PEAK_BINS) * block.sampleRate, origin = i * BLOCK_SEC * block.sampleRate;
1066
+ for (var b = from; b < to; b++) {
1067
+ var lo = Math.max(0, Math.floor(b * perBin - origin)), hi = Math.min(block.left.length, Math.floor((b + 1) * perBin - origin));
1068
+ var m = audio.peaks[b];
1069
+ for (var k = lo; k < hi; k++) m = Math.max(m, Math.abs(block.left[k]), Math.abs(block.right[k]));
1070
+ audio.peaks[b] = Math.min(1, m);
1071
+ }
1072
+ drawWave();
1073
+ if (s.seen.size < s.total) return;
1074
+ // The whole film is mixed: master as the export does, or say it's silent.
1075
+ s.gain = s.peak > 0.95 ? 0.92 / s.peak : 1;
1076
+ if (s.peak < SILENT) setAudioStatus("none");
1077
+ }
1078
+ function streamFailed(s, err) {
1079
+ if (stream !== s) return;
1080
+ if (s.worker) s.worker.stop();
1081
+ stream = null;
1082
+ stopClock();
1083
+ console.warn("Mixing the soundtrack in the browser failed, so the preview server mixes it:", err);
1084
+ audio.mode = "server";
1085
+ setAudioStatus("mixing");
1086
+ fetch("/audio/mix", { method: "POST" }).catch(function () {});
1087
+ }
1088
+ // The master stage on a block: the film's gain, then the export's soft limiter.
1089
+ function mastered(channel, gain) {
1090
+ var out = new Float32Array(channel.length);
1091
+ for (var k = 0; k < channel.length; k++) {
1092
+ var v = Math.tanh(channel[k] * gain);
1093
+ out[k] = v === v ? v : 0;
1094
+ }
1095
+ return out;
1096
+ }
1097
+ function startStream(f0) {
1098
+ var s = stream, ctx = audio.ctx;
1099
+ ctx.resume();
1100
+ var pb = { t0: f0 / meta.fps, startAt: ctx.currentTime + 0.08, next: Math.floor(f0 / meta.fps / BLOCK_SEC), sources: [], timer: 0 };
1101
+ playback = pb;
1102
+ function tick() {
1103
+ if (playback !== pb || stream !== s) return;
1104
+ var now = ctx.currentTime - pb.startAt + pb.t0;
1105
+ while (pb.next < s.total && pb.next * BLOCK_SEC < now + AHEAD_SEC) {
1106
+ var have = s.blocks.get(pb.next);
1107
+ if (!have) { streamBlock(s, pb.next, true).then(tick, function () {}); return; }
1108
+ scheduleBlock(pb, pb.next, have, s.gain);
1109
+ pb.next++;
1110
+ }
1111
+ }
1112
+ pb.timer = setInterval(tick, 250);
1113
+ tick();
1114
+ return function () { return Math.max(0, ctx.currentTime - pb.startAt); };
1115
+ }
1116
+ // Block i starts at film second i * BLOCK_SEC: on the clock, that is
1117
+ // startAt + (i * BLOCK_SEC - t0). A block that comes late starts part way
1118
+ // in, so sound and picture stay on the same clock.
1119
+ function scheduleBlock(pb, i, block, gain) {
1120
+ var ctx = audio.ctx, buf = ctx.createBuffer(2, block.left.length, block.sampleRate);
1121
+ buf.copyToChannel(mastered(block.left, gain), 0);
1122
+ buf.copyToChannel(mastered(block.right, gain), 1);
1123
+ var src = ctx.createBufferSource();
1124
+ src.buffer = buf;
1125
+ src.connect(audio.gain);
1126
+ var when = pb.startAt + (i * BLOCK_SEC - pb.t0), at = Math.max(when, ctx.currentTime + 0.02), offset = at - when;
1127
+ if (offset >= buf.duration) return;
1128
+ src.start(at, offset);
1129
+ pb.sources.push(src);
1130
+ src.onended = function () { pb.sources = pb.sources.filter(function (x) { return x !== src; }); };
1131
+ }
1132
+ function stopStream() {
1133
+ var pb = playback;
1134
+ playback = null;
1135
+ if (!pb) return;
1136
+ clearInterval(pb.timer);
1137
+ pb.sources.forEach(function (src) { try { src.stop(); } catch (e) {} src.disconnect(); });
1138
+ }
910
1139
  function loadAudio(status) {
1140
+ if (status && status.state === "browser") {
1141
+ audio.mode = "browser";
1142
+ setAudioStatus("mixing");
1143
+ if (player) beginStream(player);
1144
+ return;
1145
+ }
911
1146
  stopClock();
912
1147
  audio.buffer = null;
913
1148
  audio.peaks = null;
914
1149
  if (!status || status.state !== "ready") { setAudioStatus(status ? status.state : "none", status && status.error); return; }
915
1150
  audio.peaks = status.peaks;
916
1151
  setAudioStatus("loading");
917
- if (!audio.ctx) {
918
- var Ctx = window.AudioContext || window.webkitAudioContext;
919
- audio.ctx = new Ctx();
920
- audio.gain = audio.ctx.createGain();
921
- audio.gain.connect(audio.ctx.destination);
922
- applyVolume();
923
- }
1152
+ ensureAudioContext();
924
1153
  fetch("/audio")
925
1154
  .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.arrayBuffer(); })
926
1155
  .then(function (data) { return audio.ctx.decodeAudioData(data); })
@@ -937,6 +1166,7 @@ const previewPage = `<!doctype html>
937
1166
  // The clock for real-time playback: the soundtrack when there is one,
938
1167
  // otherwise the wall clock. Audio as master keeps picture and sound in sync.
939
1168
  function startClock(f0) {
1169
+ if (stream && audio.ctx && audio.state === "ready") return startStream(f0);
940
1170
  if (audio.buffer && audio.ctx) {
941
1171
  audio.ctx.resume();
942
1172
  var src = audio.ctx.createBufferSource();
@@ -951,6 +1181,7 @@ const previewPage = `<!doctype html>
951
1181
  return function () { return (performance.now() - t0) / 1000; };
952
1182
  }
953
1183
  function stopClock() {
1184
+ stopStream();
954
1185
  if (!audio.src) return;
955
1186
  try { audio.src.stop(); } catch (e) {}
956
1187
  audio.src.disconnect();
@@ -1043,6 +1274,14 @@ const previewPage = `<!doctype html>
1043
1274
  async function playFrames(alive) {
1044
1275
  meter.start();
1045
1276
  renderFps();
1277
+ // Sound starts with picture: wait for the block at the playhead.
1278
+ if (stream && audio.state !== "none") {
1279
+ setStalled(true);
1280
+ await streamBlock(stream, Math.floor(frame / meta.fps / BLOCK_SEC), true).catch(function () {});
1281
+ if (!alive()) return;
1282
+ setStalled(false);
1283
+ if (stream && audio.state === "mixing") setAudioStatus("ready");
1284
+ }
1046
1285
  // A soundtrack still downloading would start late: wait for it.
1047
1286
  if (audio.state === "loading") {
1048
1287
  setStalled(true);
@@ -1532,6 +1771,10 @@ const previewPage = `<!doctype html>
1532
1771
  playing: playing,
1533
1772
  buffering: stalled,
1534
1773
  audio: audio.state,
1774
+ // Soundtrack blocks mixed in this page so far, of the film's.
1775
+ audioMixed: stream ? { blocks: stream.seen.size, of: stream.total, exact: Array.from(stream.blocks.values()).filter(function (b) { return b.exact; }).length } : null,
1776
+ // Where the soundtrack mixes: "worker" (off the page's thread), "page", or "server".
1777
+ audioMixer: stream ? (stream.worker ? "worker" : "page") : audio.mode === "server" ? "server" : null,
1535
1778
  connected: !offline,
1536
1779
  // Frames shown per second over the last 2 s of playback (the last
1537
1780
  // playback's while paused), and how long the last frame took to draw.
@@ -1611,6 +1854,7 @@ const previewPage = `<!doctype html>
1611
1854
  if (!window.framefieldsPlayer) return;
1612
1855
  window.framefieldsPlayer.then(function (p) {
1613
1856
  player = p;
1857
+ if (audio.mode === "browser") beginStream(p);
1614
1858
  $("play").disabled = false;
1615
1859
  show(frame).then(function () {
1616
1860
  pageState = "ready";
@@ -1639,8 +1883,31 @@ const previewPage = `<!doctype html>
1639
1883
  `;
1640
1884
 
1641
1885
  //#endregion
1642
- //#region src/preview/index.ts
1886
+ //#region src/preview/peaks.ts
1887
+ /** Waveform peaks of a stereo mix: the loudest sample of either channel per bin, 0–1. */
1888
+ function computePeaks(left, right, bins) {
1889
+ const peaks = new Array(bins).fill(0);
1890
+ if (left.length === 0) return peaks;
1891
+ const per = left.length / bins;
1892
+ for (let b = 0; b < bins; b++) {
1893
+ const start = Math.floor(b * per);
1894
+ const end = Math.min(left.length, Math.floor((b + 1) * per));
1895
+ let max = 0;
1896
+ for (let i = start; i < end; i++) {
1897
+ const v = Math.max(Math.abs(left[i] ?? 0), Math.abs(right[i] ?? 0));
1898
+ if (v > max) max = v;
1899
+ }
1900
+ peaks[b] = Math.min(1, max);
1901
+ }
1902
+ return peaks;
1903
+ }
1904
+ /** Bins the page's waveform draws. */
1643
1905
  const PEAK_BINS = 1200;
1906
+ /** A mix counts as silent below this peak. */
1907
+ const SILENT_PEAK = .001;
1908
+
1909
+ //#endregion
1910
+ //#region src/preview/index.ts
1644
1911
  /** Requests carrying this header come from another preview process, not a page. */
1645
1912
  const TAKEOVER_HEADER = "x-framefields-preview";
1646
1913
  const PLAYER_PATH = "/@framefields/player.js";
@@ -1676,6 +1943,11 @@ async function startPreview(source, options = {}) {
1676
1943
  let pageOpened = false;
1677
1944
  const notes = options.notesDir === false ? void 0 : new NoteStore(path.resolve(options.notesDir ?? path.join(process.cwd(), ".framefields", "preview-notes")));
1678
1945
  let noteQueue = Promise.resolve();
1946
+ const assets = await openAssetLocator(path.dirname(entry)).catch((err) => {
1947
+ say(`pinned assets are off: ${err.message}`);
1948
+ });
1949
+ if (assets) inputStore.setMissingMediaResolver((file) => assets.url(file));
1950
+ const unreadable = /* @__PURE__ */ new Set();
1679
1951
  const target = await loadTarget(entry, exportName);
1680
1952
  const meta = await resolveMeta(target, title, session, notes?.dir ?? null);
1681
1953
  let bundle;
@@ -1697,7 +1969,7 @@ async function startPreview(source, options = {}) {
1697
1969
  };
1698
1970
  const engine = engineDir();
1699
1971
  engine.catch(() => {});
1700
- let audio = { state: options.audio === false ? "none" : "mixing" };
1972
+ let audio = { state: options.audio === false ? "none" : "browser" };
1701
1973
  let audioWav;
1702
1974
  function broadcast(event, data) {
1703
1975
  for (const client of sseClients) client.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
@@ -1721,7 +1993,7 @@ async function startPreview(source, options = {}) {
1721
1993
  const left = channels[0] ?? new Float32Array(0);
1722
1994
  const right = channels[1] ?? left;
1723
1995
  const peaks = computePeaks(left, right, PEAK_BINS);
1724
- if (left.length === 0 || Math.max(...peaks) < .001) {
1996
+ if (left.length === 0 || Math.max(...peaks) < SILENT_PEAK) {
1725
1997
  setAudio({ state: "none" });
1726
1998
  return;
1727
1999
  }
@@ -1750,6 +2022,7 @@ async function startPreview(source, options = {}) {
1750
2022
  if (reason === "replaced") say("stopped: a newer preview took over");
1751
2023
  for (const client of sseClients) client.end();
1752
2024
  sseClients.clear();
2025
+ if (assets) inputStore.setMissingMediaResolver();
1753
2026
  server.close(() => {
1754
2027
  resolve$1();
1755
2028
  resolveClosed(reason);
@@ -1807,7 +2080,7 @@ async function startPreview(source, options = {}) {
1807
2080
  if (req.method === "GET" && url$1.pathname === "/@framefields/stat") {
1808
2081
  const file = path.resolve(url$1.searchParams.get("path") ?? "");
1809
2082
  let size = -1;
1810
- if (roots.some((r) => isInside(r, file))) size = await fs.promises.stat(file).then((st) => st.isFile() ? st.size : -1, () => -1);
2083
+ if (roots.some((r) => isInside(r, file))) size = await fs.promises.stat(file).then((st) => st.isFile() ? st.size : -1, () => assets?.entry(file)?.size ?? -1);
1811
2084
  sendJson(res, 200, {
1812
2085
  exists: size >= 0,
1813
2086
  size: Math.max(0, size)
@@ -1868,6 +2141,14 @@ async function startPreview(source, options = {}) {
1868
2141
  return;
1869
2142
  }
1870
2143
  }
2144
+ if (req.method === "POST" && url$1.pathname === "/audio/mix") {
2145
+ if (audio.state === "browser" || audio.state === "error") {
2146
+ audio = { state: "mixing" };
2147
+ startAudio();
2148
+ }
2149
+ sendJson(res, 202, audio);
2150
+ return;
2151
+ }
1871
2152
  if (req.method === "GET" && url$1.pathname === "/audio") {
1872
2153
  if (audio.state !== "ready" || !audioWav) {
1873
2154
  sendJson(res, 404, { error: `audio is ${audio.state}` });
@@ -1895,6 +2176,7 @@ async function startPreview(source, options = {}) {
1895
2176
  await sendFile(req, res, file);
1896
2177
  return;
1897
2178
  }
2179
+ if (assets && await redirectToBucket(res, assets, file, unreadable, say)) return;
1898
2180
  }
1899
2181
  sendJson(res, 404, { error: "not found" });
1900
2182
  } catch (err) {
@@ -1929,7 +2211,6 @@ async function startPreview(source, options = {}) {
1929
2211
  const { port: actualPort } = server.address();
1930
2212
  const url = `http://${host.includes(":") ? `[${host}]` : host}:${actualPort}/`;
1931
2213
  playerBundle().catch(() => {});
1932
- startAudio();
1933
2214
  if (options.open === true) {
1934
2215
  const reconnected = await new Promise((resolve$1) => {
1935
2216
  const timer = setTimeout(() => resolve$1(false), 2e3);
@@ -2041,6 +2322,29 @@ const CONTENT_TYPES = {
2041
2322
  ".srt": "text/plain; charset=utf-8",
2042
2323
  ".txt": "text/plain; charset=utf-8"
2043
2324
  };
2325
+ /**
2326
+ * Sends the page to the bucket for a pinned asset that isn't on disk. The
2327
+ * bucket must allow this page's origin (CORS): the engine reads media with
2328
+ * `fetch`. True when it answered.
2329
+ */
2330
+ async function redirectToBucket(res, assets, file, unreadable, say) {
2331
+ if (!assets.entry(file)) return false;
2332
+ const url = await assets.url(file);
2333
+ if (url) {
2334
+ res.writeHead(302, {
2335
+ location: url,
2336
+ "cache-control": "no-store"
2337
+ });
2338
+ res.end();
2339
+ return true;
2340
+ }
2341
+ const rel = path.relative(assets.root, file);
2342
+ if (!unreadable.has(rel)) {
2343
+ unreadable.add(rel);
2344
+ say(`${rel} is pinned on a private remote and there are no keys here: set its FRAMEFIELDS_STORAGE_* keys, give the remote a publicUrl, or \`npx framefields assets pull\``);
2345
+ }
2346
+ return false;
2347
+ }
2044
2348
  /** Serves a file, with byte ranges so video can seek without loading it whole. */
2045
2349
  async function sendFile(req, res, file) {
2046
2350
  const { size } = await fs.promises.stat(file);
@@ -2115,22 +2419,6 @@ async function requestTakeover(host, port) {
2115
2419
  return ok;
2116
2420
  }
2117
2421
  /** Max absolute amplitude of both channels per bin, 0..1. */
2118
- function computePeaks(left, right, bins) {
2119
- const peaks = new Array(bins).fill(0);
2120
- if (left.length === 0) return peaks;
2121
- const per = left.length / bins;
2122
- for (let b = 0; b < bins; b++) {
2123
- const start = Math.floor(b * per);
2124
- const end = Math.min(left.length, Math.floor((b + 1) * per));
2125
- let max = 0;
2126
- for (let i = start; i < end; i++) {
2127
- const v = Math.max(Math.abs(left[i] ?? 0), Math.abs(right[i] ?? 0));
2128
- if (v > max) max = v;
2129
- }
2130
- peaks[b] = Math.min(1, max);
2131
- }
2132
- return peaks;
2133
- }
2134
2422
  function sendJson(res, status, body) {
2135
2423
  res.writeHead(status, {
2136
2424
  "content-type": "application/json",
@@ -2155,4 +2443,4 @@ function openBrowser(url) {
2155
2443
 
2156
2444
  //#endregion
2157
2445
  export { startPreview as t };
2158
- //# sourceMappingURL=preview-BUtt481A.mjs.map
2446
+ //# sourceMappingURL=preview-lHH8Tv4j.mjs.map