framefields 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/NOTICE.md +4 -0
  2. package/dist/audio/index.d.mts +6 -5
  3. package/dist/audio/index.mjs +13 -13
  4. package/dist/{audio-CYZkDwae.d.mts → audio-CHV33Od9.d.mts} +3 -4
  5. package/dist/audio-CHV33Od9.d.mts.map +1 -0
  6. package/dist/{audio-BuCVk1IQ.mjs → audio-DHzLQ_RG.mjs} +4 -4
  7. package/dist/{audio-BuCVk1IQ.mjs.map → audio-DHzLQ_RG.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 +390 -124
  19. package/dist/cli.mjs.map +1 -1
  20. package/dist/cloud/index.d.mts +16 -3
  21. package/dist/cloud/index.d.mts.map +1 -1
  22. package/dist/cloud/index.mjs +2 -2
  23. package/dist/cloud-Cj1TIme8.mjs +685 -0
  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-BSKAbyea.mjs.map +1 -0
  29. package/dist/{dist-CNGv-JTX.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-EQX3TUUl.mjs → dist-CUNvNDS3.mjs} +129 -82
  33. package/dist/dist-CUNvNDS3.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-CWLLnigL.mjs → dist-D3BeAZ7X.mjs} +315 -84
  37. package/dist/dist-D3BeAZ7X.mjs.map +1 -0
  38. package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
  39. package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
  40. package/dist/{dist-Dg9LMWoX.mjs → dist-Kbf-JTry.mjs} +2 -2
  41. package/dist/{dist-Dg9LMWoX.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-DKLbLXF7.mjs → effects-BiDgCK1L.mjs} +3 -3
  45. package/dist/{effects-DKLbLXF7.mjs.map → effects-BiDgCK1L.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-gPbGbShD.mjs → fonts-DeDPWdvJ.mjs} +2 -2
  49. package/dist/{fonts-gPbGbShD.mjs.map → fonts-DeDPWdvJ.mjs.map} +1 -1
  50. package/dist/{gpu-CpkJJLQP.mjs → gpu-CWjgql4C.mjs} +11 -3
  51. package/dist/gpu-CWjgql4C.mjs.map +1 -0
  52. package/dist/index-BFTtXosj.d.mts +63 -0
  53. package/dist/index-BFTtXosj.d.mts.map +1 -0
  54. package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
  55. package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
  56. package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
  57. package/dist/index-CnZhBlob.d.mts.map +1 -0
  58. package/dist/{index-D2i9J9Zq.d.mts → index-D68eGFNE.d.mts} +3 -30
  59. package/dist/index-D68eGFNE.d.mts.map +1 -0
  60. package/dist/{index-CEU_Zsb9.d.mts → index-DBh3WphX.d.mts} +25 -23
  61. package/dist/index-DBh3WphX.d.mts.map +1 -0
  62. package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
  63. package/dist/index-DQ1U3HC3.d.mts.map +1 -0
  64. package/dist/{index-jSDEM-uE.d.mts → index-Dibc_xpC.d.mts} +6 -6
  65. package/dist/{index-jSDEM-uE.d.mts.map → index-Dibc_xpC.d.mts.map} +1 -1
  66. package/dist/{index-Cro-818i.d.mts → index-E2IXX0Cz.d.mts} +88 -14
  67. package/dist/index-E2IXX0Cz.d.mts.map +1 -0
  68. package/dist/{index-BuiZzc6i.d.mts → index-X2u96TEo.d.mts} +162 -5
  69. package/dist/index-X2u96TEo.d.mts.map +1 -0
  70. package/dist/{index-Bly-7YM1.d.mts → index-YB9j9KUx.d.mts} +3 -3
  71. package/dist/{index-Bly-7YM1.d.mts.map → index-YB9j9KUx.d.mts.map} +1 -1
  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-C8YwZ6k1.d.mts → index-rtCXNxGO.d.mts} +2 -2
  75. package/dist/{index-C8YwZ6k1.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-BToKUTtZ.mjs → preview-PDz7o2xg.mjs} +323 -35
  81. package/dist/preview-PDz7o2xg.mjs.map +1 -0
  82. package/dist/preview-engine/audio.mjs +1 -1
  83. package/dist/preview-engine/{chunk-QF4JWVO3.mjs → chunk-35XSD4QM.mjs} +15 -15
  84. package/dist/preview-engine/{chunk-ZF2MEFKO.mjs → chunk-3DOIE4DV.mjs} +1 -1
  85. package/dist/preview-engine/{chunk-JDB7PMRI.mjs → chunk-3IT7LHWR.mjs} +1 -1
  86. package/dist/preview-engine/{chunk-DNNGWS2C.mjs → chunk-3MLGWUSK.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-KVOFO273.mjs → chunk-3QJ5GRBH.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-54Q5CKSV.mjs → chunk-3QTHW2CD.mjs} +1 -1
  89. package/dist/preview-engine/chunk-44V4V5LD.mjs +1 -0
  90. package/dist/preview-engine/chunk-4P3MMJWD.mjs +1 -0
  91. package/dist/preview-engine/chunk-4YT5YJIF.mjs +1 -0
  92. package/dist/preview-engine/{chunk-BJXNKMSY.mjs → chunk-64L4GUOF.mjs} +20 -6
  93. package/dist/preview-engine/{chunk-UMJ3VGKN.mjs → chunk-6B3NOY5W.mjs} +1 -1
  94. package/dist/preview-engine/chunk-77MT33VR.mjs +1 -0
  95. package/dist/preview-engine/{chunk-BRV7TQDV.mjs → chunk-77WWW75O.mjs} +1 -1
  96. package/dist/preview-engine/chunk-7M5LE6EM.mjs +483 -0
  97. package/dist/preview-engine/chunk-A6OAPDIA.mjs +1 -0
  98. package/dist/preview-engine/chunk-ADLIF544.mjs +39 -0
  99. package/dist/preview-engine/{chunk-OLB4TQLQ.mjs → chunk-AKVRG7UU.mjs} +1 -1
  100. package/dist/preview-engine/{chunk-CIVEZJYF.mjs → chunk-CRBOK3JT.mjs} +1 -1
  101. package/dist/preview-engine/chunk-CSLSWUUT.mjs +1 -0
  102. package/dist/preview-engine/{chunk-ACBBBOUM.mjs → chunk-CYM75INB.mjs} +1 -1
  103. package/dist/preview-engine/{chunk-JSYG6OWZ.mjs → chunk-D7OMXGIZ.mjs} +1 -1
  104. package/dist/preview-engine/{chunk-EPRINA4V.mjs → chunk-E7BKWHOT.mjs} +10 -10
  105. package/dist/preview-engine/{chunk-NOKPBMIP.mjs → chunk-EWDJMJO5.mjs} +1 -1
  106. package/dist/preview-engine/{chunk-5KSBS3AL.mjs → chunk-EYE3GNL5.mjs} +1 -1
  107. package/dist/preview-engine/chunk-FRJPXWAG.mjs +1 -0
  108. package/dist/preview-engine/{chunk-IKVJ4MW5.mjs → chunk-G4ZTSLZU.mjs} +1 -1
  109. package/dist/preview-engine/{chunk-VZLIRYAL.mjs → chunk-GAMAKN5L.mjs} +1 -1
  110. package/dist/preview-engine/{chunk-ZIXPWP2B.mjs → chunk-ICWD36H6.mjs} +1 -1
  111. package/dist/preview-engine/{chunk-OELPPLML.mjs → chunk-IEEV5RB3.mjs} +1 -1
  112. package/dist/preview-engine/chunk-JAAFSVAG.mjs +1 -0
  113. package/dist/preview-engine/{chunk-YVZTRH4Y.mjs → chunk-KDCM7S3S.mjs} +1 -1
  114. package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
  115. package/dist/preview-engine/{chunk-O63FLYWC.mjs → chunk-N2VISDTG.mjs} +1 -1
  116. package/dist/preview-engine/{chunk-GN3NDRLI.mjs → chunk-NCQHOGZK.mjs} +1 -1
  117. package/dist/preview-engine/{chunk-YKM7JDQY.mjs → chunk-NJO2BIJX.mjs} +1 -1
  118. package/dist/preview-engine/{chunk-7GMHSTRP.mjs → chunk-NTSALWFF.mjs} +1 -1
  119. package/dist/preview-engine/{chunk-PKNUTHPI.mjs → chunk-NVXFEDJS.mjs} +1 -1
  120. package/dist/preview-engine/{chunk-VFQH5KVS.mjs → chunk-ONHY4KNY.mjs} +1 -1
  121. package/dist/preview-engine/{chunk-Z24UEN4P.mjs → chunk-PD2HKW2S.mjs} +1 -1
  122. package/dist/preview-engine/chunk-PH3UUX6A.mjs +138 -0
  123. package/dist/preview-engine/chunk-PIHG6HJO.mjs +1 -0
  124. package/dist/preview-engine/{chunk-YHMBGJP6.mjs → chunk-QPT2Y2GZ.mjs} +1 -1
  125. package/dist/preview-engine/{chunk-4AGQN53P.mjs → chunk-QXLFTCLC.mjs} +1 -1
  126. package/dist/preview-engine/{chunk-65NANVQL.mjs → chunk-R4H52Q7S.mjs} +1 -1
  127. package/dist/preview-engine/{chunk-FQL4IJZN.mjs → chunk-RN7J5TRU.mjs} +1 -1
  128. package/dist/preview-engine/{chunk-26XWIHW3.mjs → chunk-RVCLMO5Q.mjs} +1 -1
  129. package/dist/preview-engine/{chunk-VQA4DYZU.mjs → chunk-RYSV44B4.mjs} +1 -1
  130. package/dist/preview-engine/{chunk-TEWRQKX3.mjs → chunk-SFHWP65D.mjs} +1 -1
  131. package/dist/preview-engine/{chunk-RDWLLITE.mjs → chunk-SMHEMYCV.mjs} +1 -1
  132. package/dist/preview-engine/{chunk-EXEO245X.mjs → chunk-SV3ZNZQU.mjs} +1 -1
  133. package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
  134. package/dist/preview-engine/chunk-UFPA36D2.mjs +2227 -0
  135. package/dist/preview-engine/{chunk-EAWJXW4J.mjs → chunk-UVEDFIPN.mjs} +1 -1
  136. package/dist/preview-engine/{chunk-6LTINEA4.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
  137. package/dist/preview-engine/{chunk-IBPYV6HF.mjs → chunk-W4XR6F5G.mjs} +1 -1
  138. package/dist/preview-engine/{chunk-UI3VH33L.mjs → chunk-WPYWCWWL.mjs} +1 -1
  139. package/dist/preview-engine/{chunk-GHTG5XV6.mjs → chunk-XYCR3STG.mjs} +84 -25
  140. package/dist/preview-engine/{chunk-WFMUDL55.mjs → chunk-YAPGJZPI.mjs} +1 -1
  141. package/dist/preview-engine/{chunk-LMXMBX4J.mjs → chunk-YJ4DSRDY.mjs} +1 -1
  142. package/dist/preview-engine/{chunk-CCORQLMR.mjs → chunk-YOJKIMU5.mjs} +1 -1
  143. package/dist/preview-engine/{chunk-UGB6JKVS.mjs → chunk-ZHNEZZ6A.mjs} +1 -1
  144. package/dist/preview-engine/{chunk-LFNCWMKS.mjs → chunk-ZZMI3WOT.mjs} +1 -1
  145. package/dist/preview-engine/components.mjs +1 -1
  146. package/dist/preview-engine/effects.mjs +1 -1
  147. package/dist/preview-engine/fonts.mjs +1 -1
  148. package/dist/preview-engine/framefields.mjs +1 -1
  149. package/dist/preview-engine/player.mjs +5 -5
  150. package/dist/preview-engine/{renderers-53EI26GL.mjs → renderers-3FZVDYRQ.mjs} +1 -1
  151. package/dist/preview-engine/renderers-3KEBYOOF.mjs +1 -0
  152. package/dist/preview-engine/{renderers-6YVZUQOH.mjs → renderers-4RPQSUUZ.mjs} +1 -1
  153. package/dist/preview-engine/renderers-5EGFXFPF.mjs +1 -0
  154. package/dist/preview-engine/renderers-5SJHYUTM.mjs +1 -0
  155. package/dist/preview-engine/renderers-66MWDUN6.mjs +1 -0
  156. package/dist/preview-engine/{renderers-CCRZNGVK.mjs → renderers-6FENMFSC.mjs} +1 -1
  157. package/dist/preview-engine/renderers-77OXJ2GY.mjs +1 -0
  158. package/dist/preview-engine/renderers-7LI4QKHO.mjs +1 -0
  159. package/dist/preview-engine/renderers-AFTUFMQQ.mjs +1 -0
  160. package/dist/preview-engine/{renderers-CYJAVWHT.mjs → renderers-AIZRIW2R.mjs} +1 -1
  161. package/dist/preview-engine/{renderers-OGOW3NA4.mjs → renderers-BDI2BDBA.mjs} +1 -1
  162. package/dist/preview-engine/renderers-BDXCO6NR.mjs +1 -0
  163. package/dist/preview-engine/{renderers-EN7LXJLG.mjs → renderers-BUZ67FNZ.mjs} +1 -1
  164. package/dist/preview-engine/renderers-DMTGKURQ.mjs +1 -0
  165. package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -0
  166. package/dist/preview-engine/{renderers-WSABL3QO.mjs → renderers-ECXMT5BD.mjs} +1 -1
  167. package/dist/preview-engine/{renderers-MOEC2XZZ.mjs → renderers-EILFSWSJ.mjs} +1 -1
  168. package/dist/preview-engine/renderers-EPSF5CSQ.mjs +1 -0
  169. package/dist/preview-engine/{renderers-X6CORAES.mjs → renderers-EVEWFJ7U.mjs} +1 -1
  170. package/dist/preview-engine/renderers-F6PT2LON.mjs +1 -0
  171. package/dist/preview-engine/renderers-F7WPJXKT.mjs +1 -0
  172. package/dist/preview-engine/renderers-FIFF267S.mjs +1 -0
  173. package/dist/preview-engine/{renderers-GQM3KMV3.mjs → renderers-FQISHQEN.mjs} +1 -1
  174. package/dist/preview-engine/{renderers-HKLCB4U6.mjs → renderers-FXAVFNUN.mjs} +1 -1
  175. package/dist/preview-engine/{renderers-P2HORBZ6.mjs → renderers-GITAVRYZ.mjs} +1 -1
  176. package/dist/preview-engine/renderers-GTKRV225.mjs +1 -0
  177. package/dist/preview-engine/{renderers-KCGK33Y2.mjs → renderers-HG6JZIZO.mjs} +1 -1
  178. package/dist/preview-engine/{renderers-I6QKZ7CH.mjs → renderers-HHWMIDN3.mjs} +1 -1
  179. package/dist/preview-engine/renderers-HI3SRJVD.mjs +1 -0
  180. package/dist/preview-engine/{renderers-7CAHX35U.mjs → renderers-HXEDI4BD.mjs} +1 -1
  181. package/dist/preview-engine/{renderers-77PDUMYI.mjs → renderers-HXNSDJBY.mjs} +1 -1
  182. package/dist/preview-engine/{renderers-ACUJMDEK.mjs → renderers-I2ZOUFRU.mjs} +1 -1
  183. package/dist/preview-engine/renderers-JHFD4LHZ.mjs +1 -0
  184. package/dist/preview-engine/{renderers-IHGAWLUF.mjs → renderers-JMSAW7VY.mjs} +1 -1
  185. package/dist/preview-engine/renderers-KGVZUFHD.mjs +1 -0
  186. package/dist/preview-engine/{renderers-RN2MHIFK.mjs → renderers-KICDB5Y6.mjs} +1 -1
  187. package/dist/preview-engine/{renderers-C7SI3NIE.mjs → renderers-KKULMOV4.mjs} +1 -1
  188. package/dist/preview-engine/{renderers-HSFQIILN.mjs → renderers-KMVMPYY7.mjs} +1 -1
  189. package/dist/preview-engine/renderers-LN7WPG6I.mjs +1 -0
  190. package/dist/preview-engine/{renderers-BOBVXYAA.mjs → renderers-LWW4RF6D.mjs} +1 -1
  191. package/dist/preview-engine/renderers-LY57CZZB.mjs +1 -0
  192. package/dist/preview-engine/renderers-MBMJWZEW.mjs +1 -0
  193. package/dist/preview-engine/{renderers-VVP5WQOY.mjs → renderers-MPFU74I3.mjs} +1 -1
  194. package/dist/preview-engine/{renderers-H6PBHEYU.mjs → renderers-MW53LTMB.mjs} +1 -1
  195. package/dist/preview-engine/{renderers-PPZK6VEW.mjs → renderers-NQC4DPX4.mjs} +1 -1
  196. package/dist/preview-engine/renderers-OJWWIVNW.mjs +1 -0
  197. package/dist/preview-engine/{renderers-4IBFDW2S.mjs → renderers-PC2GOZDT.mjs} +1 -1
  198. package/dist/preview-engine/{renderers-UG2C3C7T.mjs → renderers-Q77UPEYE.mjs} +1 -1
  199. package/dist/preview-engine/renderers-QHXCFDHI.mjs +1 -0
  200. package/dist/preview-engine/renderers-RDYJRNAR.mjs +1 -0
  201. package/dist/preview-engine/renderers-RENLKAA7.mjs +1 -0
  202. package/dist/preview-engine/renderers-RHMRWX46.mjs +1 -0
  203. package/dist/preview-engine/{renderers-5XLGCEOA.mjs → renderers-RIPXT4AL.mjs} +1 -1
  204. package/dist/preview-engine/{renderers-FY2HOQCS.mjs → renderers-SFVFAS3C.mjs} +1 -1
  205. package/dist/preview-engine/{renderers-VIGZYJYX.mjs → renderers-SWQVCJHB.mjs} +1 -1
  206. package/dist/preview-engine/renderers-SZVDZDY7.mjs +1 -0
  207. package/dist/preview-engine/renderers-TTXTV4PC.mjs +228 -0
  208. package/dist/preview-engine/renderers-TYSLUZ53.mjs +1 -0
  209. package/dist/preview-engine/{renderers-6LNDAO4B.mjs → renderers-U4IXWMD6.mjs} +1 -1
  210. package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
  211. package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
  212. package/dist/preview-engine/{renderers-33FCFHDR.mjs → renderers-VUQAZ56P.mjs} +1 -1
  213. package/dist/preview-engine/renderers-W5YFMLSB.mjs +1 -0
  214. package/dist/preview-engine/renderers-XKDWUK56.mjs +1 -0
  215. package/dist/preview-engine/renderers-XKSBNCLZ.mjs +1 -0
  216. package/dist/preview-engine/renderers-XLQXVD37.mjs +1 -0
  217. package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
  218. package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
  219. package/dist/preview-engine/signals.mjs +1 -1
  220. package/dist/preview-engine/{src-4IUYUKIZ.mjs → src-YXNX4MLK.mjs} +1 -1
  221. package/dist/{program-Bc860ko5.mjs → program-Bn6ko_I4.mjs} +44 -17
  222. package/dist/program-Bn6ko_I4.mjs.map +1 -0
  223. package/dist/renderer/index.d.mts +4 -3
  224. package/dist/renderer/index.mjs +3 -3
  225. package/dist/{renderer-B3Dme2es.mjs → renderer--Q0pM9Vh.mjs} +5 -5
  226. package/dist/{renderer-B3Dme2es.mjs.map → renderer--Q0pM9Vh.mjs.map} +1 -1
  227. package/dist/renderer-1aSF5BmY.mjs +5 -0
  228. package/dist/{renderer-CAWnCsQc.mjs → renderer-45ifiDkn.mjs} +5 -5
  229. package/dist/{renderer-CAWnCsQc.mjs.map → renderer-45ifiDkn.mjs.map} +1 -1
  230. package/dist/{renderer-Cz-n883J.mjs → renderer-549d94qG.mjs} +5 -5
  231. package/dist/{renderer-Cz-n883J.mjs.map → renderer-549d94qG.mjs.map} +1 -1
  232. package/dist/{renderer-BhsrlGKp.mjs → renderer-B-LUGB9h.mjs} +74 -21
  233. package/dist/renderer-B-LUGB9h.mjs.map +1 -0
  234. package/dist/renderer-B2e4Gr9u.mjs +5 -0
  235. package/dist/{renderer-B1LD29TV.mjs → renderer-B5b-ehRb.mjs} +3 -3
  236. package/dist/{renderer-B1LD29TV.mjs.map → renderer-B5b-ehRb.mjs.map} +1 -1
  237. package/dist/renderer-B6fz4j50.mjs +5 -0
  238. package/dist/{renderer-_9gbYS-3.mjs → renderer-BCTUqJG7.mjs} +5 -5
  239. package/dist/{renderer-_9gbYS-3.mjs.map → renderer-BCTUqJG7.mjs.map} +1 -1
  240. package/dist/renderer-BEftIYw-.mjs +5 -0
  241. package/dist/{renderer-C9BSXyrq.mjs → renderer-BHPgkoEL.mjs} +4 -4
  242. package/dist/{renderer-C9BSXyrq.mjs.map → renderer-BHPgkoEL.mjs.map} +1 -1
  243. package/dist/renderer-BHTnO-7e.mjs +5 -0
  244. package/dist/{renderer-fs8f1QeE.mjs → renderer-BIieU9pY.mjs} +5 -5
  245. package/dist/{renderer-fs8f1QeE.mjs.map → renderer-BIieU9pY.mjs.map} +1 -1
  246. package/dist/{renderer-DwK9jsER.mjs → renderer-BKi6jDi_.mjs} +4 -4
  247. package/dist/{renderer-DwK9jsER.mjs.map → renderer-BKi6jDi_.mjs.map} +1 -1
  248. package/dist/renderer-BMlnQqTO.mjs +5 -0
  249. package/dist/{renderer-BNJ6Jk7-.mjs → renderer-BMpmmYOq.mjs} +4 -4
  250. package/dist/{renderer-BNJ6Jk7-.mjs.map → renderer-BMpmmYOq.mjs.map} +1 -1
  251. package/dist/{renderer-DkqZmfm8.mjs → renderer-BO_wuUKA.mjs} +5 -5
  252. package/dist/{renderer-DkqZmfm8.mjs.map → renderer-BO_wuUKA.mjs.map} +1 -1
  253. package/dist/renderer-BOzcFezY.mjs +5 -0
  254. package/dist/{renderer-Bxjb0HYU.mjs → renderer-BPOh9x5X.mjs} +4 -4
  255. package/dist/{renderer-Bxjb0HYU.mjs.map → renderer-BPOh9x5X.mjs.map} +1 -1
  256. package/dist/{renderer-Ros7XQg2.mjs → renderer-BPiWsrC2.mjs} +3 -3
  257. package/dist/{renderer-Ros7XQg2.mjs.map → renderer-BPiWsrC2.mjs.map} +1 -1
  258. package/dist/{renderer-lHNTgiOM.mjs → renderer-BUj7jE6t.mjs} +3 -3
  259. package/dist/{renderer-lHNTgiOM.mjs.map → renderer-BUj7jE6t.mjs.map} +1 -1
  260. package/dist/renderer-BVbjJIKJ.mjs +5 -0
  261. package/dist/renderer-BXsHKf4k.mjs +5 -0
  262. package/dist/{renderer-D0aAZHC7.mjs → renderer-BZgJj8Cl.mjs} +4 -4
  263. package/dist/{renderer-D0aAZHC7.mjs.map → renderer-BZgJj8Cl.mjs.map} +1 -1
  264. package/dist/{renderer-V4dhrf_h.mjs → renderer-BgjPbgbn.mjs} +6 -6
  265. package/dist/{renderer-V4dhrf_h.mjs.map → renderer-BgjPbgbn.mjs.map} +1 -1
  266. package/dist/{renderer-BaIJIfJ6.mjs → renderer-BjgFpwVK.mjs} +5 -5
  267. package/dist/{renderer-BaIJIfJ6.mjs.map → renderer-BjgFpwVK.mjs.map} +1 -1
  268. package/dist/renderer-Bks49NVl.mjs +5 -0
  269. package/dist/{renderer-CU8v-LxD.mjs → renderer-BlZgyBSo.mjs} +5 -5
  270. package/dist/{renderer-CU8v-LxD.mjs.map → renderer-BlZgyBSo.mjs.map} +1 -1
  271. package/dist/{renderer-B6Oeahe_.mjs → renderer-BqUAyzCZ.mjs} +5 -5
  272. package/dist/{renderer-B6Oeahe_.mjs.map → renderer-BqUAyzCZ.mjs.map} +1 -1
  273. package/dist/{renderer-h62QaJYz.mjs → renderer-Br8km655.mjs} +4 -4
  274. package/dist/{renderer-h62QaJYz.mjs.map → renderer-Br8km655.mjs.map} +1 -1
  275. package/dist/{renderer-sfqZK6L5.mjs → renderer-BsMZ5Iaq.mjs} +4 -4
  276. package/dist/{renderer-sfqZK6L5.mjs.map → renderer-BsMZ5Iaq.mjs.map} +1 -1
  277. package/dist/{renderer-g_1t2je9.mjs → renderer-BtgqTg2K.mjs} +3 -3
  278. package/dist/{renderer-DcvjSolU.mjs → renderer-BuvKGwk3.mjs} +11 -2
  279. package/dist/{renderer-DcvjSolU.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
  280. package/dist/{renderer-BOrMBwQS.mjs → renderer-C-3qhk5x.mjs} +2 -2
  281. package/dist/{renderer-BOrMBwQS.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
  282. package/dist/{renderer-CLAvn9c6.mjs → renderer-C-GTxnfv.mjs} +4 -4
  283. package/dist/{renderer-CLAvn9c6.mjs.map → renderer-C-GTxnfv.mjs.map} +1 -1
  284. package/dist/renderer-C-t7qFKr.mjs +5 -0
  285. package/dist/{renderer-BDZC3o3N.mjs → renderer-C1ctHdXl.mjs} +4 -4
  286. package/dist/{renderer-BDZC3o3N.mjs.map → renderer-C1ctHdXl.mjs.map} +1 -1
  287. package/dist/renderer-C24n-6CX.mjs +6 -0
  288. package/dist/{renderer-pNmI-A9o.mjs → renderer-C7m7Yxgc.mjs} +5 -5
  289. package/dist/{renderer-pNmI-A9o.mjs.map → renderer-C7m7Yxgc.mjs.map} +1 -1
  290. package/dist/{renderer-Bf4-N7k7.mjs → renderer-C9dqx3U7.mjs} +5 -5
  291. package/dist/{renderer-Bf4-N7k7.mjs.map → renderer-C9dqx3U7.mjs.map} +1 -1
  292. package/dist/renderer-CCReX-7M.mjs +5 -0
  293. package/dist/{renderer-JHByuUNb.mjs → renderer-CE4535aW.mjs} +3 -3
  294. package/dist/{renderer-JHByuUNb.mjs.map → renderer-CE4535aW.mjs.map} +1 -1
  295. package/dist/renderer-CIxFQrAm.mjs +5 -0
  296. package/dist/{renderer-ByjaseAo.mjs → renderer-CL-vyXgX.mjs} +5 -5
  297. package/dist/{renderer-ByjaseAo.mjs.map → renderer-CL-vyXgX.mjs.map} +1 -1
  298. package/dist/renderer-CLHBMIqJ.mjs +5 -0
  299. package/dist/renderer-CMJKi-Ye.mjs +5 -0
  300. package/dist/{renderer-B-CMRUag.mjs → renderer-CMnlgAGs.mjs} +4 -4
  301. package/dist/{renderer-B-CMRUag.mjs.map → renderer-CMnlgAGs.mjs.map} +1 -1
  302. package/dist/{renderer-BNHcwxw9.mjs → renderer-CQFMyC_c.mjs} +4 -4
  303. package/dist/{renderer-BNHcwxw9.mjs.map → renderer-CQFMyC_c.mjs.map} +1 -1
  304. package/dist/{renderer-DgPn_SOC.mjs → renderer-CYwVNbUh.mjs} +4 -4
  305. package/dist/{renderer-DgPn_SOC.mjs.map → renderer-CYwVNbUh.mjs.map} +1 -1
  306. package/dist/{renderer-DLPhfwbR.mjs → renderer-CZ5mwBW1.mjs} +3 -3
  307. package/dist/{renderer-DLPhfwbR.mjs.map → renderer-CZ5mwBW1.mjs.map} +1 -1
  308. package/dist/{renderer-4ZUv3X1I.mjs → renderer-C_1eqfI0.mjs} +5 -5
  309. package/dist/{renderer-4ZUv3X1I.mjs.map → renderer-C_1eqfI0.mjs.map} +1 -1
  310. package/dist/renderer-C_H3mHZa.mjs +5 -0
  311. package/dist/{renderer-B1esRxGy.mjs → renderer-CciiDHuU.mjs} +4 -4
  312. package/dist/{renderer-B1esRxGy.mjs.map → renderer-CciiDHuU.mjs.map} +1 -1
  313. package/dist/renderer-CfkTdR5B.mjs +5 -0
  314. package/dist/{renderer-ynFRJh7G.mjs → renderer-CgK7Q1G8.mjs} +3 -3
  315. package/dist/{renderer-CR0mDPYY.mjs → renderer-CnL8Cmmr.mjs} +3 -3
  316. package/dist/renderer-CnhkXJ0R.mjs +5 -0
  317. package/dist/{renderer-fwKnV9zs.mjs → renderer-Cp_HOmp7.mjs} +5 -5
  318. package/dist/{renderer-fwKnV9zs.mjs.map → renderer-Cp_HOmp7.mjs.map} +1 -1
  319. package/dist/renderer-CqpyVsq_.mjs +5 -0
  320. package/dist/renderer-CtWgIpTE.mjs +5 -0
  321. package/dist/{renderer-riIFosX6.mjs → renderer-Cu3iKMSJ.mjs} +5 -5
  322. package/dist/{renderer-riIFosX6.mjs.map → renderer-Cu3iKMSJ.mjs.map} +1 -1
  323. package/dist/{renderer-D4f8f66C.mjs → renderer-CuPAQjDK.mjs} +4 -4
  324. package/dist/{renderer-D4f8f66C.mjs.map → renderer-CuPAQjDK.mjs.map} +1 -1
  325. package/dist/{renderer-CxGx1Lhi.mjs → renderer-CwlY8Tb-.mjs} +3 -3
  326. package/dist/{renderer-CxGx1Lhi.mjs.map → renderer-CwlY8Tb-.mjs.map} +1 -1
  327. package/dist/{renderer-o68mVeyk.mjs → renderer-CxSFvKd1.mjs} +4 -4
  328. package/dist/{renderer-o68mVeyk.mjs.map → renderer-CxSFvKd1.mjs.map} +1 -1
  329. package/dist/{renderer-CrR8Mpxq.mjs → renderer-CyUiXLRa.mjs} +5 -5
  330. package/dist/{renderer-CrR8Mpxq.mjs.map → renderer-CyUiXLRa.mjs.map} +1 -1
  331. package/dist/renderer-CyuKr5ca.mjs +5 -0
  332. package/dist/renderer-CzgcZXKH.mjs +3 -0
  333. package/dist/{renderer-Bx14Wnxl.mjs → renderer-D-GWBoVT.mjs} +58 -4
  334. package/dist/renderer-D-GWBoVT.mjs.map +1 -0
  335. package/dist/{renderer-BwrfKKqw.mjs → renderer-D-fzEZfX.mjs} +4 -4
  336. package/dist/{renderer-BwrfKKqw.mjs.map → renderer-D-fzEZfX.mjs.map} +1 -1
  337. package/dist/renderer-D5yp74NL.mjs +3 -0
  338. package/dist/{renderer-DAn9xiQT.mjs → renderer-D8gN7aqk.mjs} +4 -4
  339. package/dist/{renderer-DAn9xiQT.mjs.map → renderer-D8gN7aqk.mjs.map} +1 -1
  340. package/dist/renderer-D9ON_1Hf.mjs +5 -0
  341. package/dist/renderer-DAnTgh4o.mjs +5 -0
  342. package/dist/{renderer-Dpl6poqD.mjs → renderer-DGOMfyh8.mjs} +2 -2
  343. package/dist/{renderer-Dpl6poqD.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
  344. package/dist/{renderer-Rw87u1Cr.mjs → renderer-DGb_wgTW.mjs} +6 -6
  345. package/dist/{renderer-Rw87u1Cr.mjs.map → renderer-DGb_wgTW.mjs.map} +1 -1
  346. package/dist/{renderer-Co6UFbZB.mjs → renderer-DJPZs_zV.mjs} +5 -5
  347. package/dist/{renderer-Co6UFbZB.mjs.map → renderer-DJPZs_zV.mjs.map} +1 -1
  348. package/dist/renderer-DKJOon6y.d.mts +1 -0
  349. package/dist/{renderer-DOkbn1ot.mjs → renderer-DOZPZTxe.mjs} +5 -5
  350. package/dist/{renderer-DOkbn1ot.mjs.map → renderer-DOZPZTxe.mjs.map} +1 -1
  351. package/dist/{renderer-DaXQgGg3.mjs → renderer-DRal7Goa.mjs} +5 -5
  352. package/dist/{renderer-DaXQgGg3.mjs.map → renderer-DRal7Goa.mjs.map} +1 -1
  353. package/dist/renderer-DWgpivA3.mjs +5 -0
  354. package/dist/{renderer-Bo7shNdU.mjs → renderer-DXFJv_e6.mjs} +4 -4
  355. package/dist/{renderer-Bo7shNdU.mjs.map → renderer-DXFJv_e6.mjs.map} +1 -1
  356. package/dist/renderer-Dh_qNNwR.mjs +5 -0
  357. package/dist/renderer-DkCpXPMP.mjs +5 -0
  358. package/dist/{renderer-eMCTAa9e.mjs → renderer-Dp5ChuOs.mjs} +4 -4
  359. package/dist/{renderer-eMCTAa9e.mjs.map → renderer-Dp5ChuOs.mjs.map} +1 -1
  360. package/dist/{renderer-1uoKiILq.mjs → renderer-DpZballM.mjs} +3 -3
  361. package/dist/{renderer-1uoKiILq.mjs.map → renderer-DpZballM.mjs.map} +1 -1
  362. package/dist/renderer-Dre-6cDR.mjs +5 -0
  363. package/dist/renderer-Ds5z4_HX.mjs +5 -0
  364. package/dist/{renderer-7ow5Acsg.mjs → renderer-DwGlDNOV.mjs} +3 -3
  365. package/dist/{renderer-7ow5Acsg.mjs.map → renderer-DwGlDNOV.mjs.map} +1 -1
  366. package/dist/{renderer-q7q6k_cD.mjs → renderer-DxB_OfLs.mjs} +4 -4
  367. package/dist/{renderer-q7q6k_cD.mjs.map → renderer-DxB_OfLs.mjs.map} +1 -1
  368. package/dist/{renderer-DFJWPqOJ.mjs → renderer-Dz6P-rPI.mjs} +3 -3
  369. package/dist/{renderer-DFJWPqOJ.mjs.map → renderer-Dz6P-rPI.mjs.map} +1 -1
  370. package/dist/{renderer-BURhYcpA.mjs → renderer-FPiLBwj5.mjs} +4 -4
  371. package/dist/{renderer-BURhYcpA.mjs.map → renderer-FPiLBwj5.mjs.map} +1 -1
  372. package/dist/renderer-HGSCOMyP.mjs +5 -0
  373. package/dist/renderer-KMY8W-cJ.mjs +5 -0
  374. package/dist/{renderer-D-QVGphn.mjs → renderer-KgsVk9c6.mjs} +4 -4
  375. package/dist/{renderer-D-QVGphn.mjs.map → renderer-KgsVk9c6.mjs.map} +1 -1
  376. package/dist/{renderer-COcKhouz.mjs → renderer-LXhEPCmy.mjs} +5 -5
  377. package/dist/{renderer-COcKhouz.mjs.map → renderer-LXhEPCmy.mjs.map} +1 -1
  378. package/dist/{renderer-HDj9Zb-O.mjs → renderer-NBMmvqWl.mjs} +20 -7
  379. package/dist/renderer-NBMmvqWl.mjs.map +1 -0
  380. package/dist/{renderer-DE9Jik9K.mjs → renderer-Nnu32rqg.mjs} +3 -3
  381. package/dist/{renderer-DE9Jik9K.mjs.map → renderer-Nnu32rqg.mjs.map} +1 -1
  382. package/dist/renderer-R21YvXz3.mjs +5 -0
  383. package/dist/{renderer-celhuAL7.mjs → renderer-RAq3LnNy.mjs} +3 -3
  384. package/dist/{renderer-celhuAL7.mjs.map → renderer-RAq3LnNy.mjs.map} +1 -1
  385. package/dist/renderer-RtzCz37W.mjs +5 -0
  386. package/dist/{renderer-50JEMaVo.mjs → renderer-RzkU_O1i.mjs} +5 -5
  387. package/dist/{renderer-50JEMaVo.mjs.map → renderer-RzkU_O1i.mjs.map} +1 -1
  388. package/dist/{renderer-Bbxh4N8Y.mjs → renderer-S9tVGneU.mjs} +95 -80
  389. package/dist/renderer-S9tVGneU.mjs.map +1 -0
  390. package/dist/{renderer-BSELd5vU.mjs → renderer-SJyp9-62.mjs} +3 -3
  391. package/dist/{renderer-BSELd5vU.mjs.map → renderer-SJyp9-62.mjs.map} +1 -1
  392. package/dist/{renderer-jnAIhWn_.mjs → renderer-_54hiCq0.mjs} +5 -5
  393. package/dist/{renderer-jnAIhWn_.mjs.map → renderer-_54hiCq0.mjs.map} +1 -1
  394. package/dist/{renderer-88C3QpKL.d.mts → renderer-aRk849b3.d.mts} +2 -2
  395. package/dist/{renderer-88C3QpKL.d.mts.map → renderer-aRk849b3.d.mts.map} +1 -1
  396. package/dist/{renderer-BQetXCcZ.mjs → renderer-dGEMVaZ3.mjs} +4 -4
  397. package/dist/{renderer-BQetXCcZ.mjs.map → renderer-dGEMVaZ3.mjs.map} +1 -1
  398. package/dist/{renderer-RvI3qRUI.mjs → renderer-dRXP2dJU.mjs} +5 -5
  399. package/dist/{renderer-RvI3qRUI.mjs.map → renderer-dRXP2dJU.mjs.map} +1 -1
  400. package/dist/{renderer-D06HxSXO.mjs → renderer-g9SstkTz.mjs} +3 -3
  401. package/dist/renderer-iMrqAjix.mjs +5 -0
  402. package/dist/{renderer-BJ-7WRgO.mjs → renderer-opVuiAQR.mjs} +3 -3
  403. package/dist/{renderer-BJ-7WRgO.mjs.map → renderer-opVuiAQR.mjs.map} +1 -1
  404. package/dist/{renderer-KKk7myX1.mjs → renderer-puQhVfDS.mjs} +5 -5
  405. package/dist/{renderer-KKk7myX1.mjs.map → renderer-puQhVfDS.mjs.map} +1 -1
  406. package/dist/renderer-sMed1u1O.mjs +5 -0
  407. package/dist/renderer-tsAuo46l.mjs +5 -0
  408. package/dist/{renderer-TKZCA0B9.mjs → renderer-vll8LX0I.mjs} +211 -72
  409. package/dist/renderer-vll8LX0I.mjs.map +1 -0
  410. package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs → renderers-CP8CFWDs-BRQyvcut.mjs} +4 -4
  411. package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs.map → renderers-CP8CFWDs-BRQyvcut.mjs.map} +1 -1
  412. package/dist/sam/index.d.mts +3 -3
  413. package/dist/sam/index.mjs +1 -1
  414. package/dist/signals/index.d.mts +7 -7
  415. package/dist/signals/index.mjs +8 -8
  416. package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
  417. package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
  418. package/dist/{src-Bnr8DUC--BRDqRF6I.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +76 -11
  419. package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +1 -0
  420. package/dist/{src-BYp6r-cS.mjs → src-BzFGotRc.mjs} +250 -30
  421. package/dist/src-BzFGotRc.mjs.map +1 -0
  422. package/dist/storage/index.d.mts +206 -0
  423. package/dist/storage/index.d.mts.map +1 -0
  424. package/dist/storage/index.mjs +3 -0
  425. package/package.json +67 -59
  426. package/dist/audio-CYZkDwae.d.mts.map +0 -1
  427. package/dist/cloud-xcfV4J03.mjs +0 -233
  428. package/dist/cloud-xcfV4J03.mjs.map +0 -1
  429. package/dist/dist-CWLLnigL.mjs.map +0 -1
  430. package/dist/dist-CySGkG54.mjs.map +0 -1
  431. package/dist/dist-EQX3TUUl.mjs.map +0 -1
  432. package/dist/gpu-CpkJJLQP.mjs.map +0 -1
  433. package/dist/index-BuiZzc6i.d.mts.map +0 -1
  434. package/dist/index-CEU_Zsb9.d.mts.map +0 -1
  435. package/dist/index-CdCrae-I.d.mts.map +0 -1
  436. package/dist/index-Cro-818i.d.mts.map +0 -1
  437. package/dist/index-D2i9J9Zq.d.mts.map +0 -1
  438. package/dist/index-gOVtTm-P.d.mts.map +0 -1
  439. package/dist/preview-BToKUTtZ.mjs.map +0 -1
  440. package/dist/preview-engine/chunk-4FY4TNST.mjs +0 -1
  441. package/dist/preview-engine/chunk-7LDSMOO3.mjs +0 -1
  442. package/dist/preview-engine/chunk-AGAZJZWI.mjs +0 -1
  443. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +0 -1
  444. package/dist/preview-engine/chunk-C4M3B2Q2.mjs +0 -1
  445. package/dist/preview-engine/chunk-CIVJXFWH.mjs +0 -4
  446. package/dist/preview-engine/chunk-D73ZKPFN.mjs +0 -138
  447. package/dist/preview-engine/chunk-KOVN277Z.mjs +0 -1
  448. package/dist/preview-engine/chunk-M4QANUJI.mjs +0 -480
  449. package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
  450. package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
  451. package/dist/preview-engine/chunk-XF6DYP6B.mjs +0 -1974
  452. package/dist/preview-engine/chunk-XYGDTPO7.mjs +0 -39
  453. package/dist/preview-engine/chunk-YGKO4NIU.mjs +0 -1
  454. package/dist/preview-engine/renderers-2NGIILMI.mjs +0 -1
  455. package/dist/preview-engine/renderers-466Z77BH.mjs +0 -1
  456. package/dist/preview-engine/renderers-4KRENGZA.mjs +0 -1
  457. package/dist/preview-engine/renderers-4W52BQEU.mjs +0 -1
  458. package/dist/preview-engine/renderers-55PRAS7G.mjs +0 -1
  459. package/dist/preview-engine/renderers-5LLYINHW.mjs +0 -1
  460. package/dist/preview-engine/renderers-63N3Y2XO.mjs +0 -1
  461. package/dist/preview-engine/renderers-6ROVFDIN.mjs +0 -1
  462. package/dist/preview-engine/renderers-A4RVLPMG.mjs +0 -1
  463. package/dist/preview-engine/renderers-A53P4J6O.mjs +0 -1
  464. package/dist/preview-engine/renderers-AFJ3373L.mjs +0 -1
  465. package/dist/preview-engine/renderers-ATFWTA3U.mjs +0 -1
  466. package/dist/preview-engine/renderers-BPYJXHBU.mjs +0 -1
  467. package/dist/preview-engine/renderers-D3ZF7FXT.mjs +0 -1
  468. package/dist/preview-engine/renderers-D7YN6B4B.mjs +0 -1
  469. package/dist/preview-engine/renderers-DBLASKF5.mjs +0 -1
  470. package/dist/preview-engine/renderers-DC5ZYYHM.mjs +0 -1
  471. package/dist/preview-engine/renderers-J6ZEXW5L.mjs +0 -1
  472. package/dist/preview-engine/renderers-JV4MF46Q.mjs +0 -1
  473. package/dist/preview-engine/renderers-KQKH4ZIX.mjs +0 -1
  474. package/dist/preview-engine/renderers-MDHPQY6D.mjs +0 -1
  475. package/dist/preview-engine/renderers-MEITHN4N.mjs +0 -1
  476. package/dist/preview-engine/renderers-MN3HSBTJ.mjs +0 -1
  477. package/dist/preview-engine/renderers-NTG3QGNH.mjs +0 -1
  478. package/dist/preview-engine/renderers-OU4SFMB2.mjs +0 -1
  479. package/dist/preview-engine/renderers-P6TIBJIG.mjs +0 -1
  480. package/dist/preview-engine/renderers-POJWQ7L3.mjs +0 -1
  481. package/dist/preview-engine/renderers-RJ7S6VHD.mjs +0 -1
  482. package/dist/preview-engine/renderers-RJJAJZYN.mjs +0 -1
  483. package/dist/preview-engine/renderers-UEQ733VK.mjs +0 -1
  484. package/dist/preview-engine/renderers-ULO2AW2U.mjs +0 -1
  485. package/dist/preview-engine/renderers-UPVHGHCK.mjs +0 -1
  486. package/dist/preview-engine/renderers-UZHSNNIM.mjs +0 -1
  487. package/dist/preview-engine/renderers-V5KWZL2C.mjs +0 -1
  488. package/dist/preview-engine/renderers-WL372W36.mjs +0 -228
  489. package/dist/preview-engine/renderers-YMXKYOHQ.mjs +0 -1
  490. package/dist/preview-engine/renderers-YWDAZ2NZ.mjs +0 -1
  491. package/dist/program-Bc860ko5.mjs.map +0 -1
  492. package/dist/renderer--Ymc_4XJ.mjs +0 -5
  493. package/dist/renderer-B-OdV-eq.mjs +0 -5
  494. package/dist/renderer-B65fwoA2.mjs +0 -5
  495. package/dist/renderer-B92Ahkcv.mjs +0 -5
  496. package/dist/renderer-B9z2AK31.mjs +0 -5
  497. package/dist/renderer-BIF3Dg3Z.mjs +0 -5
  498. package/dist/renderer-BJUVaIAT.mjs +0 -5
  499. package/dist/renderer-BKRDMbI-.mjs +0 -5
  500. package/dist/renderer-BSwhyVWa.mjs +0 -5
  501. package/dist/renderer-BUqSZn2X.mjs +0 -5
  502. package/dist/renderer-BVKOQarx.d.mts +0 -99
  503. package/dist/renderer-BVKOQarx.d.mts.map +0 -1
  504. package/dist/renderer-BbmvjqK9.mjs +0 -3
  505. package/dist/renderer-Bbxh4N8Y.mjs.map +0 -1
  506. package/dist/renderer-BhsrlGKp.mjs.map +0 -1
  507. package/dist/renderer-Bpe4k_x6.mjs +0 -5
  508. package/dist/renderer-Bx14Wnxl.mjs.map +0 -1
  509. package/dist/renderer-C1NjG0CJ.mjs +0 -5
  510. package/dist/renderer-C7Puyst9.mjs +0 -5
  511. package/dist/renderer-CGA_7320.mjs +0 -5
  512. package/dist/renderer-CLnFkXO7.mjs +0 -5
  513. package/dist/renderer-CMQIT1Kh.mjs +0 -5
  514. package/dist/renderer-CQ1rwjIh.mjs +0 -5
  515. package/dist/renderer-CT8h0boY.mjs +0 -5
  516. package/dist/renderer-Cb0lszt3.mjs +0 -5
  517. package/dist/renderer-Ci7oLye9.mjs +0 -5
  518. package/dist/renderer-CjqXB3CZ.mjs +0 -5
  519. package/dist/renderer-CqTV04zQ.mjs +0 -5
  520. package/dist/renderer-CtWeRtHK.mjs +0 -5
  521. package/dist/renderer-CzolnwCo.mjs +0 -5
  522. package/dist/renderer-D6qhcx_C.mjs +0 -5
  523. package/dist/renderer-DDfEf0jt.mjs +0 -5
  524. package/dist/renderer-DDpa8ztp.mjs +0 -5
  525. package/dist/renderer-DbQBqzmx.mjs +0 -5
  526. package/dist/renderer-DfUcwMKa.mjs +0 -5
  527. package/dist/renderer-DgIjNANM.mjs +0 -6
  528. package/dist/renderer-Dsh6Tgu0.mjs +0 -3
  529. package/dist/renderer-DuIwR9GT.mjs +0 -5
  530. package/dist/renderer-Dv4u2c14.mjs +0 -5
  531. package/dist/renderer-HDj9Zb-O.mjs.map +0 -1
  532. package/dist/renderer-IE1yu3lZ.mjs +0 -5
  533. package/dist/renderer-PY_wnEN0.mjs +0 -5
  534. package/dist/renderer-TKZCA0B9.mjs.map +0 -1
  535. package/dist/renderer-gv24VyzO.mjs +0 -5
  536. package/dist/renderer-nN6lPZf9.mjs +0 -5
  537. package/dist/src-BYp6r-cS.mjs.map +0 -1
  538. package/dist/src-Bnr8DUC--BRDqRF6I.mjs.map +0 -1
  539. /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
  540. /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
package/dist/cli.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { i as renderCloud, t as CloudRenderError } from "./cloud-xcfV4J03.mjs";
3
- import { t as failedCheck } from "./check-result-Culfu7Nx.mjs";
2
+ import { c as AssetsError, d as runAssets, f as CONFIG_FILE, h as writeConfig, i as renderCloud, l as megabytes, m as readConfig, p as findRender, t as CloudRenderError, u as pullAssets } from "./cloud-Cj1TIme8.mjs";
3
+ import { t as failedCheck } from "./check-result-DZWx73V8.mjs";
4
4
  import { createRequire } from "node:module";
5
5
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
6
  import path, { basename, dirname, join, posix, relative, resolve, sep } from "node:path";
@@ -9,34 +9,6 @@ import { fileURLToPath, pathToFileURL } from "node:url";
9
9
  import { spawn } from "node:child_process";
10
10
  import { parseArgs } from "node:util";
11
11
 
12
- //#region src/cli/config.ts
13
- /**
14
- * `framefields.json` at the project root: where installed components live,
15
- * and which fonts `framefields add` / `framefields fonts add` installed.
16
- */
17
- const CONFIG_FILE = "framefields.json";
18
- /** The project's config, or the default it would get: `src/components` when there is a `src`. */
19
- function readConfig(cwd) {
20
- const file = join(cwd, CONFIG_FILE);
21
- if (existsSync(file)) {
22
- const config = JSON.parse(readFileSync(file, "utf8"));
23
- if (typeof config.components !== "string") throw new Error(`${CONFIG_FILE}: "components" must be a directory path`);
24
- if (config.fonts !== void 0 && (typeof config.fonts !== "object" || Object.values(config.fonts).some((v) => typeof v !== "string"))) throw new Error(`${CONFIG_FILE}: "fonts" must map roles to font file paths, e.g. { "emoji": "assets/fonts/NotoColorEmoji.ttf" }`);
25
- return {
26
- config,
27
- saved: true
28
- };
29
- }
30
- return {
31
- config: { components: existsSync(join(cwd, "src")) ? "src/components" : "components" },
32
- saved: false
33
- };
34
- }
35
- function writeConfig(cwd, config) {
36
- writeFileSync(join(cwd, CONFIG_FILE), `${JSON.stringify(config, null, " ")}\n`);
37
- }
38
-
39
- //#endregion
40
12
  //#region src/cli/fonts.ts
41
13
  /**
42
14
  * Fonts the CLI installs into a project: a catalog of pinned files (URL,
@@ -308,7 +280,10 @@ async function add(names, options) {
308
280
  report.written.push(shown);
309
281
  }
310
282
  if (!saved) {
311
- writeConfig(cwd, { components: relative(cwd, dir) || "." });
283
+ writeConfig(cwd, {
284
+ ...config,
285
+ components: relative(cwd, dir) || "."
286
+ });
312
287
  report.configWritten = true;
313
288
  }
314
289
  const needs = /* @__PURE__ */ new Map();
@@ -344,11 +319,6 @@ async function add(names, options) {
344
319
  //#endregion
345
320
  //#region src/cli/templates.ts
346
321
  /**
347
- * The files `framefields init` writes: the project layout the framefields
348
- * setup skill describes. `film.ts` only builds; `render.ts` renders frames,
349
- * a grid, the live preview or the video; `theme.ts` holds the numbers.
350
- */
351
- /**
352
322
  * Packages with install scripts. framefields needs exactly one (skia-canvas
353
323
  * downloads its native binary); the others work without theirs.
354
324
  */
@@ -369,14 +339,24 @@ const DEV_DEPENDENCIES = {
369
339
  };
370
340
  const SCRIPTS = {
371
341
  typecheck: "tsc --noEmit -p .",
372
- check: "tsc --noEmit -p . && framefields check src/film.ts --json",
373
- "check:render": "tsc --noEmit -p . && framefields check src/film.ts --render --json",
342
+ check: "tsc --noEmit -p . && framefields check film --json",
343
+ "check:render": "tsc --noEmit -p . && framefields check film --render --json",
374
344
  frames: "tsx src/render.ts frames",
375
345
  grid: "tsx src/render.ts grid",
376
- preview: "tsx src/render.ts preview",
377
- render: "tsx src/render.ts",
378
- "render:cloud": "framefields render src/film.ts --cloud --workers auto"
346
+ preview: "framefields preview film",
347
+ render: "framefields render film",
348
+ "render:cloud": "framefields render film --cloud"
379
349
  };
350
+ /** The named render `init` records in framefields.json. */
351
+ function defaultRenders(name) {
352
+ return { film: {
353
+ title: name,
354
+ entry: "src/film.ts",
355
+ export: "buildFilm",
356
+ workers: "auto",
357
+ output: "output/film.mp4"
358
+ } };
359
+ }
380
360
  /**
381
361
  * The `package.json` fields a framefields project needs. npm reads
382
362
  * `allowScripts`, pnpm its `pnpm` block, bun `trustedDependencies`.
@@ -505,44 +485,30 @@ export async function buildFilm(): Promise<Composition> {
505
485
  const RENDER_TS = `import { existsSync } from "node:fs";
506
486
  import fs from "node:fs/promises";
507
487
  import path from "node:path";
508
- import { HeadlessMediaRenderer, frameCount, startPreview } from "framefields";
488
+ import { HeadlessMediaRenderer, frameCount } from "framefields";
509
489
  import { buildFilm } from "./film.js";
510
490
 
491
+ // Quick looks at the film: \`npm run frames -- 0 30 60\` and \`npm run grid\`.
492
+ // \`npm run render\` and \`npm run preview\` use the "film" render in
493
+ // framefields.json instead (\`framefields render film\`, \`framefields preview film\`).
494
+
511
495
  // Optional settings such as FRAMEFIELDS_API_KEY (see .env.example).
512
496
  const ENV = path.resolve(import.meta.dirname, "../.env");
513
497
  if (existsSync(ENV)) process.loadEnvFile(ENV);
514
498
 
515
499
  const OUT = path.resolve(import.meta.dirname, "../output");
516
500
  // \`npm run frames -- 0 30\` needs the \`--\`; pnpm passes it through: drop it.
517
- const [mode = "video", ...args] = process.argv
501
+ const [mode = "frames", ...args] = process.argv
518
502
  .slice(2)
519
503
  .filter((a) => a !== "--");
520
504
 
521
- if (mode === "preview") {
522
- // The page runs film.ts itself and renders it with WebGPU in the browser.
523
- const session = await startPreview({
524
- entry: new URL("./film.ts", import.meta.url),
525
- export: "buildFilm",
526
- });
527
- console.log(\`Preview at \${session.url}\`);
528
- await session.closed; // until its tab closes or the next preview replaces it
529
- process.exit(0);
530
- }
531
-
532
505
  const film = await buildFilm();
533
506
  await fs.mkdir(OUT, { recursive: true });
534
507
 
535
- if (mode === "frames") {
536
- const renderer = new HeadlessMediaRenderer();
537
- for (const frame of (args.length ? args : ["0"]).map(Number)) {
538
- const png = await film.renderFrame({ frame, renderer });
539
- const file = path.join(OUT, \`f\${String(frame).padStart(4, "0")}.png\`);
540
- await fs.writeFile(file, png);
541
- console.log(\`Wrote \${path.relative(process.cwd(), file)}\`);
542
- }
543
- } else if (mode === "grid") {
508
+ if (mode === "grid") {
509
+ const last = frameCount(film.durationMs ?? (await film.computeDuration()), film.fps) - 1;
544
510
  const png = await film.renderFrameGrid({
545
- frames: args.length ? args.map(Number) : [...new Set([0, Math.floor((frameCount(film.durationMs ?? await film.computeDuration(), film.fps) - 1) / 2), frameCount(film.durationMs ?? await film.computeDuration(), film.fps) - 1])],
511
+ frames: args.length ? args.map(Number) : [...new Set([0, Math.floor(last / 2), last])],
546
512
  columns: 4,
547
513
  cellWidth: 480,
548
514
  showLabels: true,
@@ -550,12 +516,13 @@ if (mode === "frames") {
550
516
  await fs.writeFile(path.join(OUT, "grid.png"), png);
551
517
  console.log("Wrote output/grid.png");
552
518
  } else {
553
- const result = await film.renderVideo({
554
- outputPath: path.join(OUT, "output.mp4"),
555
- quality: "high",
556
- });
557
- await result.cleanup?.();
558
- console.log(\`Exported \${result.filePath}\`);
519
+ const renderer = new HeadlessMediaRenderer();
520
+ for (const frame of (args.length ? args : ["0"]).map(Number)) {
521
+ const png = await film.renderFrame({ frame, renderer });
522
+ const file = path.join(OUT, \`f\${String(frame).padStart(4, "0")}.png\`);
523
+ await fs.writeFile(file, png);
524
+ console.log(\`Wrote \${path.relative(process.cwd(), file)}\`);
525
+ }
559
526
  }
560
527
 
561
528
  // Native GPU and encoder threads keep Node alive; always exit explicitly.
@@ -571,10 +538,13 @@ ${run("typecheck")}
571
538
  ${run("frames")} -- 0 30 60 # PNGs in output/
572
539
  ${run("grid")} # a contact sheet of the motion
573
540
  ${run("preview")} # play it in the browser
574
- ${run("render")} # output/output.mp4
541
+ ${run("render")} # output/film.mp4
575
542
  ${run("render:cloud")} # on cloud GPUs, from the pushed commit
576
543
  \`\`\`
577
544
 
545
+ - \`framefields.json\` names the renders: \`film\` is \`buildFilm\` in \`src/film.ts\`. Add an
546
+ entry under \`renders\` for each cut (a teaser, a vertical edit) and render or check it by
547
+ name: \`npx framefields render teaser --cloud\`, \`npx framefields check teaser\`.
578
548
  - \`src/film.ts\` builds the composition, \`src/theme.ts\` holds sizes, colors and fonts,
579
549
  \`src/render.ts\` renders it.
580
550
  - \`npx framefields list\` shows ready-made components; \`npx framefields add <name>\` copies
@@ -687,10 +657,14 @@ async function init(options) {
687
657
  }
688
658
  }
689
659
  for (const [path$1, lines] of [[".gitignore", GITIGNORE], [".gitattributes", GITATTRIBUTES]]) record(report, path$1, appendLines(join(root, path$1), lines));
660
+ const configExisted = existsSync(join(root, CONFIG_FILE));
690
661
  const { config, saved } = readConfig(root);
691
- if (!saved) {
692
- writeConfig(root, config);
693
- report.written.push("framefields.json");
662
+ if (!saved || !config.renders) {
663
+ writeConfig(root, {
664
+ ...config,
665
+ renders: config.renders ?? defaultRenders(basename(root))
666
+ });
667
+ record(report, CONFIG_FILE, configExisted || "written");
694
668
  }
695
669
  const installFonts = options.fonts !== false;
696
670
  const installEmoji = options.emoji ?? installFonts;
@@ -812,6 +786,27 @@ function shownPath(cwd, root) {
812
786
  return relative(cwd, root) || ".";
813
787
  }
814
788
 
789
+ //#endregion
790
+ //#region src/cli/project-node.ts
791
+ /**
792
+ * Node arguments to run a CLI worker against the user's project: the
793
+ * project's own tsx loader for a TypeScript entry (TypeScript belongs to the
794
+ * consumer project; init's scaffold has it), and the worker script, from
795
+ * source when the CLI runs from source.
796
+ */
797
+ function projectNodeArgs(entry, worker) {
798
+ const source = import.meta.url.endsWith(".ts");
799
+ const args = source ? ["--conditions=development"] : [];
800
+ if (source || /\.[cm]?tsx?$/.test(entry)) try {
801
+ const require = createRequire(resolve("package.json"));
802
+ args.push("--import", pathToFileURL(require.resolve("tsx")).href);
803
+ } catch {
804
+ return { error: "Install the project's tsx dev dependency to load a TypeScript entry." };
805
+ }
806
+ args.push(fileURLToPath(new URL(source ? `./${worker}.ts` : `./cli/${worker}.mjs`, import.meta.url)));
807
+ return args;
808
+ }
809
+
815
810
  //#endregion
816
811
  //#region src/cli/check.ts
817
812
  /** The worker's IPC result is separate from arbitrary builder stdout/stderr. */
@@ -822,15 +817,8 @@ async function runCheck(options) {
822
817
  const timeout = options.timeoutMs ?? 6e4;
823
818
  if (!Number.isSafeInteger(timeout) || timeout <= 0) throw new Error("--timeout must be a positive integer in milliseconds");
824
819
  const fail = (code, message) => failedCheck(entry, exportName, sdkVersion, code, message);
825
- const source = import.meta.url.endsWith(".ts");
826
- const args = source ? ["--conditions=development"] : [];
827
- if (source || /\.[cm]?tsx?$/.test(entry)) try {
828
- const require = createRequire(resolve("package.json"));
829
- args.push("--import", pathToFileURL(require.resolve("tsx")).href);
830
- } catch {
831
- return fail("missing_ts_loader", "Install the project's tsx dev dependency to check a TypeScript entry.");
832
- }
833
- args.push(fileURLToPath(new URL(source ? "./check-worker.ts" : "./cli/check-worker.mjs", import.meta.url)));
820
+ const args = projectNodeArgs(entry, "check-worker");
821
+ if ("error" in args) return fail("missing_ts_loader", args.error);
834
822
  return new Promise((done) => {
835
823
  const child = spawn(process.execPath, args, { stdio: [
836
824
  "ignore",
@@ -872,14 +860,17 @@ function isCheckReport(value) {
872
860
  //#endregion
873
861
  //#region src/cli/cloud.ts
874
862
  /**
875
- * `framefields render <entry> --cloud`: renders the project on
876
- * api.framefields.dev and downloads the video. Prints one plain line per
877
- * phase, and a progress line at most every 10 seconds while frames render.
863
+ * `framefields render <name|entry> --cloud`: renders the project on
864
+ * api.framefields.dev and downloads the video. `name` is a render in
865
+ * framefields.json; a module path renders without one. Prints one plain
866
+ * line per phase, and a progress line at most every 10 seconds while
867
+ * frames render.
878
868
  */
879
869
  const PROGRESS_EVERY_MS = 1e4;
880
870
  async function runCloudRender(o, log, render = renderCloud) {
871
+ const cwd = o.cwd ?? process.cwd();
881
872
  const workers = parseWorkers(o.workers);
882
- if (workers === void 0) {
873
+ if (workers === null) {
883
874
  log(`--workers must be "auto" or a positive whole number, not "${o.workers}".`);
884
875
  return 2;
885
876
  }
@@ -887,8 +878,14 @@ async function runCloudRender(o, log, render = renderCloud) {
887
878
  log(`--codec must be h264 or vp9, not "${o.codec}".`);
888
879
  return 2;
889
880
  }
890
- const codec = o.codec ?? "h264";
891
- const outputPath = o.output ?? path.join("output", `${path.basename(o.entry).replace(/\.[^.]+$/, "")}.${codec === "vp9" ? "webm" : "mp4"}`);
881
+ const target = pickRender(o.entry, cwd);
882
+ if ("error" in target) {
883
+ log(target.error);
884
+ return 2;
885
+ }
886
+ const spec = target.name ? findRender(cwd, target.name) : void 0;
887
+ const outputPath = renderOutput(target, spec, o.codec ?? spec?.codec ?? "h264", o.output);
888
+ const planWorkers = o.plan && (workers ?? spec?.workers ?? 1) === 1 ? "auto" : workers;
892
889
  const controller = new AbortController();
893
890
  const onSigint = () => {
894
891
  log("Cancelling the cloud render…");
@@ -899,25 +896,33 @@ async function runCloudRender(o, log, render = renderCloud) {
899
896
  const narrate = narrator(o.json ? () => {} : log, Date.now);
900
897
  try {
901
898
  const result = await render({
902
- entry: o.entry,
899
+ cwd,
900
+ render: target.name,
901
+ entry: target.entry,
903
902
  export: o.export,
904
903
  select: o.select,
905
- workers: o.plan && workers === 1 ? "auto" : workers,
904
+ workers: planWorkers,
906
905
  maxWorkers: o.maxWorkers ? Number(o.maxWorkers) : void 0,
907
- codec,
906
+ codec: o.codec,
908
907
  quality: o.quality,
909
908
  dryRun: o.plan,
910
909
  outputPath: o.plan ? void 0 : outputPath,
911
910
  signal: controller.signal,
912
911
  onProgress: narrate,
913
- onWarning: (m) => log(`warning: ${m}`)
912
+ onWarning: (m) => log(`warning: ${m}`),
913
+ onLog: log
914
914
  });
915
915
  if (o.json) {
916
916
  log(JSON.stringify(result));
917
917
  return 0;
918
918
  }
919
919
  if (result.status === "planned") {
920
- log(`Render it: framefields render ${o.entry} --cloud --workers ${o.workers ?? "auto"}`);
920
+ const planned = planWorkers === "auto" && spec?.workers !== "auto";
921
+ log(`Render it: ${renderCommand({
922
+ ...o,
923
+ entry: target.name ?? target.entry,
924
+ workers: o.workers ?? (planned ? "auto" : void 0)
925
+ })}`);
921
926
  return 0;
922
927
  }
923
928
  const bytes = result.output?.bytes;
@@ -935,11 +940,45 @@ async function runCloudRender(o, log, render = renderCloud) {
935
940
  process.removeListener("SIGINT", onSigint);
936
941
  }
937
942
  }
943
+ /** The command that renders what `--plan` just planned: the same options, without `--plan`. */
944
+ function renderCommand(o) {
945
+ const flags = [
946
+ ["--export", o.export],
947
+ ["--select", o.select],
948
+ ["--workers", o.workers],
949
+ ["--max-workers", o.maxWorkers],
950
+ ["--codec", o.codec],
951
+ ["--quality", o.quality],
952
+ ["--output", o.output]
953
+ ];
954
+ return [`framefields render ${o.entry ?? ""} --cloud`.replace(" ", " "), ...flags.filter(([, v]) => v !== void 0).map(([f, v]) => `${f} ${v}`)].join(" ");
955
+ }
956
+ /** What a render named `name` (or the module `entry`) produces, wherever it runs. */
957
+ function renderOutput(target, spec, codec, output) {
958
+ const base = target.name ?? path.basename(target.entry ?? "").replace(/\.[^.]+$/, "");
959
+ return output ?? spec?.output ?? path.join("output", `${base}.${codec === "vp9" ? "webm" : "mp4"}`);
960
+ }
961
+ /**
962
+ * What `framefields render [arg]` renders: a render named in framefields.json,
963
+ * or a module path; with no argument, the project's only named render.
964
+ */
965
+ function pickRender(arg, cwd) {
966
+ const renders = readConfig(cwd).config.renders ?? {};
967
+ const names = Object.keys(renders);
968
+ if (arg === void 0) {
969
+ if (names.length === 1) return { name: names[0] };
970
+ return { error: names.length ? `Name the render: ${names.join(", ")}. \`framefields renders\` lists them.` : `Name a module, e.g. \`framefields render src/film.ts\`, or add "renders" to ${CONFIG_FILE}.` };
971
+ }
972
+ if (renders[arg]) return { name: arg };
973
+ if (existsSync(path.resolve(cwd, arg))) return { entry: arg };
974
+ return { error: names.length ? `"${arg}" is neither a render in ${CONFIG_FILE} (${names.join(", ")}) nor a file.` : `"${arg}" is not a file, and ${CONFIG_FILE} names no renders.` };
975
+ }
976
+ /** --workers: undefined when not given, null when invalid. */
938
977
  function parseWorkers(value) {
939
- if (value === void 0) return 1;
978
+ if (value === void 0) return void 0;
940
979
  if (value === "auto") return "auto";
941
980
  const n = Number(value);
942
- return Number.isInteger(n) && n >= 1 ? n : void 0;
981
+ return Number.isInteger(n) && n >= 1 ? n : null;
943
982
  }
944
983
  /** Turns status polls into log lines: one per phase, throttled frame progress. */
945
984
  function narrator(log, now) {
@@ -994,6 +1033,121 @@ function usd(value) {
994
1033
  return value > 0 && value < .01 ? "<$0.01" : `$${value.toFixed(2)}`;
995
1034
  }
996
1035
 
1036
+ //#endregion
1037
+ //#region src/cli/local.ts
1038
+ /**
1039
+ * `framefields render [name|entry]` and `framefields preview [name|entry]`
1040
+ * on this machine. They read the same named renders in framefields.json as
1041
+ * `--cloud`, so a render goes to the same file wherever it runs.
1042
+ *
1043
+ * A local render first downloads pinned assets that are missing here; a
1044
+ * preview doesn't need to: the page streams them from their bucket.
1045
+ */
1046
+ async function runLocal(mode, o, log) {
1047
+ const cwd = o.cwd ?? process.cwd();
1048
+ const target = pickRender(o.entry, cwd);
1049
+ if ("error" in target) {
1050
+ log(target.error);
1051
+ return 2;
1052
+ }
1053
+ const spec = target.name ? findRender(cwd, target.name) : void 0;
1054
+ const entry = path.resolve(cwd, spec?.entry ?? target.entry);
1055
+ const codec = o.codec ?? spec?.codec ?? "h264";
1056
+ if (codec !== "h264" && codec !== "vp9") {
1057
+ log(`--codec must be h264 or vp9, not "${codec}".`);
1058
+ return 2;
1059
+ }
1060
+ const engine = projectEngine(entry);
1061
+ if (!engine) {
1062
+ log("framefields isn't installed in this project: `npm i framefields`.");
1063
+ return 2;
1064
+ }
1065
+ const job = {
1066
+ mode,
1067
+ entry,
1068
+ engine,
1069
+ export: o.export ?? spec?.export ?? "buildFilm",
1070
+ args: spec?.args,
1071
+ select: o.select ?? spec?.select,
1072
+ codec,
1073
+ quality: o.quality ?? spec?.quality,
1074
+ outputPath: path.resolve(cwd, renderOutput(target, spec, codec, o.output)),
1075
+ title: spec?.title ?? target.name
1076
+ };
1077
+ if (mode === "preview" && (job.args !== void 0 || job.select)) log("The preview calls the export without args or select; it shows what the export returns by default.");
1078
+ if (mode === "render" && !await ensureAssets(cwd, log)) return 1;
1079
+ const result = await runWorker(job, cwd);
1080
+ if (!result.ok) {
1081
+ log(result.message);
1082
+ return 1;
1083
+ }
1084
+ if (result.filePath) log(`Rendered ${path.relative(cwd, result.filePath) || result.filePath}`);
1085
+ return result.qaPassed === false ? 1 : 0;
1086
+ }
1087
+ /** The framefields the film imports, resolved from its module. */
1088
+ function projectEngine(entry) {
1089
+ try {
1090
+ return pathToFileURL(createRequire(entry).resolve("framefields")).href;
1091
+ } catch {
1092
+ return;
1093
+ }
1094
+ }
1095
+ /** Downloads pinned assets missing here; false (after saying why) when it can't. */
1096
+ async function ensureAssets(cwd, log) {
1097
+ const assets = readConfig(cwd).config.assets ?? {};
1098
+ if (Object.keys(assets).length === 0) return true;
1099
+ try {
1100
+ const { downloaded, changed } = await pullAssets({
1101
+ cwd,
1102
+ log
1103
+ });
1104
+ if (downloaded.length) {
1105
+ const bytes = downloaded.reduce((n, p) => n + (assets[p]?.size ?? 0), 0);
1106
+ log(`Downloaded ${downloaded.length} pinned assets (${megabytes(bytes)}).`);
1107
+ }
1108
+ if (changed.length) log(`Rendering local edits of pinned assets: ${changed.join(", ")}. \`framefields assets add\` pins them for the cloud.`);
1109
+ return true;
1110
+ } catch (err) {
1111
+ if (!(err instanceof AssetsError)) throw err;
1112
+ log(err.message);
1113
+ return false;
1114
+ }
1115
+ }
1116
+ function runWorker(job, cwd) {
1117
+ const args = projectNodeArgs(job.entry, "local-worker");
1118
+ if ("error" in args) return Promise.resolve({
1119
+ ok: false,
1120
+ message: args.error
1121
+ });
1122
+ return new Promise((done) => {
1123
+ const child = spawn(process.execPath, args, {
1124
+ cwd,
1125
+ stdio: [
1126
+ "inherit",
1127
+ "inherit",
1128
+ "inherit",
1129
+ "ipc"
1130
+ ]
1131
+ });
1132
+ let result;
1133
+ child.on("message", (message) => {
1134
+ result = message;
1135
+ });
1136
+ child.on("error", (error) => done({
1137
+ ok: false,
1138
+ message: error.message
1139
+ }));
1140
+ child.on("close", (code, signal) => done(result ?? (signal === "SIGINT" || code === 130 ? {
1141
+ ok: false,
1142
+ message: "Stopped."
1143
+ } : {
1144
+ ok: false,
1145
+ message: `The ${job.mode} exited without a result (code ${code}, signal ${signal}).`
1146
+ })));
1147
+ child.send(job);
1148
+ });
1149
+ }
1150
+
997
1151
  //#endregion
998
1152
  //#region src/cli/registry.ts
999
1153
  /**
@@ -1044,14 +1198,21 @@ function openRegistry(source, cwd = process.cwd()) {
1044
1198
  * npx framefields list the components you can add
1045
1199
  * npx framefields fonts add <role...> install fonts (emoji)
1046
1200
  * npx framefields fonts list the fonts you can install
1047
- * npx framefields render <entry> --cloud render on api.framefields.dev
1201
+ * npx framefields assets add|push|pull|status media on your own bucket
1202
+ * npx framefields renders the renders named in framefields.json
1203
+ * npx framefields render <name> render on this machine's GPU
1204
+ * npx framefields render <name> --cloud render on api.framefields.dev
1205
+ * npx framefields preview <name> play it in the browser
1048
1206
  */
1049
1207
  const HELP = `Usage: framefields <command> [options]
1050
1208
 
1051
1209
  Commands:
1052
1210
  api JSON reference generated from timing, grid and check types.
1053
- check <entry> Build, validate and lint a composition; --render also writes a
1054
- representative frame and grid. --export defaults to buildFilm.
1211
+ check [name|entry]
1212
+ Build, validate and lint a composition; --render also writes a
1213
+ representative frame and grid. A render named in
1214
+ framefields.json, or a module (--export defaults to
1215
+ buildFilm); with neither, every named render.
1055
1216
  init [dir] Start a framefields project in dir (default: here), or add
1056
1217
  framefields to the project there: package.json, tsconfig,
1057
1218
  src/theme.ts, film.ts, render.ts, assets/, .gitignore,
@@ -1064,10 +1225,27 @@ Commands:
1064
1225
  Install fonts (pinned, hash-checked, with their license)
1065
1226
  and register them in the generated <components>/fonts.ts.
1066
1227
  fonts list List the fonts you can install.
1067
- render <entry> --cloud
1068
- Render on api.framefields.dev from the pushed commit of
1069
- this git repo, and download the video. Needs
1070
- FRAMEFIELDS_API_KEY. --export defaults to buildFilm.
1228
+ assets add <path...>
1229
+ Keep media out of git: hash files (or every file in a
1230
+ folder), upload them to the project's bucket (R2, S3, any
1231
+ S3-compatible storage) and pin them in framefields.json.
1232
+ assets push Upload recorded assets the bucket lacks.
1233
+ assets pull Download missing assets, checked against their sha256.
1234
+ assets status Which assets are here, missing or changed.
1235
+ renders List the renders named in framefields.json.
1236
+ render [name|entry]
1237
+ Render on this machine: a render named in framefields.json
1238
+ (its fields are the defaults; flags override them), or a
1239
+ module (--export defaults to buildFilm). Without either,
1240
+ the project's only named render. Pinned assets missing
1241
+ here are downloaded first.
1242
+ render [name|entry] --cloud
1243
+ The same render on api.framefields.dev, from the pushed
1244
+ commit of this git repo, downloaded to the same file.
1245
+ Needs FRAMEFIELDS_API_KEY.
1246
+ preview [name|entry]
1247
+ Play it in the browser (localhost, WebGPU). Pinned assets
1248
+ that aren't here stream from their bucket.
1071
1249
 
1072
1250
  Options for check:
1073
1251
  --export <name> Composition or builder export (default buildFilm).
@@ -1077,6 +1255,10 @@ Options for check:
1077
1255
  --warnings-as-errors Fail on lint warnings.
1078
1256
  --json Machine-readable check, component list, or font list result.
1079
1257
 
1258
+ Options for render and preview:
1259
+ --export, --select, --codec, --quality and --output (render) override the
1260
+ named render's fields, locally and with --cloud.
1261
+
1080
1262
  Options for render --cloud:
1081
1263
  --workers <n|auto> 1 (default) renders on one GPU. auto measures the film
1082
1264
  first and splits it across as many GPUs as stay
@@ -1084,13 +1266,21 @@ Options for render --cloud:
1084
1266
  --max-workers <n> Upper bound for auto.
1085
1267
  --plan Measure and plan only: prints workers, time and the
1086
1268
  estimated cost, renders nothing.
1087
- --output <file> Where the video goes (default output/<entry>.mp4).
1269
+ --output <file> Where the video goes (default output/<name>.mp4).
1088
1270
  --codec <codec> h264 (default) or vp9.
1089
1271
  --quality <q> very_low, low, high or very_high (default).
1090
1272
  --select <name> When the export returns several compositions.
1091
1273
  --json Print the final status as JSON.
1092
1274
  Ctrl-C cancels the render; GPU time already used is charged.
1093
1275
 
1276
+ Options for assets:
1277
+ --remote <name> The remote in framefields.json "storage" (default: its
1278
+ default, or its only one).
1279
+ --overwrite pull: replace files changed locally.
1280
+ Keys: FRAMEFIELDS_STORAGE_<REMOTE>_ACCESS_KEY_ID and _SECRET_ACCESS_KEY,
1281
+ or AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. Reads need none when the
1282
+ remote has a publicUrl (a custom domain or CDN in front of the bucket).
1283
+
1094
1284
  Options for init:
1095
1285
  --name <name> Package name (default: the folder's name).
1096
1286
  --pm <manager> npm, pnpm, yarn or bun (default: the one running this).
@@ -1118,7 +1308,10 @@ Examples:
1118
1308
  npx framefields init my-film --install
1119
1309
  npx framefields add mouse-pointer focus-zoom
1120
1310
  npx framefields fonts add emoji
1121
- npx framefields render src/film.ts --cloud --workers auto --plan
1311
+ npx framefields assets add assets/footage
1312
+ npx framefields preview film
1313
+ npx framefields render film
1314
+ npx framefields render film --cloud --plan
1122
1315
  `;
1123
1316
  async function main(argv) {
1124
1317
  const { values, positionals } = parseArgs({
@@ -1150,6 +1343,7 @@ async function main(argv) {
1150
1343
  codec: { type: "string" },
1151
1344
  quality: { type: "string" },
1152
1345
  select: { type: "string" },
1346
+ remote: { type: "string" },
1153
1347
  help: {
1154
1348
  type: "boolean",
1155
1349
  short: "h"
@@ -1162,6 +1356,7 @@ async function main(argv) {
1162
1356
  return command || values.help ? 0 : 1;
1163
1357
  }
1164
1358
  const cwd = process.cwd();
1359
+ if (existsSync(join(cwd, ".env"))) process.loadEnvFile(join(cwd, ".env"));
1165
1360
  const log = (line) => process.stdout.write(`${line}\n`);
1166
1361
  if (command === "api") {
1167
1362
  const catalog = JSON.parse(readFileSync(fileURLToPath(new URL(import.meta.url.endsWith(".ts") ? "../dist/api.json" : "./api.json", import.meta.url)), "utf8"));
@@ -1171,30 +1366,32 @@ async function main(argv) {
1171
1366
  }));
1172
1367
  return 0;
1173
1368
  }
1174
- if (command === "check") {
1175
- if (names.length !== 1) {
1176
- process.stderr.write("Usage: framefields check <entry> [--export buildFilm] [--render] [--json]\n");
1369
+ if (command === "check") return check(names, cwd, values, log);
1370
+ if (command === "renders") return listRenders(cwd, values.json, log);
1371
+ if (command === "assets") return runAssets(names, {
1372
+ cwd,
1373
+ log,
1374
+ remote: values.remote,
1375
+ overwrite: values.overwrite,
1376
+ json: values.json
1377
+ });
1378
+ if (command === "preview" || command === "render" && !values.cloud) {
1379
+ if (names.length > 1) {
1380
+ process.stderr.write(`Usage: framefields ${command} [name|entry] [--export <name>]\n`);
1177
1381
  return 2;
1178
1382
  }
1179
- const report$1 = await runCheck({
1383
+ return runLocal(command === "preview" ? "preview" : "render", {
1180
1384
  entry: names[0],
1181
- exportName: values.export,
1182
- render: values.render,
1183
- outputDir: values.output,
1184
- timeoutMs: values.timeout === void 0 ? void 0 : Number(values.timeout),
1185
- warningsAsErrors: values["warnings-as-errors"]
1186
- });
1187
- if (values.json) log(JSON.stringify(report$1));
1188
- else {
1189
- log(`Check ${report$1.status}: ${report$1.entry} (${report$1.exportName})`);
1190
- for (const d of report$1.diagnostics) log(`${d.severity} ${d.code}${d.path ? ` at ${d.path}` : ""}: ${d.message}`);
1191
- for (const file of report$1.artifacts) log(`Wrote ${file}`);
1192
- }
1193
- return report$1.status === "passed" ? 0 : 1;
1385
+ export: values.export,
1386
+ select: values.select,
1387
+ codec: values.codec,
1388
+ quality: values.quality,
1389
+ output: values.output
1390
+ }, log);
1194
1391
  }
1195
1392
  if (command === "render") {
1196
- if (names.length !== 1 || !values.cloud) {
1197
- process.stderr.write("Usage: framefields render <entry> --cloud [--workers auto] [--plan]\nLocal renders run your project's render script (`npm run render`).\n");
1393
+ if (names.length > 1) {
1394
+ process.stderr.write("Usage: framefields render [name|entry] --cloud [--workers auto] [--plan]\n");
1198
1395
  return 2;
1199
1396
  }
1200
1397
  return runCloudRender({
@@ -1284,6 +1481,75 @@ async function main(argv) {
1284
1481
  }
1285
1482
  const onDownload = (spec) => process.stdout.write(` fetching ${spec.file} (${(spec.font.bytes / 1e6).toFixed(1)} MB, ${spec.license.id})\n`);
1286
1483
  /** What `add` did about fonts, and how to use them. */
1484
+ /** `check [name|entry]`: a named render, a module, or every named render. */
1485
+ async function check(names, cwd, values, log) {
1486
+ const renders = readConfig(cwd).config.renders ?? {};
1487
+ const usage = () => {
1488
+ process.stderr.write("Usage: framefields check [name|entry] [--export buildFilm] [--render] [--json]\n");
1489
+ return 2;
1490
+ };
1491
+ if (names.length > 1) return usage();
1492
+ const targets = names.length === 0 ? Object.entries(renders).map(([name, spec]) => ({
1493
+ name,
1494
+ entry: spec.entry,
1495
+ exportName: spec.export
1496
+ })) : renders[names[0]] ? [{
1497
+ name: names[0],
1498
+ entry: renders[names[0]].entry,
1499
+ exportName: values.export ?? renders[names[0]].export
1500
+ }] : [{
1501
+ entry: names[0],
1502
+ exportName: values.export
1503
+ }];
1504
+ if (targets.length === 0) return usage();
1505
+ const reports = [];
1506
+ for (const t of targets) {
1507
+ const report = await runCheck({
1508
+ entry: t.entry,
1509
+ exportName: t.exportName,
1510
+ render: values.render,
1511
+ outputDir: values.output ?? (targets.length > 1 ? join("output", "check", t.name ?? "") : void 0),
1512
+ timeoutMs: values.timeout === void 0 ? void 0 : Number(values.timeout),
1513
+ warningsAsErrors: values["warnings-as-errors"]
1514
+ });
1515
+ reports.push({
1516
+ ...t.name && { name: t.name },
1517
+ ...report
1518
+ });
1519
+ if (values.json) continue;
1520
+ log(`Check ${report.status}: ${t.name ? `${t.name} (${t.entry}, ${report.exportName})` : `${report.entry} (${report.exportName})`}`);
1521
+ for (const d of report.diagnostics) log(`${d.severity} ${d.code}${d.path ? ` at ${d.path}` : ""}: ${d.message}`);
1522
+ for (const file of report.artifacts) log(`Wrote ${file}`);
1523
+ }
1524
+ const passed = reports.every((r) => r.status === "passed");
1525
+ if (values.json) log(JSON.stringify(names.length === 0 ? {
1526
+ status: passed ? "passed" : "failed",
1527
+ checks: reports
1528
+ } : reports[0]));
1529
+ return passed ? 0 : 1;
1530
+ }
1531
+ /** `renders`: what framefields.json names, as the dashboard shows it. */
1532
+ function listRenders(cwd, json, log) {
1533
+ const renders = readConfig(cwd).config.renders ?? {};
1534
+ if (json) {
1535
+ log(JSON.stringify({
1536
+ schemaVersion: 1,
1537
+ renders
1538
+ }));
1539
+ return 0;
1540
+ }
1541
+ const entries = Object.entries(renders);
1542
+ if (entries.length === 0) {
1543
+ log("framefields.json names no renders. Add one: \"renders\": { \"film\": { \"entry\": \"src/film.ts\", \"export\": \"buildFilm\" } }");
1544
+ return 0;
1545
+ }
1546
+ for (const [name, spec] of entries) {
1547
+ const title = spec.title && spec.title !== name ? ` ${spec.title}` : "";
1548
+ const opts = [spec.workers !== void 0 && `workers ${spec.workers}`, spec.codec].filter(Boolean);
1549
+ log(`${name}${title}\n ${spec.entry} · ${spec.export ?? "buildFilm"}${spec.select ? ` · ${spec.select}` : ""}${opts.length ? ` · ${opts.join(", ")}` : ""}${spec.description ? `\n ${spec.description}` : ""}`);
1550
+ }
1551
+ return 0;
1552
+ }
1287
1553
  function logFonts(report, cwd, log) {
1288
1554
  for (const f of report.fonts) log(` ${f.status === "installed" ? "font " : "font ok "} ${f.path} (${f.role}, for ${f.by}: ${f.why})`);
1289
1555
  for (const f of report.fontsSkipped) log(` no font ${f.role} for ${f.by} (--no-fonts): ${f.why} Install later with \`framefields fonts add ${f.role}\`.`);