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.
- package/NOTICE.md +4 -0
- package/dist/audio/index.d.mts +6 -5
- package/dist/audio/index.mjs +13 -13
- package/dist/{audio-CYZkDwae.d.mts → audio-CHV33Od9.d.mts} +3 -4
- package/dist/audio-CHV33Od9.d.mts.map +1 -0
- package/dist/{audio-BuCVk1IQ.mjs → audio-DHzLQ_RG.mjs} +4 -4
- package/dist/{audio-BuCVk1IQ.mjs.map → audio-DHzLQ_RG.mjs.map} +1 -1
- package/dist/{audio-KHBadECb.mjs → audio-DS9Jg2ls.mjs} +1 -1
- package/dist/{audio-KHBadECb.mjs.map → audio-DS9Jg2ls.mjs.map} +1 -1
- package/dist/{check-result-Culfu7Nx.mjs → check-result-DZWx73V8.mjs} +1 -1
- package/dist/{check-result-Culfu7Nx.mjs.map → check-result-DZWx73V8.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +51 -51
- package/dist/cli/check-worker.mjs.map +1 -1
- package/dist/cli/local-worker.d.mts +28 -0
- package/dist/cli/local-worker.d.mts.map +1 -0
- package/dist/cli/local-worker.mjs +83 -0
- package/dist/cli/local-worker.mjs.map +1 -0
- package/dist/cli.mjs +390 -124
- package/dist/cli.mjs.map +1 -1
- package/dist/cloud/index.d.mts +16 -3
- package/dist/cloud/index.d.mts.map +1 -1
- package/dist/cloud/index.mjs +2 -2
- package/dist/cloud-Cj1TIme8.mjs +685 -0
- package/dist/cloud-Cj1TIme8.mjs.map +1 -0
- package/dist/components/index.d.mts +15 -14
- package/dist/components/index.mjs +47 -47
- package/dist/{dist-CySGkG54.mjs → dist-BSKAbyea.mjs} +2 -2
- package/dist/dist-BSKAbyea.mjs.map +1 -0
- package/dist/{dist-CNGv-JTX.mjs → dist-B_rSWeOz.mjs} +1 -1
- package/dist/{dist-Bf2_efYP.mjs → dist-C8XSqfTx.mjs} +1 -1
- package/dist/{dist-Bf2_efYP.mjs.map → dist-C8XSqfTx.mjs.map} +1 -1
- package/dist/{dist-EQX3TUUl.mjs → dist-CUNvNDS3.mjs} +129 -82
- package/dist/dist-CUNvNDS3.mjs.map +1 -0
- package/dist/dist-CiTgmfUw.mjs +502 -0
- package/dist/dist-CiTgmfUw.mjs.map +1 -0
- package/dist/{dist-CWLLnigL.mjs → dist-D3BeAZ7X.mjs} +315 -84
- package/dist/dist-D3BeAZ7X.mjs.map +1 -0
- package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
- package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
- package/dist/{dist-Dg9LMWoX.mjs → dist-Kbf-JTry.mjs} +2 -2
- package/dist/{dist-Dg9LMWoX.mjs.map → dist-Kbf-JTry.mjs.map} +1 -1
- package/dist/effects/index.d.mts +6 -6
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-DKLbLXF7.mjs → effects-BiDgCK1L.mjs} +3 -3
- package/dist/{effects-DKLbLXF7.mjs.map → effects-BiDgCK1L.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +3 -3
- package/dist/{fonts-gPbGbShD.mjs → fonts-DeDPWdvJ.mjs} +2 -2
- package/dist/{fonts-gPbGbShD.mjs.map → fonts-DeDPWdvJ.mjs.map} +1 -1
- package/dist/{gpu-CpkJJLQP.mjs → gpu-CWjgql4C.mjs} +11 -3
- package/dist/gpu-CWjgql4C.mjs.map +1 -0
- package/dist/index-BFTtXosj.d.mts +63 -0
- package/dist/index-BFTtXosj.d.mts.map +1 -0
- package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
- package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
- package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
- package/dist/index-CnZhBlob.d.mts.map +1 -0
- package/dist/{index-D2i9J9Zq.d.mts → index-D68eGFNE.d.mts} +3 -30
- package/dist/index-D68eGFNE.d.mts.map +1 -0
- package/dist/{index-CEU_Zsb9.d.mts → index-DBh3WphX.d.mts} +25 -23
- package/dist/index-DBh3WphX.d.mts.map +1 -0
- package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
- package/dist/index-DQ1U3HC3.d.mts.map +1 -0
- package/dist/{index-jSDEM-uE.d.mts → index-Dibc_xpC.d.mts} +6 -6
- package/dist/{index-jSDEM-uE.d.mts.map → index-Dibc_xpC.d.mts.map} +1 -1
- package/dist/{index-Cro-818i.d.mts → index-E2IXX0Cz.d.mts} +88 -14
- package/dist/index-E2IXX0Cz.d.mts.map +1 -0
- package/dist/{index-BuiZzc6i.d.mts → index-X2u96TEo.d.mts} +162 -5
- package/dist/index-X2u96TEo.d.mts.map +1 -0
- package/dist/{index-Bly-7YM1.d.mts → index-YB9j9KUx.d.mts} +3 -3
- package/dist/{index-Bly-7YM1.d.mts.map → index-YB9j9KUx.d.mts.map} +1 -1
- package/dist/{index-COYNQ_mf.d.mts → index-a6JrbAK0.d.mts} +1 -1
- package/dist/{index-COYNQ_mf.d.mts.map → index-a6JrbAK0.d.mts.map} +1 -1
- package/dist/{index-C8YwZ6k1.d.mts → index-rtCXNxGO.d.mts} +2 -2
- package/dist/{index-C8YwZ6k1.d.mts.map → index-rtCXNxGO.d.mts.map} +1 -1
- package/dist/index.d.mts +16 -15
- package/dist/index.mjs +58 -58
- package/dist/preview/index.d.mts +5 -4
- package/dist/preview/index.mjs +12 -12
- package/dist/{preview-BToKUTtZ.mjs → preview-PDz7o2xg.mjs} +323 -35
- package/dist/preview-PDz7o2xg.mjs.map +1 -0
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-QF4JWVO3.mjs → chunk-35XSD4QM.mjs} +15 -15
- package/dist/preview-engine/{chunk-ZF2MEFKO.mjs → chunk-3DOIE4DV.mjs} +1 -1
- package/dist/preview-engine/{chunk-JDB7PMRI.mjs → chunk-3IT7LHWR.mjs} +1 -1
- package/dist/preview-engine/{chunk-DNNGWS2C.mjs → chunk-3MLGWUSK.mjs} +1 -1
- package/dist/preview-engine/{chunk-KVOFO273.mjs → chunk-3QJ5GRBH.mjs} +1 -1
- package/dist/preview-engine/{chunk-54Q5CKSV.mjs → chunk-3QTHW2CD.mjs} +1 -1
- package/dist/preview-engine/chunk-44V4V5LD.mjs +1 -0
- package/dist/preview-engine/chunk-4P3MMJWD.mjs +1 -0
- package/dist/preview-engine/chunk-4YT5YJIF.mjs +1 -0
- package/dist/preview-engine/{chunk-BJXNKMSY.mjs → chunk-64L4GUOF.mjs} +20 -6
- package/dist/preview-engine/{chunk-UMJ3VGKN.mjs → chunk-6B3NOY5W.mjs} +1 -1
- package/dist/preview-engine/chunk-77MT33VR.mjs +1 -0
- package/dist/preview-engine/{chunk-BRV7TQDV.mjs → chunk-77WWW75O.mjs} +1 -1
- package/dist/preview-engine/chunk-7M5LE6EM.mjs +483 -0
- package/dist/preview-engine/chunk-A6OAPDIA.mjs +1 -0
- package/dist/preview-engine/chunk-ADLIF544.mjs +39 -0
- package/dist/preview-engine/{chunk-OLB4TQLQ.mjs → chunk-AKVRG7UU.mjs} +1 -1
- package/dist/preview-engine/{chunk-CIVEZJYF.mjs → chunk-CRBOK3JT.mjs} +1 -1
- package/dist/preview-engine/chunk-CSLSWUUT.mjs +1 -0
- package/dist/preview-engine/{chunk-ACBBBOUM.mjs → chunk-CYM75INB.mjs} +1 -1
- package/dist/preview-engine/{chunk-JSYG6OWZ.mjs → chunk-D7OMXGIZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-EPRINA4V.mjs → chunk-E7BKWHOT.mjs} +10 -10
- package/dist/preview-engine/{chunk-NOKPBMIP.mjs → chunk-EWDJMJO5.mjs} +1 -1
- package/dist/preview-engine/{chunk-5KSBS3AL.mjs → chunk-EYE3GNL5.mjs} +1 -1
- package/dist/preview-engine/chunk-FRJPXWAG.mjs +1 -0
- package/dist/preview-engine/{chunk-IKVJ4MW5.mjs → chunk-G4ZTSLZU.mjs} +1 -1
- package/dist/preview-engine/{chunk-VZLIRYAL.mjs → chunk-GAMAKN5L.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZIXPWP2B.mjs → chunk-ICWD36H6.mjs} +1 -1
- package/dist/preview-engine/{chunk-OELPPLML.mjs → chunk-IEEV5RB3.mjs} +1 -1
- package/dist/preview-engine/chunk-JAAFSVAG.mjs +1 -0
- package/dist/preview-engine/{chunk-YVZTRH4Y.mjs → chunk-KDCM7S3S.mjs} +1 -1
- package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
- package/dist/preview-engine/{chunk-O63FLYWC.mjs → chunk-N2VISDTG.mjs} +1 -1
- package/dist/preview-engine/{chunk-GN3NDRLI.mjs → chunk-NCQHOGZK.mjs} +1 -1
- package/dist/preview-engine/{chunk-YKM7JDQY.mjs → chunk-NJO2BIJX.mjs} +1 -1
- package/dist/preview-engine/{chunk-7GMHSTRP.mjs → chunk-NTSALWFF.mjs} +1 -1
- package/dist/preview-engine/{chunk-PKNUTHPI.mjs → chunk-NVXFEDJS.mjs} +1 -1
- package/dist/preview-engine/{chunk-VFQH5KVS.mjs → chunk-ONHY4KNY.mjs} +1 -1
- package/dist/preview-engine/{chunk-Z24UEN4P.mjs → chunk-PD2HKW2S.mjs} +1 -1
- package/dist/preview-engine/chunk-PH3UUX6A.mjs +138 -0
- package/dist/preview-engine/chunk-PIHG6HJO.mjs +1 -0
- package/dist/preview-engine/{chunk-YHMBGJP6.mjs → chunk-QPT2Y2GZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-4AGQN53P.mjs → chunk-QXLFTCLC.mjs} +1 -1
- package/dist/preview-engine/{chunk-65NANVQL.mjs → chunk-R4H52Q7S.mjs} +1 -1
- package/dist/preview-engine/{chunk-FQL4IJZN.mjs → chunk-RN7J5TRU.mjs} +1 -1
- package/dist/preview-engine/{chunk-26XWIHW3.mjs → chunk-RVCLMO5Q.mjs} +1 -1
- package/dist/preview-engine/{chunk-VQA4DYZU.mjs → chunk-RYSV44B4.mjs} +1 -1
- package/dist/preview-engine/{chunk-TEWRQKX3.mjs → chunk-SFHWP65D.mjs} +1 -1
- package/dist/preview-engine/{chunk-RDWLLITE.mjs → chunk-SMHEMYCV.mjs} +1 -1
- package/dist/preview-engine/{chunk-EXEO245X.mjs → chunk-SV3ZNZQU.mjs} +1 -1
- package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
- package/dist/preview-engine/chunk-UFPA36D2.mjs +2227 -0
- package/dist/preview-engine/{chunk-EAWJXW4J.mjs → chunk-UVEDFIPN.mjs} +1 -1
- package/dist/preview-engine/{chunk-6LTINEA4.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-IBPYV6HF.mjs → chunk-W4XR6F5G.mjs} +1 -1
- package/dist/preview-engine/{chunk-UI3VH33L.mjs → chunk-WPYWCWWL.mjs} +1 -1
- package/dist/preview-engine/{chunk-GHTG5XV6.mjs → chunk-XYCR3STG.mjs} +84 -25
- package/dist/preview-engine/{chunk-WFMUDL55.mjs → chunk-YAPGJZPI.mjs} +1 -1
- package/dist/preview-engine/{chunk-LMXMBX4J.mjs → chunk-YJ4DSRDY.mjs} +1 -1
- package/dist/preview-engine/{chunk-CCORQLMR.mjs → chunk-YOJKIMU5.mjs} +1 -1
- package/dist/preview-engine/{chunk-UGB6JKVS.mjs → chunk-ZHNEZZ6A.mjs} +1 -1
- package/dist/preview-engine/{chunk-LFNCWMKS.mjs → chunk-ZZMI3WOT.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/{renderers-53EI26GL.mjs → renderers-3FZVDYRQ.mjs} +1 -1
- package/dist/preview-engine/renderers-3KEBYOOF.mjs +1 -0
- package/dist/preview-engine/{renderers-6YVZUQOH.mjs → renderers-4RPQSUUZ.mjs} +1 -1
- package/dist/preview-engine/renderers-5EGFXFPF.mjs +1 -0
- package/dist/preview-engine/renderers-5SJHYUTM.mjs +1 -0
- package/dist/preview-engine/renderers-66MWDUN6.mjs +1 -0
- package/dist/preview-engine/{renderers-CCRZNGVK.mjs → renderers-6FENMFSC.mjs} +1 -1
- package/dist/preview-engine/renderers-77OXJ2GY.mjs +1 -0
- package/dist/preview-engine/renderers-7LI4QKHO.mjs +1 -0
- package/dist/preview-engine/renderers-AFTUFMQQ.mjs +1 -0
- package/dist/preview-engine/{renderers-CYJAVWHT.mjs → renderers-AIZRIW2R.mjs} +1 -1
- package/dist/preview-engine/{renderers-OGOW3NA4.mjs → renderers-BDI2BDBA.mjs} +1 -1
- package/dist/preview-engine/renderers-BDXCO6NR.mjs +1 -0
- package/dist/preview-engine/{renderers-EN7LXJLG.mjs → renderers-BUZ67FNZ.mjs} +1 -1
- package/dist/preview-engine/renderers-DMTGKURQ.mjs +1 -0
- package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -0
- package/dist/preview-engine/{renderers-WSABL3QO.mjs → renderers-ECXMT5BD.mjs} +1 -1
- package/dist/preview-engine/{renderers-MOEC2XZZ.mjs → renderers-EILFSWSJ.mjs} +1 -1
- package/dist/preview-engine/renderers-EPSF5CSQ.mjs +1 -0
- package/dist/preview-engine/{renderers-X6CORAES.mjs → renderers-EVEWFJ7U.mjs} +1 -1
- package/dist/preview-engine/renderers-F6PT2LON.mjs +1 -0
- package/dist/preview-engine/renderers-F7WPJXKT.mjs +1 -0
- package/dist/preview-engine/renderers-FIFF267S.mjs +1 -0
- package/dist/preview-engine/{renderers-GQM3KMV3.mjs → renderers-FQISHQEN.mjs} +1 -1
- package/dist/preview-engine/{renderers-HKLCB4U6.mjs → renderers-FXAVFNUN.mjs} +1 -1
- package/dist/preview-engine/{renderers-P2HORBZ6.mjs → renderers-GITAVRYZ.mjs} +1 -1
- package/dist/preview-engine/renderers-GTKRV225.mjs +1 -0
- package/dist/preview-engine/{renderers-KCGK33Y2.mjs → renderers-HG6JZIZO.mjs} +1 -1
- package/dist/preview-engine/{renderers-I6QKZ7CH.mjs → renderers-HHWMIDN3.mjs} +1 -1
- package/dist/preview-engine/renderers-HI3SRJVD.mjs +1 -0
- package/dist/preview-engine/{renderers-7CAHX35U.mjs → renderers-HXEDI4BD.mjs} +1 -1
- package/dist/preview-engine/{renderers-77PDUMYI.mjs → renderers-HXNSDJBY.mjs} +1 -1
- package/dist/preview-engine/{renderers-ACUJMDEK.mjs → renderers-I2ZOUFRU.mjs} +1 -1
- package/dist/preview-engine/renderers-JHFD4LHZ.mjs +1 -0
- package/dist/preview-engine/{renderers-IHGAWLUF.mjs → renderers-JMSAW7VY.mjs} +1 -1
- package/dist/preview-engine/renderers-KGVZUFHD.mjs +1 -0
- package/dist/preview-engine/{renderers-RN2MHIFK.mjs → renderers-KICDB5Y6.mjs} +1 -1
- package/dist/preview-engine/{renderers-C7SI3NIE.mjs → renderers-KKULMOV4.mjs} +1 -1
- package/dist/preview-engine/{renderers-HSFQIILN.mjs → renderers-KMVMPYY7.mjs} +1 -1
- package/dist/preview-engine/renderers-LN7WPG6I.mjs +1 -0
- package/dist/preview-engine/{renderers-BOBVXYAA.mjs → renderers-LWW4RF6D.mjs} +1 -1
- package/dist/preview-engine/renderers-LY57CZZB.mjs +1 -0
- package/dist/preview-engine/renderers-MBMJWZEW.mjs +1 -0
- package/dist/preview-engine/{renderers-VVP5WQOY.mjs → renderers-MPFU74I3.mjs} +1 -1
- package/dist/preview-engine/{renderers-H6PBHEYU.mjs → renderers-MW53LTMB.mjs} +1 -1
- package/dist/preview-engine/{renderers-PPZK6VEW.mjs → renderers-NQC4DPX4.mjs} +1 -1
- package/dist/preview-engine/renderers-OJWWIVNW.mjs +1 -0
- package/dist/preview-engine/{renderers-4IBFDW2S.mjs → renderers-PC2GOZDT.mjs} +1 -1
- package/dist/preview-engine/{renderers-UG2C3C7T.mjs → renderers-Q77UPEYE.mjs} +1 -1
- package/dist/preview-engine/renderers-QHXCFDHI.mjs +1 -0
- package/dist/preview-engine/renderers-RDYJRNAR.mjs +1 -0
- package/dist/preview-engine/renderers-RENLKAA7.mjs +1 -0
- package/dist/preview-engine/renderers-RHMRWX46.mjs +1 -0
- package/dist/preview-engine/{renderers-5XLGCEOA.mjs → renderers-RIPXT4AL.mjs} +1 -1
- package/dist/preview-engine/{renderers-FY2HOQCS.mjs → renderers-SFVFAS3C.mjs} +1 -1
- package/dist/preview-engine/{renderers-VIGZYJYX.mjs → renderers-SWQVCJHB.mjs} +1 -1
- package/dist/preview-engine/renderers-SZVDZDY7.mjs +1 -0
- package/dist/preview-engine/renderers-TTXTV4PC.mjs +228 -0
- package/dist/preview-engine/renderers-TYSLUZ53.mjs +1 -0
- package/dist/preview-engine/{renderers-6LNDAO4B.mjs → renderers-U4IXWMD6.mjs} +1 -1
- package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
- package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
- package/dist/preview-engine/{renderers-33FCFHDR.mjs → renderers-VUQAZ56P.mjs} +1 -1
- package/dist/preview-engine/renderers-W5YFMLSB.mjs +1 -0
- package/dist/preview-engine/renderers-XKDWUK56.mjs +1 -0
- package/dist/preview-engine/renderers-XKSBNCLZ.mjs +1 -0
- package/dist/preview-engine/renderers-XLQXVD37.mjs +1 -0
- package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
- package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/preview-engine/{src-4IUYUKIZ.mjs → src-YXNX4MLK.mjs} +1 -1
- package/dist/{program-Bc860ko5.mjs → program-Bn6ko_I4.mjs} +44 -17
- package/dist/program-Bn6ko_I4.mjs.map +1 -0
- package/dist/renderer/index.d.mts +4 -3
- package/dist/renderer/index.mjs +3 -3
- package/dist/{renderer-B3Dme2es.mjs → renderer--Q0pM9Vh.mjs} +5 -5
- package/dist/{renderer-B3Dme2es.mjs.map → renderer--Q0pM9Vh.mjs.map} +1 -1
- package/dist/renderer-1aSF5BmY.mjs +5 -0
- package/dist/{renderer-CAWnCsQc.mjs → renderer-45ifiDkn.mjs} +5 -5
- package/dist/{renderer-CAWnCsQc.mjs.map → renderer-45ifiDkn.mjs.map} +1 -1
- package/dist/{renderer-Cz-n883J.mjs → renderer-549d94qG.mjs} +5 -5
- package/dist/{renderer-Cz-n883J.mjs.map → renderer-549d94qG.mjs.map} +1 -1
- package/dist/{renderer-BhsrlGKp.mjs → renderer-B-LUGB9h.mjs} +74 -21
- package/dist/renderer-B-LUGB9h.mjs.map +1 -0
- package/dist/renderer-B2e4Gr9u.mjs +5 -0
- package/dist/{renderer-B1LD29TV.mjs → renderer-B5b-ehRb.mjs} +3 -3
- package/dist/{renderer-B1LD29TV.mjs.map → renderer-B5b-ehRb.mjs.map} +1 -1
- package/dist/renderer-B6fz4j50.mjs +5 -0
- package/dist/{renderer-_9gbYS-3.mjs → renderer-BCTUqJG7.mjs} +5 -5
- package/dist/{renderer-_9gbYS-3.mjs.map → renderer-BCTUqJG7.mjs.map} +1 -1
- package/dist/renderer-BEftIYw-.mjs +5 -0
- package/dist/{renderer-C9BSXyrq.mjs → renderer-BHPgkoEL.mjs} +4 -4
- package/dist/{renderer-C9BSXyrq.mjs.map → renderer-BHPgkoEL.mjs.map} +1 -1
- package/dist/renderer-BHTnO-7e.mjs +5 -0
- package/dist/{renderer-fs8f1QeE.mjs → renderer-BIieU9pY.mjs} +5 -5
- package/dist/{renderer-fs8f1QeE.mjs.map → renderer-BIieU9pY.mjs.map} +1 -1
- package/dist/{renderer-DwK9jsER.mjs → renderer-BKi6jDi_.mjs} +4 -4
- package/dist/{renderer-DwK9jsER.mjs.map → renderer-BKi6jDi_.mjs.map} +1 -1
- package/dist/renderer-BMlnQqTO.mjs +5 -0
- package/dist/{renderer-BNJ6Jk7-.mjs → renderer-BMpmmYOq.mjs} +4 -4
- package/dist/{renderer-BNJ6Jk7-.mjs.map → renderer-BMpmmYOq.mjs.map} +1 -1
- package/dist/{renderer-DkqZmfm8.mjs → renderer-BO_wuUKA.mjs} +5 -5
- package/dist/{renderer-DkqZmfm8.mjs.map → renderer-BO_wuUKA.mjs.map} +1 -1
- package/dist/renderer-BOzcFezY.mjs +5 -0
- package/dist/{renderer-Bxjb0HYU.mjs → renderer-BPOh9x5X.mjs} +4 -4
- package/dist/{renderer-Bxjb0HYU.mjs.map → renderer-BPOh9x5X.mjs.map} +1 -1
- package/dist/{renderer-Ros7XQg2.mjs → renderer-BPiWsrC2.mjs} +3 -3
- package/dist/{renderer-Ros7XQg2.mjs.map → renderer-BPiWsrC2.mjs.map} +1 -1
- package/dist/{renderer-lHNTgiOM.mjs → renderer-BUj7jE6t.mjs} +3 -3
- package/dist/{renderer-lHNTgiOM.mjs.map → renderer-BUj7jE6t.mjs.map} +1 -1
- package/dist/renderer-BVbjJIKJ.mjs +5 -0
- package/dist/renderer-BXsHKf4k.mjs +5 -0
- package/dist/{renderer-D0aAZHC7.mjs → renderer-BZgJj8Cl.mjs} +4 -4
- package/dist/{renderer-D0aAZHC7.mjs.map → renderer-BZgJj8Cl.mjs.map} +1 -1
- package/dist/{renderer-V4dhrf_h.mjs → renderer-BgjPbgbn.mjs} +6 -6
- package/dist/{renderer-V4dhrf_h.mjs.map → renderer-BgjPbgbn.mjs.map} +1 -1
- package/dist/{renderer-BaIJIfJ6.mjs → renderer-BjgFpwVK.mjs} +5 -5
- package/dist/{renderer-BaIJIfJ6.mjs.map → renderer-BjgFpwVK.mjs.map} +1 -1
- package/dist/renderer-Bks49NVl.mjs +5 -0
- package/dist/{renderer-CU8v-LxD.mjs → renderer-BlZgyBSo.mjs} +5 -5
- package/dist/{renderer-CU8v-LxD.mjs.map → renderer-BlZgyBSo.mjs.map} +1 -1
- package/dist/{renderer-B6Oeahe_.mjs → renderer-BqUAyzCZ.mjs} +5 -5
- package/dist/{renderer-B6Oeahe_.mjs.map → renderer-BqUAyzCZ.mjs.map} +1 -1
- package/dist/{renderer-h62QaJYz.mjs → renderer-Br8km655.mjs} +4 -4
- package/dist/{renderer-h62QaJYz.mjs.map → renderer-Br8km655.mjs.map} +1 -1
- package/dist/{renderer-sfqZK6L5.mjs → renderer-BsMZ5Iaq.mjs} +4 -4
- package/dist/{renderer-sfqZK6L5.mjs.map → renderer-BsMZ5Iaq.mjs.map} +1 -1
- package/dist/{renderer-g_1t2je9.mjs → renderer-BtgqTg2K.mjs} +3 -3
- package/dist/{renderer-DcvjSolU.mjs → renderer-BuvKGwk3.mjs} +11 -2
- package/dist/{renderer-DcvjSolU.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
- package/dist/{renderer-BOrMBwQS.mjs → renderer-C-3qhk5x.mjs} +2 -2
- package/dist/{renderer-BOrMBwQS.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
- package/dist/{renderer-CLAvn9c6.mjs → renderer-C-GTxnfv.mjs} +4 -4
- package/dist/{renderer-CLAvn9c6.mjs.map → renderer-C-GTxnfv.mjs.map} +1 -1
- package/dist/renderer-C-t7qFKr.mjs +5 -0
- package/dist/{renderer-BDZC3o3N.mjs → renderer-C1ctHdXl.mjs} +4 -4
- package/dist/{renderer-BDZC3o3N.mjs.map → renderer-C1ctHdXl.mjs.map} +1 -1
- package/dist/renderer-C24n-6CX.mjs +6 -0
- package/dist/{renderer-pNmI-A9o.mjs → renderer-C7m7Yxgc.mjs} +5 -5
- package/dist/{renderer-pNmI-A9o.mjs.map → renderer-C7m7Yxgc.mjs.map} +1 -1
- package/dist/{renderer-Bf4-N7k7.mjs → renderer-C9dqx3U7.mjs} +5 -5
- package/dist/{renderer-Bf4-N7k7.mjs.map → renderer-C9dqx3U7.mjs.map} +1 -1
- package/dist/renderer-CCReX-7M.mjs +5 -0
- package/dist/{renderer-JHByuUNb.mjs → renderer-CE4535aW.mjs} +3 -3
- package/dist/{renderer-JHByuUNb.mjs.map → renderer-CE4535aW.mjs.map} +1 -1
- package/dist/renderer-CIxFQrAm.mjs +5 -0
- package/dist/{renderer-ByjaseAo.mjs → renderer-CL-vyXgX.mjs} +5 -5
- package/dist/{renderer-ByjaseAo.mjs.map → renderer-CL-vyXgX.mjs.map} +1 -1
- package/dist/renderer-CLHBMIqJ.mjs +5 -0
- package/dist/renderer-CMJKi-Ye.mjs +5 -0
- package/dist/{renderer-B-CMRUag.mjs → renderer-CMnlgAGs.mjs} +4 -4
- package/dist/{renderer-B-CMRUag.mjs.map → renderer-CMnlgAGs.mjs.map} +1 -1
- package/dist/{renderer-BNHcwxw9.mjs → renderer-CQFMyC_c.mjs} +4 -4
- package/dist/{renderer-BNHcwxw9.mjs.map → renderer-CQFMyC_c.mjs.map} +1 -1
- package/dist/{renderer-DgPn_SOC.mjs → renderer-CYwVNbUh.mjs} +4 -4
- package/dist/{renderer-DgPn_SOC.mjs.map → renderer-CYwVNbUh.mjs.map} +1 -1
- package/dist/{renderer-DLPhfwbR.mjs → renderer-CZ5mwBW1.mjs} +3 -3
- package/dist/{renderer-DLPhfwbR.mjs.map → renderer-CZ5mwBW1.mjs.map} +1 -1
- package/dist/{renderer-4ZUv3X1I.mjs → renderer-C_1eqfI0.mjs} +5 -5
- package/dist/{renderer-4ZUv3X1I.mjs.map → renderer-C_1eqfI0.mjs.map} +1 -1
- package/dist/renderer-C_H3mHZa.mjs +5 -0
- package/dist/{renderer-B1esRxGy.mjs → renderer-CciiDHuU.mjs} +4 -4
- package/dist/{renderer-B1esRxGy.mjs.map → renderer-CciiDHuU.mjs.map} +1 -1
- package/dist/renderer-CfkTdR5B.mjs +5 -0
- package/dist/{renderer-ynFRJh7G.mjs → renderer-CgK7Q1G8.mjs} +3 -3
- package/dist/{renderer-CR0mDPYY.mjs → renderer-CnL8Cmmr.mjs} +3 -3
- package/dist/renderer-CnhkXJ0R.mjs +5 -0
- package/dist/{renderer-fwKnV9zs.mjs → renderer-Cp_HOmp7.mjs} +5 -5
- package/dist/{renderer-fwKnV9zs.mjs.map → renderer-Cp_HOmp7.mjs.map} +1 -1
- package/dist/renderer-CqpyVsq_.mjs +5 -0
- package/dist/renderer-CtWgIpTE.mjs +5 -0
- package/dist/{renderer-riIFosX6.mjs → renderer-Cu3iKMSJ.mjs} +5 -5
- package/dist/{renderer-riIFosX6.mjs.map → renderer-Cu3iKMSJ.mjs.map} +1 -1
- package/dist/{renderer-D4f8f66C.mjs → renderer-CuPAQjDK.mjs} +4 -4
- package/dist/{renderer-D4f8f66C.mjs.map → renderer-CuPAQjDK.mjs.map} +1 -1
- package/dist/{renderer-CxGx1Lhi.mjs → renderer-CwlY8Tb-.mjs} +3 -3
- package/dist/{renderer-CxGx1Lhi.mjs.map → renderer-CwlY8Tb-.mjs.map} +1 -1
- package/dist/{renderer-o68mVeyk.mjs → renderer-CxSFvKd1.mjs} +4 -4
- package/dist/{renderer-o68mVeyk.mjs.map → renderer-CxSFvKd1.mjs.map} +1 -1
- package/dist/{renderer-CrR8Mpxq.mjs → renderer-CyUiXLRa.mjs} +5 -5
- package/dist/{renderer-CrR8Mpxq.mjs.map → renderer-CyUiXLRa.mjs.map} +1 -1
- package/dist/renderer-CyuKr5ca.mjs +5 -0
- package/dist/renderer-CzgcZXKH.mjs +3 -0
- package/dist/{renderer-Bx14Wnxl.mjs → renderer-D-GWBoVT.mjs} +58 -4
- package/dist/renderer-D-GWBoVT.mjs.map +1 -0
- package/dist/{renderer-BwrfKKqw.mjs → renderer-D-fzEZfX.mjs} +4 -4
- package/dist/{renderer-BwrfKKqw.mjs.map → renderer-D-fzEZfX.mjs.map} +1 -1
- package/dist/renderer-D5yp74NL.mjs +3 -0
- package/dist/{renderer-DAn9xiQT.mjs → renderer-D8gN7aqk.mjs} +4 -4
- package/dist/{renderer-DAn9xiQT.mjs.map → renderer-D8gN7aqk.mjs.map} +1 -1
- package/dist/renderer-D9ON_1Hf.mjs +5 -0
- package/dist/renderer-DAnTgh4o.mjs +5 -0
- package/dist/{renderer-Dpl6poqD.mjs → renderer-DGOMfyh8.mjs} +2 -2
- package/dist/{renderer-Dpl6poqD.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
- package/dist/{renderer-Rw87u1Cr.mjs → renderer-DGb_wgTW.mjs} +6 -6
- package/dist/{renderer-Rw87u1Cr.mjs.map → renderer-DGb_wgTW.mjs.map} +1 -1
- package/dist/{renderer-Co6UFbZB.mjs → renderer-DJPZs_zV.mjs} +5 -5
- package/dist/{renderer-Co6UFbZB.mjs.map → renderer-DJPZs_zV.mjs.map} +1 -1
- package/dist/renderer-DKJOon6y.d.mts +1 -0
- package/dist/{renderer-DOkbn1ot.mjs → renderer-DOZPZTxe.mjs} +5 -5
- package/dist/{renderer-DOkbn1ot.mjs.map → renderer-DOZPZTxe.mjs.map} +1 -1
- package/dist/{renderer-DaXQgGg3.mjs → renderer-DRal7Goa.mjs} +5 -5
- package/dist/{renderer-DaXQgGg3.mjs.map → renderer-DRal7Goa.mjs.map} +1 -1
- package/dist/renderer-DWgpivA3.mjs +5 -0
- package/dist/{renderer-Bo7shNdU.mjs → renderer-DXFJv_e6.mjs} +4 -4
- package/dist/{renderer-Bo7shNdU.mjs.map → renderer-DXFJv_e6.mjs.map} +1 -1
- package/dist/renderer-Dh_qNNwR.mjs +5 -0
- package/dist/renderer-DkCpXPMP.mjs +5 -0
- package/dist/{renderer-eMCTAa9e.mjs → renderer-Dp5ChuOs.mjs} +4 -4
- package/dist/{renderer-eMCTAa9e.mjs.map → renderer-Dp5ChuOs.mjs.map} +1 -1
- package/dist/{renderer-1uoKiILq.mjs → renderer-DpZballM.mjs} +3 -3
- package/dist/{renderer-1uoKiILq.mjs.map → renderer-DpZballM.mjs.map} +1 -1
- package/dist/renderer-Dre-6cDR.mjs +5 -0
- package/dist/renderer-Ds5z4_HX.mjs +5 -0
- package/dist/{renderer-7ow5Acsg.mjs → renderer-DwGlDNOV.mjs} +3 -3
- package/dist/{renderer-7ow5Acsg.mjs.map → renderer-DwGlDNOV.mjs.map} +1 -1
- package/dist/{renderer-q7q6k_cD.mjs → renderer-DxB_OfLs.mjs} +4 -4
- package/dist/{renderer-q7q6k_cD.mjs.map → renderer-DxB_OfLs.mjs.map} +1 -1
- package/dist/{renderer-DFJWPqOJ.mjs → renderer-Dz6P-rPI.mjs} +3 -3
- package/dist/{renderer-DFJWPqOJ.mjs.map → renderer-Dz6P-rPI.mjs.map} +1 -1
- package/dist/{renderer-BURhYcpA.mjs → renderer-FPiLBwj5.mjs} +4 -4
- package/dist/{renderer-BURhYcpA.mjs.map → renderer-FPiLBwj5.mjs.map} +1 -1
- package/dist/renderer-HGSCOMyP.mjs +5 -0
- package/dist/renderer-KMY8W-cJ.mjs +5 -0
- package/dist/{renderer-D-QVGphn.mjs → renderer-KgsVk9c6.mjs} +4 -4
- package/dist/{renderer-D-QVGphn.mjs.map → renderer-KgsVk9c6.mjs.map} +1 -1
- package/dist/{renderer-COcKhouz.mjs → renderer-LXhEPCmy.mjs} +5 -5
- package/dist/{renderer-COcKhouz.mjs.map → renderer-LXhEPCmy.mjs.map} +1 -1
- package/dist/{renderer-HDj9Zb-O.mjs → renderer-NBMmvqWl.mjs} +20 -7
- package/dist/renderer-NBMmvqWl.mjs.map +1 -0
- package/dist/{renderer-DE9Jik9K.mjs → renderer-Nnu32rqg.mjs} +3 -3
- package/dist/{renderer-DE9Jik9K.mjs.map → renderer-Nnu32rqg.mjs.map} +1 -1
- package/dist/renderer-R21YvXz3.mjs +5 -0
- package/dist/{renderer-celhuAL7.mjs → renderer-RAq3LnNy.mjs} +3 -3
- package/dist/{renderer-celhuAL7.mjs.map → renderer-RAq3LnNy.mjs.map} +1 -1
- package/dist/renderer-RtzCz37W.mjs +5 -0
- package/dist/{renderer-50JEMaVo.mjs → renderer-RzkU_O1i.mjs} +5 -5
- package/dist/{renderer-50JEMaVo.mjs.map → renderer-RzkU_O1i.mjs.map} +1 -1
- package/dist/{renderer-Bbxh4N8Y.mjs → renderer-S9tVGneU.mjs} +95 -80
- package/dist/renderer-S9tVGneU.mjs.map +1 -0
- package/dist/{renderer-BSELd5vU.mjs → renderer-SJyp9-62.mjs} +3 -3
- package/dist/{renderer-BSELd5vU.mjs.map → renderer-SJyp9-62.mjs.map} +1 -1
- package/dist/{renderer-jnAIhWn_.mjs → renderer-_54hiCq0.mjs} +5 -5
- package/dist/{renderer-jnAIhWn_.mjs.map → renderer-_54hiCq0.mjs.map} +1 -1
- package/dist/{renderer-88C3QpKL.d.mts → renderer-aRk849b3.d.mts} +2 -2
- package/dist/{renderer-88C3QpKL.d.mts.map → renderer-aRk849b3.d.mts.map} +1 -1
- package/dist/{renderer-BQetXCcZ.mjs → renderer-dGEMVaZ3.mjs} +4 -4
- package/dist/{renderer-BQetXCcZ.mjs.map → renderer-dGEMVaZ3.mjs.map} +1 -1
- package/dist/{renderer-RvI3qRUI.mjs → renderer-dRXP2dJU.mjs} +5 -5
- package/dist/{renderer-RvI3qRUI.mjs.map → renderer-dRXP2dJU.mjs.map} +1 -1
- package/dist/{renderer-D06HxSXO.mjs → renderer-g9SstkTz.mjs} +3 -3
- package/dist/renderer-iMrqAjix.mjs +5 -0
- package/dist/{renderer-BJ-7WRgO.mjs → renderer-opVuiAQR.mjs} +3 -3
- package/dist/{renderer-BJ-7WRgO.mjs.map → renderer-opVuiAQR.mjs.map} +1 -1
- package/dist/{renderer-KKk7myX1.mjs → renderer-puQhVfDS.mjs} +5 -5
- package/dist/{renderer-KKk7myX1.mjs.map → renderer-puQhVfDS.mjs.map} +1 -1
- package/dist/renderer-sMed1u1O.mjs +5 -0
- package/dist/renderer-tsAuo46l.mjs +5 -0
- package/dist/{renderer-TKZCA0B9.mjs → renderer-vll8LX0I.mjs} +211 -72
- package/dist/renderer-vll8LX0I.mjs.map +1 -0
- package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs → renderers-CP8CFWDs-BRQyvcut.mjs} +4 -4
- package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs.map → renderers-CP8CFWDs-BRQyvcut.mjs.map} +1 -1
- package/dist/sam/index.d.mts +3 -3
- package/dist/sam/index.mjs +1 -1
- package/dist/signals/index.d.mts +7 -7
- package/dist/signals/index.mjs +8 -8
- package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
- package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
- package/dist/{src-Bnr8DUC--BRDqRF6I.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +76 -11
- package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +1 -0
- package/dist/{src-BYp6r-cS.mjs → src-BzFGotRc.mjs} +250 -30
- package/dist/src-BzFGotRc.mjs.map +1 -0
- package/dist/storage/index.d.mts +206 -0
- package/dist/storage/index.d.mts.map +1 -0
- package/dist/storage/index.mjs +3 -0
- package/package.json +67 -59
- package/dist/audio-CYZkDwae.d.mts.map +0 -1
- package/dist/cloud-xcfV4J03.mjs +0 -233
- package/dist/cloud-xcfV4J03.mjs.map +0 -1
- package/dist/dist-CWLLnigL.mjs.map +0 -1
- package/dist/dist-CySGkG54.mjs.map +0 -1
- package/dist/dist-EQX3TUUl.mjs.map +0 -1
- package/dist/gpu-CpkJJLQP.mjs.map +0 -1
- package/dist/index-BuiZzc6i.d.mts.map +0 -1
- package/dist/index-CEU_Zsb9.d.mts.map +0 -1
- package/dist/index-CdCrae-I.d.mts.map +0 -1
- package/dist/index-Cro-818i.d.mts.map +0 -1
- package/dist/index-D2i9J9Zq.d.mts.map +0 -1
- package/dist/index-gOVtTm-P.d.mts.map +0 -1
- package/dist/preview-BToKUTtZ.mjs.map +0 -1
- package/dist/preview-engine/chunk-4FY4TNST.mjs +0 -1
- package/dist/preview-engine/chunk-7LDSMOO3.mjs +0 -1
- package/dist/preview-engine/chunk-AGAZJZWI.mjs +0 -1
- package/dist/preview-engine/chunk-BXPM5SJ3.mjs +0 -1
- package/dist/preview-engine/chunk-C4M3B2Q2.mjs +0 -1
- package/dist/preview-engine/chunk-CIVJXFWH.mjs +0 -4
- package/dist/preview-engine/chunk-D73ZKPFN.mjs +0 -138
- package/dist/preview-engine/chunk-KOVN277Z.mjs +0 -1
- package/dist/preview-engine/chunk-M4QANUJI.mjs +0 -480
- package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
- package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
- package/dist/preview-engine/chunk-XF6DYP6B.mjs +0 -1974
- package/dist/preview-engine/chunk-XYGDTPO7.mjs +0 -39
- package/dist/preview-engine/chunk-YGKO4NIU.mjs +0 -1
- package/dist/preview-engine/renderers-2NGIILMI.mjs +0 -1
- package/dist/preview-engine/renderers-466Z77BH.mjs +0 -1
- package/dist/preview-engine/renderers-4KRENGZA.mjs +0 -1
- package/dist/preview-engine/renderers-4W52BQEU.mjs +0 -1
- package/dist/preview-engine/renderers-55PRAS7G.mjs +0 -1
- package/dist/preview-engine/renderers-5LLYINHW.mjs +0 -1
- package/dist/preview-engine/renderers-63N3Y2XO.mjs +0 -1
- package/dist/preview-engine/renderers-6ROVFDIN.mjs +0 -1
- package/dist/preview-engine/renderers-A4RVLPMG.mjs +0 -1
- package/dist/preview-engine/renderers-A53P4J6O.mjs +0 -1
- package/dist/preview-engine/renderers-AFJ3373L.mjs +0 -1
- package/dist/preview-engine/renderers-ATFWTA3U.mjs +0 -1
- package/dist/preview-engine/renderers-BPYJXHBU.mjs +0 -1
- package/dist/preview-engine/renderers-D3ZF7FXT.mjs +0 -1
- package/dist/preview-engine/renderers-D7YN6B4B.mjs +0 -1
- package/dist/preview-engine/renderers-DBLASKF5.mjs +0 -1
- package/dist/preview-engine/renderers-DC5ZYYHM.mjs +0 -1
- package/dist/preview-engine/renderers-J6ZEXW5L.mjs +0 -1
- package/dist/preview-engine/renderers-JV4MF46Q.mjs +0 -1
- package/dist/preview-engine/renderers-KQKH4ZIX.mjs +0 -1
- package/dist/preview-engine/renderers-MDHPQY6D.mjs +0 -1
- package/dist/preview-engine/renderers-MEITHN4N.mjs +0 -1
- package/dist/preview-engine/renderers-MN3HSBTJ.mjs +0 -1
- package/dist/preview-engine/renderers-NTG3QGNH.mjs +0 -1
- package/dist/preview-engine/renderers-OU4SFMB2.mjs +0 -1
- package/dist/preview-engine/renderers-P6TIBJIG.mjs +0 -1
- package/dist/preview-engine/renderers-POJWQ7L3.mjs +0 -1
- package/dist/preview-engine/renderers-RJ7S6VHD.mjs +0 -1
- package/dist/preview-engine/renderers-RJJAJZYN.mjs +0 -1
- package/dist/preview-engine/renderers-UEQ733VK.mjs +0 -1
- package/dist/preview-engine/renderers-ULO2AW2U.mjs +0 -1
- package/dist/preview-engine/renderers-UPVHGHCK.mjs +0 -1
- package/dist/preview-engine/renderers-UZHSNNIM.mjs +0 -1
- package/dist/preview-engine/renderers-V5KWZL2C.mjs +0 -1
- package/dist/preview-engine/renderers-WL372W36.mjs +0 -228
- package/dist/preview-engine/renderers-YMXKYOHQ.mjs +0 -1
- package/dist/preview-engine/renderers-YWDAZ2NZ.mjs +0 -1
- package/dist/program-Bc860ko5.mjs.map +0 -1
- package/dist/renderer--Ymc_4XJ.mjs +0 -5
- package/dist/renderer-B-OdV-eq.mjs +0 -5
- package/dist/renderer-B65fwoA2.mjs +0 -5
- package/dist/renderer-B92Ahkcv.mjs +0 -5
- package/dist/renderer-B9z2AK31.mjs +0 -5
- package/dist/renderer-BIF3Dg3Z.mjs +0 -5
- package/dist/renderer-BJUVaIAT.mjs +0 -5
- package/dist/renderer-BKRDMbI-.mjs +0 -5
- package/dist/renderer-BSwhyVWa.mjs +0 -5
- package/dist/renderer-BUqSZn2X.mjs +0 -5
- package/dist/renderer-BVKOQarx.d.mts +0 -99
- package/dist/renderer-BVKOQarx.d.mts.map +0 -1
- package/dist/renderer-BbmvjqK9.mjs +0 -3
- package/dist/renderer-Bbxh4N8Y.mjs.map +0 -1
- package/dist/renderer-BhsrlGKp.mjs.map +0 -1
- package/dist/renderer-Bpe4k_x6.mjs +0 -5
- package/dist/renderer-Bx14Wnxl.mjs.map +0 -1
- package/dist/renderer-C1NjG0CJ.mjs +0 -5
- package/dist/renderer-C7Puyst9.mjs +0 -5
- package/dist/renderer-CGA_7320.mjs +0 -5
- package/dist/renderer-CLnFkXO7.mjs +0 -5
- package/dist/renderer-CMQIT1Kh.mjs +0 -5
- package/dist/renderer-CQ1rwjIh.mjs +0 -5
- package/dist/renderer-CT8h0boY.mjs +0 -5
- package/dist/renderer-Cb0lszt3.mjs +0 -5
- package/dist/renderer-Ci7oLye9.mjs +0 -5
- package/dist/renderer-CjqXB3CZ.mjs +0 -5
- package/dist/renderer-CqTV04zQ.mjs +0 -5
- package/dist/renderer-CtWeRtHK.mjs +0 -5
- package/dist/renderer-CzolnwCo.mjs +0 -5
- package/dist/renderer-D6qhcx_C.mjs +0 -5
- package/dist/renderer-DDfEf0jt.mjs +0 -5
- package/dist/renderer-DDpa8ztp.mjs +0 -5
- package/dist/renderer-DbQBqzmx.mjs +0 -5
- package/dist/renderer-DfUcwMKa.mjs +0 -5
- package/dist/renderer-DgIjNANM.mjs +0 -6
- package/dist/renderer-Dsh6Tgu0.mjs +0 -3
- package/dist/renderer-DuIwR9GT.mjs +0 -5
- package/dist/renderer-Dv4u2c14.mjs +0 -5
- package/dist/renderer-HDj9Zb-O.mjs.map +0 -1
- package/dist/renderer-IE1yu3lZ.mjs +0 -5
- package/dist/renderer-PY_wnEN0.mjs +0 -5
- package/dist/renderer-TKZCA0B9.mjs.map +0 -1
- package/dist/renderer-gv24VyzO.mjs +0 -5
- package/dist/renderer-nN6lPZf9.mjs +0 -5
- package/dist/src-BYp6r-cS.mjs.map +0 -1
- package/dist/src-Bnr8DUC--BRDqRF6I.mjs.map +0 -1
- /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
- /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { z as inputStore } from "./dist-D3BeAZ7X.mjs";
|
|
2
|
+
import { t as encodeStereoWav } from "./audio-DS9Jg2ls.mjs";
|
|
3
|
+
import { s as HeadlessMediaRenderer } from "./renderer-S9tVGneU.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
|
-
`
|
|
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
|
-
|
|
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/
|
|
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" : "
|
|
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) <
|
|
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-
|
|
2446
|
+
//# sourceMappingURL=preview-PDz7o2xg.mjs.map
|