framefields 2.0.5 → 2.0.7
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/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-COkiXyDb.mjs → audio-D6enPyAG.mjs} +4 -4
- package/dist/{audio-COkiXyDb.mjs.map → audio-D6enPyAG.mjs.map} +1 -1
- package/dist/{audio-nmU-BWxI.d.mts → audio-a6pY05g2.d.mts} +3 -3
- package/dist/{audio-nmU-BWxI.d.mts.map → audio-a6pY05g2.d.mts.map} +1 -1
- package/dist/{dist-Bx6J0VcM.mjs → dist-B9Afsv83.mjs} +47 -2
- package/dist/dist-B9Afsv83.mjs.map +1 -0
- package/dist/{dist-DKm2IyEJ.mjs → dist-DzUJmIHt.mjs} +2 -2
- package/dist/dist-DzUJmIHt.mjs.map +1 -0
- package/dist/{dist-55MP0aN4.mjs → dist-JkiL-qy7.mjs} +3 -3
- package/dist/{dist-55MP0aN4.mjs.map → dist-JkiL-qy7.mjs.map} +1 -1
- package/dist/{dist-DgIKXWZ1.mjs → dist-sHqWCB9M.mjs} +156 -113
- package/dist/dist-sHqWCB9M.mjs.map +1 -0
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +25 -25
- package/dist/effects-l0T61DPU.mjs +2086 -0
- package/dist/effects-l0T61DPU.mjs.map +1 -0
- package/dist/fonts/index.mjs +1 -1
- package/dist/{fonts-C_AWIMdb.mjs → fonts-CuG-05-_.mjs} +2 -2
- package/dist/{fonts-C_AWIMdb.mjs.map → fonts-CuG-05-_.mjs.map} +1 -1
- package/dist/{index-Bx7JBFT6.d.mts → index-BJUS4Nx6.d.mts} +2 -2
- package/dist/{index-Bx7JBFT6.d.mts.map → index-BJUS4Nx6.d.mts.map} +1 -1
- package/dist/{index-C8rstr3Y.d.mts → index-BJx_Qxc_.d.mts} +2510 -125
- package/dist/{index-C8rstr3Y.d.mts.map → index-BJx_Qxc_.d.mts.map} +1 -1
- package/dist/{index-i0xPY4Fe.d.mts → index-BLbUQolI.d.mts} +3 -3
- package/dist/{index-i0xPY4Fe.d.mts.map → index-BLbUQolI.d.mts.map} +1 -1
- package/dist/{index-CAGDH7l6.d.mts → index-Bi2nRZ_g.d.mts} +3 -3
- package/dist/{index-CAGDH7l6.d.mts.map → index-Bi2nRZ_g.d.mts.map} +1 -1
- package/dist/{index-DY3mLoPO.d.mts → index-CZChQhXZ.d.mts} +2 -2
- package/dist/index-CZChQhXZ.d.mts.map +1 -0
- package/dist/{index-ogL8Y-Ng.d.mts → index-WIPHLy5m.d.mts} +23 -2
- package/dist/index-WIPHLy5m.d.mts.map +1 -0
- package/dist/index.d.mts +41 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +47 -45
- package/dist/index.mjs.map +1 -1
- package/dist/preview/index.d.mts +2 -2
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-BM0Zzcn1.mjs → preview-4z1jNSej.mjs} +2 -2
- package/dist/{preview-BM0Zzcn1.mjs.map → preview-4z1jNSej.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-H5BPCY7N.mjs → chunk-24DXIKXL.mjs} +2 -2
- package/dist/preview-engine/{chunk-QP2NI4XD.mjs → chunk-2XXICKQV.mjs} +1 -1
- package/dist/preview-engine/{chunk-EDIZNO3P.mjs → chunk-3ROJ7JVY.mjs} +1 -1
- package/dist/preview-engine/{chunk-2RMSCL6V.mjs → chunk-5NYKHIQN.mjs} +10 -10
- package/dist/preview-engine/{chunk-VSSB73UU.mjs → chunk-66NVL4BN.mjs} +2 -2
- package/dist/preview-engine/{chunk-AOLAHYVV.mjs → chunk-6JW37VJA.mjs} +1 -1
- package/dist/preview-engine/chunk-7MJVROKR.mjs +98 -0
- package/dist/preview-engine/{chunk-Z4ERCLNF.mjs → chunk-7NVDTELW.mjs} +1 -1
- package/dist/preview-engine/{chunk-SXX7HX34.mjs → chunk-AMBSW6OA.mjs} +2 -2
- package/dist/preview-engine/{chunk-UDNCEHUI.mjs → chunk-BE3CEVJB.mjs} +1 -1
- package/dist/preview-engine/{chunk-CA5N7JRZ.mjs → chunk-BQ65MU6H.mjs} +1 -1
- package/dist/preview-engine/{chunk-LEEZXHQO.mjs → chunk-BWDARDO6.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZX6APG6E.mjs → chunk-CXFEQ5PM.mjs} +1 -1
- package/dist/preview-engine/chunk-D3TETPLI.mjs +5 -0
- package/dist/preview-engine/{chunk-B6PLCMBM.mjs → chunk-DMWSTYFF.mjs} +1 -1
- package/dist/preview-engine/{chunk-6ZOXGAYA.mjs → chunk-EJTGJVUA.mjs} +2 -2
- package/dist/preview-engine/{chunk-3O5OKR6D.mjs → chunk-EQ4QZRXB.mjs} +2 -2
- package/dist/preview-engine/{chunk-I4FH6HYU.mjs → chunk-FE6RSVKZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-U446SQP3.mjs → chunk-GHMCGTJ2.mjs} +1 -1
- package/dist/preview-engine/{chunk-M2GRYRLM.mjs → chunk-HPIULG7P.mjs} +1 -1
- package/dist/preview-engine/{chunk-G3HW4VER.mjs → chunk-HRIKNYPF.mjs} +1 -1
- package/dist/preview-engine/{chunk-G76HSKOS.mjs → chunk-IGFT3XLN.mjs} +1 -1
- package/dist/preview-engine/{chunk-NWRSVVTF.mjs → chunk-JQ4WY6BZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-JWNHTRED.mjs → chunk-LIHUEYI5.mjs} +2 -2
- package/dist/preview-engine/{chunk-DPPH3NK2.mjs → chunk-NRHSNPZV.mjs} +1 -1
- package/dist/preview-engine/{chunk-BUIQ5TUH.mjs → chunk-OWOSYNMF.mjs} +1 -1
- package/dist/preview-engine/{chunk-7S6ZFYLI.mjs → chunk-OZVCWK27.mjs} +1 -1
- package/dist/preview-engine/{chunk-D5PHI6ET.mjs → chunk-PO4VAAQC.mjs} +1 -1
- package/dist/preview-engine/{chunk-LP3EP33S.mjs → chunk-POPVFC5P.mjs} +1 -1
- package/dist/preview-engine/chunk-PQD5UPHG.mjs +5 -0
- package/dist/preview-engine/{chunk-SA3JUR6D.mjs → chunk-QGBSLNFI.mjs} +1 -1
- package/dist/preview-engine/{chunk-H2F5NVQ6.mjs → chunk-QM3XFEJN.mjs} +1 -1
- package/dist/preview-engine/{chunk-L62MRHGZ.mjs → chunk-R3ZH7YF3.mjs} +1 -1
- package/dist/preview-engine/{chunk-V7ZVVUQU.mjs → chunk-R6YNSBKL.mjs} +1 -1
- package/dist/preview-engine/chunk-S3P3MJYU.mjs +1 -0
- package/dist/preview-engine/chunk-SUUUYXXT.mjs +1 -0
- package/dist/preview-engine/{chunk-55CCFPUX.mjs → chunk-TNZENER3.mjs} +1 -1
- package/dist/preview-engine/chunk-V6VU46ZG.mjs +52 -0
- package/dist/preview-engine/{chunk-5XDHHOF2.mjs → chunk-XCYFPA34.mjs} +1 -1
- package/dist/preview-engine/{chunk-EHIIT4ZR.mjs → chunk-XFYXT76H.mjs} +1 -1
- package/dist/preview-engine/{chunk-V3H7WWOT.mjs → chunk-XLFYM7KH.mjs} +2 -2
- package/dist/preview-engine/{chunk-D7MZHP2Y.mjs → chunk-XSMK5E2V.mjs} +1 -1
- package/dist/preview-engine/{chunk-5UP7FSGT.mjs → chunk-Y6FEU4TV.mjs} +1 -1
- package/dist/preview-engine/{chunk-HXMDPMLB.mjs → chunk-YG35X5R5.mjs} +1 -1
- package/dist/preview-engine/{chunk-KZOLCZIV.mjs → chunk-YITWSOG4.mjs} +1 -1
- package/dist/preview-engine/chunk-ZNGOAGAI.mjs +1 -0
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +24 -24
- package/dist/preview-engine/player.mjs +4 -4
- package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +1 -0
- package/dist/preview-engine/renderers-47UITXLZ.mjs +1 -0
- package/dist/preview-engine/renderers-4AHH6BHF.mjs +1 -0
- package/dist/preview-engine/renderers-54AQK6RF.mjs +1 -0
- package/dist/preview-engine/renderers-6PRVCTYV.mjs +1 -0
- package/dist/preview-engine/{renderers-GUKQUMGG.mjs → renderers-B52QT6MT.mjs} +1 -1
- package/dist/preview-engine/{renderers-AGMH5CRH.mjs → renderers-BE6RVJSE.mjs} +1 -1
- package/dist/preview-engine/renderers-BMM2BH56.mjs +1 -0
- package/dist/preview-engine/{renderers-YWRP23SZ.mjs → renderers-CAUWP4XH.mjs} +2 -2
- package/dist/preview-engine/renderers-CHJWUJVI.mjs +1 -0
- package/dist/preview-engine/renderers-CHOGQHVQ.mjs +1 -0
- package/dist/preview-engine/renderers-DEYDSGJX.mjs +1 -0
- package/dist/preview-engine/renderers-DZTNRCR7.mjs +1 -0
- package/dist/preview-engine/{renderers-BHVPLYNN.mjs → renderers-E3JYRLSD.mjs} +1 -1
- package/dist/preview-engine/renderers-ELO3KWTK.mjs +1 -0
- package/dist/preview-engine/{renderers-YKUQUCTO.mjs → renderers-F2KJNDWA.mjs} +1 -1
- package/dist/preview-engine/renderers-FCV4COVB.mjs +1 -0
- package/dist/preview-engine/{renderers-F2NFJI5L.mjs → renderers-GC7EGB5Z.mjs} +1 -1
- package/dist/preview-engine/renderers-GXCRINGC.mjs +1 -0
- package/dist/preview-engine/renderers-GYJTBVV2.mjs +1 -0
- package/dist/preview-engine/renderers-JA4SLMG3.mjs +1 -0
- package/dist/preview-engine/renderers-JLN77CFZ.mjs +1 -0
- package/dist/preview-engine/{renderers-6BJA6MSU.mjs → renderers-JQHUBWLL.mjs} +1 -1
- package/dist/preview-engine/{renderers-LX654SZ3.mjs → renderers-KBFW7B5F.mjs} +1 -1
- package/dist/preview-engine/{renderers-LK3NRMGR.mjs → renderers-KCP4TFHG.mjs} +1 -1
- package/dist/preview-engine/renderers-KS4HPV6Q.mjs +1 -0
- package/dist/preview-engine/renderers-LJRJMFCR.mjs +1 -0
- package/dist/preview-engine/renderers-LPAPZ5QS.mjs +1 -0
- package/dist/preview-engine/renderers-N5UPJY73.mjs +1 -0
- package/dist/preview-engine/renderers-NS3AIJVG.mjs +1 -0
- package/dist/preview-engine/renderers-OBMTU3QY.mjs +1 -0
- package/dist/preview-engine/{renderers-ZPWOUWZJ.mjs → renderers-PW4OJWHF.mjs} +1 -1
- package/dist/preview-engine/renderers-PXGLEFZO.mjs +1 -0
- package/dist/preview-engine/{renderers-7AO5746S.mjs → renderers-Q2ZDD5K2.mjs} +1 -1
- package/dist/preview-engine/renderers-Q3MD34JN.mjs +1 -0
- package/dist/preview-engine/renderers-QECJP22T.mjs +1 -0
- package/dist/preview-engine/{renderers-LFA5NW4V.mjs → renderers-R5WSHETG.mjs} +4 -4
- package/dist/preview-engine/renderers-RXGNA2Q7.mjs +1 -0
- package/dist/preview-engine/renderers-TG62LZTF.mjs +1 -0
- package/dist/preview-engine/{renderers-AHSGP6LY.mjs → renderers-TUYQLKHJ.mjs} +1 -1
- package/dist/preview-engine/renderers-VTTGFO55.mjs +1 -0
- package/dist/preview-engine/{renderers-UTFXZE3G.mjs → renderers-WG7QBD4D.mjs} +1 -1
- package/dist/preview-engine/{renderers-VGU3LNLT.mjs → renderers-WLH4HRUE.mjs} +1 -1
- package/dist/preview-engine/{renderers-5QYK6766.mjs → renderers-WSMLLSWX.mjs} +1 -1
- package/dist/preview-engine/renderers-XFC6ZPO5.mjs +1 -0
- package/dist/preview-engine/{renderers-UWPH7HBH.mjs → renderers-XUHRY3XH.mjs} +1 -1
- package/dist/preview-engine/renderers-YAOB5XU6.mjs +1 -0
- package/dist/preview-engine/renderers-YTB4FOHT.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-DGqyGGvj.mjs → program-DPFDbeL9.mjs} +12 -7
- package/dist/{program-DGqyGGvj.mjs.map → program-DPFDbeL9.mjs.map} +1 -1
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-CXUohIJ9.mjs → renderer--akPySto.mjs} +2 -2
- package/dist/{renderer-CXUohIJ9.mjs.map → renderer--akPySto.mjs.map} +1 -1
- package/dist/{renderer-2r4EgfdZ.mjs → renderer-0ty5QtXg.mjs} +9 -8
- package/dist/renderer-0ty5QtXg.mjs.map +1 -0
- package/dist/renderer-145WIXyW.mjs +3 -0
- package/dist/{renderer-BJiL-BQY.mjs → renderer-7v-ZNKEJ.mjs} +2 -2
- package/dist/{renderer-BJiL-BQY.mjs.map → renderer-7v-ZNKEJ.mjs.map} +1 -1
- package/dist/renderer-9W8q4Y8D.mjs +3 -0
- package/dist/{renderer-QfSB-cRU.mjs → renderer-B1IXTeF2.mjs} +2 -2
- package/dist/{renderer-QfSB-cRU.mjs.map → renderer-B1IXTeF2.mjs.map} +1 -1
- package/dist/{renderer-CwAjqb2o.mjs → renderer-B52Y2SDC.mjs} +1 -1
- package/dist/renderer-B5HBViEG.mjs +3 -0
- package/dist/renderer-B7naoaVH.mjs +3 -0
- package/dist/{renderer-z6Qb5Z-W.mjs → renderer-BD6Jkc8j.mjs} +2 -2
- package/dist/{renderer-z6Qb5Z-W.mjs.map → renderer-BD6Jkc8j.mjs.map} +1 -1
- package/dist/renderer-BHYmRBem.mjs +3 -0
- package/dist/{renderer-CnRoblJF.mjs → renderer-BHsEOp1I.mjs} +2 -2
- package/dist/{renderer-CnRoblJF.mjs.map → renderer-BHsEOp1I.mjs.map} +1 -1
- package/dist/renderer-BL51bhvQ.mjs +3 -0
- package/dist/{renderer-Q7_DUcnu.mjs → renderer-BNBh4omF.mjs} +2 -2
- package/dist/{renderer-Q7_DUcnu.mjs.map → renderer-BNBh4omF.mjs.map} +1 -1
- package/dist/{renderer-Cx5H41JR.mjs → renderer-BShK_xMJ.mjs} +1 -1
- package/dist/{renderer-D5N2JO7g.mjs → renderer-BUJ6uaJE.mjs} +3 -3
- package/dist/{renderer-D5N2JO7g.mjs.map → renderer-BUJ6uaJE.mjs.map} +1 -1
- package/dist/{renderer-CeADvUU_.mjs → renderer-BV_d3D_3.mjs} +3 -3
- package/dist/{renderer-CeADvUU_.mjs.map → renderer-BV_d3D_3.mjs.map} +1 -1
- package/dist/{renderer-BMrm2Zbz.mjs → renderer-BXWu8aHU.mjs} +3 -3
- package/dist/{renderer-BMrm2Zbz.mjs.map → renderer-BXWu8aHU.mjs.map} +1 -1
- package/dist/{renderer-DcPOsAVu.d.mts → renderer-Bal8734U.d.mts} +2 -2
- package/dist/{renderer-DcPOsAVu.d.mts.map → renderer-Bal8734U.d.mts.map} +1 -1
- package/dist/{renderer-vUjNMbLq.mjs → renderer-BbwOEawB.mjs} +2 -2
- package/dist/{renderer-vUjNMbLq.mjs.map → renderer-BbwOEawB.mjs.map} +1 -1
- package/dist/renderer-BfvBHHNr.mjs +3 -0
- package/dist/{renderer-JjMO41Cv.mjs → renderer-BgrDGRNW.mjs} +2 -2
- package/dist/{renderer-JjMO41Cv.mjs.map → renderer-BgrDGRNW.mjs.map} +1 -1
- package/dist/{renderer-D_QS6p1q.mjs → renderer-BhfFVqCx.mjs} +2 -2
- package/dist/{renderer-D_QS6p1q.mjs.map → renderer-BhfFVqCx.mjs.map} +1 -1
- package/dist/{renderer-CsQ7nY0z.mjs → renderer-Bl9C9lIo.mjs} +1 -1
- package/dist/{renderer-Bwsh5TUv.mjs → renderer-BpTwFaja.mjs} +3 -3
- package/dist/{renderer-Bwsh5TUv.mjs.map → renderer-BpTwFaja.mjs.map} +1 -1
- package/dist/{renderer-Dcd-Pkzd.mjs → renderer-Bpf8EGY1.mjs} +2 -2
- package/dist/{renderer-Dcd-Pkzd.mjs.map → renderer-Bpf8EGY1.mjs.map} +1 -1
- package/dist/{renderer-D1Zs78PQ.mjs → renderer-By91JEn8.mjs} +42 -42
- package/dist/{renderer-D1Zs78PQ.mjs.map → renderer-By91JEn8.mjs.map} +1 -1
- package/dist/renderer-ByxrzTRg.mjs +3 -0
- package/dist/{renderer-eC1gRPRo.mjs → renderer-C-F91lPu.mjs} +2 -2
- package/dist/{renderer-eC1gRPRo.mjs.map → renderer-C-F91lPu.mjs.map} +1 -1
- package/dist/{renderer-B9l641o-.mjs → renderer-C5lJvf-h.mjs} +2 -2
- package/dist/{renderer-B9l641o-.mjs.map → renderer-C5lJvf-h.mjs.map} +1 -1
- package/dist/renderer-CDirzReW.mjs +3 -0
- package/dist/renderer-CGCmbeJ2.mjs +3 -0
- package/dist/renderer-CL3evUmF.mjs +3 -0
- package/dist/{renderer-BtkU0BT-.mjs → renderer-CLUPc9do.mjs} +3 -3
- package/dist/{renderer-BtkU0BT-.mjs.map → renderer-CLUPc9do.mjs.map} +1 -1
- package/dist/{renderer-C28Bab-M.mjs → renderer-CLWAbaCS.mjs} +9 -8
- package/dist/renderer-CLWAbaCS.mjs.map +1 -0
- package/dist/{renderer-COkFM1KL.mjs → renderer-CM5c8a7B.mjs} +8 -7
- package/dist/renderer-CM5c8a7B.mjs.map +1 -0
- package/dist/renderer-CO0KsnEg.mjs +3 -0
- package/dist/renderer-COO44HDO.mjs +3 -0
- package/dist/renderer-C_9SIgZX.mjs +3 -0
- package/dist/{renderer-BYsmLk63.mjs → renderer-Cgy1H0Ql.mjs} +2 -2
- package/dist/{renderer-BYsmLk63.mjs.map → renderer-Cgy1H0Ql.mjs.map} +1 -1
- package/dist/{renderer-5OiVjQan.mjs → renderer-CmMNU1-P.mjs} +9 -9
- package/dist/renderer-CmMNU1-P.mjs.map +1 -0
- package/dist/{renderer-DjiUZ0Vs.mjs → renderer-Cn-p1SyO.mjs} +34 -18
- package/dist/renderer-Cn-p1SyO.mjs.map +1 -0
- package/dist/renderer-CntaTaNq.mjs +3 -0
- package/dist/{renderer-C3L9SNRO.mjs → renderer-CsE9ztUa.mjs} +3 -3
- package/dist/{renderer-C3L9SNRO.mjs.map → renderer-CsE9ztUa.mjs.map} +1 -1
- package/dist/renderer-CtVkU_GA.mjs.map +1 -1
- package/dist/renderer-Cv9JLpL6.mjs +3 -0
- package/dist/{renderer-x2s9LmVL.mjs → renderer-D-4Yh-RK.mjs} +2 -2
- package/dist/{renderer-x2s9LmVL.mjs.map → renderer-D-4Yh-RK.mjs.map} +1 -1
- package/dist/renderer-D0FWIsWn.mjs +3 -0
- package/dist/{renderer-C9BKcHZb.mjs → renderer-D3FsnptO.mjs} +1 -1
- package/dist/renderer-D3jUYUDU.mjs +3 -0
- package/dist/renderer-D5Je-AeQ.mjs +3 -0
- package/dist/{renderer-bebAt6Dz.mjs → renderer-DJPuwTbS.mjs} +10 -8
- package/dist/renderer-DJPuwTbS.mjs.map +1 -0
- package/dist/renderer-DNPwpmYS.mjs +3 -0
- package/dist/{renderer-D54yO_M_.mjs → renderer-DRf4FLSq.mjs} +10 -9
- package/dist/renderer-DRf4FLSq.mjs.map +1 -0
- package/dist/{renderer-DI2RcpKU.mjs → renderer-DVj8jfmO.mjs} +9 -8
- package/dist/renderer-DVj8jfmO.mjs.map +1 -0
- package/dist/renderer-DawVsNLw.mjs +3 -0
- package/dist/renderer-Dl_6Kn87.mjs +3 -0
- package/dist/renderer-DlrJSfaw.mjs +3 -0
- package/dist/{renderer-BUHMkkLU.mjs → renderer-DnXQXk-8.mjs} +2 -2
- package/dist/{renderer-BUHMkkLU.mjs.map → renderer-DnXQXk-8.mjs.map} +1 -1
- package/dist/{renderer-CgVdRbc-.mjs → renderer-Dntxca07.mjs} +2 -2
- package/dist/{renderer-CgVdRbc-.mjs.map → renderer-Dntxca07.mjs.map} +1 -1
- package/dist/renderer-DpScOWGG.mjs +4 -0
- package/dist/{renderer-CMM4DZ1i.mjs → renderer-DvHpzsUV.mjs} +2 -2
- package/dist/{renderer-CMM4DZ1i.mjs.map → renderer-DvHpzsUV.mjs.map} +1 -1
- package/dist/renderer-DxYOA1MM.mjs +3 -0
- package/dist/{renderer-DBp6A7tR.mjs → renderer-E5D4H5dK.mjs} +3 -3
- package/dist/{renderer-DBp6A7tR.mjs.map → renderer-E5D4H5dK.mjs.map} +1 -1
- package/dist/{renderer-D1ib-wB3.mjs → renderer-L72D1mwv.mjs} +3 -3
- package/dist/{renderer-D1ib-wB3.mjs.map → renderer-L72D1mwv.mjs.map} +1 -1
- package/dist/renderer-S7jOr_jF.mjs +3 -0
- package/dist/{renderer-WXylxlu2.mjs → renderer-XRGwrdg8.mjs} +5 -5
- package/dist/renderer-XRGwrdg8.mjs.map +1 -0
- package/dist/{renderer-0gJC-sc8.mjs → renderer-doPt4zQZ.mjs} +2 -2
- package/dist/{renderer-0gJC-sc8.mjs.map → renderer-doPt4zQZ.mjs.map} +1 -1
- package/dist/{renderer-Dm08-hAU.mjs → renderer-h-HOoLwD.mjs} +2 -2
- package/dist/{renderer-Dm08-hAU.mjs.map → renderer-h-HOoLwD.mjs.map} +1 -1
- package/dist/renderer-kN2TeWks.mjs +3 -0
- package/dist/{renderers-BWg16W-V-jhdCp6Vd.mjs → renderers-CP8CFWDs-CAs5DgWj.mjs} +16 -13
- package/dist/renderers-CP8CFWDs-CAs5DgWj.mjs.map +1 -0
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +6 -6
- package/dist/{signals-BwbdO3AN.mjs → signals-CsxqD2AA.mjs} +3 -3
- package/dist/{signals-BwbdO3AN.mjs.map → signals-CsxqD2AA.mjs.map} +1 -1
- package/package.json +54 -54
- package/dist/dist-Bx6J0VcM.mjs.map +0 -1
- package/dist/dist-DKm2IyEJ.mjs.map +0 -1
- package/dist/dist-DgIKXWZ1.mjs.map +0 -1
- package/dist/effects-m3FuatqZ.mjs +0 -811
- package/dist/effects-m3FuatqZ.mjs.map +0 -1
- package/dist/index-DY3mLoPO.d.mts.map +0 -1
- package/dist/index-ogL8Y-Ng.d.mts.map +0 -1
- package/dist/preview-engine/chunk-4Q7JG6WJ.mjs +0 -1
- package/dist/preview-engine/chunk-CVGM2U4J.mjs +0 -47
- package/dist/preview-engine/chunk-N4PWLBZ7.mjs +0 -5
- package/dist/preview-engine/chunk-P3HBP725.mjs +0 -1
- package/dist/preview-engine/chunk-PCB2VB5K.mjs +0 -98
- package/dist/preview-engine/chunk-TMRLZV5X.mjs +0 -1
- package/dist/preview-engine/chunk-XD4GKD6H.mjs +0 -5
- package/dist/preview-engine/chunk-YSTLMWCG.mjs +0 -1
- package/dist/preview-engine/renderers-2AUSIYZN.mjs +0 -1
- package/dist/preview-engine/renderers-2QN6KZJP.mjs +0 -1
- package/dist/preview-engine/renderers-32SKW7ML.mjs +0 -1
- package/dist/preview-engine/renderers-6QAF3LQ2.mjs +0 -1
- package/dist/preview-engine/renderers-76MPTVZK.mjs +0 -1
- package/dist/preview-engine/renderers-AFYKNM6N.mjs +0 -1
- package/dist/preview-engine/renderers-ASTBICLA.mjs +0 -1
- package/dist/preview-engine/renderers-D7PVQFVU.mjs +0 -1
- package/dist/preview-engine/renderers-DB4ABTNA.mjs +0 -1
- package/dist/preview-engine/renderers-FI7YHNLY.mjs +0 -1
- package/dist/preview-engine/renderers-GBHULMPH.mjs +0 -1
- package/dist/preview-engine/renderers-HGT7QDY3.mjs +0 -1
- package/dist/preview-engine/renderers-HOYLA7ZK.mjs +0 -1
- package/dist/preview-engine/renderers-KKI2D3MZ.mjs +0 -1
- package/dist/preview-engine/renderers-KRAJNV4E.mjs +0 -1
- package/dist/preview-engine/renderers-KUGZKSVE.mjs +0 -1
- package/dist/preview-engine/renderers-L2EQQIOC.mjs +0 -1
- package/dist/preview-engine/renderers-MCFQFYEL.mjs +0 -1
- package/dist/preview-engine/renderers-OEVXCGE2.mjs +0 -1
- package/dist/preview-engine/renderers-QVD6C4CS.mjs +0 -1
- package/dist/preview-engine/renderers-RBFWJWVM.mjs +0 -1
- package/dist/preview-engine/renderers-RX3VLVLO.mjs +0 -1
- package/dist/preview-engine/renderers-SM6JP64K.mjs +0 -1
- package/dist/preview-engine/renderers-TKMAATVS.mjs +0 -1
- package/dist/preview-engine/renderers-UZGECFVO.mjs +0 -1
- package/dist/preview-engine/renderers-WJUTT5BB.mjs +0 -1
- package/dist/preview-engine/renderers-XA2M4YXK.mjs +0 -1
- package/dist/preview-engine/renderers-XIHRFEFQ.mjs +0 -1
- package/dist/preview-engine/renderers-XJTA5MFG.mjs +0 -1
- package/dist/preview-engine/renderers-XLTY5APF.mjs +0 -1
- package/dist/preview-engine/renderers-XZ3VXFGZ.mjs +0 -1
- package/dist/renderer--fkO4O8d.mjs +0 -3
- package/dist/renderer-2r4EgfdZ.mjs.map +0 -1
- package/dist/renderer-5OiVjQan.mjs.map +0 -1
- package/dist/renderer-6x7CgHhJ.mjs +0 -3
- package/dist/renderer-B0RDWv1C.mjs +0 -3
- package/dist/renderer-BFOkGS0N.mjs +0 -3
- package/dist/renderer-BaoJiMJO.mjs +0 -3
- package/dist/renderer-C28Bab-M.mjs.map +0 -1
- package/dist/renderer-C4O-L73n.mjs +0 -3
- package/dist/renderer-CGVuhBbA.mjs +0 -3
- package/dist/renderer-CHKB-Or4.mjs +0 -3
- package/dist/renderer-CL9gPcfZ.mjs +0 -3
- package/dist/renderer-COkFM1KL.mjs.map +0 -1
- package/dist/renderer-CSkFF-qe.mjs +0 -3
- package/dist/renderer-CU2c6zWc.mjs +0 -3
- package/dist/renderer-CiLiH6w_.mjs +0 -3
- package/dist/renderer-D54yO_M_.mjs.map +0 -1
- package/dist/renderer-DI2RcpKU.mjs.map +0 -1
- package/dist/renderer-DMaYsSM4.mjs +0 -3
- package/dist/renderer-DPSsf8-t.mjs +0 -3
- package/dist/renderer-DZ7t_l1d.mjs +0 -3
- package/dist/renderer-DjiUZ0Vs.mjs.map +0 -1
- package/dist/renderer-DkJEnKQu.mjs +0 -3
- package/dist/renderer-DlkrKqQj.mjs +0 -3
- package/dist/renderer-DxOQ5S8T.mjs +0 -3
- package/dist/renderer-Ibvw1tE_.mjs +0 -3
- package/dist/renderer-M0jeFo6S.mjs +0 -4
- package/dist/renderer-NhSzqWsQ.mjs +0 -3
- package/dist/renderer-OrhgkzVu.mjs +0 -3
- package/dist/renderer-WXylxlu2.mjs.map +0 -1
- package/dist/renderer-WrFAaLxW.mjs +0 -3
- package/dist/renderer-bbOALT4F.mjs +0 -3
- package/dist/renderer-bebAt6Dz.mjs.map +0 -1
- package/dist/renderer-lXmyzdcx.mjs +0 -3
- package/dist/renderer-ospMsCzr.mjs +0 -3
- package/dist/renderer-xc9wkiC7.mjs +0 -3
- package/dist/renderers-BWg16W-V-jhdCp6Vd.mjs.map +0 -1
- /package/dist/preview-engine/{chunk-VJGK7MLJ.mjs → chunk-CBM7B7EW.mjs} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects-l0T61DPU.mjs","names":[],"sources":["../src/effects/with-defaults.ts","../src/effects/generated/meta.ts","../src/effects/generated/classes.ts","../src/effects/custom/blur.ts","../src/effects/generated/registry.ts","../src/effects/classes.ts"],"sourcesContent":["import { isSignal } from \"@framefields/core\";\n\n/** Literal metadata for one prop, emitted into `generated/meta.ts`. */\nexport interface PropMeta {\n\treadonly min?: number;\n\treadonly max?: number;\n\treadonly enum?: readonly (string | number | boolean)[];\n\t/** Members of a nested object prop. */\n\treadonly props?: EffectMeta;\n}\n\nexport type EffectMeta = Readonly<Record<string, PropMeta>>;\n\nfunction env(name: string): string | undefined {\n\treturn typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\n/** Throw instead of warn. Recommended for agent harnesses and CI. */\nfunction isStrict(): boolean {\n\tconst flag = env(\"FRAMEFIELDS_STRICT_PROPS\");\n\treturn flag === \"1\" || flag === \"true\";\n}\n\nfunction checksEnabled(): boolean {\n\treturn isStrict() || env(\"NODE_ENV\") !== \"production\";\n}\n\nconst reported = new Set<string>();\n\nfunction report(message: string): void {\n\tif (isStrict()) throw new Error(message);\n\tif (reported.has(message)) return;\n\treported.add(message);\n\tconsole.warn(`[framefields] ${message}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value) || isSignal(value)) return false;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n\n/** Levenshtein distance, for \"did you mean\" suggestions on small key sets. */\nfunction distance(a: string, b: string): number {\n\tconst row = Array.from({ length: b.length + 1 }, (_, i) => i);\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tlet prev = row[0];\n\t\trow[0] = i;\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst current = row[j];\n\t\t\trow[j] = Math.min(\n\t\t\t\trow[j] + 1,\n\t\t\t\trow[j - 1] + 1,\n\t\t\t\tprev + (a[i - 1] === b[j - 1] ? 0 : 1),\n\t\t\t);\n\t\t\tprev = current;\n\t\t}\n\t}\n\treturn row[b.length];\n}\n\nfunction suggest(key: string, known: readonly string[]): string {\n\tlet best: string | undefined;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\tconst lower = key.toLowerCase();\n\tfor (const candidate of known) {\n\t\tconst candidateLower = candidate.toLowerCase();\n\t\tconst score =\n\t\t\tcandidateLower.includes(lower) || lower.includes(candidateLower)\n\t\t\t\t? 1\n\t\t\t\t: distance(lower, candidateLower);\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbest = candidate;\n\t\t}\n\t}\n\tconst close = best && bestScore <= Math.max(2, Math.ceil(key.length / 2));\n\treturn close\n\t\t? ` Did you mean \"${best}\"?`\n\t\t: ` Known props: ${known.join(\", \")}.`;\n}\n\nfunction checkValue(path: string, value: unknown, meta: PropMeta): void {\n\tif (typeof value === \"number\") {\n\t\tconst { min, max } = meta;\n\t\tconst below = min !== undefined && value < min;\n\t\tconst above = max !== undefined && value > max;\n\t\tif (below || above || Number.isNaN(value)) {\n\t\t\tconst range =\n\t\t\t\tmin !== undefined && max !== undefined\n\t\t\t\t\t? `${min} to ${max}`\n\t\t\t\t\t: min !== undefined\n\t\t\t\t\t\t? `≥ ${min}`\n\t\t\t\t\t\t: `≤ ${max}`;\n\t\t\treport(\n\t\t\t\tNumber.isNaN(value)\n\t\t\t\t\t? `${path} is NaN`\n\t\t\t\t\t: `${path} = ${value} is outside ${range}`,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\tmeta.enum &&\n\t\t(typeof value === \"string\" || typeof value === \"boolean\") &&\n\t\t!meta.enum.includes(value)\n\t) {\n\t\treport(\n\t\t\t`${path} = ${JSON.stringify(value)} is not one of ${meta.enum\n\t\t\t\t.map((v) => JSON.stringify(v))\n\t\t\t\t.join(\", \")}`,\n\t\t);\n\t}\n}\n\nfunction checkProps(\n\tpath: string,\n\tconfig: Record<string, unknown>,\n\tmeta: EffectMeta,\n): void {\n\tconst known = Object.keys(meta);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value === undefined) continue;\n\t\tconst propMeta = meta[key];\n\t\tif (!propMeta) {\n\t\t\treport(`${path}: unknown prop \"${key}\".${suggest(key, known)}`);\n\t\t\tcontinue;\n\t\t}\n\t\t// Signals and frame functions are sampled per frame; only static values\n\t\t// can be checked here.\n\t\tif (isSignal(value) || typeof value === \"function\") continue;\n\t\tif (propMeta.props && isPlainObject(value)) {\n\t\t\tcheckProps(`${path}.${key}`, value, propMeta.props);\n\t\t} else {\n\t\t\tcheckValue(`${path}.${key}`, value, propMeta);\n\t\t}\n\t}\n}\n\nfunction cloneDefault<T>(value: T): T {\n\treturn typeof value === \"object\" && value !== null\n\t\t? structuredClone(value)\n\t\t: value;\n}\n\n/**\n * Builds the initial config of a generated effect class.\n *\n * - `undefined` entries in `config` keep the default instead of overwriting it.\n * - When both the default and the supplied value are plain objects, they are\n * merged one level deep, so `new ColorBalance({ shadows: { cyanRed: 10 } })`\n * keeps the other two channels at their defaults.\n * - Object defaults are cloned per instance.\n * - Outside production, unknown props and out-of-range static values are\n * reported: a `console.warn` once per message, or a thrown `Error` when\n * `FRAMEFIELDS_STRICT_PROPS=1`. Unknown props are still passed through.\n */\nexport function withDefaults<T extends object>(\n\top: string,\n\tdefaults: Readonly<Partial<T>>,\n\tconfig: T,\n\tmeta: EffectMeta,\n): T {\n\tconst supplied = config as Record<string, unknown>;\n\tif (checksEnabled()) checkProps(op, supplied, meta);\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(defaults)) {\n\t\tresult[key] = cloneDefault(value);\n\t}\n\tfor (const [key, value] of Object.entries(supplied)) {\n\t\tif (value === undefined) continue;\n\t\tconst base = result[key];\n\t\tresult[key] =\n\t\t\tisPlainObject(base) && isPlainObject(value)\n\t\t\t\t? {\n\t\t\t\t\t\t...base,\n\t\t\t\t\t\t...Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t}\n\t\t\t\t: value;\n\t}\n\treturn result as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport type { EffectMeta } from \"../with-defaults.js\";\n\n/** Ranges and allowed values per effect prop, used by `withDefaults()` checks. */\nexport const effectMeta = {\n\tAudioCompressor: {\n\t\tthreshold: {\n\t\t\tmin: -60,\n\t\t\tmax: 0,\n\t\t},\n\t\tratio: {\n\t\t\tmin: 1,\n\t\t\tmax: 100,\n\t\t},\n\t\tattack: {\n\t\t\tmin: 0.0001,\n\t\t\tmax: 1,\n\t\t},\n\t\trelease: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 5,\n\t\t},\n\t\tknee: {\n\t\t\tmin: 0,\n\t\t\tmax: 24,\n\t\t},\n\t\tmakeupGain: {\n\t\t\tmin: 0,\n\t\t\tmax: 24,\n\t\t},\n\t},\n\tAudioDelay: {\n\t\tdelayTime: {\n\t\t\tmin: 0.001,\n\t\t\tmax: 5,\n\t\t},\n\t\tfeedback: {\n\t\t\tmin: 0,\n\t\t\tmax: 0.95,\n\t\t},\n\t\twet: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tdry: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tpingPong: {},\n\t},\n\tAudioFade: {\n\t\tfadeInDuration: {\n\t\t\tmin: 0,\n\t\t\tmax: 60,\n\t\t},\n\t\tfadeOutDuration: {\n\t\t\tmin: 0,\n\t\t\tmax: 60,\n\t\t},\n\t\tfadeInCurve: {\n\t\t\tenum: [\"linear\", \"exponential\", \"scurve\"],\n\t\t},\n\t\tfadeOutCurve: {\n\t\t\tenum: [\"linear\", \"exponential\", \"scurve\"],\n\t\t},\n\t},\n\tAudioNoiseGate: {\n\t\tthreshold: {\n\t\t\tmin: -120,\n\t\t\tmax: 0,\n\t\t},\n\t\tattack: {\n\t\t\tmin: 0.0001,\n\t\t\tmax: 1,\n\t\t},\n\t\thold: {\n\t\t\tmin: 0.001,\n\t\t\tmax: 5,\n\t\t},\n\t\trelease: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 5,\n\t\t},\n\t\trange: {\n\t\t\tmin: -120,\n\t\t\tmax: 0,\n\t\t},\n\t},\n\tAudioParametricEq: {\n\t\ttype: {\n\t\t\tenum: [\"lowShelf\", \"highShelf\", \"peak\", \"lowPass\", \"highPass\", \"notch\"],\n\t\t},\n\t\tfrequency: {\n\t\t\tmin: 20,\n\t\t\tmax: 20000,\n\t\t},\n\t\tgain: {\n\t\t\tmin: -24,\n\t\t\tmax: 24,\n\t\t},\n\t\tq: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 10,\n\t\t},\n\t},\n\tAudioReverb: {\n\t\troomSize: {\n\t\t\tmin: 0,\n\t\t\tmax: 0.98,\n\t\t},\n\t\tdamping: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\twet: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tdry: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\twidth: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t},\n\tBlur: {\n\t\tblurType: {\n\t\t\tenum: [\n\t\t\t\t\"Gaussian\",\n\t\t\t\t\"Box\",\n\t\t\t\t\"Median\",\n\t\t\t\t\"Motion\",\n\t\t\t\t\"Bilateral\",\n\t\t\t\t\"Edge-preserving\",\n\t\t\t\t\"Radial\",\n\t\t\t\t\"Zoom\",\n\t\t\t],\n\t\t},\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tangle: {\n\t\t\tmin: 0,\n\t\t\tmax: 360,\n\t\t},\n\t\tsigmaColor: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tpartialBlur: {},\n\t\tradius: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tradiusY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tshape: {\n\t\t\tenum: [\"ellipse\", \"circle\", \"rect\"],\n\t\t},\n\t},\n\tCameraParallax3D: {\n\t\tmotionPreset: {\n\t\t\tenum: [\n\t\t\t\t\"Custom\",\n\t\t\t\t\"DollyZoom\",\n\t\t\t\t\"Orbit\",\n\t\t\t\t\"FlyThrough\",\n\t\t\t\t\"HandheldShake\",\n\t\t\t\t\"RackFocus\",\n\t\t\t],\n\t\t},\n\t\tpanX: {\n\t\t\tmin: -1,\n\t\t\tmax: 1,\n\t\t},\n\t\tpanY: {\n\t\t\tmin: -1,\n\t\t\tmax: 1,\n\t\t},\n\t\tdollyZ: {\n\t\t\tmin: -1,\n\t\t\tmax: 1,\n\t\t},\n\t\tfov: {\n\t\t\tmin: 15,\n\t\t\tmax: 120,\n\t\t},\n\t\tparallaxAmount: {\n\t\t\tmin: 0,\n\t\t\tmax: 2,\n\t\t},\n\t\tdofAperture: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tfocusPlane: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tedgeDilation: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tdepthInvert: {},\n\t},\n\tChannelMerger: {\n\t\tcolorSpace: {\n\t\t\tenum: [\"RGBA\", \"HSLA\", \"CMYK\", \"LAB\"],\n\t\t},\n\t\tdefaultChannel4: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t},\n\tChannelSplitter: {\n\t\tcolorSpace: {\n\t\t\tenum: [\"RGBA\", \"HSLA\", \"CMYK\", \"LAB\"],\n\t\t},\n\t},\n\tColorBalance: {\n\t\tshadows: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmidtones: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\thighlights: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tpreserveLuminosity: {},\n\t},\n\tColorKey: {\n\t\tkeyColor: {},\n\t\tsimilarity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tsmoothness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tspillSuppression: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcolorSpace: {\n\t\t\tenum: [\"YUV\", \"RGB\"],\n\t\t},\n\t\tspillSuppressionType: {\n\t\t\tenum: [\"Desaturate\", \"Neutralize\", \"None\"],\n\t\t},\n\t},\n\tCornerPin: {\n\t\tpoints: {},\n\t},\n\tDisplacementMap: {\n\t\tstrengthX: {\n\t\t\tmin: 0,\n\t\t\tmax: 500,\n\t\t},\n\t\tstrengthY: {\n\t\t\tmin: 0,\n\t\t\tmax: 500,\n\t\t},\n\t\txChannel: {\n\t\t\tenum: [\"Red\", \"Green\", \"Blue\", \"Alpha\", \"Luminance\"],\n\t\t},\n\t\tyChannel: {\n\t\t\tenum: [\"Red\", \"Green\", \"Blue\", \"Alpha\", \"Luminance\"],\n\t\t},\n\t\twrapMode: {\n\t\t\tenum: [\"Clamp\", \"Repeat\", \"Mirror\"],\n\t\t},\n\t},\n\tExtractLUT: {\n\t\tstrategy: {\n\t\t\tenum: [\"deterministic\", \"statistical\"],\n\t\t},\n\t\tsamplePoints: {\n\t\t\tmin: 10,\n\t\t\tmax: 500,\n\t\t},\n\t},\n\tFlip: {\n\t\thorizontal: {},\n\t\tvertical: {},\n\t\tdiagonal: {},\n\t\tmode: {\n\t\t\tenum: [\n\t\t\t\t\"horizontal\",\n\t\t\t\t\"vertical\",\n\t\t\t\t\"both\",\n\t\t\t\t\"diagonal\",\n\t\t\t\t\"antiDiagonal\",\n\t\t\t\t\"custom\",\n\t\t\t],\n\t\t},\n\t\tsymmetry: {\n\t\t\tenum: [\n\t\t\t\t\"none\",\n\t\t\t\t\"leftToRight\",\n\t\t\t\t\"rightToLeft\",\n\t\t\t\t\"topToBottom\",\n\t\t\t\t\"bottomToTop\",\n\t\t\t\t\"quadrant\",\n\t\t\t],\n\t\t},\n\t},\n\tKenBurns: {\n\t\tkeyframes: {},\n\t\tmotionBlurSize: {\n\t\t\tmin: 0,\n\t\t\tmax: 10,\n\t\t},\n\t\tmovementStyle: {\n\t\t\tenum: [\"spline\", \"direct\"],\n\t\t},\n\t\taspectRatio: {\n\t\t\tenum: [\n\t\t\t\t\"input\",\n\t\t\t\t\"16:9\",\n\t\t\t\t\"9:16\",\n\t\t\t\t\"21:9\",\n\t\t\t\t\"9:21\",\n\t\t\t\t\"1:1\",\n\t\t\t\t\"4:3\",\n\t\t\t\t\"3:2\",\n\t\t\t\t\"2:3\",\n\t\t\t\t\"4:5\",\n\t\t\t\t\"5:4\",\n\t\t\t],\n\t\t},\n\t},\n\tLayerStyle: {\n\t\tdropShadow: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tangle: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 360,\n\t\t\t\t},\n\t\t\t\tdistance: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 500,\n\t\t\t\t},\n\t\t\t\tspread: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 250,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\tinnerShadow: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tangle: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 360,\n\t\t\t\t},\n\t\t\t\tdistance: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 500,\n\t\t\t\t},\n\t\t\t\tchoke: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 250,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\touterGlow: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 250,\n\t\t\t\t},\n\t\t\t\tspread: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\tinnerGlow: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 250,\n\t\t\t\t},\n\t\t\t\tspread: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\tstroke: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tposition: {\n\t\t\t\t\tenum: [\"inside\", \"center\", \"outside\"],\n\t\t\t\t},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\tbevelEmboss: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tstyle: {\n\t\t\t\t\tenum: [\"InnerBevel\", \"OuterBevel\", \"Emboss\", \"PillowEmboss\"],\n\t\t\t\t},\n\t\t\t\ttechnique: {\n\t\t\t\t\tenum: [\"Smooth\", \"ChiselHard\", \"ChiselSoft\"],\n\t\t\t\t},\n\t\t\t\tdepth: {\n\t\t\t\t\tmin: 1,\n\t\t\t\t\tmax: 1000,\n\t\t\t\t},\n\t\t\t\tdirection: {\n\t\t\t\t\tenum: [\"Up\", \"Down\"],\n\t\t\t\t},\n\t\t\t\tsize: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 250,\n\t\t\t\t},\n\t\t\t\tsoften: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 50,\n\t\t\t\t},\n\t\t\t\tangle: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 360,\n\t\t\t\t},\n\t\t\t\taltitude: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 90,\n\t\t\t\t},\n\t\t\t\thighlightColor: {},\n\t\t\t\thighlightOpacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tshadowColor: {},\n\t\t\t\tshadowOpacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcolorOverlay: {\n\t\t\tprops: {\n\t\t\t\tenabled: {},\n\t\t\t\tcolor: {},\n\t\t\t\topacity: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t},\n\t\t\t\tblendMode: {},\n\t\t\t},\n\t\t},\n\t\tdropShadowAngleHandleId: {},\n\t\tdropShadowDistanceHandleId: {},\n\t\tdropShadowSpreadHandleId: {},\n\t\tdropShadowSizeHandleId: {},\n\t\tdropShadowOpacityHandleId: {},\n\t\tinnerShadowAngleHandleId: {},\n\t\tinnerShadowDistanceHandleId: {},\n\t\tinnerShadowChokeHandleId: {},\n\t\tinnerShadowSizeHandleId: {},\n\t\tinnerShadowOpacityHandleId: {},\n\t\touterGlowSizeHandleId: {},\n\t\touterGlowSpreadHandleId: {},\n\t\touterGlowOpacityHandleId: {},\n\t\tinnerGlowSizeHandleId: {},\n\t\tinnerGlowSpreadHandleId: {},\n\t\tinnerGlowOpacityHandleId: {},\n\t\tstrokeSizeHandleId: {},\n\t\tstrokeOpacityHandleId: {},\n\t\tbevelEmbossDepthHandleId: {},\n\t\tbevelEmbossSizeHandleId: {},\n\t\tbevelEmbossSoftenHandleId: {},\n\t\tbevelEmbossAngleHandleId: {},\n\t\tbevelEmbossAltitudeHandleId: {},\n\t\tbevelEmbossHighlightOpacityHandleId: {},\n\t\tbevelEmbossShadowOpacityHandleId: {},\n\t\tcolorOverlayOpacityHandleId: {},\n\t},\n\tLiquify: {\n\t\toperations: {},\n\t},\n\tMaskMath: {\n\t\toperation: {\n\t\t\tenum: [\n\t\t\t\t\"Union\",\n\t\t\t\t\"Intersect\",\n\t\t\t\t\"Subtract\",\n\t\t\t\t\"Difference\",\n\t\t\t\t\"Invert\",\n\t\t\t\t\"Dilate\",\n\t\t\t\t\"Erode\",\n\t\t\t\t\"Choke\",\n\t\t\t\t\"Feather\",\n\t\t\t],\n\t\t},\n\t\tradius: {\n\t\t\tmin: 0,\n\t\t\tmax: 200,\n\t\t},\n\t\tthreshold: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tclampMin: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tclampMax: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tchannelA: {\n\t\t\tenum: [\"Alpha\", \"Luminance\", \"Red\", \"Green\", \"Blue\"],\n\t\t},\n\t\tchannelB: {\n\t\t\tenum: [\"Alpha\", \"Luminance\", \"Red\", \"Green\", \"Blue\"],\n\t\t},\n\t\tbinarize: {},\n\t\tinvertResult: {},\n\t\toutputFormat: {\n\t\t\tenum: [\"WhiteWithAlpha\", \"GrayscaleRGB\", \"AlphaOnly\", \"PassthroughRGB\"],\n\t\t},\n\t},\n\tMeshWarp: {\n\t\tcols: {\n\t\t\tmin: 2,\n\t\t\tmax: 12,\n\t\t},\n\t\trows: {\n\t\t\tmin: 2,\n\t\t\tmax: 12,\n\t\t},\n\t\tpoints: {},\n\t},\n\tNoiseGenerator: {\n\t\tnoiseType: {\n\t\t\tenum: [\"Perlin\", \"Simplex\", \"Voronoi\"],\n\t\t},\n\t\toutputType: {\n\t\t\tenum: [\"Image\", \"Video\"],\n\t\t},\n\t\twidth: {\n\t\t\tmin: 16,\n\t\t\tmax: 4096,\n\t\t},\n\t\theight: {\n\t\t\tmin: 16,\n\t\t\tmax: 4096,\n\t\t},\n\t\tscale: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 100,\n\t\t},\n\t\toctaves: {\n\t\t\tmin: 1,\n\t\t\tmax: 8,\n\t\t},\n\t\tpersistence: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tlacunarity: {\n\t\t\tmin: 1,\n\t\t\tmax: 4,\n\t\t},\n\t\tspeed: {\n\t\t\tmin: 0,\n\t\t\tmax: 10,\n\t\t},\n\t\tcolorStart: {},\n\t\tcolorEnd: {},\n\t\tdurationMs: {\n\t\t\tmin: 1,\n\t\t\tmax: 60000,\n\t\t},\n\t\tfps: {\n\t\t\tmin: 1,\n\t\t\tmax: 120,\n\t\t},\n\t},\n\tPaint: {\n\t\twidth: {\n\t\t\tmin: 1,\n\t\t\tmax: 16384,\n\t\t},\n\t\theight: {\n\t\t\tmin: 1,\n\t\t\tmax: 16384,\n\t\t},\n\t\tmaintainAspect: {},\n\t\taspectRatio: {},\n\t\tbackgroundColor: {},\n\t\tstrokes: {},\n\t},\n\tPatchHeal: {\n\t\tpatches: {},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\toffsetX: {\n\t\t\tmin: -4096,\n\t\t\tmax: 4096,\n\t\t},\n\t\toffsetY: {\n\t\t\tmin: -4096,\n\t\t\tmax: 4096,\n\t\t},\n\t\tradius: {\n\t\t\tmin: 1,\n\t\t\tmax: 500,\n\t\t},\n\t\tsourceRadius: {\n\t\t\tmin: 1,\n\t\t\tmax: 500,\n\t\t},\n\t\tfeather: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\topacity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tmode: {\n\t\t\tenum: [\"Clone\", \"SeamlessHeal\", \"TextureTransfer\"],\n\t\t},\n\t},\n\tProceduralVFX: {\n\t\teffectType: {\n\t\t\tenum: [\n\t\t\t\t\"Smoke\",\n\t\t\t\t\"Fire\",\n\t\t\t\t\"Rain\",\n\t\t\t\t\"Sparks\",\n\t\t\t\t\"Snow\",\n\t\t\t\t\"Dust\",\n\t\t\t\t\"Lightning\",\n\t\t\t\t\"Magic\",\n\t\t\t\t\"LensFlare\",\n\t\t\t\t\"Embers\",\n\t\t\t\t\"EnergyBeam\",\n\t\t\t],\n\t\t},\n\t\toutputType: {\n\t\t\tenum: [\"Image\", \"Video\"],\n\t\t},\n\t\twidth: {\n\t\t\tmin: 16,\n\t\t\tmax: 4096,\n\t\t},\n\t\theight: {\n\t\t\tmin: 16,\n\t\t\tmax: 4096,\n\t\t},\n\t\tdensity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tscale: {\n\t\t\tmin: 0.001,\n\t\t\tmax: 10,\n\t\t},\n\t\tspeed: {\n\t\t\tmin: 0,\n\t\t\tmax: 10,\n\t\t},\n\t\tintensity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tseed: {\n\t\t\tmin: 0,\n\t\t\tmax: 1000000,\n\t\t},\n\t\tcolorStart: {},\n\t\tcolorEnd: {},\n\t\tdurationMs: {\n\t\t\tmin: 100,\n\t\t\tmax: 100000,\n\t\t},\n\t\tfps: {\n\t\t\tmin: 1,\n\t\t\tmax: 120,\n\t\t},\n\t},\n\tRefineEdge: {\n\t\tdecontaminateAmount: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tradius: {\n\t\t\tmin: 0.5,\n\t\t\tmax: 50,\n\t\t},\n\t\tsmooth: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tfeather: {\n\t\t\tmin: 0,\n\t\t\tmax: 50,\n\t\t},\n\t\tshiftEdge: {\n\t\t\tmin: -100,\n\t\t\tmax: 100,\n\t\t},\n\t\tmatteChannel: {\n\t\t\tenum: [\"Alpha\", \"Luminance\", \"Red\", \"Green\", \"Blue\"],\n\t\t},\n\t\toutputMode: {\n\t\t\tenum: [\"Composite\", \"MatteOnly\", \"DecontaminatedRGB\"],\n\t\t},\n\t},\n\tRefractionCaustics3D: {\n\t\tior: {\n\t\t\tmin: 1,\n\t\t\tmax: 2.5,\n\t\t},\n\t\tdispersion: {\n\t\t\tmin: 0,\n\t\t\tmax: 0.2,\n\t\t},\n\t\trefractionScale: {\n\t\t\tmin: 0,\n\t\t\tmax: 2,\n\t\t},\n\t\tcausticBrightness: {\n\t\t\tmin: 0,\n\t\t\tmax: 2,\n\t\t},\n\t\tcausticScale: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 5,\n\t\t},\n\t\tfluidRipples: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\trippleSpeed: {\n\t\t\tmin: 0,\n\t\t\tmax: 5,\n\t\t},\n\t\troughness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tspecularIntensity: {\n\t\t\tmin: 0,\n\t\t\tmax: 2,\n\t\t},\n\t\tlightPosX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tlightPosY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\ttintColor: {},\n\t\ttintStrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tdepthInvert: {},\n\t\tdepthScale: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 5,\n\t\t},\n\t},\n\tResizerScaler: {\n\t\taspectRatioPreset: {\n\t\t\tenum: [\"9:16\", \"16:9\", \"1:1\", \"4:5\", \"21:9\", \"custom\"],\n\t\t},\n\t\tresolutionPreset: {\n\t\t\tenum: [\"4k\", \"1080p\", \"720p\", \"480p\", \"custom\"],\n\t\t},\n\t\ttargetWidth: {\n\t\t\tmin: 1,\n\t\t\tmax: 8192,\n\t\t},\n\t\ttargetHeight: {\n\t\t\tmin: 1,\n\t\t\tmax: 8192,\n\t\t},\n\t\tfitMode: {\n\t\t\tenum: [\"cover\", \"contain\", \"stretch\", \"manual\"],\n\t\t},\n\t\tzoom: {\n\t\t\tmin: 1,\n\t\t\tmax: 1000,\n\t\t},\n\t\toffsetX: {\n\t\t\tmin: -8192,\n\t\t\tmax: 8192,\n\t\t},\n\t\toffsetY: {\n\t\t\tmin: -8192,\n\t\t\tmax: 8192,\n\t\t},\n\t\tbackgroundMode: {\n\t\t\tenum: [\"solid\", \"blurred\", \"gradient\", \"transparent\"],\n\t\t},\n\t\tbackgroundColor: {},\n\t\tbackgroundColor2: {},\n\t\tblurRadius: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tbackgroundBrightness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tanchorX: {\n\t\t\tenum: [\"left\", \"center\", \"right\"],\n\t\t},\n\t\tanchorY: {\n\t\t\tenum: [\"top\", \"center\", \"bottom\"],\n\t\t},\n\t},\n\tStereoPanning: {\n\t\tpan: {\n\t\t\tmin: -1,\n\t\t\tmax: 1,\n\t\t},\n\t},\n\tVignette: {\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tradius: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 2,\n\t\t},\n\t\tsoftness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\troundness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t},\n} as const satisfies Record<string, EffectMeta>;\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Effect } from \"@framefields/core\";\nimport type { EffectProp } from \"../types.js\";\nimport { withDefaults } from \"../with-defaults.js\";\nimport { effectMeta } from \"./meta.js\";\n\nexport interface CornerPinPointsItem {\n\t/** Range 0 to 100. */\n\tx: number;\n\t/** Range 0 to 100. */\n\ty: number;\n}\n\nexport interface KenBurnsKeyframesItem {\n\tid?: string;\n\t/** Range 0 to 20000. */\n\tdurationMs: number;\n\t/**\n\t * Range 0 to 20000.\n\t * @default 1000\n\t */\n\tholdMs: number;\n\t/** Range 1 to 20. */\n\tscale: number;\n\t/** Range 0 to 100. */\n\tx: number;\n\t/** Range 0 to 100. */\n\ty: number;\n\t/**\n\t * @default \"ease-in-out\"\n\t */\n\teasing: \"linear\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\" | \"spring\";\n}\n\nexport interface LayerStyleBevelEmboss {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"InnerBevel\"\n\t */\n\tstyle: \"InnerBevel\" | \"OuterBevel\" | \"Emboss\" | \"PillowEmboss\";\n\t/**\n\t * @default \"Smooth\"\n\t */\n\ttechnique: \"Smooth\" | \"ChiselHard\" | \"ChiselSoft\";\n\t/**\n\t * Range 1 to 1000.\n\t * @default 100\n\t */\n\tdepth: number;\n\t/**\n\t * @default \"Up\"\n\t */\n\tdirection: \"Up\" | \"Down\";\n\t/**\n\t * Range 0 to 250.\n\t * @default 5\n\t */\n\tsize: number;\n\t/**\n\t * Range 0 to 50.\n\t * @default 0\n\t */\n\tsoften: number;\n\t/**\n\t * Range 0 to 360.\n\t * @default 120\n\t */\n\tangle: number;\n\t/**\n\t * Range 0 to 90.\n\t * @default 30\n\t */\n\taltitude: number;\n\t/**\n\t * @default \"#ffffff\"\n\t */\n\thighlightColor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\thighlightOpacity: number;\n\t/**\n\t * @default \"#000000\"\n\t */\n\tshadowColor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\tshadowOpacity: number;\n}\n\nexport interface LayerStyleColorOverlay {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"#ff0000\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 1\n\t */\n\topacity: number;\n\t/**\n\t * @default \"normal\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LayerStyleDropShadow {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"#000000\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\topacity: number;\n\t/**\n\t * Range 0 to 360.\n\t * @default 120\n\t */\n\tangle: number;\n\t/**\n\t * Range 0 to 500.\n\t * @default 10\n\t */\n\tdistance: number;\n\t/**\n\t * Range 0 to 100.\n\t * @default 0\n\t */\n\tspread: number;\n\t/**\n\t * Range 0 to 250.\n\t * @default 10\n\t */\n\tsize: number;\n\t/**\n\t * @default \"multiply\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LayerStyleInnerGlow {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"#ffffff\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\topacity: number;\n\t/**\n\t * Range 0 to 250.\n\t * @default 15\n\t */\n\tsize: number;\n\t/**\n\t * Range 0 to 100.\n\t * @default 0\n\t */\n\tspread: number;\n\t/**\n\t * @default \"screen\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LayerStyleInnerShadow {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"#000000\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\topacity: number;\n\t/**\n\t * Range 0 to 360.\n\t * @default 120\n\t */\n\tangle: number;\n\t/**\n\t * Range 0 to 500.\n\t * @default 5\n\t */\n\tdistance: number;\n\t/**\n\t * Range 0 to 100.\n\t * @default 0\n\t */\n\tchoke: number;\n\t/**\n\t * Range 0 to 250.\n\t * @default 5\n\t */\n\tsize: number;\n\t/**\n\t * @default \"multiply\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LayerStyleOuterGlow {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * @default \"#ffffff\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.75\n\t */\n\topacity: number;\n\t/**\n\t * Range 0 to 250.\n\t * @default 15\n\t */\n\tsize: number;\n\t/**\n\t * Range 0 to 100.\n\t * @default 0\n\t */\n\tspread: number;\n\t/**\n\t * @default \"screen\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LayerStyleStroke {\n\t/**\n\t * @default false\n\t */\n\tenabled: boolean;\n\t/**\n\t * Range 0 to 100.\n\t * @default 2\n\t */\n\tsize: number;\n\t/**\n\t * @default \"outside\"\n\t */\n\tposition: \"inside\" | \"center\" | \"outside\";\n\t/**\n\t * @default \"#ffffff\"\n\t */\n\tcolor: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 1\n\t */\n\topacity: number;\n\t/**\n\t * @default \"normal\"\n\t */\n\tblendMode: string;\n}\n\nexport interface LiquifyOperationsItem {\n\t/**\n\t * @default \"Bloat\"\n\t */\n\ttype: \"Push\" | \"Pull\" | \"Bloat\" | \"Pucker\" | \"TwirlCW\" | \"TwirlCCW\";\n\t/** Range 0 to 1. */\n\tx: number;\n\t/** Range 0 to 1. */\n\ty: number;\n\t/**\n\t * Range 0.01 to 1.\n\t * @default 0.15\n\t */\n\tradius: number;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.5\n\t */\n\tstrength: number;\n\t/**\n\t * Range -1 to 1.\n\t * @default 0\n\t */\n\tdx: number;\n\t/**\n\t * Range -1 to 1.\n\t * @default 0\n\t */\n\tdy: number;\n}\n\nexport interface MeshWarpPointsItem {\n\t/** Range 0 to 100. */\n\tx: number;\n\t/** Range 0 to 100. */\n\ty: number;\n}\n\nexport interface PaintStrokesItemOption1 {\n\t/**\n\t * @default \"brush\"\n\t */\n\tid: string;\n\ttool: \"brush\";\n\tpath: string;\n\tcolor: string;\n\tsize: number;\n\t/**\n\t * Range 0 to 1.\n\t * @default 1\n\t */\n\topacity: number;\n}\n\nexport interface PaintStrokesItemOption2 {\n\t/**\n\t * @default \"eraser\"\n\t */\n\tid: string;\n\ttool: \"eraser\";\n\tpath: string;\n\tsize: number;\n}\n\nexport interface PaintStrokesItemOption3 {\n\t/**\n\t * @default \"fill\"\n\t */\n\tid: string;\n\ttool: \"fill\";\n\timageData: string;\n\t/** Maximum 16384. */\n\twidth: number;\n\t/** Maximum 16384. */\n\theight: number;\n}\n\nexport interface PatchHealPatchesItem {\n\t/**\n\t * @default \"patch\"\n\t */\n\tid: string;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.5\n\t */\n\tcenterX: number;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.5\n\t */\n\tcenterY: number;\n\t/**\n\t * Range -4096 to 4096.\n\t * @default 50\n\t */\n\toffsetX: number;\n\t/**\n\t * Range -4096 to 4096.\n\t * @default 0\n\t */\n\toffsetY: number;\n\t/**\n\t * Range 1 to 500.\n\t * @default 25\n\t */\n\tradius: number;\n\t/**\n\t * Range 1 to 500.\n\t * @default 25\n\t */\n\tsourceRadius: number;\n\t/**\n\t * Range 0 to 100.\n\t * @default 50\n\t */\n\tfeather: number;\n\t/**\n\t * Range 0 to 1.\n\t * @default 1\n\t */\n\topacity: number;\n\t/**\n\t * @default \"SeamlessHeal\"\n\t */\n\tmode: \"Clone\" | \"SeamlessHeal\" | \"TextureTransfer\";\n}\n\nexport interface TonalShift {\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tcyanRed: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tmagentaGreen: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tyellowBlue: number;\n}\n\nexport interface AudioCompressorProps {\n\t/**\n\t * Level (dBFS) above which gain reduction begins (-60 to 0 dB). Can be modulated by a static number or dynamic signal.\n\t * Range -60 to 0. Accepts a signal.\n\t * @default -24\n\t */\n\tthreshold?: EffectProp<number>;\n\t/**\n\t * Input-to-output ratio above threshold (1 to 100). Can be modulated by a static number or dynamic signal.\n\t * Range 1 to 100. Accepts a signal.\n\t * @default 4\n\t */\n\tratio?: EffectProp<number>;\n\t/**\n\t * Seconds to reach full gain reduction (0.0001 to 1.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.0001 to 1. Accepts a signal.\n\t * @default 0.003\n\t */\n\tattack?: EffectProp<number>;\n\t/**\n\t * Seconds to recover gain after signal drops (0.01 to 5.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.01 to 5. Accepts a signal.\n\t * @default 0.25\n\t */\n\trelease?: EffectProp<number>;\n\t/**\n\t * dB range for soft-knee transition around threshold (0 to 24 dB). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 24. Accepts a signal.\n\t * @default 6\n\t */\n\tknee?: EffectProp<number>;\n\t/**\n\t * dBFS of gain applied after compression (0 to 24 dB). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 24. Accepts a signal.\n\t * @default 0\n\t */\n\tmakeupGain?: EffectProp<number>;\n}\n\nconst audioCompressorDefaults: AudioCompressorProps = {\n\tthreshold: -24,\n\tratio: 4,\n\tattack: 0.003,\n\trelease: 0.25,\n\tknee: 6,\n\tmakeupGain: 0,\n};\n\nexport class AudioCompressor extends Effect<AudioCompressorProps> {\n\tpublic readonly op = \"AudioCompressor\";\n\n\tpublic declare threshold: number;\n\tpublic declare ratio: number;\n\tpublic declare attack: number;\n\tpublic declare release: number;\n\tpublic declare knee: number;\n\tpublic declare makeupGain: number;\n\n\tconstructor(config: AudioCompressorProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioCompressor\",\n\t\t\t\taudioCompressorDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioCompressor,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface AudioDelayProps {\n\t/**\n\t * Delay time in seconds (0.001 to 5.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.001 to 5. Accepts a signal.\n\t * @default 0.25\n\t */\n\tdelayTime?: EffectProp<number>;\n\t/**\n\t * Amount of delayed signal fed back into delay line (0.0 to 0.95). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 0.95. Accepts a signal.\n\t * @default 0.4\n\t */\n\tfeedback?: EffectProp<number>;\n\t/**\n\t * Mix level of the wet delayed signal (0.0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\twet?: EffectProp<number>;\n\t/**\n\t * Mix level of the original dry signal (0.0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\tdry?: EffectProp<number>;\n\t/**\n\t * Alternates echo reflections between left and right channels\n\t * @default false\n\t */\n\tpingPong?: boolean;\n}\n\nconst audioDelayDefaults: AudioDelayProps = {\n\tdelayTime: 0.25,\n\tfeedback: 0.4,\n\twet: 0.3,\n\tdry: 1,\n\tpingPong: false,\n};\n\nexport class AudioDelay extends Effect<AudioDelayProps> {\n\tpublic readonly op = \"AudioDelay\";\n\n\tpublic declare delayTime: number;\n\tpublic declare feedback: number;\n\tpublic declare wet: number;\n\tpublic declare dry: number;\n\tpublic declare pingPong: boolean;\n\n\tconstructor(config: AudioDelayProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioDelay\",\n\t\t\t\taudioDelayDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioDelay,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface AudioFadeProps {\n\t/**\n\t * Duration in seconds of fade in from silence (0 to 60s). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 60. Accepts a signal.\n\t * @default 0\n\t */\n\tfadeInDuration?: EffectProp<number>;\n\t/**\n\t * Duration in seconds of fade out to silence (0 to 60s). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 60. Accepts a signal.\n\t * @default 0\n\t */\n\tfadeOutDuration?: EffectProp<number>;\n\t/**\n\t * Envelope shape for fade in\n\t * @default \"linear\"\n\t */\n\tfadeInCurve?: \"linear\" | \"exponential\" | \"scurve\";\n\t/**\n\t * Envelope shape for fade out\n\t * @default \"linear\"\n\t */\n\tfadeOutCurve?: \"linear\" | \"exponential\" | \"scurve\";\n}\n\nconst audioFadeDefaults: AudioFadeProps = {\n\tfadeInDuration: 0,\n\tfadeOutDuration: 0,\n\tfadeInCurve: \"linear\",\n\tfadeOutCurve: \"linear\",\n};\n\nexport class AudioFade extends Effect<AudioFadeProps> {\n\tpublic readonly op = \"AudioFade\";\n\n\tpublic declare fadeInDuration: number;\n\tpublic declare fadeOutDuration: number;\n\tpublic declare fadeInCurve: \"linear\" | \"exponential\" | \"scurve\";\n\tpublic declare fadeOutCurve: \"linear\" | \"exponential\" | \"scurve\";\n\n\tconstructor(config: AudioFadeProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioFade\",\n\t\t\t\taudioFadeDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioFade,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface AudioNoiseGateProps {\n\t/**\n\t * dBFS level below which the gate closes (-120 to 0 dB). Can be modulated by a static number or dynamic signal.\n\t * Range -120 to 0. Accepts a signal.\n\t * @default -40\n\t */\n\tthreshold?: EffectProp<number>;\n\t/**\n\t * Seconds to open (fade in) when signal exceeds threshold (0.0001 to 1.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.0001 to 1. Accepts a signal.\n\t * @default 0.005\n\t */\n\tattack?: EffectProp<number>;\n\t/**\n\t * Seconds to stay open after signal drops below threshold (0.001 to 5.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.001 to 5. Accepts a signal.\n\t * @default 0.05\n\t */\n\thold?: EffectProp<number>;\n\t/**\n\t * Seconds to close (fade out) after hold expires (0.01 to 5.0s). Can be modulated by a static number or dynamic signal.\n\t * Range 0.01 to 5. Accepts a signal.\n\t * @default 0.1\n\t */\n\trelease?: EffectProp<number>;\n\t/**\n\t * dBFS floor when gate is closed (-120 to 0 dB). Can be modulated by a static number or dynamic signal.\n\t * Range -120 to 0. Accepts a signal.\n\t * @default -80\n\t */\n\trange?: EffectProp<number>;\n}\n\nconst audioNoiseGateDefaults: AudioNoiseGateProps = {\n\tthreshold: -40,\n\tattack: 0.005,\n\thold: 0.05,\n\trelease: 0.1,\n\trange: -80,\n};\n\nexport class AudioNoiseGate extends Effect<AudioNoiseGateProps> {\n\tpublic readonly op = \"AudioNoiseGate\";\n\n\tpublic declare threshold: number;\n\tpublic declare attack: number;\n\tpublic declare hold: number;\n\tpublic declare release: number;\n\tpublic declare range: number;\n\n\tconstructor(config: AudioNoiseGateProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioNoiseGate\",\n\t\t\t\taudioNoiseGateDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioNoiseGate,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface AudioParametricEqProps {\n\t/**\n\t * Type of biquad filter\n\t * @default \"peak\"\n\t */\n\ttype?: \"lowShelf\" | \"highShelf\" | \"peak\" | \"lowPass\" | \"highPass\" | \"notch\";\n\t/**\n\t * Cutoff or center frequency in Hz (20 to 20000 Hz). Can be modulated by a static number or dynamic signal.\n\t * Range 20 to 20000. Accepts a signal.\n\t * @default 1000\n\t */\n\tfrequency?: EffectProp<number>;\n\t/**\n\t * Gain boost or cut in dB (-24 to 24 dB). Can be modulated by a static number or dynamic signal.\n\t * Range -24 to 24. Accepts a signal.\n\t * @default 0\n\t */\n\tgain?: EffectProp<number>;\n\t/**\n\t * Filter bandwidth / Q factor (0.01 to 10.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0.01 to 10. Accepts a signal.\n\t * @default 1\n\t */\n\tq?: EffectProp<number>;\n}\n\nconst audioParametricEqDefaults: AudioParametricEqProps = {\n\ttype: \"peak\",\n\tfrequency: 1000,\n\tgain: 0,\n\tq: 1,\n};\n\nexport class AudioParametricEq extends Effect<AudioParametricEqProps> {\n\tpublic readonly op = \"AudioParametricEq\";\n\n\tpublic declare type:\n\t\t| \"lowShelf\"\n\t\t| \"highShelf\"\n\t\t| \"peak\"\n\t\t| \"lowPass\"\n\t\t| \"highPass\"\n\t\t| \"notch\";\n\tpublic declare frequency: number;\n\tpublic declare gain: number;\n\tpublic declare q: number;\n\n\tconstructor(config: AudioParametricEqProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioParametricEq\",\n\t\t\t\taudioParametricEqDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioParametricEq,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface AudioReverbProps {\n\t/**\n\t * Room decay, size of simulated space (0 to 0.98). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 0.98. Accepts a signal.\n\t * @default 0.5\n\t */\n\troomSize?: EffectProp<number>;\n\t/**\n\t * High-frequency absorption (0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tdamping?: EffectProp<number>;\n\t/**\n\t * Mix level of the wet reverberated signal (0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\twet?: EffectProp<number>;\n\t/**\n\t * Mix level of the original dry signal (0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\tdry?: EffectProp<number>;\n\t/**\n\t * Stereo spread of the reverb tail (0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\twidth?: EffectProp<number>;\n}\n\nconst audioReverbDefaults: AudioReverbProps = {\n\troomSize: 0.5,\n\tdamping: 0.5,\n\twet: 0.3,\n\tdry: 1,\n\twidth: 1,\n};\n\nexport class AudioReverb extends Effect<AudioReverbProps> {\n\tpublic readonly op = \"AudioReverb\";\n\n\tpublic declare roomSize: number;\n\tpublic declare damping: number;\n\tpublic declare wet: number;\n\tpublic declare dry: number;\n\tpublic declare width: number;\n\n\tconstructor(config: AudioReverbProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"AudioReverb\",\n\t\t\t\taudioReverbDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.AudioReverb,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface BlurBaseProps {\n\t/**\n\t * Blur Type\n\t * @default \"Gaussian\"\n\t */\n\tblurType?:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\t/**\n\t * The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 5\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * Direction of a Motion blur, in degrees.\n\t * Range 0 to 360. Accepts a signal.\n\t * @default 0\n\t */\n\tangle?: EffectProp<number>;\n\t/**\n\t * Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsigmaColor?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n\t/**\n\t * Blurs only a specific circular area around center point.\n\t * Accepts a signal.\n\t * @default false\n\t */\n\tpartialBlur?: EffectProp<boolean>;\n\t/**\n\t * Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tradiusY?: EffectProp<number>;\n\t/**\n\t * Shape of the partial blur region.\n\t * @default \"circle\"\n\t */\n\tshape?: \"ellipse\" | \"circle\" | \"rect\";\n}\n\nconst blurDefaults: BlurBaseProps = {\n\tblurType: \"Gaussian\",\n\tstrength: 5,\n\tangle: 0,\n\tsigmaColor: 0.1,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n\tpartialBlur: false,\n\tradius: 0.3,\n\tradiusY: 0,\n\tshape: \"circle\",\n};\n\n/** @internal Extended by `effects/custom/blur.ts`, which exports `Blur`. */\nexport class BlurBase extends Effect<BlurBaseProps> {\n\tpublic readonly op = \"Blur\";\n\n\tpublic declare blurType:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\tpublic declare strength: number;\n\tpublic declare angle: number;\n\tpublic declare sigmaColor: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\tpublic declare partialBlur: boolean;\n\tpublic declare radius: number;\n\tpublic declare radiusY: number;\n\tpublic declare shape: \"ellipse\" | \"circle\" | \"rect\";\n\n\tconstructor(config: BlurBaseProps = {}) {\n\t\tsuper(withDefaults(\"Blur\", blurDefaults, config, effectMeta.Blur));\n\t}\n}\n\nexport interface CameraParallax3DProps {\n\t/**\n\t * Motion Preset\n\t * @default \"DollyZoom\"\n\t */\n\tmotionPreset?:\n\t\t| \"Custom\"\n\t\t| \"DollyZoom\"\n\t\t| \"Orbit\"\n\t\t| \"FlyThrough\"\n\t\t| \"HandheldShake\"\n\t\t| \"RackFocus\";\n\t/**\n\t * Horizontal camera pan angle / position offset (-1.0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range -1 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tpanX?: EffectProp<number>;\n\t/**\n\t * Vertical camera tilt angle / position offset (-1.0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range -1 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tpanY?: EffectProp<number>;\n\t/**\n\t * Camera forward/backward zoom position (-1.0 to 1.0). Can be modulated by a static number or dynamic signal.\n\t * Range -1 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tdollyZ?: EffectProp<number>;\n\t/**\n\t * Camera Field of View in degrees (15° to 120°). Can be modulated by a static number or dynamic signal.\n\t * Range 15 to 120. Accepts a signal.\n\t * @default 50\n\t */\n\tfov?: EffectProp<number>;\n\t/**\n\t * Strength of 3D spatial displacement depth relief. Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 2. Accepts a signal.\n\t * @default 0.6\n\t */\n\tparallaxAmount?: EffectProp<number>;\n\t/**\n\t * Lens aperture size / Circle of Confusion bokeh blur radius. Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\tdofAperture?: EffectProp<number>;\n\t/**\n\t * Focal plane depth in scene (0.0=foreground, 1.0=background). Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.4\n\t */\n\tfocusPlane?: EffectProp<number>;\n\t/**\n\t * Inpainting border bleed to eliminate border occlusion tearing.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tedgeDilation?: EffectProp<number>;\n\t/**\n\t * Invert depth polarity (white = near vs black = near).\n\t * @default false\n\t */\n\tdepthInvert?: boolean;\n}\n\nconst cameraParallax3DDefaults: CameraParallax3DProps = {\n\tmotionPreset: \"DollyZoom\",\n\tpanX: 0,\n\tpanY: 0,\n\tdollyZ: 0,\n\tfov: 50,\n\tparallaxAmount: 0.6,\n\tdofAperture: 0.3,\n\tfocusPlane: 0.4,\n\tedgeDilation: 0.5,\n\tdepthInvert: false,\n};\n\nexport class CameraParallax3D extends Effect<CameraParallax3DProps> {\n\tpublic readonly op = \"CameraParallax3D\";\n\n\tpublic declare motionPreset:\n\t\t| \"Custom\"\n\t\t| \"DollyZoom\"\n\t\t| \"Orbit\"\n\t\t| \"FlyThrough\"\n\t\t| \"HandheldShake\"\n\t\t| \"RackFocus\";\n\tpublic declare panX: number;\n\tpublic declare panY: number;\n\tpublic declare dollyZ: number;\n\tpublic declare fov: number;\n\tpublic declare parallaxAmount: number;\n\tpublic declare dofAperture: number;\n\tpublic declare focusPlane: number;\n\tpublic declare edgeDilation: number;\n\tpublic declare depthInvert: boolean;\n\n\tconstructor(config: CameraParallax3DProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"CameraParallax3D\",\n\t\t\t\tcameraParallax3DDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.CameraParallax3D,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ChannelMergerProps {\n\t/**\n\t * Color space used for channel recombination (RGBA, HSLA, CMYK, or LAB).\n\t * @default \"RGBA\"\n\t */\n\tcolorSpace?: \"RGBA\" | \"HSLA\" | \"CMYK\" | \"LAB\";\n\t/**\n\t * Fallback value used when Channel 4 is unconnected (Alpha=1.0, Black=0.0 in CMYK).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\tdefaultChannel4?: EffectProp<number>;\n}\n\nconst channelMergerDefaults: ChannelMergerProps = {\n\tcolorSpace: \"RGBA\",\n\tdefaultChannel4: 1,\n};\n\nexport class ChannelMerger extends Effect<ChannelMergerProps> {\n\tpublic readonly op = \"ChannelMerger\";\n\n\tpublic declare colorSpace: \"RGBA\" | \"HSLA\" | \"CMYK\" | \"LAB\";\n\tpublic declare defaultChannel4: number;\n\n\tconstructor(config: ChannelMergerProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ChannelMerger\",\n\t\t\t\tchannelMergerDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ChannelMerger,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ChannelSplitterProps {\n\t/**\n\t * Color space used for channel decomposition (RGBA, HSLA, CMYK, or LAB).\n\t * @default \"RGBA\"\n\t */\n\tcolorSpace?: \"RGBA\" | \"HSLA\" | \"CMYK\" | \"LAB\";\n}\n\nconst channelSplitterDefaults: ChannelSplitterProps = {\n\tcolorSpace: \"RGBA\",\n};\n\nexport class ChannelSplitter extends Effect<ChannelSplitterProps> {\n\tpublic readonly op = \"ChannelSplitter\";\n\n\tpublic declare colorSpace: \"RGBA\" | \"HSLA\" | \"CMYK\" | \"LAB\";\n\n\tconstructor(config: ChannelSplitterProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ChannelSplitter\",\n\t\t\t\tchannelSplitterDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ChannelSplitter,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ColorBalanceProps {\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tshadows?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tmidtones?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\thighlights?: Partial<TonalShift>;\n\t/**\n\t * @default true\n\t */\n\tpreserveLuminosity?: boolean;\n}\n\nconst colorBalanceDefaults: ColorBalanceProps = {\n\tshadows: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tmidtones: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\thighlights: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tpreserveLuminosity: true,\n};\n\nexport class ColorBalance extends Effect<ColorBalanceProps> {\n\tpublic readonly op = \"ColorBalance\";\n\n\tpublic declare shadows: Partial<TonalShift>;\n\tpublic declare midtones: Partial<TonalShift>;\n\tpublic declare highlights: Partial<TonalShift>;\n\tpublic declare preserveLuminosity: boolean;\n\n\tconstructor(config: ColorBalanceProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ColorBalance\",\n\t\t\t\tcolorBalanceDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ColorBalance,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ColorKeyProps {\n\t/**\n\t * Key Color\n\t * @default \"#00ff00\"\n\t */\n\tkeyColor?: string;\n\t/**\n\t * How close the color must be to the Key Color to be removed.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.4\n\t */\n\tsimilarity?: EffectProp<number>;\n\t/**\n\t * The softness of the transparency edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsmoothness?: EffectProp<number>;\n\t/**\n\t * Amount of key color spill to remove from foreground edges.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.2\n\t */\n\tspillSuppression?: EffectProp<number>;\n\t/**\n\t * Color space used to calculate similarity distance.\n\t * @default \"YUV\"\n\t */\n\tcolorSpace?: \"YUV\" | \"RGB\";\n\t/**\n\t * How key color spill is suppressed on foreground edges.\n\t * @default \"Desaturate\"\n\t */\n\tspillSuppressionType?: \"Desaturate\" | \"Neutralize\" | \"None\";\n}\n\nconst colorKeyDefaults: ColorKeyProps = {\n\tkeyColor: \"#00ff00\",\n\tsimilarity: 0.4,\n\tsmoothness: 0.1,\n\tspillSuppression: 0.2,\n\tcolorSpace: \"YUV\",\n\tspillSuppressionType: \"Desaturate\",\n};\n\nexport class ColorKey extends Effect<ColorKeyProps> {\n\tpublic readonly op = \"ColorKey\";\n\n\tpublic declare keyColor: string;\n\tpublic declare similarity: number;\n\tpublic declare smoothness: number;\n\tpublic declare spillSuppression: number;\n\tpublic declare colorSpace: \"YUV\" | \"RGB\";\n\tpublic declare spillSuppressionType: \"Desaturate\" | \"Neutralize\" | \"None\";\n\n\tconstructor(config: ColorKeyProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"ColorKey\", colorKeyDefaults, config, effectMeta.ColorKey),\n\t\t);\n\t}\n}\n\nexport interface CornerPinProps {\n\tpoints?: CornerPinPointsItem[];\n}\n\nconst cornerPinDefaults: CornerPinProps = {};\n\nexport class CornerPin extends Effect<CornerPinProps> {\n\tpublic readonly op = \"CornerPin\";\n\n\tpublic declare points: CornerPinPointsItem[] | undefined;\n\n\tconstructor(config: CornerPinProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"CornerPin\",\n\t\t\t\tcornerPinDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.CornerPin,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface DisplacementMapProps {\n\t/**\n\t * Horizontal displacement strength in pixels. Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 500. Accepts a signal.\n\t * @default 50\n\t */\n\tstrengthX?: EffectProp<number>;\n\t/**\n\t * Vertical displacement strength in pixels. Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 500. Accepts a signal.\n\t * @default 50\n\t */\n\tstrengthY?: EffectProp<number>;\n\t/**\n\t * X Channel\n\t * @default \"Red\"\n\t */\n\txChannel?: \"Red\" | \"Green\" | \"Blue\" | \"Alpha\" | \"Luminance\";\n\t/**\n\t * Y Channel\n\t * @default \"Green\"\n\t */\n\tyChannel?: \"Red\" | \"Green\" | \"Blue\" | \"Alpha\" | \"Luminance\";\n\t/**\n\t * Wrap Mode\n\t * @default \"Clamp\"\n\t */\n\twrapMode?: \"Clamp\" | \"Repeat\" | \"Mirror\";\n}\n\nconst displacementMapDefaults: DisplacementMapProps = {\n\tstrengthX: 50,\n\tstrengthY: 50,\n\txChannel: \"Red\",\n\tyChannel: \"Green\",\n\twrapMode: \"Clamp\",\n};\n\nexport class DisplacementMap extends Effect<DisplacementMapProps> {\n\tpublic readonly op = \"DisplacementMap\";\n\n\tpublic declare strengthX: number;\n\tpublic declare strengthY: number;\n\tpublic declare xChannel: \"Red\" | \"Green\" | \"Blue\" | \"Alpha\" | \"Luminance\";\n\tpublic declare yChannel: \"Red\" | \"Green\" | \"Blue\" | \"Alpha\" | \"Luminance\";\n\tpublic declare wrapMode: \"Clamp\" | \"Repeat\" | \"Mirror\";\n\n\tconstructor(config: DisplacementMapProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"DisplacementMap\",\n\t\t\t\tdisplacementMapDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.DisplacementMap,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ExtractLUTProps {\n\t/**\n\t * Extraction Strategy\n\t * @default \"deterministic\"\n\t */\n\tstrategy?: \"deterministic\" | \"statistical\";\n\t/**\n\t * Sample Points\n\t * Range 10 to 500. Accepts a signal.\n\t * @default 150\n\t */\n\tsamplePoints?: EffectProp<number>;\n}\n\nconst extractLUTDefaults: ExtractLUTProps = {\n\tstrategy: \"deterministic\",\n\tsamplePoints: 150,\n};\n\nexport class ExtractLUT extends Effect<ExtractLUTProps> {\n\tpublic readonly op = \"ExtractLUT\";\n\n\tpublic declare strategy: \"deterministic\" | \"statistical\";\n\tpublic declare samplePoints: number;\n\n\tconstructor(config: ExtractLUTProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ExtractLUT\",\n\t\t\t\textractLUTDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ExtractLUT,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface FlipProps {\n\t/**\n\t * Mirror horizontally along the vertical center axis.\n\t * @default true\n\t */\n\thorizontal?: boolean;\n\t/**\n\t * Mirror vertically along the horizontal center axis.\n\t * @default false\n\t */\n\tvertical?: boolean;\n\t/**\n\t * Swap horizontal and vertical axes (diagonal transposition).\n\t * @default false\n\t */\n\tdiagonal?: boolean;\n\t/**\n\t * Quick preset mode for flipping or transposition.\n\t * @default \"horizontal\"\n\t */\n\tmode?:\n\t\t| \"horizontal\"\n\t\t| \"vertical\"\n\t\t| \"both\"\n\t\t| \"diagonal\"\n\t\t| \"antiDiagonal\"\n\t\t| \"custom\";\n\t/**\n\t * Split-mirror reflection and symmetry effects.\n\t * @default \"none\"\n\t */\n\tsymmetry?:\n\t\t| \"none\"\n\t\t| \"leftToRight\"\n\t\t| \"rightToLeft\"\n\t\t| \"topToBottom\"\n\t\t| \"bottomToTop\"\n\t\t| \"quadrant\";\n}\n\nconst flipDefaults: FlipProps = {\n\thorizontal: true,\n\tvertical: false,\n\tdiagonal: false,\n\tmode: \"horizontal\",\n\tsymmetry: \"none\",\n};\n\nexport class Flip extends Effect<FlipProps> {\n\tpublic readonly op = \"Flip\";\n\n\tpublic declare horizontal: boolean;\n\tpublic declare vertical: boolean;\n\tpublic declare diagonal: boolean;\n\tpublic declare mode:\n\t\t| \"horizontal\"\n\t\t| \"vertical\"\n\t\t| \"both\"\n\t\t| \"diagonal\"\n\t\t| \"antiDiagonal\"\n\t\t| \"custom\";\n\tpublic declare symmetry:\n\t\t| \"none\"\n\t\t| \"leftToRight\"\n\t\t| \"rightToLeft\"\n\t\t| \"topToBottom\"\n\t\t| \"bottomToTop\"\n\t\t| \"quadrant\";\n\n\tconstructor(config: FlipProps = {}) {\n\t\tsuper(withDefaults(\"Flip\", flipDefaults, config, effectMeta.Flip));\n\t}\n}\n\nexport interface KenBurnsProps {\n\t/**\n\t * @default []\n\t */\n\tkeyframes?: KenBurnsKeyframesItem[];\n\t/**\n\t * Range 0 to 10.\n\t * @default 1.5\n\t */\n\tmotionBlurSize?: number;\n\t/**\n\t * @default \"spline\"\n\t */\n\tmovementStyle?: \"spline\" | \"direct\";\n\t/**\n\t * @default \"input\"\n\t */\n\taspectRatio?:\n\t\t| \"input\"\n\t\t| \"16:9\"\n\t\t| \"9:16\"\n\t\t| \"21:9\"\n\t\t| \"9:21\"\n\t\t| \"1:1\"\n\t\t| \"4:3\"\n\t\t| \"3:2\"\n\t\t| \"2:3\"\n\t\t| \"4:5\"\n\t\t| \"5:4\";\n}\n\nconst kenBurnsDefaults: KenBurnsProps = {\n\tkeyframes: [],\n\tmotionBlurSize: 1.5,\n\tmovementStyle: \"spline\",\n\taspectRatio: \"input\",\n};\n\nexport class KenBurns extends Effect<KenBurnsProps> {\n\tpublic readonly op = \"KenBurns\";\n\n\tpublic declare keyframes: KenBurnsKeyframesItem[];\n\tpublic declare motionBlurSize: number;\n\tpublic declare movementStyle: \"spline\" | \"direct\";\n\tpublic declare aspectRatio:\n\t\t| \"input\"\n\t\t| \"16:9\"\n\t\t| \"9:16\"\n\t\t| \"21:9\"\n\t\t| \"9:21\"\n\t\t| \"1:1\"\n\t\t| \"4:3\"\n\t\t| \"3:2\"\n\t\t| \"2:3\"\n\t\t| \"4:5\"\n\t\t| \"5:4\";\n\n\tconstructor(config: KenBurnsProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"KenBurns\", kenBurnsDefaults, config, effectMeta.KenBurns),\n\t\t);\n\t}\n}\n\nexport interface LayerStyleProps {\n\t/**\n\t * @default {\"enabled\":false,\"color\":\"#000000\",\"opacity\":0.75,\"angle\":120,\"distance\":10,\"spread\":0,\"size\":10,\"blendMode\":\"multiply\"}\n\t */\n\tdropShadow?: Partial<LayerStyleDropShadow>;\n\t/**\n\t * @default {\"enabled\":false,\"color\":\"#000000\",\"opacity\":0.75,\"angle\":120,\"distance\":5,\"choke\":0,\"size\":5,\"blendMode\":\"multiply\"}\n\t */\n\tinnerShadow?: Partial<LayerStyleInnerShadow>;\n\t/**\n\t * @default {\"enabled\":false,\"color\":\"#ffffff\",\"opacity\":0.75,\"size\":15,\"spread\":0,\"blendMode\":\"screen\"}\n\t */\n\touterGlow?: Partial<LayerStyleOuterGlow>;\n\t/**\n\t * @default {\"enabled\":false,\"color\":\"#ffffff\",\"opacity\":0.75,\"size\":15,\"spread\":0,\"blendMode\":\"screen\"}\n\t */\n\tinnerGlow?: Partial<LayerStyleInnerGlow>;\n\t/**\n\t * @default {\"enabled\":false,\"size\":2,\"position\":\"outside\",\"color\":\"#ffffff\",\"opacity\":1,\"blendMode\":\"normal\"}\n\t */\n\tstroke?: Partial<LayerStyleStroke>;\n\t/**\n\t * @default {\"enabled\":false,\"style\":\"InnerBevel\",\"technique\":\"Smooth\",\"depth\":100,\"direction\":\"Up\",\"size\":5,\"soften\":0,\"angle\":120,\"altitude\":30,\"highlightColor\":\"#ffffff\",\"highlightOpacity\":0.75,\"shadowColor\":\"#000000\",\"shadowOpacity\":0.75}\n\t */\n\tbevelEmboss?: Partial<LayerStyleBevelEmboss>;\n\t/**\n\t * @default {\"enabled\":false,\"color\":\"#ff0000\",\"opacity\":1,\"blendMode\":\"normal\"}\n\t */\n\tcolorOverlay?: Partial<LayerStyleColorOverlay>;\n\tdropShadowAngleHandleId?: string | null;\n\tdropShadowDistanceHandleId?: string | null;\n\tdropShadowSpreadHandleId?: string | null;\n\tdropShadowSizeHandleId?: string | null;\n\tdropShadowOpacityHandleId?: string | null;\n\tinnerShadowAngleHandleId?: string | null;\n\tinnerShadowDistanceHandleId?: string | null;\n\tinnerShadowChokeHandleId?: string | null;\n\tinnerShadowSizeHandleId?: string | null;\n\tinnerShadowOpacityHandleId?: string | null;\n\touterGlowSizeHandleId?: string | null;\n\touterGlowSpreadHandleId?: string | null;\n\touterGlowOpacityHandleId?: string | null;\n\tinnerGlowSizeHandleId?: string | null;\n\tinnerGlowSpreadHandleId?: string | null;\n\tinnerGlowOpacityHandleId?: string | null;\n\tstrokeSizeHandleId?: string | null;\n\tstrokeOpacityHandleId?: string | null;\n\tbevelEmbossDepthHandleId?: string | null;\n\tbevelEmbossSizeHandleId?: string | null;\n\tbevelEmbossSoftenHandleId?: string | null;\n\tbevelEmbossAngleHandleId?: string | null;\n\tbevelEmbossAltitudeHandleId?: string | null;\n\tbevelEmbossHighlightOpacityHandleId?: string | null;\n\tbevelEmbossShadowOpacityHandleId?: string | null;\n\tcolorOverlayOpacityHandleId?: string | null;\n}\n\nconst layerStyleDefaults: LayerStyleProps = {\n\tdropShadow: {\n\t\tenabled: false,\n\t\tcolor: \"#000000\",\n\t\topacity: 0.75,\n\t\tangle: 120,\n\t\tdistance: 10,\n\t\tspread: 0,\n\t\tsize: 10,\n\t\tblendMode: \"multiply\",\n\t},\n\tinnerShadow: {\n\t\tenabled: false,\n\t\tcolor: \"#000000\",\n\t\topacity: 0.75,\n\t\tangle: 120,\n\t\tdistance: 5,\n\t\tchoke: 0,\n\t\tsize: 5,\n\t\tblendMode: \"multiply\",\n\t},\n\touterGlow: {\n\t\tenabled: false,\n\t\tcolor: \"#ffffff\",\n\t\topacity: 0.75,\n\t\tsize: 15,\n\t\tspread: 0,\n\t\tblendMode: \"screen\",\n\t},\n\tinnerGlow: {\n\t\tenabled: false,\n\t\tcolor: \"#ffffff\",\n\t\topacity: 0.75,\n\t\tsize: 15,\n\t\tspread: 0,\n\t\tblendMode: \"screen\",\n\t},\n\tstroke: {\n\t\tenabled: false,\n\t\tsize: 2,\n\t\tposition: \"outside\",\n\t\tcolor: \"#ffffff\",\n\t\topacity: 1,\n\t\tblendMode: \"normal\",\n\t},\n\tbevelEmboss: {\n\t\tenabled: false,\n\t\tstyle: \"InnerBevel\",\n\t\ttechnique: \"Smooth\",\n\t\tdepth: 100,\n\t\tdirection: \"Up\",\n\t\tsize: 5,\n\t\tsoften: 0,\n\t\tangle: 120,\n\t\taltitude: 30,\n\t\thighlightColor: \"#ffffff\",\n\t\thighlightOpacity: 0.75,\n\t\tshadowColor: \"#000000\",\n\t\tshadowOpacity: 0.75,\n\t},\n\tcolorOverlay: {\n\t\tenabled: false,\n\t\tcolor: \"#ff0000\",\n\t\topacity: 1,\n\t\tblendMode: \"normal\",\n\t},\n};\n\nexport class LayerStyle extends Effect<LayerStyleProps> {\n\tpublic readonly op = \"LayerStyle\";\n\n\tpublic declare dropShadow: Partial<LayerStyleDropShadow>;\n\tpublic declare innerShadow: Partial<LayerStyleInnerShadow>;\n\tpublic declare outerGlow: Partial<LayerStyleOuterGlow>;\n\tpublic declare innerGlow: Partial<LayerStyleInnerGlow>;\n\tpublic declare stroke: Partial<LayerStyleStroke>;\n\tpublic declare bevelEmboss: Partial<LayerStyleBevelEmboss>;\n\tpublic declare colorOverlay: Partial<LayerStyleColorOverlay>;\n\tpublic declare dropShadowAngleHandleId: string | null | undefined;\n\tpublic declare dropShadowDistanceHandleId: string | null | undefined;\n\tpublic declare dropShadowSpreadHandleId: string | null | undefined;\n\tpublic declare dropShadowSizeHandleId: string | null | undefined;\n\tpublic declare dropShadowOpacityHandleId: string | null | undefined;\n\tpublic declare innerShadowAngleHandleId: string | null | undefined;\n\tpublic declare innerShadowDistanceHandleId: string | null | undefined;\n\tpublic declare innerShadowChokeHandleId: string | null | undefined;\n\tpublic declare innerShadowSizeHandleId: string | null | undefined;\n\tpublic declare innerShadowOpacityHandleId: string | null | undefined;\n\tpublic declare outerGlowSizeHandleId: string | null | undefined;\n\tpublic declare outerGlowSpreadHandleId: string | null | undefined;\n\tpublic declare outerGlowOpacityHandleId: string | null | undefined;\n\tpublic declare innerGlowSizeHandleId: string | null | undefined;\n\tpublic declare innerGlowSpreadHandleId: string | null | undefined;\n\tpublic declare innerGlowOpacityHandleId: string | null | undefined;\n\tpublic declare strokeSizeHandleId: string | null | undefined;\n\tpublic declare strokeOpacityHandleId: string | null | undefined;\n\tpublic declare bevelEmbossDepthHandleId: string | null | undefined;\n\tpublic declare bevelEmbossSizeHandleId: string | null | undefined;\n\tpublic declare bevelEmbossSoftenHandleId: string | null | undefined;\n\tpublic declare bevelEmbossAngleHandleId: string | null | undefined;\n\tpublic declare bevelEmbossAltitudeHandleId: string | null | undefined;\n\tpublic declare bevelEmbossHighlightOpacityHandleId: string | null | undefined;\n\tpublic declare bevelEmbossShadowOpacityHandleId: string | null | undefined;\n\tpublic declare colorOverlayOpacityHandleId: string | null | undefined;\n\n\tconstructor(config: LayerStyleProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"LayerStyle\",\n\t\t\t\tlayerStyleDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.LayerStyle,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface LiquifyProps {\n\t/**\n\t * List of localized liquify deformation operations.\n\t * @default []\n\t */\n\toperations?: LiquifyOperationsItem[];\n}\n\nconst liquifyDefaults: LiquifyProps = {\n\toperations: [],\n};\n\nexport class Liquify extends Effect<LiquifyProps> {\n\tpublic readonly op = \"Liquify\";\n\n\tpublic declare operations: LiquifyOperationsItem[];\n\n\tconstructor(config: LiquifyProps = {}) {\n\t\tsuper(withDefaults(\"Liquify\", liquifyDefaults, config, effectMeta.Liquify));\n\t}\n}\n\nexport interface MaskMathProps {\n\t/**\n\t * Morphological or Boolean set operation applied to input alpha masks.\n\t * @default \"Union\"\n\t */\n\toperation?:\n\t\t| \"Union\"\n\t\t| \"Intersect\"\n\t\t| \"Subtract\"\n\t\t| \"Difference\"\n\t\t| \"Invert\"\n\t\t| \"Dilate\"\n\t\t| \"Erode\"\n\t\t| \"Choke\"\n\t\t| \"Feather\";\n\t/**\n\t * Kernel radius in pixels for Dilate, Erode, Choke, or Feather operations.\n\t * Range 0 to 200. Accepts a signal.\n\t * @default 0\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Cutoff threshold level (0.0–1.0) for binarization step or non-linear choke.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tthreshold?: EffectProp<number>;\n\t/**\n\t * Minimum alpha matte cutoff limit (0.0–1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tclampMin?: EffectProp<number>;\n\t/**\n\t * Maximum alpha matte cutoff limit (0.0–1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\tclampMax?: EffectProp<number>;\n\t/**\n\t * Source channel to extract mask from Mask A (Alpha, Luminance, Red, Green, Blue).\n\t * @default \"Alpha\"\n\t */\n\tchannelA?: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\t/**\n\t * Source channel to extract mask from Mask B (Alpha, Luminance, Red, Green, Blue).\n\t * @default \"Alpha\"\n\t */\n\tchannelB?: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\t/**\n\t * When enabled, outputs crisp 1-bit binary matte based on threshold.\n\t * @default false\n\t */\n\tbinarize?: boolean;\n\t/**\n\t * Inverts final matte output.\n\t * @default false\n\t */\n\tinvertResult?: boolean;\n\t/**\n\t * WhiteWithAlpha (rgba(1,1,1,a)), GrayscaleRGB (rgba(a,a,a,1)), AlphaOnly (rgba(0,0,0,a)), PassthroughRGB (Mask A RGB with new alpha).\n\t * @default \"WhiteWithAlpha\"\n\t */\n\toutputFormat?:\n\t\t| \"WhiteWithAlpha\"\n\t\t| \"GrayscaleRGB\"\n\t\t| \"AlphaOnly\"\n\t\t| \"PassthroughRGB\";\n}\n\nconst maskMathDefaults: MaskMathProps = {\n\toperation: \"Union\",\n\tradius: 0,\n\tthreshold: 0.5,\n\tclampMin: 0,\n\tclampMax: 1,\n\tchannelA: \"Alpha\",\n\tchannelB: \"Alpha\",\n\tbinarize: false,\n\tinvertResult: false,\n\toutputFormat: \"WhiteWithAlpha\",\n};\n\nexport class MaskMath extends Effect<MaskMathProps> {\n\tpublic readonly op = \"MaskMath\";\n\n\tpublic declare operation:\n\t\t| \"Union\"\n\t\t| \"Intersect\"\n\t\t| \"Subtract\"\n\t\t| \"Difference\"\n\t\t| \"Invert\"\n\t\t| \"Dilate\"\n\t\t| \"Erode\"\n\t\t| \"Choke\"\n\t\t| \"Feather\";\n\tpublic declare radius: number;\n\tpublic declare threshold: number;\n\tpublic declare clampMin: number;\n\tpublic declare clampMax: number;\n\tpublic declare channelA: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\tpublic declare channelB: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\tpublic declare binarize: boolean;\n\tpublic declare invertResult: boolean;\n\tpublic declare outputFormat:\n\t\t| \"WhiteWithAlpha\"\n\t\t| \"GrayscaleRGB\"\n\t\t| \"AlphaOnly\"\n\t\t| \"PassthroughRGB\";\n\n\tconstructor(config: MaskMathProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"MaskMath\", maskMathDefaults, config, effectMeta.MaskMath),\n\t\t);\n\t}\n}\n\nexport interface MeshWarpProps {\n\t/**\n\t * Range 2 to 12.\n\t * @default 3\n\t */\n\tcols?: number;\n\t/**\n\t * Range 2 to 12.\n\t * @default 3\n\t */\n\trows?: number;\n\tpoints?: MeshWarpPointsItem[];\n}\n\nconst meshWarpDefaults: MeshWarpProps = {\n\tcols: 3,\n\trows: 3,\n};\n\nexport class MeshWarp extends Effect<MeshWarpProps> {\n\tpublic readonly op = \"MeshWarp\";\n\n\tpublic declare cols: number;\n\tpublic declare rows: number;\n\tpublic declare points: MeshWarpPointsItem[] | undefined;\n\n\tconstructor(config: MeshWarpProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"MeshWarp\", meshWarpDefaults, config, effectMeta.MeshWarp),\n\t\t);\n\t}\n}\n\nexport interface NoiseGeneratorProps {\n\t/**\n\t * Noise Type\n\t * @default \"Perlin\"\n\t */\n\tnoiseType?: \"Perlin\" | \"Simplex\" | \"Voronoi\";\n\t/**\n\t * Output Type\n\t * @default \"Image\"\n\t */\n\toutputType?: \"Image\" | \"Video\";\n\t/**\n\t * Width\n\t * Range 16 to 4096.\n\t * @default 512\n\t */\n\twidth?: number;\n\t/**\n\t * Height\n\t * Range 16 to 4096.\n\t * @default 512\n\t */\n\theight?: number;\n\t/**\n\t * Scale of the noise pattern. Can be modulated by a static number or a dynamic signal.\n\t * Range 0.1 to 100. Accepts a signal.\n\t * @default 10\n\t */\n\tscale?: EffectProp<number>;\n\t/**\n\t * Fractal detail depth of the noise.\n\t * Range 1 to 8. Accepts a signal.\n\t * @default 4\n\t */\n\toctaves?: EffectProp<number>;\n\t/**\n\t * Roughness multiplier for each fractal octave.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tpersistence?: EffectProp<number>;\n\t/**\n\t * Frequency spacing multiplier for each fractal octave.\n\t * Range 1 to 4. Accepts a signal.\n\t * @default 2\n\t */\n\tlacunarity?: EffectProp<number>;\n\t/**\n\t * Speed of time-based noise animation in Video mode.\n\t * Range 0 to 10. Accepts a signal.\n\t * @default 1\n\t */\n\tspeed?: EffectProp<number>;\n\t/**\n\t * Color Start\n\t * @default \"#000000\"\n\t */\n\tcolorStart?: string;\n\t/**\n\t * Color End\n\t * @default \"#ffffff\"\n\t */\n\tcolorEnd?: string;\n\t/**\n\t * Duration (ms)\n\t * Range 1 to 60000.\n\t * @default 5000\n\t */\n\tdurationMs?: number;\n\t/**\n\t * FPS\n\t * Range 1 to 120.\n\t * @default 30\n\t */\n\tfps?: number;\n}\n\nconst noiseGeneratorDefaults: NoiseGeneratorProps = {\n\tnoiseType: \"Perlin\",\n\toutputType: \"Image\",\n\twidth: 512,\n\theight: 512,\n\tscale: 10,\n\toctaves: 4,\n\tpersistence: 0.5,\n\tlacunarity: 2,\n\tspeed: 1,\n\tcolorStart: \"#000000\",\n\tcolorEnd: \"#ffffff\",\n\tdurationMs: 5000,\n\tfps: 30,\n};\n\nexport class NoiseGenerator extends Effect<NoiseGeneratorProps> {\n\tpublic readonly op = \"NoiseGenerator\";\n\n\tpublic declare noiseType: \"Perlin\" | \"Simplex\" | \"Voronoi\";\n\tpublic declare outputType: \"Image\" | \"Video\";\n\tpublic declare width: number;\n\tpublic declare height: number;\n\tpublic declare scale: number;\n\tpublic declare octaves: number;\n\tpublic declare persistence: number;\n\tpublic declare lacunarity: number;\n\tpublic declare speed: number;\n\tpublic declare colorStart: string;\n\tpublic declare colorEnd: string;\n\tpublic declare durationMs: number;\n\tpublic declare fps: number;\n\n\tconstructor(config: NoiseGeneratorProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"NoiseGenerator\",\n\t\t\t\tnoiseGeneratorDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.NoiseGenerator,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface PaintProps {\n\t/**\n\t * Range 1 to 16384.\n\t * @default 1080\n\t */\n\twidth?: number;\n\t/**\n\t * Range 1 to 16384.\n\t * @default 1080\n\t */\n\theight?: number;\n\t/**\n\t * @default true\n\t */\n\tmaintainAspect?: boolean;\n\taspectRatio?: number;\n\t/**\n\t * @default \"#ffffff\"\n\t */\n\tbackgroundColor?: string;\n\tstrokes?: (\n\t\t| PaintStrokesItemOption1\n\t\t| PaintStrokesItemOption2\n\t\t| PaintStrokesItemOption3\n\t)[];\n}\n\nconst paintDefaults: PaintProps = {\n\twidth: 1080,\n\theight: 1080,\n\tmaintainAspect: true,\n\tbackgroundColor: \"#ffffff\",\n};\n\nexport class Paint extends Effect<PaintProps> {\n\tpublic readonly op = \"Paint\";\n\n\tpublic declare width: number;\n\tpublic declare height: number;\n\tpublic declare maintainAspect: boolean;\n\tpublic declare aspectRatio: number | undefined;\n\tpublic declare backgroundColor: string;\n\tpublic declare strokes:\n\t\t| (\n\t\t\t\t| PaintStrokesItemOption1\n\t\t\t\t| PaintStrokesItemOption2\n\t\t\t\t| PaintStrokesItemOption3\n\t\t )[]\n\t\t| undefined;\n\n\tconstructor(config: PaintProps = {}) {\n\t\tsuper(withDefaults(\"Paint\", paintDefaults, config, effectMeta.Paint));\n\t}\n}\n\nexport interface PatchHealProps {\n\t/** List of patch healing operations applied sequentially. */\n\tpatches?: PatchHealPatchesItem[];\n\t/**\n\t * Horizontal normalized position of destination patch (0.0 to 1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * Vertical normalized position of destination patch (0.0 to 1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n\t/**\n\t * Horizontal pixel distance from destination to sample source patch.\n\t * Range -4096 to 4096. Accepts a signal.\n\t * @default 50\n\t */\n\toffsetX?: EffectProp<number>;\n\t/**\n\t * Vertical pixel distance from destination to sample source patch.\n\t * Range -4096 to 4096. Accepts a signal.\n\t * @default 0\n\t */\n\toffsetY?: EffectProp<number>;\n\t/**\n\t * Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\n\t * Range 1 to 500. Accepts a signal.\n\t * @default 25\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Radius of the source sample circular patch in pixels.\n\t * Range 1 to 500. Accepts a signal.\n\t * @default 25\n\t */\n\tsourceRadius?: EffectProp<number>;\n\t/**\n\t * Softness edge falloff percentage (0–100%).\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 50\n\t */\n\tfeather?: EffectProp<number>;\n\t/**\n\t * Blending opacity of the healed patch (0.0–1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 1\n\t */\n\topacity?: EffectProp<number>;\n\t/**\n\t * Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\n\t * @default \"SeamlessHeal\"\n\t */\n\tmode?: \"Clone\" | \"SeamlessHeal\" | \"TextureTransfer\";\n}\n\nconst patchHealDefaults: PatchHealProps = {\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n\toffsetX: 50,\n\toffsetY: 0,\n\tradius: 25,\n\tsourceRadius: 25,\n\tfeather: 50,\n\topacity: 1,\n\tmode: \"SeamlessHeal\",\n};\n\nexport class PatchHeal extends Effect<PatchHealProps> {\n\tpublic readonly op = \"PatchHeal\";\n\n\tpublic declare patches: PatchHealPatchesItem[] | undefined;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\tpublic declare offsetX: number;\n\tpublic declare offsetY: number;\n\tpublic declare radius: number;\n\tpublic declare sourceRadius: number;\n\tpublic declare feather: number;\n\tpublic declare opacity: number;\n\tpublic declare mode: \"Clone\" | \"SeamlessHeal\" | \"TextureTransfer\";\n\n\tconstructor(config: PatchHealProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"PatchHeal\",\n\t\t\t\tpatchHealDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.PatchHeal,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ProceduralVFXProps {\n\t/**\n\t * Which procedural particle / light effect to synthesize.\n\t * @default \"Smoke\"\n\t */\n\teffectType?:\n\t\t| \"Smoke\"\n\t\t| \"Fire\"\n\t\t| \"Rain\"\n\t\t| \"Sparks\"\n\t\t| \"Snow\"\n\t\t| \"Dust\"\n\t\t| \"Lightning\"\n\t\t| \"Magic\"\n\t\t| \"LensFlare\"\n\t\t| \"Embers\"\n\t\t| \"EnergyBeam\";\n\t/**\n\t * Image renders a static frame; Video animates over time.\n\t * @default \"Video\"\n\t */\n\toutputType?: \"Image\" | \"Video\";\n\t/**\n\t * Width\n\t * Range 16 to 4096.\n\t * @default 1080\n\t */\n\twidth?: number;\n\t/**\n\t * Height\n\t * Range 16 to 4096.\n\t * @default 1080\n\t */\n\theight?: number;\n\t/**\n\t * Amount of particles / coverage of the effect. Can be modulated by a static number or dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.6\n\t */\n\tdensity?: EffectProp<number>;\n\t/**\n\t * Spatial frequency / particle size of the effect. Can be modulated by a signal.\n\t * Range 0.001 to 10. Accepts a signal.\n\t * @default 0.01\n\t */\n\tscale?: EffectProp<number>;\n\t/**\n\t * Animation speed in Video mode. Can be modulated by a signal.\n\t * Range 0 to 10. Accepts a signal.\n\t * @default 1\n\t */\n\tspeed?: EffectProp<number>;\n\t/**\n\t * Brightness / alpha gain of the effect. Can be modulated by a signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.8\n\t */\n\tintensity?: EffectProp<number>;\n\t/**\n\t * Deterministic shuffle of the random pattern. Can be modulated by a signal.\n\t * Range 0 to 1000000. Accepts a signal.\n\t * @default 1234\n\t */\n\tseed?: EffectProp<number>;\n\t/**\n\t * Color Start\n\t * @default \"#ffffff\"\n\t */\n\tcolorStart?: string;\n\t/**\n\t * Color End\n\t * @default \"#ff5500\"\n\t */\n\tcolorEnd?: string;\n\t/**\n\t * Duration (ms)\n\t * Range 100 to 100000.\n\t * @default 5000\n\t */\n\tdurationMs?: number;\n\t/**\n\t * FPS\n\t * Range 1 to 120.\n\t * @default 30\n\t */\n\tfps?: number;\n}\n\nconst proceduralVFXDefaults: ProceduralVFXProps = {\n\teffectType: \"Smoke\",\n\toutputType: \"Video\",\n\twidth: 1080,\n\theight: 1080,\n\tdensity: 0.6,\n\tscale: 0.01,\n\tspeed: 1,\n\tintensity: 0.8,\n\tseed: 1234,\n\tcolorStart: \"#ffffff\",\n\tcolorEnd: \"#ff5500\",\n\tdurationMs: 5000,\n\tfps: 30,\n};\n\nexport class ProceduralVFX extends Effect<ProceduralVFXProps> {\n\tpublic readonly op = \"ProceduralVFX\";\n\n\tpublic declare effectType:\n\t\t| \"Smoke\"\n\t\t| \"Fire\"\n\t\t| \"Rain\"\n\t\t| \"Sparks\"\n\t\t| \"Snow\"\n\t\t| \"Dust\"\n\t\t| \"Lightning\"\n\t\t| \"Magic\"\n\t\t| \"LensFlare\"\n\t\t| \"Embers\"\n\t\t| \"EnergyBeam\";\n\tpublic declare outputType: \"Image\" | \"Video\";\n\tpublic declare width: number;\n\tpublic declare height: number;\n\tpublic declare density: number;\n\tpublic declare scale: number;\n\tpublic declare speed: number;\n\tpublic declare intensity: number;\n\tpublic declare seed: number;\n\tpublic declare colorStart: string;\n\tpublic declare colorEnd: string;\n\tpublic declare durationMs: number;\n\tpublic declare fps: number;\n\n\tconstructor(config: ProceduralVFXProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ProceduralVFX\",\n\t\t\t\tproceduralVFXDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ProceduralVFX,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface RefineEdgeProps {\n\t/**\n\t * Amount of edge color spill decontamination/defringing (0.0–1.0).\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.7\n\t */\n\tdecontaminateAmount?: EffectProp<number>;\n\t/**\n\t * Radius in pixels around alpha transitions to refine and decontaminate.\n\t * Range 0.5 to 50. Accepts a signal.\n\t * @default 2\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Matte edge smoothing curve intensity (0–100).\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 5\n\t */\n\tsmooth?: EffectProp<number>;\n\t/**\n\t * Sub-pixel gaussian softness along the matte boundary.\n\t * Range 0 to 50. Accepts a signal.\n\t * @default 0.5\n\t */\n\tfeather?: EffectProp<number>;\n\t/**\n\t * Contract (<0) or expand (>0) the edge boundary (-100% to +100%).\n\t * Range -100 to 100. Accepts a signal.\n\t * @default 0\n\t */\n\tshiftEdge?: EffectProp<number>;\n\t/**\n\t * Channel to extract matte from (Alpha, Luminance, Red, Green, Blue).\n\t * @default \"Alpha\"\n\t */\n\tmatteChannel?: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\t/**\n\t * Composite (decontaminated RGB + refined alpha), MatteOnly (grayscale mask), DecontaminatedRGB (clean RGB with full alpha).\n\t * @default \"Composite\"\n\t */\n\toutputMode?: \"Composite\" | \"MatteOnly\" | \"DecontaminatedRGB\";\n}\n\nconst refineEdgeDefaults: RefineEdgeProps = {\n\tdecontaminateAmount: 0.7,\n\tradius: 2,\n\tsmooth: 5,\n\tfeather: 0.5,\n\tshiftEdge: 0,\n\tmatteChannel: \"Alpha\",\n\toutputMode: \"Composite\",\n};\n\nexport class RefineEdge extends Effect<RefineEdgeProps> {\n\tpublic readonly op = \"RefineEdge\";\n\n\tpublic declare decontaminateAmount: number;\n\tpublic declare radius: number;\n\tpublic declare smooth: number;\n\tpublic declare feather: number;\n\tpublic declare shiftEdge: number;\n\tpublic declare matteChannel: \"Alpha\" | \"Luminance\" | \"Red\" | \"Green\" | \"Blue\";\n\tpublic declare outputMode: \"Composite\" | \"MatteOnly\" | \"DecontaminatedRGB\";\n\n\tconstructor(config: RefineEdgeProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"RefineEdge\",\n\t\t\t\trefineEdgeDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.RefineEdge,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface RefractionCaustics3DProps {\n\t/**\n\t * Index of Refraction (1.0=Air, 1.33=Water, 1.52=Crown Glass, 2.42=Diamond). Controls ray bending according to Snell's Law.\n\t * Range 1 to 2.5. Accepts a signal.\n\t * @default 1.52\n\t */\n\tior?: EffectProp<number>;\n\t/**\n\t * Chromatic dispersion (RGB wavelength splitting) creating prismatic rainbow fringing.\n\t * Range 0 to 0.2. Accepts a signal.\n\t * @default 0.04\n\t */\n\tdispersion?: EffectProp<number>;\n\t/**\n\t * Depth displacement scale and effective glass thickness factor.\n\t * Range 0 to 2. Accepts a signal.\n\t * @default 0.5\n\t */\n\trefractionScale?: EffectProp<number>;\n\t/**\n\t * Brightness multiplier for photometric caustic light rays focusing through curved glass.\n\t * Range 0 to 2. Accepts a signal.\n\t * @default 0.6\n\t */\n\tcausticBrightness?: EffectProp<number>;\n\t/**\n\t * Spatial frequency scale of photometric caustic patterns.\n\t * Range 0.1 to 5. Accepts a signal.\n\t * @default 1\n\t */\n\tcausticScale?: EffectProp<number>;\n\t/**\n\t * Dynamic liquid wave perturbation strength across the refractive surface.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tfluidRipples?: EffectProp<number>;\n\t/**\n\t * Speed of dynamic fluid wave animation.\n\t * Range 0 to 5. Accepts a signal.\n\t * @default 1\n\t */\n\trippleSpeed?: EffectProp<number>;\n\t/**\n\t * Microfacet frosted glass roughness and optical diffusion blur.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\troughness?: EffectProp<number>;\n\t/**\n\t * Fresnel specular reflection gleam intensity.\n\t * Range 0 to 2. Accepts a signal.\n\t * @default 0.8\n\t */\n\tspecularIntensity?: EffectProp<number>;\n\t/**\n\t * Horizontal normalized coordinate (0.0 to 1.0) of incident light source.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tlightPosX?: EffectProp<number>;\n\t/**\n\t * Vertical normalized coordinate (0.0 to 1.0) of incident light source.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.2\n\t */\n\tlightPosY?: EffectProp<number>;\n\t/**\n\t * Internal glass color tint and absorption.\n\t * @default \"#ffffff\"\n\t */\n\ttintColor?: string;\n\t/**\n\t * Strength of internal glass color tint absorption.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\ttintStrength?: EffectProp<number>;\n\t/**\n\t * Invert depth polarity (white = near vs black = near).\n\t * @default false\n\t */\n\tdepthInvert?: boolean;\n\t/**\n\t * Height-field surface normal extrusion exaggeration.\n\t * Range 0.1 to 5. Accepts a signal.\n\t * @default 1\n\t */\n\tdepthScale?: EffectProp<number>;\n}\n\nconst refractionCaustics3DDefaults: RefractionCaustics3DProps = {\n\tior: 1.52,\n\tdispersion: 0.04,\n\trefractionScale: 0.5,\n\tcausticBrightness: 0.6,\n\tcausticScale: 1,\n\tfluidRipples: 0,\n\trippleSpeed: 1,\n\troughness: 0,\n\tspecularIntensity: 0.8,\n\tlightPosX: 0.5,\n\tlightPosY: 0.2,\n\ttintColor: \"#ffffff\",\n\ttintStrength: 0,\n\tdepthInvert: false,\n\tdepthScale: 1,\n};\n\nexport class RefractionCaustics3D extends Effect<RefractionCaustics3DProps> {\n\tpublic readonly op = \"RefractionCaustics3D\";\n\n\tpublic declare ior: number;\n\tpublic declare dispersion: number;\n\tpublic declare refractionScale: number;\n\tpublic declare causticBrightness: number;\n\tpublic declare causticScale: number;\n\tpublic declare fluidRipples: number;\n\tpublic declare rippleSpeed: number;\n\tpublic declare roughness: number;\n\tpublic declare specularIntensity: number;\n\tpublic declare lightPosX: number;\n\tpublic declare lightPosY: number;\n\tpublic declare tintColor: string;\n\tpublic declare tintStrength: number;\n\tpublic declare depthInvert: boolean;\n\tpublic declare depthScale: number;\n\n\tconstructor(config: RefractionCaustics3DProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"RefractionCaustics3D\",\n\t\t\t\trefractionCaustics3DDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.RefractionCaustics3D,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ResizerScalerProps {\n\t/**\n\t * @default \"16:9\"\n\t */\n\taspectRatioPreset?: \"9:16\" | \"16:9\" | \"1:1\" | \"4:5\" | \"21:9\" | \"custom\";\n\t/**\n\t * @default \"1080p\"\n\t */\n\tresolutionPreset?: \"4k\" | \"1080p\" | \"720p\" | \"480p\" | \"custom\";\n\t/**\n\t * Range 1 to 8192.\n\t * @default 1920\n\t */\n\ttargetWidth?: number;\n\t/**\n\t * Range 1 to 8192.\n\t * @default 1080\n\t */\n\ttargetHeight?: number;\n\t/**\n\t * @default \"contain\"\n\t */\n\tfitMode?: \"cover\" | \"contain\" | \"stretch\" | \"manual\";\n\t/**\n\t * Range 1 to 1000.\n\t * @default 100\n\t */\n\tzoom?: number;\n\t/**\n\t * Range -8192 to 8192.\n\t * @default 0\n\t */\n\toffsetX?: number;\n\t/**\n\t * Range -8192 to 8192.\n\t * @default 0\n\t */\n\toffsetY?: number;\n\t/**\n\t * @default \"solid\"\n\t */\n\tbackgroundMode?: \"solid\" | \"blurred\" | \"gradient\" | \"transparent\";\n\t/**\n\t * @default \"#000000FF\"\n\t */\n\tbackgroundColor?: string;\n\t/**\n\t * @default \"#000000FF\"\n\t */\n\tbackgroundColor2?: string;\n\t/**\n\t * Range 0 to 100.\n\t * @default 40\n\t */\n\tblurRadius?: number;\n\t/**\n\t * Range 0 to 1.\n\t * @default 0.6\n\t */\n\tbackgroundBrightness?: number;\n\t/**\n\t * @default \"center\"\n\t */\n\tanchorX?: \"left\" | \"center\" | \"right\";\n\t/**\n\t * @default \"center\"\n\t */\n\tanchorY?: \"top\" | \"center\" | \"bottom\";\n}\n\nconst resizerScalerDefaults: ResizerScalerProps = {\n\taspectRatioPreset: \"16:9\",\n\tresolutionPreset: \"1080p\",\n\ttargetWidth: 1920,\n\ttargetHeight: 1080,\n\tfitMode: \"contain\",\n\tzoom: 100,\n\toffsetX: 0,\n\toffsetY: 0,\n\tbackgroundMode: \"solid\",\n\tbackgroundColor: \"#000000FF\",\n\tbackgroundColor2: \"#000000FF\",\n\tblurRadius: 40,\n\tbackgroundBrightness: 0.6,\n\tanchorX: \"center\",\n\tanchorY: \"center\",\n};\n\nexport class ResizerScaler extends Effect<ResizerScalerProps> {\n\tpublic readonly op = \"ResizerScaler\";\n\n\tpublic declare aspectRatioPreset:\n\t\t| \"9:16\"\n\t\t| \"16:9\"\n\t\t| \"1:1\"\n\t\t| \"4:5\"\n\t\t| \"21:9\"\n\t\t| \"custom\";\n\tpublic declare resolutionPreset: \"4k\" | \"1080p\" | \"720p\" | \"480p\" | \"custom\";\n\tpublic declare targetWidth: number;\n\tpublic declare targetHeight: number;\n\tpublic declare fitMode: \"cover\" | \"contain\" | \"stretch\" | \"manual\";\n\tpublic declare zoom: number;\n\tpublic declare offsetX: number;\n\tpublic declare offsetY: number;\n\tpublic declare backgroundMode:\n\t\t| \"solid\"\n\t\t| \"blurred\"\n\t\t| \"gradient\"\n\t\t| \"transparent\";\n\tpublic declare backgroundColor: string;\n\tpublic declare backgroundColor2: string;\n\tpublic declare blurRadius: number;\n\tpublic declare backgroundBrightness: number;\n\tpublic declare anchorX: \"left\" | \"center\" | \"right\";\n\tpublic declare anchorY: \"top\" | \"center\" | \"bottom\";\n\n\tconstructor(config: ResizerScalerProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ResizerScaler\",\n\t\t\t\tresizerScalerDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ResizerScaler,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface StereoPanningProps {\n\t/**\n\t * Stereo panning value: -1 (full left) to 1 (full right), 0 is center. Can be modulated by a static number or dynamic signal.\n\t * Range -1 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tpan?: EffectProp<number>;\n}\n\nconst stereoPanningDefaults: StereoPanningProps = {\n\tpan: 0,\n};\n\nexport class StereoPanning extends Effect<StereoPanningProps> {\n\tpublic readonly op = \"StereoPanning\";\n\n\tpublic declare pan: number;\n\n\tconstructor(config: StereoPanningProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"StereoPanning\",\n\t\t\t\tstereoPanningDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.StereoPanning,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface VignetteProps {\n\t/**\n\t * The intensity of the vignette darkening effect. 0 = no vignette.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 50\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * The extent/size of the vignette.\n\t * Range 0.1 to 2. Accepts a signal.\n\t * @default 1\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * The softness of the vignette transition edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tsoftness?: EffectProp<number>;\n\t/**\n\t * 0.0 matches the image aspect ratio, 1.0 is a perfect circle.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\troundness?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n}\n\nconst vignetteDefaults: VignetteProps = {\n\tstrength: 50,\n\tradius: 1,\n\tsoftness: 0.5,\n\troundness: 0.5,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n};\n\nexport class Vignette extends Effect<VignetteProps> {\n\tpublic readonly op = \"Vignette\";\n\n\tpublic declare strength: number;\n\tpublic declare radius: number;\n\tpublic declare softness: number;\n\tpublic declare roundness: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\n\tconstructor(config: VignetteProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"Vignette\", vignetteDefaults, config, effectMeta.Vignette),\n\t\t);\n\t}\n}\n","import type { ObjectTrackSignals } from \"@framefields/vision\";\nimport { BlurBase, type BlurBaseProps } from \"../generated/classes.js\";\n\nexport interface BlurProps extends BlurBaseProps {\n\t/**\n\t * Follow a tracked object. Turns on `partialBlur` and derives the region\n\t * (`centerX`, `centerY`, `radius`, `radiusY`, `shape`) and `strength` from\n\t * the track. Any of those passed explicitly wins over the track.\n\t */\n\ttrack?: ObjectTrackSignals;\n}\n\n/** Props the track supplies when the caller does not. */\nfunction trackDefaults(track: ObjectTrackSignals): BlurBaseProps {\n\treturn {\n\t\tpartialBlur: true,\n\t\tcenterX: track.center.x,\n\t\tcenterY: track.center.y,\n\t\tradius: track.bounds.width.multiply(0.55),\n\t\tradiusY: track.bounds.height.multiply(0.55),\n\t\tshape: \"ellipse\",\n\t\t// Fades the blur out while the object is not being tracked.\n\t\tstrength: track.active.multiply(25),\n\t};\n}\n\n/**\n * Blur effect. Props, defaults and ranges are generated from `node-blur`'s\n * schema ({@link BlurBase}); this subclass only adds `track`.\n */\nexport class Blur extends BlurBase {\n\tconstructor(config: BlurProps = {}) {\n\t\tconst { track, ...rest } = config;\n\t\tsuper(track ? { ...trackDefaults(track), ...definedOnly(rest) } : rest);\n\t}\n}\n\nfunction definedOnly<T extends object>(value: T): T {\n\treturn Object.fromEntries(\n\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t) as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Blur, type BlurProps } from \"../custom/blur.js\";\nimport {\n\tAudioCompressor,\n\ttype AudioCompressorProps,\n\tAudioDelay,\n\ttype AudioDelayProps,\n\tAudioFade,\n\ttype AudioFadeProps,\n\tAudioNoiseGate,\n\ttype AudioNoiseGateProps,\n\tAudioParametricEq,\n\ttype AudioParametricEqProps,\n\tAudioReverb,\n\ttype AudioReverbProps,\n\tCameraParallax3D,\n\ttype CameraParallax3DProps,\n\tChannelMerger,\n\ttype ChannelMergerProps,\n\tChannelSplitter,\n\ttype ChannelSplitterProps,\n\tColorBalance,\n\ttype ColorBalanceProps,\n\tColorKey,\n\ttype ColorKeyProps,\n\tCornerPin,\n\ttype CornerPinProps,\n\tDisplacementMap,\n\ttype DisplacementMapProps,\n\tExtractLUT,\n\ttype ExtractLUTProps,\n\tFlip,\n\ttype FlipProps,\n\tKenBurns,\n\ttype KenBurnsProps,\n\tLayerStyle,\n\ttype LayerStyleProps,\n\tLiquify,\n\ttype LiquifyProps,\n\tMaskMath,\n\ttype MaskMathProps,\n\tMeshWarp,\n\ttype MeshWarpProps,\n\tNoiseGenerator,\n\ttype NoiseGeneratorProps,\n\tPaint,\n\ttype PaintProps,\n\tPatchHeal,\n\ttype PatchHealProps,\n\tProceduralVFX,\n\ttype ProceduralVFXProps,\n\tRefineEdge,\n\ttype RefineEdgeProps,\n\tRefractionCaustics3D,\n\ttype RefractionCaustics3DProps,\n\tResizerScaler,\n\ttype ResizerScalerProps,\n\tStereoPanning,\n\ttype StereoPanningProps,\n\tVignette,\n\ttype VignetteProps,\n} from \"./classes.js\";\n\n/** `Effect.<factory>(config)` helpers, one per generated effect class. */\nexport const effectFactories = {\n\taudioCompressor: (config?: AudioCompressorProps) =>\n\t\tnew AudioCompressor(config),\n\taudioDelay: (config?: AudioDelayProps) => new AudioDelay(config),\n\taudioFade: (config?: AudioFadeProps) => new AudioFade(config),\n\taudioNoiseGate: (config?: AudioNoiseGateProps) => new AudioNoiseGate(config),\n\taudioParametricEq: (config?: AudioParametricEqProps) =>\n\t\tnew AudioParametricEq(config),\n\taudioReverb: (config?: AudioReverbProps) => new AudioReverb(config),\n\tblur: (config?: BlurProps) => new Blur(config),\n\tcameraParallax3D: (config?: CameraParallax3DProps) =>\n\t\tnew CameraParallax3D(config),\n\tchannelMerger: (config?: ChannelMergerProps) => new ChannelMerger(config),\n\tchannelSplitter: (config?: ChannelSplitterProps) =>\n\t\tnew ChannelSplitter(config),\n\tcolorBalance: (config?: ColorBalanceProps) => new ColorBalance(config),\n\tcolorKey: (config?: ColorKeyProps) => new ColorKey(config),\n\tcornerPin: (config?: CornerPinProps) => new CornerPin(config),\n\tdisplacementMap: (config?: DisplacementMapProps) =>\n\t\tnew DisplacementMap(config),\n\textractLUT: (config?: ExtractLUTProps) => new ExtractLUT(config),\n\tflip: (config?: FlipProps) => new Flip(config),\n\tkenBurns: (config?: KenBurnsProps) => new KenBurns(config),\n\tlayerStyle: (config?: LayerStyleProps) => new LayerStyle(config),\n\tliquify: (config?: LiquifyProps) => new Liquify(config),\n\tmaskMath: (config?: MaskMathProps) => new MaskMath(config),\n\tmeshWarp: (config?: MeshWarpProps) => new MeshWarp(config),\n\tnoiseGenerator: (config?: NoiseGeneratorProps) => new NoiseGenerator(config),\n\tpaint: (config?: PaintProps) => new Paint(config),\n\tpatchHeal: (config?: PatchHealProps) => new PatchHeal(config),\n\tproceduralVFX: (config?: ProceduralVFXProps) => new ProceduralVFX(config),\n\trefineEdge: (config?: RefineEdgeProps) => new RefineEdge(config),\n\trefractionCaustics3D: (config?: RefractionCaustics3DProps) =>\n\t\tnew RefractionCaustics3D(config),\n\tresizerScaler: (config?: ResizerScalerProps) => new ResizerScaler(config),\n\tstereoPanning: (config?: StereoPanningProps) => new StereoPanning(config),\n\tvignette: (config?: VignetteProps) => new Vignette(config),\n} as const;\n","import { Effect } from \"@framefields/core\";\nimport {\n\tAudioSignal,\n\ttype AudioSignalOptions,\n\ttype ExtractedAudioSignalsBundle,\n} from \"../signals/audio.js\";\nimport type { EffectProp } from \"./types.js\";\n\n// Vignette, Blur and ColorBalance are generated from their node packages\n// (./generated, written by scripts/generate-effects.mts). The classes below\n// are still hand-written and move there in later phases of spec/sync-node.md.\nexport * from \"./generated/index.js\";\nexport type { EffectProp } from \"./types.js\";\n\nexport interface LevelChannel {\n\tinBlack?: number;\n\tinWhite?: number;\n\toutBlack?: number;\n\toutWhite?: number;\n}\n\nexport interface LevelsProps {\n\tmaster?: LevelChannel;\n\tred?: LevelChannel;\n\tgreen?: LevelChannel;\n\tblue?: LevelChannel;\n}\n\nexport class Levels extends Effect<LevelsProps> {\n\tpublic readonly op = \"Levels\";\n\n\tpublic declare master: LevelChannel;\n\tpublic declare red: LevelChannel;\n\tpublic declare green: LevelChannel;\n\tpublic declare blue: LevelChannel;\n\n\tconstructor(config: LevelsProps = {}) {\n\t\tconst defaultChannel: LevelChannel = {\n\t\t\tinBlack: 0,\n\t\t\tinWhite: 1,\n\t\t\toutBlack: 0,\n\t\t\toutWhite: 1,\n\t\t};\n\t\tsuper({\n\t\t\tmaster: config.master ?? { ...defaultChannel },\n\t\t\tred: config.red ?? { ...defaultChannel },\n\t\t\tgreen: config.green ?? { ...defaultChannel },\n\t\t\tblue: config.blue ?? { ...defaultChannel },\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface FilmGrainProps {\n\tstrength?: EffectProp<number>;\n\tsize?: EffectProp<number>;\n\tmonochrome?: boolean;\n\tanimated?: boolean;\n\tspeed?: EffectProp<number>;\n\tshadows?: EffectProp<number>;\n\tmidtones?: EffectProp<number>;\n\thighlights?: EffectProp<number>;\n}\n\nexport class FilmGrain extends Effect<FilmGrainProps> {\n\tpublic readonly op = \"FilmGrain\";\n\n\tpublic declare strength: number;\n\tpublic declare size: number;\n\tpublic declare monochrome: boolean;\n\tpublic declare animated: boolean;\n\tpublic declare speed: number;\n\tpublic declare shadows: number;\n\tpublic declare midtones: number;\n\tpublic declare highlights: number;\n\n\tconstructor(config: FilmGrainProps = {}) {\n\t\tsuper({\n\t\t\tstrength: config.strength ?? 15,\n\t\t\tsize: config.size ?? 1.5,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t\tanimated: config.animated ?? true,\n\t\t\tspeed: config.speed ?? 50,\n\t\t\tshadows: config.shadows ?? 0.2,\n\t\t\tmidtones: config.midtones ?? 1.0,\n\t\t\thighlights: config.highlights ?? 0.2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport class CustomEffect extends Effect<Record<string, unknown>> {\n\tpublic readonly op: string;\n\n\tconstructor(opName: string, config: Record<string, unknown> = {}) {\n\t\tsuper(config);\n\t\tthis.op = opName;\n\t}\n}\n\nexport interface AudioSignalExtractorProps {\n\textractionMode?:\n\t\t| \"rms_envelope\"\n\t\t| \"transient_beat\"\n\t\t| \"sub_bass\"\n\t\t| \"bass\"\n\t\t| \"mid\"\n\t\t| \"high\"\n\t\t| \"spectral_flux\";\n\tattackMs?: number;\n\treleaseMs?: number;\n\tsensitivity?: number;\n\tnoiseFloorDb?: number;\n\tdynamicRangeDb?: number;\n\tautoRange?: boolean;\n\tsmoothing?: number;\n\tcurve?: \"linear\" | \"exponential\" | \"logarithmic\" | \"square\" | \"smoothstep\";\n\tbeatThreshold?: number;\n\tbeatDecayMs?: number;\n\tpreviewMode?: \"waveform\" | \"envelope\" | \"beat_markers\" | \"spectrum\";\n\tnodeId?: string;\n}\n\nexport class AudioSignalExtractor extends Effect<AudioSignalExtractorProps> {\n\tpublic readonly op = \"AudioSignalExtractor\";\n\n\tpublic declare extractionMode: AudioSignalExtractorProps[\"extractionMode\"];\n\tpublic declare attackMs: number;\n\tpublic declare releaseMs: number;\n\tpublic declare sensitivity: number;\n\tpublic declare noiseFloorDb: number;\n\tpublic declare dynamicRangeDb: number;\n\tpublic declare autoRange: boolean;\n\tpublic declare smoothing: number;\n\tpublic declare curve: AudioSignalExtractorProps[\"curve\"];\n\tpublic declare beatThreshold: number;\n\tpublic declare beatDecayMs: number;\n\tpublic declare previewMode: AudioSignalExtractorProps[\"previewMode\"];\n\tpublic declare nodeId: string;\n\n\tconstructor(config: AudioSignalExtractorProps = {}) {\n\t\tsuper({\n\t\t\textractionMode: config.extractionMode ?? \"rms_envelope\",\n\t\t\tattackMs: config.attackMs ?? 10,\n\t\t\treleaseMs: config.releaseMs ?? 120,\n\t\t\tsensitivity: config.sensitivity ?? 1.0,\n\t\t\tnoiseFloorDb: config.noiseFloorDb ?? -48,\n\t\t\tdynamicRangeDb: config.dynamicRangeDb ?? 48,\n\t\t\tautoRange: config.autoRange ?? true,\n\t\t\tsmoothing: config.smoothing ?? 0.15,\n\t\t\tcurve: config.curve ?? \"linear\",\n\t\t\tbeatThreshold: config.beatThreshold ?? 0.08,\n\t\t\tbeatDecayMs: config.beatDecayMs ?? 80,\n\t\t\tpreviewMode: config.previewMode ?? \"envelope\",\n\t\t\tnodeId: config.nodeId ?? \"audio_extractor\",\n\t\t\t...config,\n\t\t});\n\t}\n\n\tpublic async extract(\n\t\tsource: string,\n\t\toptions: Partial<AudioSignalOptions> = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\treturn AudioSignal.extract(source, {\n\t\t\textractionMode: this.extractionMode,\n\t\t\tattackMs: this.attackMs,\n\t\t\treleaseMs: this.releaseMs,\n\t\t\tsensitivity: this.sensitivity,\n\t\t\tnoiseFloorDb: this.noiseFloorDb,\n\t\t\tdynamicRangeDb: this.dynamicRangeDb,\n\t\t\tsmoothing: this.smoothing,\n\t\t\tcurve: this.curve,\n\t\t\tbeatThreshold: this.beatThreshold,\n\t\t\tbeatDecayMs: this.beatDecayMs,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\t...options,\n\t\t});\n\t}\n}\n\n// ─── Batch 1: Core Tonal, Color & Filter Effects ────────────────────────────\n\nexport interface CurvesChannelPoint {\n\tx: number;\n\ty: number;\n}\n\nexport interface CurvesProps {\n\tcurveType?: \"rgb\" | \"hue-vs-hue\" | \"hue-vs-sat\" | \"lum-vs-sat\" | \"sat-vs-sat\";\n\tmaster?: CurvesChannelPoint[];\n\tred?: CurvesChannelPoint[];\n\tgreen?: CurvesChannelPoint[];\n\tblue?: CurvesChannelPoint[];\n\thueVsHue?: CurvesChannelPoint[];\n\thueVsSat?: CurvesChannelPoint[];\n\tlumVsSat?: CurvesChannelPoint[];\n\tsatVsSat?: CurvesChannelPoint[];\n}\n\nexport class Curves extends Effect<CurvesProps> {\n\tpublic readonly op = \"Curves\";\n\n\tpublic declare curveType: CurvesProps[\"curveType\"];\n\tpublic declare master: CurvesChannelPoint[];\n\tpublic declare red: CurvesChannelPoint[];\n\tpublic declare green: CurvesChannelPoint[];\n\tpublic declare blue: CurvesChannelPoint[];\n\tpublic declare hueVsHue: CurvesChannelPoint[];\n\tpublic declare hueVsSat: CurvesChannelPoint[];\n\tpublic declare lumVsSat: CurvesChannelPoint[];\n\tpublic declare satVsSat: CurvesChannelPoint[];\n\n\tconstructor(config: CurvesProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tcurveType: config.curveType ?? \"rgb\",\n\t\t\tmaster: config.master ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tred: config.red ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tgreen: config.green ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tblue: config.blue ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\thueVsHue: config.hueVsHue ?? [\n\t\t\t\t{ x: 0, y: 0.5 },\n\t\t\t\t{ x: 1, y: 0.5 },\n\t\t\t],\n\t\t\thueVsSat: config.hueVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tlumVsSat: config.lumVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tsatVsSat: config.satVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t});\n\t}\n}\n\nexport interface SelectiveColorAdjustment {\n\tcyan: number;\n\tmagenta: number;\n\tyellow: number;\n\tblack: number;\n}\n\nexport interface SelectiveColorProps {\n\tmethod?: \"Relative\" | \"Absolute\";\n\treds?: Partial<SelectiveColorAdjustment>;\n\tyellows?: Partial<SelectiveColorAdjustment>;\n\tgreens?: Partial<SelectiveColorAdjustment>;\n\tcyans?: Partial<SelectiveColorAdjustment>;\n\tblues?: Partial<SelectiveColorAdjustment>;\n\tmagentas?: Partial<SelectiveColorAdjustment>;\n\twhites?: Partial<SelectiveColorAdjustment>;\n\tneutrals?: Partial<SelectiveColorAdjustment>;\n\tblacks?: Partial<SelectiveColorAdjustment>;\n}\n\nexport class SelectiveColor extends Effect<SelectiveColorProps> {\n\tpublic readonly op = \"SelectiveColor\";\n\n\tpublic declare method: \"Relative\" | \"Absolute\";\n\tpublic declare reds: SelectiveColorAdjustment;\n\tpublic declare yellows: SelectiveColorAdjustment;\n\tpublic declare greens: SelectiveColorAdjustment;\n\tpublic declare cyans: SelectiveColorAdjustment;\n\tpublic declare blues: SelectiveColorAdjustment;\n\tpublic declare magentas: SelectiveColorAdjustment;\n\tpublic declare whites: SelectiveColorAdjustment;\n\tpublic declare neutrals: SelectiveColorAdjustment;\n\tpublic declare blacks: SelectiveColorAdjustment;\n\n\tconstructor(config: SelectiveColorProps = {}) {\n\t\tconst defaultAdj: SelectiveColorAdjustment = {\n\t\t\tcyan: 0,\n\t\t\tmagenta: 0,\n\t\t\tyellow: 0,\n\t\t\tblack: 0,\n\t\t};\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmethod: config.method ?? \"Relative\",\n\t\t\treds: { ...defaultAdj, ...config.reds },\n\t\t\tyellows: { ...defaultAdj, ...config.yellows },\n\t\t\tgreens: { ...defaultAdj, ...config.greens },\n\t\t\tcyans: { ...defaultAdj, ...config.cyans },\n\t\t\tblues: { ...defaultAdj, ...config.blues },\n\t\t\tmagentas: { ...defaultAdj, ...config.magentas },\n\t\t\twhites: { ...defaultAdj, ...config.whites },\n\t\t\tneutrals: { ...defaultAdj, ...config.neutrals },\n\t\t\tblacks: { ...defaultAdj, ...config.blacks },\n\t\t});\n\t}\n}\n\nexport interface GradientMapStop {\n\tposition: number;\n\tcolor: string;\n}\n\nexport interface GradientMapProps {\n\tstops?: GradientMapStop[];\n\tsmooth?: boolean;\n\tdither?: boolean;\n\topacity?: EffectProp<number>;\n}\n\nexport class GradientMap extends Effect<GradientMapProps> {\n\tpublic readonly op = \"GradientMap\";\n\n\tpublic declare stops: GradientMapStop[];\n\tpublic declare smooth: boolean;\n\tpublic declare dither: boolean;\n\tpublic declare opacity: number;\n\n\tconstructor(config: GradientMapProps = {}) {\n\t\tconst defaultStops: GradientMapStop[] = [\n\t\t\t{ position: 0.0, color: \"#000000\" },\n\t\t\t{ position: 1.0, color: \"#ffffff\" },\n\t\t];\n\t\tsuper({\n\t\t\t...config,\n\t\t\tstops: config.stops ?? defaultStops,\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tdither: config.dither ?? true,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface ShadowsHighlightsProps {\n\tshadowAmount?: EffectProp<number>;\n\tshadowTonalWidth?: EffectProp<number>;\n\tshadowRadius?: EffectProp<number>;\n\thighlightAmount?: EffectProp<number>;\n\thighlightTonalWidth?: EffectProp<number>;\n\thighlightRadius?: EffectProp<number>;\n\tcolorCorrection?: EffectProp<number>;\n\tmidtoneContrast?: EffectProp<number>;\n}\n\nexport class ShadowsHighlights extends Effect<ShadowsHighlightsProps> {\n\tpublic readonly op = \"ShadowsHighlights\";\n\n\tpublic declare shadowAmount: number;\n\tpublic declare shadowTonalWidth: number;\n\tpublic declare shadowRadius: number;\n\tpublic declare highlightAmount: number;\n\tpublic declare highlightTonalWidth: number;\n\tpublic declare highlightRadius: number;\n\tpublic declare colorCorrection: number;\n\tpublic declare midtoneContrast: number;\n\n\tconstructor(config: ShadowsHighlightsProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshadowAmount: config.shadowAmount ?? 0,\n\t\t\tshadowTonalWidth: config.shadowTonalWidth ?? 50,\n\t\t\tshadowRadius: config.shadowRadius ?? 30,\n\t\t\thighlightAmount: config.highlightAmount ?? 0,\n\t\t\thighlightTonalWidth: config.highlightTonalWidth ?? 50,\n\t\t\thighlightRadius: config.highlightRadius ?? 30,\n\t\t\tcolorCorrection: config.colorCorrection ?? 0,\n\t\t\tmidtoneContrast: config.midtoneContrast ?? 0,\n\t\t});\n\t}\n}\n\nexport interface ApplyLUTProps {\n\tlutUrl?: string;\n\tintensity?: EffectProp<number>;\n}\n\nexport class ApplyLUT extends Effect<ApplyLUTProps> {\n\tpublic readonly op = \"ApplyLUT\";\n\n\tpublic declare lutUrl: string;\n\tpublic declare intensity: number;\n\n\tconstructor(config: ApplyLUTProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tlutUrl: config.lutUrl ?? \"\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface UnsharpMaskProps {\n\tamount?: EffectProp<number>;\n\tradius?: EffectProp<number>;\n\tthreshold?: EffectProp<number>;\n}\n\nexport class UnsharpMask extends Effect<UnsharpMaskProps> {\n\tpublic readonly op = \"UnsharpMask\";\n\n\tpublic declare amount: number;\n\tpublic declare radius: number;\n\tpublic declare threshold: number;\n\n\tconstructor(config: UnsharpMaskProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tamount: config.amount ?? 100,\n\t\t\tradius: config.radius ?? 1.5,\n\t\t\tthreshold: config.threshold ?? 3,\n\t\t});\n\t}\n}\n\nexport interface HighPassProps {\n\tradius?: EffectProp<number>;\n\tcontrastBoost?: EffectProp<number>;\n\tmonochrome?: boolean;\n}\n\nexport class HighPass extends Effect<HighPassProps> {\n\tpublic readonly op = \"HighPass\";\n\n\tpublic declare radius: number;\n\tpublic declare contrastBoost: number;\n\tpublic declare monochrome: boolean;\n\n\tconstructor(config: HighPassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 3.0,\n\t\t\tcontrastBoost: config.contrastBoost ?? 1.0,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t});\n\t}\n}\n\nexport type HalftoneDotShape = \"Circle\" | \"Diamond\" | \"Line\" | \"Square\";\nexport type HalftoneMode = \"Monochrome\" | \"CMYK\";\n\nexport interface HalftoneScreenProps {\n\tmode?: HalftoneMode;\n\tdotShape?: HalftoneDotShape;\n\tfrequency?: EffectProp<number>;\n\tangle?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\tdotColor?: string;\n\tpaperColor?: string;\n\tsmooth?: boolean;\n\tinvert?: boolean;\n\tcyanAngle?: EffectProp<number>;\n\tmagentaAngle?: EffectProp<number>;\n\tyellowAngle?: EffectProp<number>;\n\tblackAngle?: EffectProp<number>;\n\topacity?: EffectProp<number>;\n}\n\nexport class HalftoneScreen extends Effect<HalftoneScreenProps> {\n\tpublic readonly op = \"HalftoneScreen\";\n\n\tpublic declare mode: HalftoneMode;\n\tpublic declare dotShape: HalftoneDotShape;\n\tpublic declare frequency: number;\n\tpublic declare angle: number;\n\tpublic declare contrast: number;\n\tpublic declare dotColor: string;\n\tpublic declare paperColor: string;\n\tpublic declare smooth: boolean;\n\tpublic declare invert: boolean;\n\tpublic declare cyanAngle: number;\n\tpublic declare magentaAngle: number;\n\tpublic declare yellowAngle: number;\n\tpublic declare blackAngle: number;\n\tpublic declare opacity: number;\n\n\tconstructor(config: HalftoneScreenProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmode: config.mode ?? \"Monochrome\",\n\t\t\tdotShape: config.dotShape ?? \"Circle\",\n\t\t\tfrequency: config.frequency ?? 30,\n\t\t\tangle: config.angle ?? 45,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\tdotColor: config.dotColor ?? \"#000000\",\n\t\t\tpaperColor: config.paperColor ?? \"#ffffff\",\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tinvert: config.invert ?? false,\n\t\t\tcyanAngle: config.cyanAngle ?? 15,\n\t\t\tmagentaAngle: config.magentaAngle ?? 75,\n\t\t\tyellowAngle: config.yellowAngle ?? 0,\n\t\t\tblackAngle: config.blackAngle ?? 45,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport type TileOffsetEdgeMode = \"wrap\" | \"clamp\" | \"transparent\" | \"mirror\";\n\nexport interface TileOffsetProps {\n\toffsetX?: EffectProp<number>;\n\toffsetY?: EffectProp<number>;\n\twrap?: boolean;\n\tedgeMode?: TileOffsetEdgeMode;\n}\n\nexport class TileOffset extends Effect<TileOffsetProps> {\n\tpublic readonly op = \"TileOffset\";\n\n\tpublic declare offsetX: number;\n\tpublic declare offsetY: number;\n\tpublic declare wrap: boolean;\n\tpublic declare edgeMode: TileOffsetEdgeMode;\n\n\tconstructor(config: TileOffsetProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\toffsetX: config.offsetX ?? 0,\n\t\t\toffsetY: config.offsetY ?? 0,\n\t\t\twrap: config.wrap ?? true,\n\t\t\tedgeMode: config.edgeMode ?? \"wrap\",\n\t\t});\n\t}\n}\n\nexport interface MotionBlurProps {\n\tshutterAngle?: EffectProp<number>;\n\tsamples?: EffectProp<number>;\n\tmaxVelocity?: EffectProp<number>;\n\tshutterCurve?: \"box\" | \"gaussian\" | \"triangle\";\n\tdepthAware?: boolean;\n}\n\nexport class MotionBlur extends Effect<MotionBlurProps> {\n\tpublic readonly op = \"MotionBlur\";\n\n\tpublic declare shutterAngle: number;\n\tpublic declare samples: number;\n\tpublic declare maxVelocity: number;\n\tpublic declare shutterCurve: \"box\" | \"gaussian\" | \"triangle\";\n\tpublic declare depthAware: boolean;\n\n\tconstructor(config: MotionBlurProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshutterAngle: config.shutterAngle ?? 180,\n\t\t\tsamples: config.samples ?? 16,\n\t\t\tmaxVelocity: config.maxVelocity ?? 64,\n\t\t\tshutterCurve: config.shutterCurve ?? \"gaussian\",\n\t\t\tdepthAware: config.depthAware ?? true,\n\t\t});\n\t}\n}\n\nexport interface SSAOProps {\n\tradius?: EffectProp<number>;\n\tbias?: EffectProp<number>;\n\tintensity?: EffectProp<number>;\n\tkernelSamples?: EffectProp<number>;\n\tblurRadius?: EffectProp<number>;\n}\n\nexport class SSAO extends Effect<SSAOProps> {\n\tpublic readonly op = \"SSAO\";\n\n\tpublic declare radius: number;\n\tpublic declare bias: number;\n\tpublic declare intensity: number;\n\tpublic declare kernelSamples: number;\n\tpublic declare blurRadius: number;\n\n\tconstructor(config: SSAOProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 45,\n\t\t\tbias: config.bias ?? 0.025,\n\t\t\tintensity: config.intensity ?? 1.5,\n\t\t\tkernelSamples: config.kernelSamples ?? 16,\n\t\t\tblurRadius: config.blurRadius ?? 4,\n\t\t});\n\t}\n}\n\nexport interface PBRGlassProps {\n\tior?: EffectProp<number>;\n\troughness?: EffectProp<number>;\n\ttransmission?: EffectProp<number>;\n\tdispersion?: EffectProp<number>;\n\tfresnelPower?: EffectProp<number>;\n\ttintColor?: EffectProp<string>;\n}\n\nexport class PBRGlass extends Effect<PBRGlassProps> {\n\tpublic readonly op = \"PBRGlass\";\n\n\tpublic declare ior: number;\n\tpublic declare roughness: number;\n\tpublic declare transmission: number;\n\tpublic declare dispersion: number;\n\tpublic declare fresnelPower: number;\n\tpublic declare tintColor: string;\n\n\tconstructor(config: PBRGlassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tior: config.ior ?? 1.49,\n\t\t\troughness: config.roughness ?? 0.15,\n\t\t\ttransmission: config.transmission ?? 0.92,\n\t\t\tdispersion: config.dispersion ?? 0.015,\n\t\t\tfresnelPower: config.fresnelPower ?? 5.0,\n\t\t\ttintColor: config.tintColor ?? \"#ffffff\",\n\t\t});\n\t}\n}\n\nexport interface DepthOfFieldProps {\n\tfocusDistance?: EffectProp<number>;\n\tfocalLength?: EffectProp<number>;\n\taperture?: EffectProp<number>;\n\tmaxBlur?: EffectProp<number>;\n\tquality?: \"low\" | \"medium\" | \"high\" | \"ultra\";\n}\n\nexport class DepthOfField extends Effect<DepthOfFieldProps> {\n\tpublic readonly op = \"DepthOfField\";\n\n\tpublic declare focusDistance: number;\n\tpublic declare focalLength: number;\n\tpublic declare aperture: number;\n\tpublic declare maxBlur: number;\n\tpublic declare quality: string;\n\n\tconstructor(config: DepthOfFieldProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tfocusDistance: config.focusDistance ?? 500,\n\t\t\tfocalLength: config.focalLength ?? 50,\n\t\t\taperture: config.aperture ?? 2.8,\n\t\t\tmaxBlur: config.maxBlur ?? 16,\n\t\t\tquality: config.quality ?? \"high\",\n\t\t});\n\t}\n}\n\nexport interface CropProps {\n\tcropType?: \"rect\" | \"path\";\n\tleftPercentage?: EffectProp<number>;\n\ttopPercentage?: EffectProp<number>;\n\twidthPercentage?: EffectProp<number>;\n\theightPercentage?: EffectProp<number>;\n\troundness?: EffectProp<number>;\n\tpathPoints?: { x: number; y: number }[];\n\tmode?: \"cropped\" | \"rest\";\n}\n\nexport class Crop extends Effect<CropProps> {\n\tpublic readonly op = \"Crop\";\n\n\tpublic declare cropType: \"rect\" | \"path\";\n\tpublic declare leftPercentage: number;\n\tpublic declare topPercentage: number;\n\tpublic declare widthPercentage: number;\n\tpublic declare heightPercentage: number;\n\tpublic declare roundness: number;\n\tpublic declare pathPoints?: { x: number; y: number }[];\n\tpublic declare mode?: \"cropped\" | \"rest\";\n\n\tconstructor(config: CropProps = {}) {\n\t\tsuper({\n\t\t\tcropType: config.cropType ?? \"rect\",\n\t\t\tleftPercentage: config.leftPercentage ?? 0,\n\t\t\ttopPercentage: config.topPercentage ?? 0,\n\t\t\twidthPercentage: config.widthPercentage ?? 100,\n\t\t\theightPercentage: config.heightPercentage ?? 100,\n\t\t\troundness: config.roundness ?? 0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface VisionProps {\n\t/** Track COCO-80 objects (RTMDet-Ins boxes). Default true. */\n\tenableDetection?: boolean;\n\t/** Per-instance masks (RTMDet-Ins). Shares the detection pass. */\n\tenableSegmentation?: boolean;\n\t/** COCO-17 keypoints per person (RTMO). */\n\tenablePose?: boolean;\n\t/** Fast person-vs-background alpha (Selfie Segmenter). */\n\tenableMatte?: boolean;\n\t/** COCO class-name filter (all classes when omitted). */\n\tclasses?: readonly string[];\n\t/** Minimum detection score, 0..1. Default 0.3. */\n\tconfidence?: number;\n\t/** Model size: `t` fastest · `s` default · `m` most accurate. */\n\tvariant?: \"t\" | \"s\" | \"m\";\n\tmode?:\n\t\t| \"passthrough\"\n\t\t| \"mask\"\n\t\t| \"matte\"\n\t\t| \"crop\"\n\t\t| \"skeleton\"\n\t\t| \"boxes\"\n\t\t| \"tracking\";\n\t/**\n\t * Subject alpha for mask/matte/crop: instance masks (default; any COCO class) or the\n\t * selfie matte (fastest, but only reliable when a person fills much of the frame).\n\t */\n\tmatteSource?: \"instance\" | \"selfie\";\n\t/** Frames a track may go unseen before it is dropped. Default 15. */\n\tmaxMissedFrames?: number;\n\tmodelsDir?: string;\n\tbaseUrl?: string;\n\tmaskThreshold?: number;\n\tfeatherRadius?: number;\n\t/** Grow the subject into connected pixels that stand out from the backdrop. */\n\tkeyBackground?: boolean;\n\t/** Colour-distance threshold for the background key (lower → more growth). Default 70. */\n\tbackgroundKeyThreshold?: number;\n\tvisionBundle?: unknown;\n}\n\n/**\n * On-device vision: tracks objects, segments instances, estimates pose and mattes people on\n * the rendered frame, feeding reactive signals. Models download lazily on first use.\n */\nexport class Vision extends Effect<VisionProps> {\n\tpublic readonly op = \"Vision\";\n\n\tpublic declare enableDetection?: boolean;\n\tpublic declare enableSegmentation?: boolean;\n\tpublic declare enablePose?: boolean;\n\tpublic declare enableMatte?: boolean;\n\tpublic declare classes?: readonly string[];\n\tpublic declare confidence?: number;\n\tpublic declare variant?: VisionProps[\"variant\"];\n\tpublic declare mode?: VisionProps[\"mode\"];\n\tpublic declare matteSource?: VisionProps[\"matteSource\"];\n\tpublic declare maxMissedFrames?: number;\n\tpublic declare modelsDir?: string;\n\tpublic declare baseUrl?: string;\n\tpublic declare maskThreshold?: number;\n\tpublic declare featherRadius?: number;\n\tpublic declare keyBackground?: boolean;\n\tpublic declare backgroundKeyThreshold?: number;\n\tpublic declare visionBundle?: unknown;\n\n\tconstructor(config: VisionProps = {}) {\n\t\tsuper({\n\t\t\tenableDetection: config.enableDetection !== false,\n\t\t\tenableSegmentation: config.enableSegmentation === true,\n\t\t\tenablePose: config.enablePose === true,\n\t\t\tenableMatte: config.enableMatte === true,\n\t\t\tconfidence: config.confidence ?? 0.3,\n\t\t\tvariant: config.variant ?? \"s\",\n\t\t\tmode: config.mode ?? \"passthrough\",\n\t\t\tmatteSource: config.matteSource ?? \"instance\",\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface Relight3DProps {\n\tlightType?: \"Point\" | \"Spot\" | \"Directional\" | \"Rim\";\n\tintensity?: EffectProp<number>;\n\tlightPosX?: EffectProp<number>;\n\tlightPosY?: EffectProp<number>;\n\tlightPosZ?: EffectProp<number>;\n\tlightRadius?: EffectProp<number>;\n\tspotConeAngle?: EffectProp<number>;\n\tspecularRoughness?: EffectProp<number>;\n\tspecularStrength?: EffectProp<number>;\n\tmetallic?: EffectProp<number>;\n\tambientIntensity?: EffectProp<number>;\n\tvolumetricDensity?: EffectProp<number>;\n\tdepthScale?: EffectProp<number>;\n\tdepthInvert?: boolean;\n\tlightColor?: string;\n\tambientColor?: string;\n\tnormalMap?: unknown;\n}\n\nexport class Relight3D extends Effect<Relight3DProps> {\n\tpublic readonly op = \"Relight3D\";\n\n\tpublic declare lightType: Relight3DProps[\"lightType\"];\n\tpublic declare intensity: number;\n\tpublic declare lightPosX: number;\n\tpublic declare lightPosY: number;\n\tpublic declare lightPosZ: number;\n\tpublic declare lightRadius: number;\n\tpublic declare spotConeAngle: number;\n\tpublic declare specularRoughness: number;\n\tpublic declare specularStrength: number;\n\tpublic declare metallic: number;\n\tpublic declare ambientIntensity: number;\n\tpublic declare volumetricDensity: number;\n\tpublic declare depthScale: number;\n\tpublic declare depthInvert: boolean;\n\tpublic declare lightColor: string;\n\tpublic declare ambientColor: string;\n\tpublic declare normalMap: unknown;\n\n\tconstructor(config: Relight3DProps = {}) {\n\t\tsuper({\n\t\t\tlightType: config.lightType ?? \"Point\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t\tlightPosX: config.lightPosX ?? 0.5,\n\t\t\tlightPosY: config.lightPosY ?? 0.5,\n\t\t\tlightPosZ: config.lightPosZ ?? 0.3,\n\t\t\tlightRadius: config.lightRadius ?? 0.8,\n\t\t\tspotConeAngle: config.spotConeAngle ?? 45,\n\t\t\tspecularRoughness: config.specularRoughness ?? 0.35,\n\t\t\tspecularStrength: config.specularStrength ?? 0.7,\n\t\t\tmetallic: config.metallic ?? 0.0,\n\t\t\tambientIntensity: config.ambientIntensity ?? 0.4,\n\t\t\tvolumetricDensity: config.volumetricDensity ?? 0.2,\n\t\t\tdepthScale: config.depthScale ?? 1.0,\n\t\t\tdepthInvert: config.depthInvert ?? false,\n\t\t\tlightColor: config.lightColor ?? \"#ffffff\",\n\t\t\tambientColor: config.ambientColor ?? \"#ffffff\",\n\t\t\tnormalMap: config.normalMap,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface DeflickerProps {\n\tblendWeight?: EffectProp<number>;\n\tdisocclusionThreshold?: EffectProp<number>;\n\tmaxMotionPixels?: EffectProp<number>;\n\tscale?: number;\n\twindowSize?: number;\n}\n\nexport class TemporalDeflicker extends Effect<DeflickerProps> {\n\tpublic readonly op = \"TemporalDeflicker\";\n\n\tpublic declare blendWeight: number;\n\tpublic declare disocclusionThreshold: number;\n\tpublic declare maxMotionPixels: number;\n\tpublic declare scale: number;\n\tpublic declare windowSize: number;\n\n\tconstructor(config: DeflickerProps = {}) {\n\t\tsuper({\n\t\t\tblendWeight: config.blendWeight ?? 0.35,\n\t\t\tdisocclusionThreshold: config.disocclusionThreshold ?? 0.15,\n\t\t\tmaxMotionPixels: config.maxMotionPixels ?? 64.0,\n\t\t\tscale: config.scale ?? 0.5,\n\t\t\twindowSize: config.windowSize ?? 2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface ModulateProps {\n\thue?: EffectProp<number>;\n\tbrightness?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\texposure?: EffectProp<number>;\n\tsaturation?: EffectProp<number>;\n\tsepia?: EffectProp<number>;\n}\n\nexport class Modulate extends Effect<ModulateProps> {\n\tpublic readonly op = \"Modulate\";\n\n\tpublic declare hue: number;\n\tpublic declare brightness: number;\n\tpublic declare contrast: number;\n\tpublic declare exposure: number;\n\tpublic declare saturation: number;\n\tpublic declare sepia: number;\n\n\tconstructor(config: ModulateProps = {}) {\n\t\tsuper({\n\t\t\thue: config.hue ?? 0,\n\t\t\tbrightness: config.brightness ?? 1.0,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\texposure: config.exposure ?? 0.0,\n\t\t\tsaturation: config.saturation ?? 1.0,\n\t\t\tsepia: config.sepia ?? 0.0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n"],"mappings":"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ACvE;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,GAAG;GACF,KAAK;GACL,KAAK;GACL;EACD;CACD,aAAa;EACZ,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD;CACD,MAAM;EACL,UAAU,EACT,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,aAAa,EAAE;EACf,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,OAAO,EACN,MAAM;GAAC;GAAW;GAAU;GAAO,EACnC;EACD;CACD,kBAAkB;EACjB,cAAc,EACb,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD,gBAAgB;GACf,KAAK;GACL,KAAK;GACL;EACD,aAAa;GACZ,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,cAAc;GACb,KAAK;GACL,KAAK;GACL;EACD,aAAa,EAAE;EACf;CACD,eAAe;EACd,YAAY,EACX,MAAM;GAAC;GAAQ;GAAQ;GAAQ;GAAM,EACrC;EACD,iBAAiB;GAChB,KAAK;GACL,KAAK;GACL;EACD;CACD,iBAAiB,EAChB,YAAY,EACX,MAAM;EAAC;EAAQ;EAAQ;EAAQ;EAAM,EACrC,EACD;CACD,cAAc;EACb,SAAS,EACR,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,UAAU,EACT,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,YAAY,EACX,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,oBAAoB,EAAE;EACtB;CACD,UAAU;EACT,UAAU,EAAE;EACZ,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,kBAAkB;GACjB,KAAK;GACL,KAAK;GACL;EACD,YAAY,EACX,MAAM,CAAC,OAAO,MAAM,EACpB;EACD,sBAAsB,EACrB,MAAM;GAAC;GAAc;GAAc;GAAO,EAC1C;EACD;CACD,WAAW,EACV,QAAQ,EAAE,EACV;CACD,iBAAiB;EAChB,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,UAAU,EACT,MAAM;GAAC;GAAO;GAAS;GAAQ;GAAS;GAAY,EACpD;EACD,UAAU,EACT,MAAM;GAAC;GAAO;GAAS;GAAQ;GAAS;GAAY,EACpD;EACD,UAAU,EACT,MAAM;GAAC;GAAS;GAAU;GAAS,EACnC;EACD;CACD,YAAY;EACX,UAAU,EACT,MAAM,CAAC,iBAAiB,cAAc,EACtC;EACD,cAAc;GACb,KAAK;GACL,KAAK;GACL;EACD;CACD,MAAM;EACL,YAAY,EAAE;EACd,UAAU,EAAE;EACZ,UAAU,EAAE;EACZ,MAAM,EACL,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,UAAU,EACT,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD;CACD,UAAU;EACT,WAAW,EAAE;EACb,gBAAgB;GACf,KAAK;GACL,KAAK;GACL;EACD,eAAe,EACd,MAAM,CAAC,UAAU,SAAS,EAC1B;EACD,aAAa,EACZ,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD;CACD,YAAY;EACX,YAAY,EACX,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,OAAO;IACN,KAAK;IACL,KAAK;IACL;GACD,UAAU;IACT,KAAK;IACL,KAAK;IACL;GACD,QAAQ;IACP,KAAK;IACL,KAAK;IACL;GACD,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,aAAa,EACZ,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,OAAO;IACN,KAAK;IACL,KAAK;IACL;GACD,UAAU;IACT,KAAK;IACL,KAAK;IACL;GACD,OAAO;IACN,KAAK;IACL,KAAK;IACL;GACD,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,WAAW,EACV,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,QAAQ;IACP,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,WAAW,EACV,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,QAAQ;IACP,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,QAAQ,EACP,OAAO;GACN,SAAS,EAAE;GACX,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,UAAU,EACT,MAAM;IAAC;IAAU;IAAU;IAAU,EACrC;GACD,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,aAAa,EACZ,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EACN,MAAM;IAAC;IAAc;IAAc;IAAU;IAAe,EAC5D;GACD,WAAW,EACV,MAAM;IAAC;IAAU;IAAc;IAAa,EAC5C;GACD,OAAO;IACN,KAAK;IACL,KAAK;IACL;GACD,WAAW,EACV,MAAM,CAAC,MAAM,OAAO,EACpB;GACD,MAAM;IACL,KAAK;IACL,KAAK;IACL;GACD,QAAQ;IACP,KAAK;IACL,KAAK;IACL;GACD,OAAO;IACN,KAAK;IACL,KAAK;IACL;GACD,UAAU;IACT,KAAK;IACL,KAAK;IACL;GACD,gBAAgB,EAAE;GAClB,kBAAkB;IACjB,KAAK;IACL,KAAK;IACL;GACD,aAAa,EAAE;GACf,eAAe;IACd,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,cAAc,EACb,OAAO;GACN,SAAS,EAAE;GACX,OAAO,EAAE;GACT,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,WAAW,EAAE;GACb,EACD;EACD,yBAAyB,EAAE;EAC3B,4BAA4B,EAAE;EAC9B,0BAA0B,EAAE;EAC5B,wBAAwB,EAAE;EAC1B,2BAA2B,EAAE;EAC7B,0BAA0B,EAAE;EAC5B,6BAA6B,EAAE;EAC/B,0BAA0B,EAAE;EAC5B,yBAAyB,EAAE;EAC3B,4BAA4B,EAAE;EAC9B,uBAAuB,EAAE;EACzB,yBAAyB,EAAE;EAC3B,0BAA0B,EAAE;EAC5B,uBAAuB,EAAE;EACzB,yBAAyB,EAAE;EAC3B,0BAA0B,EAAE;EAC5B,oBAAoB,EAAE;EACtB,uBAAuB,EAAE;EACzB,0BAA0B,EAAE;EAC5B,yBAAyB,EAAE;EAC3B,2BAA2B,EAAE;EAC7B,0BAA0B,EAAE;EAC5B,6BAA6B,EAAE;EAC/B,qCAAqC,EAAE;EACvC,kCAAkC,EAAE;EACpC,6BAA6B,EAAE;EAC/B;CACD,SAAS,EACR,YAAY,EAAE,EACd;CACD,UAAU;EACT,WAAW,EACV,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,UAAU,EACT,MAAM;GAAC;GAAS;GAAa;GAAO;GAAS;GAAO,EACpD;EACD,UAAU,EACT,MAAM;GAAC;GAAS;GAAa;GAAO;GAAS;GAAO,EACpD;EACD,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,cAAc,EACb,MAAM;GAAC;GAAkB;GAAgB;GAAa;GAAiB,EACvE;EACD;CACD,UAAU;EACT,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,QAAQ,EAAE;EACV;CACD,gBAAgB;EACf,WAAW,EACV,MAAM;GAAC;GAAU;GAAW;GAAU,EACtC;EACD,YAAY,EACX,MAAM,CAAC,SAAS,QAAQ,EACxB;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,aAAa;GACZ,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,YAAY,EAAE;EACd,UAAU,EAAE;EACZ,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD;CACD,OAAO;EACN,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,gBAAgB,EAAE;EAClB,aAAa,EAAE;EACf,iBAAiB,EAAE;EACnB,SAAS,EAAE;EACX;CACD,WAAW;EACV,SAAS,EAAE;EACX,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,cAAc;GACb,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,MAAM,EACL,MAAM;GAAC;GAAS;GAAgB;GAAkB,EAClD;EACD;CACD,eAAe;EACd,YAAY,EACX,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,YAAY,EACX,MAAM,CAAC,SAAS,QAAQ,EACxB;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,MAAM;GACL,KAAK;GACL,KAAK;GACL;EACD,YAAY,EAAE;EACd,UAAU,EAAE;EACZ,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD;CACD,YAAY;EACX,qBAAqB;GACpB,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,cAAc,EACb,MAAM;GAAC;GAAS;GAAa;GAAO;GAAS;GAAO,EACpD;EACD,YAAY,EACX,MAAM;GAAC;GAAa;GAAa;GAAoB,EACrD;EACD;CACD,sBAAsB;EACrB,KAAK;GACJ,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,iBAAiB;GAChB,KAAK;GACL,KAAK;GACL;EACD,mBAAmB;GAClB,KAAK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"}
|
package/dist/fonts/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as registerHeadlessFont, y as SlugFontCache } from "./dist-
|
|
1
|
+
import { $ as registerHeadlessFont, y as SlugFontCache } from "./dist-sHqWCB9M.mjs";
|
|
2
2
|
import * as fontkit from "fontkit";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
@@ -196,4 +196,4 @@ var FontManager = class FontManager {
|
|
|
196
196
|
|
|
197
197
|
//#endregion
|
|
198
198
|
export { FontManager as t };
|
|
199
|
-
//# sourceMappingURL=fonts-
|
|
199
|
+
//# sourceMappingURL=fonts-CuG-05-_.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fonts-C_AWIMdb.mjs","names":[],"sources":["../src/fonts/manager.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tregisterHeadlessFont,\n\tSlugFontCache,\n} from \"@framefields/webgpu-renderers\";\nimport * as fontkit from \"fontkit\";\n\nexport interface RegisterFontOptions {\n\tfamily?: string;\n\tsource: string | Uint8Array;\n\tweight?: number | string;\n\tstyle?: \"normal\" | \"italic\" | \"oblique\";\n}\n\nexport interface RegisteredFont {\n\tfamily: string;\n\tsource: string | Uint8Array;\n\tfilePath?: string;\n\tformat: \"truetype\" | \"opentype\";\n\tpostscriptName?: string;\n\tunitsPerEm?: number;\n\tweight?: number | string;\n\tstyle?: string;\n}\n\ninterface ResolvedSource {\n\tbuffer: Uint8Array;\n\tfilePath?: string;\n}\n\nconst SFNT_TRUETYPE_1 = 0x00010000;\nconst SFNT_TRUETYPE_TRUE = 0x74727565; // 'true'\nconst SFNT_TRUETYPE_TYP1 = 0x74797031; // 'typ1'\nconst SFNT_OPENTYPE_CFF = 0x4f54544f; // 'OTTO'\nconst SFNT_COLLECTION = 0x74746366; // 'ttcf'\n\nfunction validateFontBinaryHeader(\n\tbytes: Uint8Array,\n\tsourceLabel: string,\n): \"truetype\" | \"opentype\" {\n\tif (bytes.length < 12) {\n\t\tthrow new Error(\n\t\t\t`Invalid font binary for \"${sourceLabel}\": File size (${bytes.length} bytes) is too small to be a valid TrueType or OpenType font.`,\n\t\t);\n\t}\n\n\tconst tag =\n\t\t((bytes[0] ?? 0) << 24) |\n\t\t((bytes[1] ?? 0) << 16) |\n\t\t((bytes[2] ?? 0) << 8) |\n\t\t(bytes[3] ?? 0);\n\n\tif (\n\t\ttag === SFNT_TRUETYPE_1 ||\n\t\ttag === SFNT_TRUETYPE_TRUE ||\n\t\ttag === SFNT_TRUETYPE_TYP1 ||\n\t\ttag === SFNT_COLLECTION\n\t) {\n\t\treturn \"truetype\";\n\t}\n\n\tif (tag === SFNT_OPENTYPE_CFF) {\n\t\treturn \"opentype\";\n\t}\n\n\tconst hexTag = (tag >>> 0).toString(16).padStart(8, \"0\");\n\tthrow new Error(\n\t\t`Invalid font format for \"${sourceLabel}\": Expected a valid TrueType (.ttf) or OpenType (.otf) font binary. Found header tag: 0x${hexTag}.`,\n\t);\n}\n\nasync function resolveSourceBuffer(\n\tsource: string | Uint8Array,\n): Promise<ResolvedSource> {\n\tif (source instanceof Uint8Array) {\n\t\treturn { buffer: source };\n\t}\n\n\tif (typeof source !== \"string\") {\n\t\tthrow new TypeError(\n\t\t\t`Font source must be a file path string or Uint8Array, received: ${typeof source}`,\n\t\t);\n\t}\n\n\tlet cleanPath = source;\n\tif (cleanPath.startsWith(\"http://\") || cleanPath.startsWith(\"https://\")) {\n\t\tconst res = await fetch(cleanPath);\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to download font from \"${cleanPath}\": HTTP ${res.status} ${res.statusText}`,\n\t\t\t);\n\t\t}\n\t\tconst arrayBuffer = await res.arrayBuffer();\n\t\treturn {\n\t\t\tbuffer: new Uint8Array(arrayBuffer),\n\t\t\tfilePath: cleanPath,\n\t\t};\n\t}\n\n\tif (cleanPath.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tcleanPath = new URL(cleanPath).pathname;\n\t\t} catch {\n\t\t\tcleanPath = cleanPath.replace(/^file:\\/\\//, \"\");\n\t\t}\n\t}\n\n\tconst candidates: string[] = [\n\t\tcleanPath,\n\t\tpath.resolve(process.cwd(), cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", path.basename(cleanPath)),\n\t];\n\n\t// Upward traversal to locate fonts in parent monorepo roots\n\tlet currentDir = process.cwd();\n\tfor (let i = 0; i < 5; i++) {\n\t\tcandidates.push(path.resolve(currentDir, cleanPath));\n\t\tcandidates.push(\n\t\t\tpath.resolve(currentDir, \"assets/fonts\", path.basename(cleanPath)),\n\t\t);\n\t\tconst parent = path.dirname(currentDir);\n\t\tif (parent === currentDir) break;\n\t\tcurrentDir = parent;\n\t}\n\n\tlet resolvedPath: string | null = null;\n\tlet fileBuffer: Buffer | null = null;\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst stat = await fs.stat(candidate);\n\t\t\tif (stat.isFile()) {\n\t\t\t\tresolvedPath = candidate;\n\t\t\t\tfileBuffer = await fs.readFile(candidate);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Continue searching next candidate\n\t\t}\n\t}\n\n\tif (!resolvedPath || !fileBuffer) {\n\t\tthrow new Error(\n\t\t\t`Font file not found: \"${source}\". Checked candidate locations:\\n - ${candidates.join(\"\\n - \")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tbuffer: new Uint8Array(\n\t\t\tfileBuffer.buffer,\n\t\t\tfileBuffer.byteOffset,\n\t\t\tfileBuffer.byteLength,\n\t\t),\n\t\tfilePath: resolvedPath,\n\t};\n}\n\n/**\n * Central singleton manager for font registration, TTF validation, and compositor typography binding.\n */\nexport class FontManager {\n\tprivate static instance: FontManager | null = null;\n\tprivate readonly fonts = new Map<string, RegisteredFont>();\n\n\tprivate constructor() {}\n\n\t/**\n\t * Returns the singleton FontManager instance.\n\t */\n\tpublic static getInstance(): FontManager {\n\t\tif (!FontManager.instance) {\n\t\t\tFontManager.instance = new FontManager();\n\t\t}\n\t\treturn FontManager.instance;\n\t}\n\n\t/**\n\t * Registers a TrueType/OpenType font into the Framefields engine with validation.\n\t */\n\tpublic static async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\treturn FontManager.getInstance().register(optionsOrFamilyOrSource, source);\n\t}\n\n\t/**\n\t * Sets the color emoji font text draws emoji with, for the preview and the\n\t * export alike: a CBDT/CBLC bitmap font such as Noto Color Emoji, as a file\n\t * path, URL or bytes. framefields ships none; without one, exports draw\n\t * nothing for emoji.\n\t */\n\tpublic static async registerEmojiFont(\n\t\tsource: string | Uint8Array,\n\t): Promise<void> {\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(source);\n\t\tconst label =\n\t\t\tfilePath ?? (typeof source === \"string\" ? source : \"Uint8Array\");\n\t\tvalidateFontBinaryHeader(buffer, label);\n\t\tSlugFontCache.setEmojiFont(buffer, filePath);\n\t}\n\n\t/**\n\t * Retrieves registered font metadata by family name.\n\t */\n\tpublic static get(family: string): RegisteredFont | undefined {\n\t\treturn FontManager.getInstance().get(family);\n\t}\n\n\t/**\n\t * Checks if a font family has been registered.\n\t */\n\tpublic static has(family: string): boolean {\n\t\treturn FontManager.getInstance().has(family);\n\t}\n\n\t/**\n\t * Returns all currently registered fonts.\n\t */\n\tpublic static getAll(): RegisteredFont[] {\n\t\treturn FontManager.getInstance().getAll();\n\t}\n\n\t/**\n\t * Returns relative or absolute file paths of all registered fonts for composition spec serialization.\n\t */\n\tpublic static getRegisteredFontPaths(): string[] {\n\t\treturn FontManager.getInstance().getRegisteredFontPaths();\n\t}\n\n\t/**\n\t * Clears all registered fonts from the manager.\n\t */\n\tpublic static clear(): void {\n\t\tFontManager.getInstance().clear();\n\t}\n\n\t/**\n\t * Instance registration method with format validation and Slug WebGPU cache population.\n\t */\n\tpublic async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\tlet family: string | undefined;\n\t\tlet rawSource: string | Uint8Array;\n\t\tlet weight: number | string | undefined;\n\t\tlet style: \"normal\" | \"italic\" | \"oblique\" | undefined;\n\n\t\tif (\n\t\t\ttypeof optionsOrFamilyOrSource === \"object\" &&\n\t\t\toptionsOrFamilyOrSource !== null\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource.family;\n\t\t\trawSource = optionsOrFamilyOrSource.source;\n\t\t\tweight = optionsOrFamilyOrSource.weight;\n\t\t\tstyle = optionsOrFamilyOrSource.style;\n\t\t} else if (\n\t\t\ttypeof optionsOrFamilyOrSource === \"string\" &&\n\t\t\tsource !== undefined\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource;\n\t\t\trawSource = source;\n\t\t} else if (typeof optionsOrFamilyOrSource === \"string\") {\n\t\t\tfamily = undefined;\n\t\t\trawSource = optionsOrFamilyOrSource;\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid arguments passed to FontManager.register\");\n\t\t}\n\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(rawSource);\n\t\tconst sourceLabel =\n\t\t\tfilePath ?? (typeof rawSource === \"string\" ? rawSource : \"Uint8Array\");\n\t\tconst format = validateFontBinaryHeader(buffer, sourceLabel);\n\n\t\tlet parsedFontkit: fontkit.Font;\n\t\ttry {\n\t\t\tconst parsed = fontkit.create(buffer as unknown as Buffer);\n\t\t\tif (\n\t\t\t\tparsed &&\n\t\t\t\t\"fonts\" in parsed &&\n\t\t\t\tArray.isArray(parsed.fonts) &&\n\t\t\t\tparsed.fonts.length > 0\n\t\t\t) {\n\t\t\t\tparsedFontkit = parsed.fonts[0] as fontkit.Font;\n\t\t\t} else {\n\t\t\t\tparsedFontkit = parsed as fontkit.Font;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse TrueType/OpenType font binary for \"${sourceLabel}\": ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tconst detectedFamily =\n\t\t\tparsedFontkit.familyName ||\n\t\t\tparsedFontkit.postscriptName ||\n\t\t\tpath.parse(sourceLabel).name;\n\t\tconst resolvedFamily = family?.trim() || detectedFamily;\n\n\t\tconst registered: RegisteredFont = {\n\t\t\tfamily: resolvedFamily,\n\t\t\tsource: rawSource,\n\t\t\tfilePath,\n\t\t\tformat,\n\t\t\tpostscriptName: parsedFontkit.postscriptName,\n\t\t\tunitsPerEm: parsedFontkit.unitsPerEm,\n\t\t\tweight,\n\t\t\tstyle,\n\t\t};\n\n\t\tthis.fonts.set(resolvedFamily, registered);\n\n\t\t// Populate headless font registries\n\t\tif (filePath) {\n\t\t\tawait registerHeadlessFont(resolvedFamily, filePath);\n\t\t}\n\t\tSlugFontCache.setParsed(resolvedFamily, parsedFontkit);\n\n\t\treturn registered;\n\t}\n\n\tpublic get(family: string): RegisteredFont | undefined {\n\t\treturn this.fonts.get(family);\n\t}\n\n\tpublic has(family: string): boolean {\n\t\treturn this.fonts.has(family);\n\t}\n\n\tpublic getAll(): RegisteredFont[] {\n\t\treturn Array.from(this.fonts.values());\n\t}\n\n\tpublic getRegisteredFontPaths(): string[] {\n\t\tconst paths: string[] = [];\n\t\tfor (const font of this.fonts.values()) {\n\t\t\tif (font.filePath) {\n\t\t\t\tpaths.push(font.filePath);\n\t\t\t} else if (typeof font.source === \"string\") {\n\t\t\t\tpaths.push(font.source);\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.fonts.clear();\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fonts-CuG-05-_.mjs","names":[],"sources":["../src/fonts/manager.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tregisterHeadlessFont,\n\tSlugFontCache,\n} from \"@framefields/webgpu-renderers\";\nimport * as fontkit from \"fontkit\";\n\nexport interface RegisterFontOptions {\n\tfamily?: string;\n\tsource: string | Uint8Array;\n\tweight?: number | string;\n\tstyle?: \"normal\" | \"italic\" | \"oblique\";\n}\n\nexport interface RegisteredFont {\n\tfamily: string;\n\tsource: string | Uint8Array;\n\tfilePath?: string;\n\tformat: \"truetype\" | \"opentype\";\n\tpostscriptName?: string;\n\tunitsPerEm?: number;\n\tweight?: number | string;\n\tstyle?: string;\n}\n\ninterface ResolvedSource {\n\tbuffer: Uint8Array;\n\tfilePath?: string;\n}\n\nconst SFNT_TRUETYPE_1 = 0x00010000;\nconst SFNT_TRUETYPE_TRUE = 0x74727565; // 'true'\nconst SFNT_TRUETYPE_TYP1 = 0x74797031; // 'typ1'\nconst SFNT_OPENTYPE_CFF = 0x4f54544f; // 'OTTO'\nconst SFNT_COLLECTION = 0x74746366; // 'ttcf'\n\nfunction validateFontBinaryHeader(\n\tbytes: Uint8Array,\n\tsourceLabel: string,\n): \"truetype\" | \"opentype\" {\n\tif (bytes.length < 12) {\n\t\tthrow new Error(\n\t\t\t`Invalid font binary for \"${sourceLabel}\": File size (${bytes.length} bytes) is too small to be a valid TrueType or OpenType font.`,\n\t\t);\n\t}\n\n\tconst tag =\n\t\t((bytes[0] ?? 0) << 24) |\n\t\t((bytes[1] ?? 0) << 16) |\n\t\t((bytes[2] ?? 0) << 8) |\n\t\t(bytes[3] ?? 0);\n\n\tif (\n\t\ttag === SFNT_TRUETYPE_1 ||\n\t\ttag === SFNT_TRUETYPE_TRUE ||\n\t\ttag === SFNT_TRUETYPE_TYP1 ||\n\t\ttag === SFNT_COLLECTION\n\t) {\n\t\treturn \"truetype\";\n\t}\n\n\tif (tag === SFNT_OPENTYPE_CFF) {\n\t\treturn \"opentype\";\n\t}\n\n\tconst hexTag = (tag >>> 0).toString(16).padStart(8, \"0\");\n\tthrow new Error(\n\t\t`Invalid font format for \"${sourceLabel}\": Expected a valid TrueType (.ttf) or OpenType (.otf) font binary. Found header tag: 0x${hexTag}.`,\n\t);\n}\n\nasync function resolveSourceBuffer(\n\tsource: string | Uint8Array,\n): Promise<ResolvedSource> {\n\tif (source instanceof Uint8Array) {\n\t\treturn { buffer: source };\n\t}\n\n\tif (typeof source !== \"string\") {\n\t\tthrow new TypeError(\n\t\t\t`Font source must be a file path string or Uint8Array, received: ${typeof source}`,\n\t\t);\n\t}\n\n\tlet cleanPath = source;\n\tif (cleanPath.startsWith(\"http://\") || cleanPath.startsWith(\"https://\")) {\n\t\tconst res = await fetch(cleanPath);\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to download font from \"${cleanPath}\": HTTP ${res.status} ${res.statusText}`,\n\t\t\t);\n\t\t}\n\t\tconst arrayBuffer = await res.arrayBuffer();\n\t\treturn {\n\t\t\tbuffer: new Uint8Array(arrayBuffer),\n\t\t\tfilePath: cleanPath,\n\t\t};\n\t}\n\n\tif (cleanPath.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tcleanPath = new URL(cleanPath).pathname;\n\t\t} catch {\n\t\t\tcleanPath = cleanPath.replace(/^file:\\/\\//, \"\");\n\t\t}\n\t}\n\n\tconst candidates: string[] = [\n\t\tcleanPath,\n\t\tpath.resolve(process.cwd(), cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", path.basename(cleanPath)),\n\t];\n\n\t// Upward traversal to locate fonts in parent monorepo roots\n\tlet currentDir = process.cwd();\n\tfor (let i = 0; i < 5; i++) {\n\t\tcandidates.push(path.resolve(currentDir, cleanPath));\n\t\tcandidates.push(\n\t\t\tpath.resolve(currentDir, \"assets/fonts\", path.basename(cleanPath)),\n\t\t);\n\t\tconst parent = path.dirname(currentDir);\n\t\tif (parent === currentDir) break;\n\t\tcurrentDir = parent;\n\t}\n\n\tlet resolvedPath: string | null = null;\n\tlet fileBuffer: Buffer | null = null;\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst stat = await fs.stat(candidate);\n\t\t\tif (stat.isFile()) {\n\t\t\t\tresolvedPath = candidate;\n\t\t\t\tfileBuffer = await fs.readFile(candidate);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Continue searching next candidate\n\t\t}\n\t}\n\n\tif (!resolvedPath || !fileBuffer) {\n\t\tthrow new Error(\n\t\t\t`Font file not found: \"${source}\". Checked candidate locations:\\n - ${candidates.join(\"\\n - \")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tbuffer: new Uint8Array(\n\t\t\tfileBuffer.buffer,\n\t\t\tfileBuffer.byteOffset,\n\t\t\tfileBuffer.byteLength,\n\t\t),\n\t\tfilePath: resolvedPath,\n\t};\n}\n\n/**\n * Central singleton manager for font registration, TTF validation, and compositor typography binding.\n */\nexport class FontManager {\n\tprivate static instance: FontManager | null = null;\n\tprivate readonly fonts = new Map<string, RegisteredFont>();\n\n\tprivate constructor() {}\n\n\t/**\n\t * Returns the singleton FontManager instance.\n\t */\n\tpublic static getInstance(): FontManager {\n\t\tif (!FontManager.instance) {\n\t\t\tFontManager.instance = new FontManager();\n\t\t}\n\t\treturn FontManager.instance;\n\t}\n\n\t/**\n\t * Registers a TrueType/OpenType font into the Framefields engine with validation.\n\t */\n\tpublic static async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\treturn FontManager.getInstance().register(optionsOrFamilyOrSource, source);\n\t}\n\n\t/**\n\t * Sets the color emoji font text draws emoji with, for the preview and the\n\t * export alike: a CBDT/CBLC bitmap font such as Noto Color Emoji, as a file\n\t * path, URL or bytes. framefields ships none; without one, exports draw\n\t * nothing for emoji.\n\t */\n\tpublic static async registerEmojiFont(\n\t\tsource: string | Uint8Array,\n\t): Promise<void> {\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(source);\n\t\tconst label =\n\t\t\tfilePath ?? (typeof source === \"string\" ? source : \"Uint8Array\");\n\t\tvalidateFontBinaryHeader(buffer, label);\n\t\tSlugFontCache.setEmojiFont(buffer, filePath);\n\t}\n\n\t/**\n\t * Retrieves registered font metadata by family name.\n\t */\n\tpublic static get(family: string): RegisteredFont | undefined {\n\t\treturn FontManager.getInstance().get(family);\n\t}\n\n\t/**\n\t * Checks if a font family has been registered.\n\t */\n\tpublic static has(family: string): boolean {\n\t\treturn FontManager.getInstance().has(family);\n\t}\n\n\t/**\n\t * Returns all currently registered fonts.\n\t */\n\tpublic static getAll(): RegisteredFont[] {\n\t\treturn FontManager.getInstance().getAll();\n\t}\n\n\t/**\n\t * Returns relative or absolute file paths of all registered fonts for composition spec serialization.\n\t */\n\tpublic static getRegisteredFontPaths(): string[] {\n\t\treturn FontManager.getInstance().getRegisteredFontPaths();\n\t}\n\n\t/**\n\t * Clears all registered fonts from the manager.\n\t */\n\tpublic static clear(): void {\n\t\tFontManager.getInstance().clear();\n\t}\n\n\t/**\n\t * Instance registration method with format validation and Slug WebGPU cache population.\n\t */\n\tpublic async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\tlet family: string | undefined;\n\t\tlet rawSource: string | Uint8Array;\n\t\tlet weight: number | string | undefined;\n\t\tlet style: \"normal\" | \"italic\" | \"oblique\" | undefined;\n\n\t\tif (\n\t\t\ttypeof optionsOrFamilyOrSource === \"object\" &&\n\t\t\toptionsOrFamilyOrSource !== null\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource.family;\n\t\t\trawSource = optionsOrFamilyOrSource.source;\n\t\t\tweight = optionsOrFamilyOrSource.weight;\n\t\t\tstyle = optionsOrFamilyOrSource.style;\n\t\t} else if (\n\t\t\ttypeof optionsOrFamilyOrSource === \"string\" &&\n\t\t\tsource !== undefined\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource;\n\t\t\trawSource = source;\n\t\t} else if (typeof optionsOrFamilyOrSource === \"string\") {\n\t\t\tfamily = undefined;\n\t\t\trawSource = optionsOrFamilyOrSource;\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid arguments passed to FontManager.register\");\n\t\t}\n\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(rawSource);\n\t\tconst sourceLabel =\n\t\t\tfilePath ?? (typeof rawSource === \"string\" ? rawSource : \"Uint8Array\");\n\t\tconst format = validateFontBinaryHeader(buffer, sourceLabel);\n\n\t\tlet parsedFontkit: fontkit.Font;\n\t\ttry {\n\t\t\tconst parsed = fontkit.create(buffer as unknown as Buffer);\n\t\t\tif (\n\t\t\t\tparsed &&\n\t\t\t\t\"fonts\" in parsed &&\n\t\t\t\tArray.isArray(parsed.fonts) &&\n\t\t\t\tparsed.fonts.length > 0\n\t\t\t) {\n\t\t\t\tparsedFontkit = parsed.fonts[0] as fontkit.Font;\n\t\t\t} else {\n\t\t\t\tparsedFontkit = parsed as fontkit.Font;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse TrueType/OpenType font binary for \"${sourceLabel}\": ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tconst detectedFamily =\n\t\t\tparsedFontkit.familyName ||\n\t\t\tparsedFontkit.postscriptName ||\n\t\t\tpath.parse(sourceLabel).name;\n\t\tconst resolvedFamily = family?.trim() || detectedFamily;\n\n\t\tconst registered: RegisteredFont = {\n\t\t\tfamily: resolvedFamily,\n\t\t\tsource: rawSource,\n\t\t\tfilePath,\n\t\t\tformat,\n\t\t\tpostscriptName: parsedFontkit.postscriptName,\n\t\t\tunitsPerEm: parsedFontkit.unitsPerEm,\n\t\t\tweight,\n\t\t\tstyle,\n\t\t};\n\n\t\tthis.fonts.set(resolvedFamily, registered);\n\n\t\t// Populate headless font registries\n\t\tif (filePath) {\n\t\t\tawait registerHeadlessFont(resolvedFamily, filePath);\n\t\t}\n\t\tSlugFontCache.setParsed(resolvedFamily, parsedFontkit);\n\n\t\treturn registered;\n\t}\n\n\tpublic get(family: string): RegisteredFont | undefined {\n\t\treturn this.fonts.get(family);\n\t}\n\n\tpublic has(family: string): boolean {\n\t\treturn this.fonts.has(family);\n\t}\n\n\tpublic getAll(): RegisteredFont[] {\n\t\treturn Array.from(this.fonts.values());\n\t}\n\n\tpublic getRegisteredFontPaths(): string[] {\n\t\tconst paths: string[] = [];\n\t\tfor (const font of this.fonts.values()) {\n\t\t\tif (font.filePath) {\n\t\t\t\tpaths.push(font.filePath);\n\t\t\t} else if (typeof font.source === \"string\") {\n\t\t\t\tpaths.push(font.source);\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.fonts.clear();\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { wr as VirtualMediaData } from "./index-
|
|
1
|
+
import { wr as VirtualMediaData } from "./index-WIPHLy5m.mjs";
|
|
2
2
|
import { VideoSampleSource } from "mediabunny";
|
|
3
3
|
import { VideoFrame } from "@napi-rs/webcodecs";
|
|
4
4
|
|
|
@@ -313,4 +313,4 @@ type FrameGridRenderable = {
|
|
|
313
313
|
declare function renderFrameGrid(target: FrameGridRenderable, options?: FrameGridOptions): Promise<Buffer>;
|
|
314
314
|
//#endregion
|
|
315
315
|
export { renderFrameGrid as a, HeadlessMediaRenderer as c, QaSegment as d, VideoQaOptions as f, renderSemaphore as g, formatQaReport as h, computeGridLayout as i, HeadlessWebGPURenderer as l, VideoQaStats as m, FrameGridRenderable as n, resolveSamplePoints as o, VideoQaReport as p, FrameSamplePoint as r, AudioQaStats as s, FrameGridOptions as t, QaIssue as u };
|
|
316
|
-
//# sourceMappingURL=index-
|
|
316
|
+
//# sourceMappingURL=index-BJUS4Nx6.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-Bx7JBFT6.d.mts","names":["VideoColorPrimaries","VideoFrame","VideoMatrixCoefficients","VideoTransferCharacteristics","RenderDiagnostic","VirtualMediaData","VideoSampleSource","preloadFonts","GPUDevice","Promise","StagingSlotStatus","VideoColorSpaceConfig","DmaStagingRingOptions","GPUTextureFormat","StagingSlotInfo","DmaStagingRing","GPUCommandEncoder","GPUTexture","Uint8Array","findNodesDir","discoverAndRegisterNodeRenderers","VideoQaOptions","QaSegment","QaIssue","VideoQaStats","AudioQaStats","VideoQaReport","FrameInspector","analyzeAudio","Float32Array","integratedLoudness","buildQaReport","formatQaReport","WorkerInput","WorkerMessage","Array","RenderSemaphore","renderSemaphore","HeadlessWebGPURenderer","Buffer","HeadlessMediaRenderer","NODE_KINDS","NodeKind","NodeRendererExports","NodeManifest","NodeManifestError","Error","parseNodeManifest","loadNodeManifests","ZeroCopyWebCodecsPipelineOptions","WebCodecsPipelineStats","ZeroCopyWebCodecsPipeline"],"sources":["../../renderer/dist/index.d.mts","../src/renderer/framegrid.ts"],"sourcesContent":["import { VideoColorPrimaries, VideoFrame, VideoMatrixCoefficients, VideoTransferCharacteristics } from \"@napi-rs/webcodecs\";\nimport { RenderDiagnostic, VirtualMediaData } from \"@framefields/core\";\nimport { VideoSampleSource } from \"mediabunny\";\n\n//#region src/asset-preloader.d.ts\n\n/**\n * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n * typography renders correctly on Node.js without loading its media. Shared\n * with the browser preview; emoji need a font set with\n * `FontManager.registerEmojiFont()`.\n */\ndeclare function preloadFonts(media: VirtualMediaData, device?: GPUDevice | null): Promise<void>;\n//#endregion\n//#region src/dma-staging-ring.d.ts\ntype StagingSlotStatus = \"idle\" | \"rendering\" | \"mapping\" | \"mapped\";\ninterface VideoColorSpaceConfig {\n readonly primaries?: VideoColorPrimaries;\n readonly transfer?: VideoTransferCharacteristics;\n readonly matrix?: VideoMatrixCoefficients;\n readonly fullRange?: boolean;\n}\ninterface DmaStagingRingOptions {\n readonly width: number;\n readonly height: number;\n readonly capacity?: number;\n readonly format?: GPUTextureFormat;\n}\ninterface StagingSlotInfo {\n readonly index: number;\n readonly status: StagingSlotStatus;\n readonly inFlightFrame: number | null;\n}\n/**\n * Pipelined Asynchronous DMA Staging Ring for WebGPU.\n *\n * Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n * GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n * Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n * is asynchronously mapped and consumed by the hardware video encoder.\n */\ndeclare class DmaStagingRing {\n readonly width: number;\n readonly height: number;\n readonly capacity: number;\n readonly bytesPerRow: number;\n readonly unpaddedBytesPerRow: number;\n readonly bufferSize: number;\n readonly format: GPUTextureFormat;\n readonly device: GPUDevice;\n private readonly slots;\n private isDestroyed;\n constructor(device: GPUDevice, options: DmaStagingRingOptions);\n /**\n * Prepares the staging buffer slot for writing by ensuring any prior mapping\n * from a previous cycle has been completed and unmapped.\n */\n prepareSlot(frameIndex: number): Promise<void>;\n /**\n * Records a GPU-to-buffer DMA copy command into the provided command encoder.\n */\n stageTexture(encoder: GPUCommandEncoder, texture: GPUTexture, frameIndex: number): void;\n /**\n * Initiates asynchronous DMA mapping on the slot for the specified frame.\n * Must be called immediately after submitting the command encoder to the device queue.\n */\n scheduleMap(frameIndex: number): Promise<void>;\n /**\n * Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n * The slot remains in the \"mapped\" state until releaseFrame() is called.\n */\n readFramePixels(frameIndex: number): Promise<Uint8Array>;\n /**\n * Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n * returning the slot to \"idle\" state so it can be reused immediately.\n */\n readAndReleaseFrame(frameIndex: number): Promise<Uint8Array>;\n /**\n * Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n * bypassing redundant intermediate JS allocations when row pitches align,\n * and immediately unmaps the buffer.\n */\n readFrameToVideoFrame(frameIndex: number, timestampUs: number, colorSpace?: VideoColorSpaceConfig, /** Sees the tightly packed RGBA pixels while they are mapped; must not keep them. */\n inspect?: (rgba: Uint8Array) => void): Promise<VideoFrame>;\n /**\n * Unmaps the staging buffer for the specified frame and marks the slot idle.\n */\n releaseFrame(frameIndex: number): void;\n /**\n * Returns current status info for each slot in the ring.\n */\n getSlotInfos(): readonly StagingSlotInfo[];\n /**\n * Destroys all staging buffers and releases resources.\n */\n destroy(): void;\n private checkDestroyed;\n}\n//#endregion\n//#region src/dynamic-node-discovery.d.ts\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\ndeclare function findNodesDir(startDir?: string): string | null;\n/**\n * Registers the built-in node renderers, then any extra nodes found in the\n * directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n * that directory overrides the built-in renderer for the same op.\n */\ndeclare function discoverAndRegisterNodeRenderers(): Promise<void>;\n//#endregion\n//#region src/video-qa.d.ts\n/**\n * Quality checks run on a video while it renders: frames are measured as\n * they are read back for the encoder and audio as it is mixed, so the report\n * describes exactly what was encoded without decoding the file again.\n */\ninterface VideoQaOptions {\n /** Luma (0-1) at or below which a pixel counts as black. Default 0.1. */\n readonly blackPixelThreshold?: number;\n /** Share of black pixels that makes a frame black. Default 0.98. */\n readonly blackFrameRatio?: number;\n /** Shortest run of black frames reported. Default 0.5 s. */\n readonly minBlackSec?: number;\n /** Shortest run of unchanging frames reported. Default 2 s. */\n readonly minFrozenSec?: number;\n /** Level (dBFS, 100 ms windows) below which audio counts as silent. Default -60. */\n readonly silenceDbfs?: number;\n /** Shortest silent stretch reported. Default 2 s. */\n readonly minSilenceSec?: number;\n /** Integrated loudness to hit, e.g. -14 for most streaming platforms. Unchecked when unset. */\n readonly targetLufs?: number;\n /** Allowed distance from `targetLufs`, in LU. Default 1. */\n readonly lufsTolerance?: number;\n}\ninterface QaSegment {\n readonly startSec: number;\n readonly endSec: number;\n}\ninterface QaIssue {\n readonly severity: \"error\" | \"warning\" | \"info\";\n /** Stable machine-readable kind, e.g. \"black_frames\", \"audio_clipping\" */\n readonly code: string;\n readonly message: string;\n readonly startSec?: number;\n readonly endSec?: number;\n readonly layerId?: string;\n}\ninterface VideoQaStats {\n readonly expectedFrames: number;\n readonly encodedFrames: number;\n readonly fps: number;\n readonly width: number;\n readonly height: number;\n /** Average luma over the whole video, 0-1 */\n readonly meanLuma: number;\n readonly blackSegments: readonly QaSegment[];\n readonly frozenSegments: readonly QaSegment[];\n}\ninterface AudioQaStats {\n readonly sampleRate: number;\n readonly channels: number;\n readonly durationSec: number;\n /** Highest sample, dBFS (sample peak, not true peak) */\n readonly peakDbfs: number;\n /** Mean level over the whole track, dBFS */\n readonly rmsDbfs: number;\n /** ITU-R BS.1770 integrated loudness; null when the track is silent */\n readonly integratedLufs: number | null;\n /** Samples at or beyond full scale */\n readonly clippedSamples: number;\n readonly silentSegments: readonly QaSegment[];\n}\ninterface VideoQaReport {\n /** No errors or warnings (info issues do not fail a render) */\n readonly passed: boolean;\n readonly video?: VideoQaStats;\n readonly audio?: AudioQaStats;\n readonly issues: readonly QaIssue[];\n}\n/** Measures frames handed to it in order, as RGBA bytes. */\ndeclare class FrameInspector {\n private readonly blackLuma;\n private readonly blackRatio;\n private readonly black;\n private readonly sameAsPrevious;\n private lumaSum;\n private previous;\n constructor(options?: VideoQaOptions);\n get frameCount(): number;\n inspect(rgba: Uint8Array, width: number, height: number): void;\n stats(expectedFrames: number, encodedFrames: number, fps: number, width: number, height: number, options?: VideoQaOptions): VideoQaStats;\n}\n/** Measures a mixed audio track (one Float32Array per channel). */\ndeclare function analyzeAudio(channels: readonly Float32Array[], sampleRate: number, options?: VideoQaOptions): AudioQaStats;\n/**\n * ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n * 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n * the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n */\ndeclare function integratedLoudness(channels: readonly Float32Array[], sampleRate: number): number | null;\n/** Turn measurements and document diagnostics into a report with issues. */\ndeclare function buildQaReport(parts: {\n video?: VideoQaStats;\n audio?: AudioQaStats;\n diagnostics?: readonly RenderDiagnostic[];\n options?: VideoQaOptions;\n}): VideoQaReport;\n/** A short human- and agent-readable summary of a report. */\ndeclare function formatQaReport(report: VideoQaReport): string;\n//#endregion\n//#region src/headless-webgpu-renderer.d.ts\ninterface WorkerInput {\n virtualMedia: VirtualMediaData;\n width: number;\n height: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n renderId: string;\n outputFormat: \"png\" | \"pixels\";\n workerIndex: number;\n}\ntype WorkerMessage = {\n type: \"frame\";\n renderId: string;\n frameIndex: number;\n pixels: Uint8Array;\n} | {\n type: \"png\";\n renderId: string;\n data: Uint8Array;\n} | {\n type: \"done\";\n renderId: string;\n} | {\n type: \"lut\";\n renderId: string;\n raw: {\n points: Array<[number, number, number]>;\n size: number;\n type: \"1D\" | \"3D\";\n };\n} | {\n type: \"error\";\n renderId?: string;\n error: string;\n};\ndeclare class RenderSemaphore {\n private _running;\n private readonly _max;\n private readonly _queue;\n constructor(max: number);\n acquire(timeoutMs?: number): Promise<void>;\n release(): void;\n get stats(): {\n active: number;\n queued: number;\n max: number;\n };\n}\ndeclare const renderSemaphore: RenderSemaphore;\ndeclare class HeadlessWebGPURenderer {\n private static isInitialized;\n private static initPromise;\n private static initFailureCount;\n private static readonly MAX_INIT_FAILURES;\n private static nextRetryAt;\n static initialize(): Promise<void>;\n renderImage(virtualMedia: VirtualMediaData, frame?: number, fps?: number, options?: {\n renderId?: string;\n /** \"rgba\" skips PNG encoding and returns width*height*4 raw pixels. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n */\n renderFrame(source: VirtualMediaData | {\n toVirtualMedia(): VirtualMediaData;\n }, options?: {\n atMs?: number;\n frame?: number;\n fps?: number;\n /** Reuse compiled state across calls; see `renderImage`. */\n renderId?: string;\n /** \"rgba\" returns raw width*height*4 pixels instead of a PNG. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Mixes the composition's full audio timeline (clips, effects, synthesized\n * tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n */\n renderAudio(virtualMedia: VirtualMediaData, options?: {\n fps?: number;\n sampleRate?: number;\n }): Promise<{\n channels: Float32Array[];\n sampleRate: number;\n }>;\n renderLut(virtualMedia: VirtualMediaData, frame?: number, fps?: number): Promise<Buffer>;\n private resolveMediaDuration;\n renderVideo(virtualMedia: VirtualMediaData, options?: {\n codec?: string;\n audioCodec?: string;\n quality?: string;\n concurrency?: number;\n /**\n * Depth of the DMA staging ring (default 2, clamped 2–8). A deeper\n * ring overlaps more encoder latency at the cost of VRAM\n * (~8.3MB/slot at 1080p RGBA). Also settable via\n * `FRAMEFIELDS_RING_CAPACITY`.\n */\n ringCapacity?: number;\n /**\n * Measure the output while it renders (black and frozen frames,\n * dropped frames, loudness, clipping, silence, document warnings)\n * and return the findings as `qa`. `true` uses default thresholds.\n */\n qa?: boolean | VideoQaOptions;\n }): Promise<{\n filePath: string;\n cleanup: () => Promise<void>;\n qa?: VideoQaReport;\n }>;\n}\ndeclare const HeadlessMediaRenderer: typeof HeadlessWebGPURenderer;\ntype HeadlessMediaRenderer = HeadlessWebGPURenderer;\n//#endregion\n//#region src/node-manifest.d.ts\n/**\n * The `framefields` block of a node package's `package.json`.\n *\n * This is the single declaration of a node's op: renderer discovery, the\n * effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n * read it from here. There is deliberately no fallback that derives an op from\n * the package name. See `spec/sync-node.md` §5.1.\n */\ndeclare const NODE_KINDS: readonly [\"effect\", \"audio\", \"source\", \"signal\", \"utility\"];\ntype NodeKind = (typeof NODE_KINDS)[number];\ninterface NodeRendererExports {\n development?: string;\n import?: string;\n default?: string;\n}\ninterface NodeManifest {\n /** Directory name under `nodes/`, e.g. `node-apply-lut`. */\n dir: string;\n /** Absolute path of the node package. */\n path: string;\n /** npm package name, e.g. `@framefields/node-lut`. */\n packageName: string;\n /** Canonical op literal used in the operation AST and the renderer registry. */\n type: string;\n kind: NodeKind;\n /** Legacy ops that resolve to the same renderer. */\n aliases: readonly string[];\n /** Named zod schema export of `src/shared/config.ts`. */\n schema?: string;\n /** Authoring class name. Defaults to `type`. */\n className?: string;\n /** Key on `Effect.*`. Defaults to `className` with a lower-cased first letter. */\n factory?: string;\n /** A hand-written subclass exists under `effects/custom/`. */\n custom: boolean;\n /** `false` when the package opts out of discovery. */\n enabled: boolean;\n rendererExports?: NodeRendererExports;\n}\ndeclare class NodeManifestError extends Error {\n readonly problems: readonly string[];\n constructor(problems: readonly string[]);\n}\n/**\n * Validates one parsed `package.json`. Returns the manifest, or the list of\n * problems that make it unusable. Never throws.\n */\ndeclare function parseNodeManifest(pkg: unknown, dir: string, nodePath?: string): {\n manifest?: NodeManifest;\n problems: string[];\n};\n/**\n * Reads every `nodes/node-*` package and returns its manifest, sorted by\n * directory name. Throws a single {@link NodeManifestError} listing every\n * problem: a missing or malformed block, or an op/alias claimed twice.\n */\ndeclare function loadNodeManifests(nodesDir: string): NodeManifest[];\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.d.ts\ninterface ZeroCopyWebCodecsPipelineOptions {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly videoSource: VideoSampleSource;\n readonly ringCapacity?: number;\n readonly colorSpace?: VideoColorSpaceConfig;\n readonly directCanvasSource?: unknown;\n /**\n * Called with each frame's RGBA pixels, in frame order, just before it is\n * encoded (staging-ring path only). The buffer is reused: read, don't keep.\n */\n readonly onFrame?: (rgba: Uint8Array, frameIndex: number) => void;\n}\ninterface WebCodecsPipelineStats {\n readonly totalFramesEnqueued: number;\n readonly totalFramesEncoded: number;\n readonly averageGpuSubmitTimeMs: number;\n readonly averageEncodeTimeMs: number;\n readonly averageCycleTimeMs: number;\n readonly maxCycleTimeMs: number;\n readonly minCycleTimeMs: number;\n readonly throughputFps: number;\n readonly ringCapacity: number;\n readonly isDirectZeroCopy: boolean;\n}\n/**\n * High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n *\n * Provides:\n * 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n * 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n * allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n */\ndeclare class ZeroCopyWebCodecsPipeline {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly ringCapacity: number;\n private readonly device;\n private readonly videoSource;\n private readonly stagingRing;\n private readonly colorSpace?;\n private readonly directCanvasSource?;\n private readonly onFrame?;\n private readonly inFlightFrames;\n private readonly cycleStartTimes;\n private totalFramesEnqueued;\n private totalFramesEncoded;\n private totalGpuSubmitTimeMs;\n private totalEncodeTimeMs;\n private totalCycleTimeMs;\n private maxCycleTimeMs;\n private minCycleTimeMs;\n private pipelineStartTime;\n constructor(device: GPUDevice, options: ZeroCopyWebCodecsPipelineOptions);\n /**\n * Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n */\n canDirectZeroCopy(): boolean;\n /**\n * Enqueues a rendered GPU texture frame into the pipeline.\n *\n * Uses double-buffered DMA staging: if the staging ring has reached capacity,\n * the oldest in-flight frame is asynchronously consumed and added to the video encoder\n * before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n */\n enqueueFrame(frameIndex: number, targetTexture: GPUTexture, encoder: GPUCommandEncoder): Promise<void>;\n /**\n * Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n * frame has been encoded and added to the video sample source.\n */\n drain(): Promise<void>;\n /**\n * Returns runtime throughput, latency, and pipeline statistics.\n */\n getStats(): WebCodecsPipelineStats;\n /**\n * Destroys the pipeline and releases all staging buffers.\n */\n destroy(): void;\n private consumeAndEncode;\n}\n//#endregion\nexport { AudioQaStats, DmaStagingRing, DmaStagingRingOptions, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeKind, NodeManifest, NodeManifestError, NodeRendererExports, QaIssue, QaSegment, StagingSlotInfo, StagingSlotStatus, VideoColorSpaceConfig, VideoQaOptions, VideoQaReport, VideoQaStats, WebCodecsPipelineStats, WorkerInput, WorkerMessage, ZeroCopyWebCodecsPipeline, ZeroCopyWebCodecsPipelineOptions, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;;;;;;;UAmHUqB,cAAAA;;;;;;;;;;;;;;;;;;UAkBAC,SAAAA;;;;UAIAC,OAAAA;;;;;;;;;UASAC,YAAAA;;;;;;;;mCAQyBF;oCACCA;;UAE1BG,YAAAA;;;;;;;;;;;;oCAY0BH;;UAE1BI,aAAAA;;;mBAGSF;mBACAC;4BACSF;;;;;iBA+BXS,cAAAA,SAAuBN;;;;cAuC1BU,eAAAA;;;;;+BAKiB3B;;;;;;;;cAQjB4B,iBAAiBD;cACjBE,sBAAAA;;;;;;uBAMS7B;4BACKJ;;;;MAItBI,QAAQ8B;;;;sBAIQlC;sBACAA;;;;;;;;;MAShBI,QAAQ8B;;;;;4BAKclC;;;MAGtBI;cACQoB;;;0BAGYxB,iDAAiDI,QAAQ8B;;4BAEvDlC;;;;;;;;;;;;;;;;;mBAiBTgB;MACbZ;;mBAEaA;SACViB;;;cAGKc,8BAA8BF;KACvCE,qBAAAA,GAAwBF;;;;;;;;;;;;;UC/TZ,gBAAA;;;ADsG2C;AA0BlDhB,UC3HO,gBAAA,CD2HE;EAITC;AAAO;AAkB4B;EAgBnCG,UAAAA,CAAAA,EAAAA,MAAa;EAGJF;;;EAEgB,QAAA,CAAA,EAAA,MAAA;EA+BlBQ;AA8BA;AAcqB;EASxBM,UAAAA,CAAAA,EAAAA,MAAAA;EAMS7B;;;EAKjBA,MAAAA,CAAAA,EAAAA,MAAAA,EAAAA;EAIgBJ;;;EAUhBI,OAAAA,CAAAA,EAAAA,MAAAA;EAKsBJ;;;EAOFA,KAAAA,CAAAA,EAAAA,MAAAA;EAAyDkC;;;EAmBhElB,MAAAA,CAAAA,EAAAA,MAAAA;EAGAZ;;;EAFN,OAAA,CAAA,EAAA,MAAA,EAAA;EAMC+B;AAAoD;;;;AC9TlE;AAKA;EA0HgB,OAAA,CAAA,EAAA,MAAA;EAsGA;AAiFhB;;;EAOa,SAAA,CAAA,EAAA,MAAA;EAAR;;AAWL;EACS,UAAA,CAAA,EAAA,MAAA;EACC;;;EACA,GAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAlNE;;;;;iBAMI,mBAAA,UACN;WAGI;;;;;;iBAkGE,iBAAA,mDAGN;;;;;;;;;;;KA8EE,mBAAA;oBACO;;;;;eAKN;MACR,QAAQ;;;;;;;;;;iBAWS,eAAA,SACb,+BACC,mBACP,QAAQ"}
|
|
1
|
+
{"version":3,"file":"index-BJUS4Nx6.d.mts","names":["VideoColorPrimaries","VideoFrame","VideoMatrixCoefficients","VideoTransferCharacteristics","RenderDiagnostic","VirtualMediaData","VideoSampleSource","preloadFonts","GPUDevice","Promise","StagingSlotStatus","VideoColorSpaceConfig","DmaStagingRingOptions","GPUTextureFormat","StagingSlotInfo","DmaStagingRing","GPUCommandEncoder","GPUTexture","Uint8Array","findNodesDir","discoverAndRegisterNodeRenderers","VideoQaOptions","QaSegment","QaIssue","VideoQaStats","AudioQaStats","VideoQaReport","FrameInspector","analyzeAudio","Float32Array","integratedLoudness","buildQaReport","formatQaReport","WorkerInput","WorkerMessage","Array","RenderSemaphore","renderSemaphore","HeadlessWebGPURenderer","Buffer","HeadlessMediaRenderer","NODE_KINDS","NodeKind","NodeRendererExports","NodeManifest","NodeManifestError","Error","parseNodeManifest","loadNodeManifests","ZeroCopyWebCodecsPipelineOptions","WebCodecsPipelineStats","ZeroCopyWebCodecsPipeline"],"sources":["../../renderer/dist/index.d.mts","../src/renderer/framegrid.ts"],"sourcesContent":["import { VideoColorPrimaries, VideoFrame, VideoMatrixCoefficients, VideoTransferCharacteristics } from \"@napi-rs/webcodecs\";\nimport { RenderDiagnostic, VirtualMediaData } from \"@framefields/core\";\nimport { VideoSampleSource } from \"mediabunny\";\n\n//#region src/asset-preloader.d.ts\n\n/**\n * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n * typography renders correctly on Node.js without loading its media. Shared\n * with the browser preview; emoji need a font set with\n * `FontManager.registerEmojiFont()`.\n */\ndeclare function preloadFonts(media: VirtualMediaData, device?: GPUDevice | null): Promise<void>;\n//#endregion\n//#region src/dma-staging-ring.d.ts\ntype StagingSlotStatus = \"idle\" | \"rendering\" | \"mapping\" | \"mapped\";\ninterface VideoColorSpaceConfig {\n readonly primaries?: VideoColorPrimaries;\n readonly transfer?: VideoTransferCharacteristics;\n readonly matrix?: VideoMatrixCoefficients;\n readonly fullRange?: boolean;\n}\ninterface DmaStagingRingOptions {\n readonly width: number;\n readonly height: number;\n readonly capacity?: number;\n readonly format?: GPUTextureFormat;\n}\ninterface StagingSlotInfo {\n readonly index: number;\n readonly status: StagingSlotStatus;\n readonly inFlightFrame: number | null;\n}\n/**\n * Pipelined Asynchronous DMA Staging Ring for WebGPU.\n *\n * Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n * GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n * Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n * is asynchronously mapped and consumed by the hardware video encoder.\n */\ndeclare class DmaStagingRing {\n readonly width: number;\n readonly height: number;\n readonly capacity: number;\n readonly bytesPerRow: number;\n readonly unpaddedBytesPerRow: number;\n readonly bufferSize: number;\n readonly format: GPUTextureFormat;\n readonly device: GPUDevice;\n private readonly slots;\n private isDestroyed;\n constructor(device: GPUDevice, options: DmaStagingRingOptions);\n /**\n * Prepares the staging buffer slot for writing by ensuring any prior mapping\n * from a previous cycle has been completed and unmapped.\n */\n prepareSlot(frameIndex: number): Promise<void>;\n /**\n * Records a GPU-to-buffer DMA copy command into the provided command encoder.\n */\n stageTexture(encoder: GPUCommandEncoder, texture: GPUTexture, frameIndex: number): void;\n /**\n * Initiates asynchronous DMA mapping on the slot for the specified frame.\n * Must be called immediately after submitting the command encoder to the device queue.\n */\n scheduleMap(frameIndex: number): Promise<void>;\n /**\n * Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n * The slot remains in the \"mapped\" state until releaseFrame() is called.\n */\n readFramePixels(frameIndex: number): Promise<Uint8Array>;\n /**\n * Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n * returning the slot to \"idle\" state so it can be reused immediately.\n */\n readAndReleaseFrame(frameIndex: number): Promise<Uint8Array>;\n /**\n * Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n * bypassing redundant intermediate JS allocations when row pitches align,\n * and immediately unmaps the buffer.\n */\n readFrameToVideoFrame(frameIndex: number, timestampUs: number, colorSpace?: VideoColorSpaceConfig, /** Sees the tightly packed RGBA pixels while they are mapped; must not keep them. */\n inspect?: (rgba: Uint8Array) => void): Promise<VideoFrame>;\n /**\n * Unmaps the staging buffer for the specified frame and marks the slot idle.\n */\n releaseFrame(frameIndex: number): void;\n /**\n * Returns current status info for each slot in the ring.\n */\n getSlotInfos(): readonly StagingSlotInfo[];\n /**\n * Destroys all staging buffers and releases resources.\n */\n destroy(): void;\n private checkDestroyed;\n}\n//#endregion\n//#region src/dynamic-node-discovery.d.ts\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\ndeclare function findNodesDir(startDir?: string): string | null;\n/**\n * Registers the built-in node renderers, then any extra nodes found in the\n * directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n * that directory overrides the built-in renderer for the same op.\n */\ndeclare function discoverAndRegisterNodeRenderers(): Promise<void>;\n//#endregion\n//#region src/video-qa.d.ts\n/**\n * Quality checks run on a video while it renders: frames are measured as\n * they are read back for the encoder and audio as it is mixed, so the report\n * describes exactly what was encoded without decoding the file again.\n */\ninterface VideoQaOptions {\n /** Luma (0-1) at or below which a pixel counts as black. Default 0.1. */\n readonly blackPixelThreshold?: number;\n /** Share of black pixels that makes a frame black. Default 0.98. */\n readonly blackFrameRatio?: number;\n /** Shortest run of black frames reported. Default 0.5 s. */\n readonly minBlackSec?: number;\n /** Shortest run of unchanging frames reported. Default 2 s. */\n readonly minFrozenSec?: number;\n /** Level (dBFS, 100 ms windows) below which audio counts as silent. Default -60. */\n readonly silenceDbfs?: number;\n /** Shortest silent stretch reported. Default 2 s. */\n readonly minSilenceSec?: number;\n /** Integrated loudness to hit, e.g. -14 for most streaming platforms. Unchecked when unset. */\n readonly targetLufs?: number;\n /** Allowed distance from `targetLufs`, in LU. Default 1. */\n readonly lufsTolerance?: number;\n}\ninterface QaSegment {\n readonly startSec: number;\n readonly endSec: number;\n}\ninterface QaIssue {\n readonly severity: \"error\" | \"warning\" | \"info\";\n /** Stable machine-readable kind, e.g. \"black_frames\", \"audio_clipping\" */\n readonly code: string;\n readonly message: string;\n readonly startSec?: number;\n readonly endSec?: number;\n readonly layerId?: string;\n}\ninterface VideoQaStats {\n readonly expectedFrames: number;\n readonly encodedFrames: number;\n readonly fps: number;\n readonly width: number;\n readonly height: number;\n /** Average luma over the whole video, 0-1 */\n readonly meanLuma: number;\n readonly blackSegments: readonly QaSegment[];\n readonly frozenSegments: readonly QaSegment[];\n}\ninterface AudioQaStats {\n readonly sampleRate: number;\n readonly channels: number;\n readonly durationSec: number;\n /** Highest sample, dBFS (sample peak, not true peak) */\n readonly peakDbfs: number;\n /** Mean level over the whole track, dBFS */\n readonly rmsDbfs: number;\n /** ITU-R BS.1770 integrated loudness; null when the track is silent */\n readonly integratedLufs: number | null;\n /** Samples at or beyond full scale */\n readonly clippedSamples: number;\n readonly silentSegments: readonly QaSegment[];\n}\ninterface VideoQaReport {\n /** No errors or warnings (info issues do not fail a render) */\n readonly passed: boolean;\n readonly video?: VideoQaStats;\n readonly audio?: AudioQaStats;\n readonly issues: readonly QaIssue[];\n}\n/** Measures frames handed to it in order, as RGBA bytes. */\ndeclare class FrameInspector {\n private readonly blackLuma;\n private readonly blackRatio;\n private readonly black;\n private readonly sameAsPrevious;\n private lumaSum;\n private previous;\n constructor(options?: VideoQaOptions);\n get frameCount(): number;\n inspect(rgba: Uint8Array, width: number, height: number): void;\n stats(expectedFrames: number, encodedFrames: number, fps: number, width: number, height: number, options?: VideoQaOptions): VideoQaStats;\n}\n/** Measures a mixed audio track (one Float32Array per channel). */\ndeclare function analyzeAudio(channels: readonly Float32Array[], sampleRate: number, options?: VideoQaOptions): AudioQaStats;\n/**\n * ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n * 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n * the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n */\ndeclare function integratedLoudness(channels: readonly Float32Array[], sampleRate: number): number | null;\n/** Turn measurements and document diagnostics into a report with issues. */\ndeclare function buildQaReport(parts: {\n video?: VideoQaStats;\n audio?: AudioQaStats;\n diagnostics?: readonly RenderDiagnostic[];\n options?: VideoQaOptions;\n}): VideoQaReport;\n/** A short human- and agent-readable summary of a report. */\ndeclare function formatQaReport(report: VideoQaReport): string;\n//#endregion\n//#region src/headless-webgpu-renderer.d.ts\ninterface WorkerInput {\n virtualMedia: VirtualMediaData;\n width: number;\n height: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n renderId: string;\n outputFormat: \"png\" | \"pixels\";\n workerIndex: number;\n}\ntype WorkerMessage = {\n type: \"frame\";\n renderId: string;\n frameIndex: number;\n pixels: Uint8Array;\n} | {\n type: \"png\";\n renderId: string;\n data: Uint8Array;\n} | {\n type: \"done\";\n renderId: string;\n} | {\n type: \"lut\";\n renderId: string;\n raw: {\n points: Array<[number, number, number]>;\n size: number;\n type: \"1D\" | \"3D\";\n };\n} | {\n type: \"error\";\n renderId?: string;\n error: string;\n};\ndeclare class RenderSemaphore {\n private _running;\n private readonly _max;\n private readonly _queue;\n constructor(max: number);\n acquire(timeoutMs?: number): Promise<void>;\n release(): void;\n get stats(): {\n active: number;\n queued: number;\n max: number;\n };\n}\ndeclare const renderSemaphore: RenderSemaphore;\ndeclare class HeadlessWebGPURenderer {\n private static isInitialized;\n private static initPromise;\n private static initFailureCount;\n private static readonly MAX_INIT_FAILURES;\n private static nextRetryAt;\n static initialize(): Promise<void>;\n renderImage(virtualMedia: VirtualMediaData, frame?: number, fps?: number, options?: {\n renderId?: string;\n /** \"rgba\" skips PNG encoding and returns width*height*4 raw pixels. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n */\n renderFrame(source: VirtualMediaData | {\n toVirtualMedia(): VirtualMediaData;\n }, options?: {\n atMs?: number;\n frame?: number;\n fps?: number;\n /** Reuse compiled state across calls; see `renderImage`. */\n renderId?: string;\n /** \"rgba\" returns raw width*height*4 pixels instead of a PNG. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Mixes the composition's full audio timeline (clips, effects, synthesized\n * tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n */\n renderAudio(virtualMedia: VirtualMediaData, options?: {\n fps?: number;\n sampleRate?: number;\n }): Promise<{\n channels: Float32Array[];\n sampleRate: number;\n }>;\n renderLut(virtualMedia: VirtualMediaData, frame?: number, fps?: number): Promise<Buffer>;\n private resolveMediaDuration;\n renderVideo(virtualMedia: VirtualMediaData, options?: {\n codec?: string;\n audioCodec?: string;\n quality?: string;\n concurrency?: number;\n /**\n * Depth of the DMA staging ring (default 2, clamped 2–8). A deeper\n * ring overlaps more encoder latency at the cost of VRAM\n * (~8.3MB/slot at 1080p RGBA). Also settable via\n * `FRAMEFIELDS_RING_CAPACITY`.\n */\n ringCapacity?: number;\n /**\n * Measure the output while it renders (black and frozen frames,\n * dropped frames, loudness, clipping, silence, document warnings)\n * and return the findings as `qa`. `true` uses default thresholds.\n */\n qa?: boolean | VideoQaOptions;\n }): Promise<{\n filePath: string;\n cleanup: () => Promise<void>;\n qa?: VideoQaReport;\n }>;\n}\ndeclare const HeadlessMediaRenderer: typeof HeadlessWebGPURenderer;\ntype HeadlessMediaRenderer = HeadlessWebGPURenderer;\n//#endregion\n//#region src/node-manifest.d.ts\n/**\n * The `framefields` block of a node package's `package.json`.\n *\n * This is the single declaration of a node's op: renderer discovery, the\n * effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n * read it from here. There is deliberately no fallback that derives an op from\n * the package name. See `spec/sync-node.md` §5.1.\n */\ndeclare const NODE_KINDS: readonly [\"effect\", \"audio\", \"source\", \"signal\", \"utility\"];\ntype NodeKind = (typeof NODE_KINDS)[number];\ninterface NodeRendererExports {\n development?: string;\n import?: string;\n default?: string;\n}\ninterface NodeManifest {\n /** Directory name under `nodes/`, e.g. `node-apply-lut`. */\n dir: string;\n /** Absolute path of the node package. */\n path: string;\n /** npm package name, e.g. `@framefields/node-lut`. */\n packageName: string;\n /** Canonical op literal used in the operation AST and the renderer registry. */\n type: string;\n kind: NodeKind;\n /** Legacy ops that resolve to the same renderer. */\n aliases: readonly string[];\n /** Named zod schema export of `src/shared/config.ts`. */\n schema?: string;\n /** Authoring class name. Defaults to `type`. */\n className?: string;\n /** Key on `Effect.*`. Defaults to `className` with a lower-cased first letter. */\n factory?: string;\n /** A hand-written subclass exists under `effects/custom/`. */\n custom: boolean;\n /** `false` when the package opts out of discovery. */\n enabled: boolean;\n rendererExports?: NodeRendererExports;\n}\ndeclare class NodeManifestError extends Error {\n readonly problems: readonly string[];\n constructor(problems: readonly string[]);\n}\n/**\n * Validates one parsed `package.json`. Returns the manifest, or the list of\n * problems that make it unusable. Never throws.\n */\ndeclare function parseNodeManifest(pkg: unknown, dir: string, nodePath?: string): {\n manifest?: NodeManifest;\n problems: string[];\n};\n/**\n * Reads every `nodes/node-*` package and returns its manifest, sorted by\n * directory name. Throws a single {@link NodeManifestError} listing every\n * problem: a missing or malformed block, or an op/alias claimed twice.\n */\ndeclare function loadNodeManifests(nodesDir: string): NodeManifest[];\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.d.ts\ninterface ZeroCopyWebCodecsPipelineOptions {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly videoSource: VideoSampleSource;\n readonly ringCapacity?: number;\n readonly colorSpace?: VideoColorSpaceConfig;\n readonly directCanvasSource?: unknown;\n /**\n * Called with each frame's RGBA pixels, in frame order, just before it is\n * encoded (staging-ring path only). The buffer is reused: read, don't keep.\n */\n readonly onFrame?: (rgba: Uint8Array, frameIndex: number) => void;\n}\ninterface WebCodecsPipelineStats {\n readonly totalFramesEnqueued: number;\n readonly totalFramesEncoded: number;\n readonly averageGpuSubmitTimeMs: number;\n readonly averageEncodeTimeMs: number;\n readonly averageCycleTimeMs: number;\n readonly maxCycleTimeMs: number;\n readonly minCycleTimeMs: number;\n readonly throughputFps: number;\n readonly ringCapacity: number;\n readonly isDirectZeroCopy: boolean;\n}\n/**\n * High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n *\n * Provides:\n * 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n * 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n * allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n */\ndeclare class ZeroCopyWebCodecsPipeline {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly ringCapacity: number;\n private readonly device;\n private readonly videoSource;\n private readonly stagingRing;\n private readonly colorSpace?;\n private readonly directCanvasSource?;\n private readonly onFrame?;\n private readonly inFlightFrames;\n private readonly cycleStartTimes;\n private totalFramesEnqueued;\n private totalFramesEncoded;\n private totalGpuSubmitTimeMs;\n private totalEncodeTimeMs;\n private totalCycleTimeMs;\n private maxCycleTimeMs;\n private minCycleTimeMs;\n private pipelineStartTime;\n constructor(device: GPUDevice, options: ZeroCopyWebCodecsPipelineOptions);\n /**\n * Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n */\n canDirectZeroCopy(): boolean;\n /**\n * Enqueues a rendered GPU texture frame into the pipeline.\n *\n * Uses double-buffered DMA staging: if the staging ring has reached capacity,\n * the oldest in-flight frame is asynchronously consumed and added to the video encoder\n * before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n */\n enqueueFrame(frameIndex: number, targetTexture: GPUTexture, encoder: GPUCommandEncoder): Promise<void>;\n /**\n * Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n * frame has been encoded and added to the video sample source.\n */\n drain(): Promise<void>;\n /**\n * Returns runtime throughput, latency, and pipeline statistics.\n */\n getStats(): WebCodecsPipelineStats;\n /**\n * Destroys the pipeline and releases all staging buffers.\n */\n destroy(): void;\n private consumeAndEncode;\n}\n//#endregion\nexport { AudioQaStats, DmaStagingRing, DmaStagingRingOptions, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeKind, NodeManifest, NodeManifestError, NodeRendererExports, QaIssue, QaSegment, StagingSlotInfo, StagingSlotStatus, VideoColorSpaceConfig, VideoQaOptions, VideoQaReport, VideoQaStats, WebCodecsPipelineStats, WorkerInput, WorkerMessage, ZeroCopyWebCodecsPipeline, ZeroCopyWebCodecsPipelineOptions, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;;;;;;;UAmHUqB,cAAAA;;;;;;;;;;;;;;;;;;UAkBAC,SAAAA;;;;UAIAC,OAAAA;;;;;;;;;UASAC,YAAAA;;;;;;;;mCAQyBF;oCACCA;;UAE1BG,YAAAA;;;;;;;;;;;;oCAY0BH;;UAE1BI,aAAAA;;;mBAGSF;mBACAC;4BACSF;;;;;iBA+BXS,cAAAA,SAAuBN;;;;cAuC1BU,eAAAA;;;;;+BAKiB3B;;;;;;;;cAQjB4B,iBAAiBD;cACjBE,sBAAAA;;;;;;uBAMS7B;4BACKJ;;;;MAItBI,QAAQ8B;;;;sBAIQlC;sBACAA;;;;;;;;;MAShBI,QAAQ8B;;;;;4BAKclC;;;MAGtBI;cACQoB;;;0BAGYxB,iDAAiDI,QAAQ8B;;4BAEvDlC;;;;;;;;;;;;;;;;;mBAiBTgB;MACbZ;;mBAEaA;SACViB;;;cAGKc,8BAA8BF;KACvCE,qBAAAA,GAAwBF;;;;;;;;;;;;;UC/TZ,gBAAA;;;ADsG2C;AA0BlDhB,UC3HO,gBAAA,CD2HE;EAITC;AAAO;AAkB4B;EAgBnCG,UAAAA,CAAAA,EAAAA,MAAa;EAGJF;;;EAEgB,QAAA,CAAA,EAAA,MAAA;EA+BlBQ;AA8BA;AAcqB;EASxBM,UAAAA,CAAAA,EAAAA,MAAAA;EAMS7B;;;EAKjBA,MAAAA,CAAAA,EAAAA,MAAAA,EAAAA;EAIgBJ;;;EAUhBI,OAAAA,CAAAA,EAAAA,MAAAA;EAKsBJ;;;EAOFA,KAAAA,CAAAA,EAAAA,MAAAA;EAAyDkC;;;EAmBhElB,MAAAA,CAAAA,EAAAA,MAAAA;EAGAZ;;;EAFN,OAAA,CAAA,EAAA,MAAA,EAAA;EAMC+B;AAAoD;;;;AC9TlE;AAKA;EA0HgB,OAAA,CAAA,EAAA,MAAA;EAsGA;AAiFhB;;;EAOa,SAAA,CAAA,EAAA,MAAA;EAAR;;AAWL;EACS,UAAA,CAAA,EAAA,MAAA;EACC;;;EACA,GAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAlNE;;;;;iBAMI,mBAAA,UACN;WAGI;;;;;;iBAkGE,iBAAA,mDAGN;;;;;;;;;;;KA8EE,mBAAA;oBACO;;;;;eAKN;MACR,QAAQ;;;;;;;;;;iBAWS,eAAA,SACb,+BACC,mBACP,QAAQ"}
|