framefields 2.3.2 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -1
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-C7Kn5xBm.mjs → audio-CPApYcWF.mjs} +4 -4
- package/dist/{audio-C7Kn5xBm.mjs.map → audio-CPApYcWF.mjs.map} +1 -1
- package/dist/{audio-BNnEclHU.d.mts → audio-DHuEMOtQ.d.mts} +3 -3
- package/dist/{audio-BNnEclHU.d.mts.map → audio-DHuEMOtQ.d.mts.map} +1 -1
- package/dist/{dist-fjKpBYkc.mjs → dist-ClyC_d66.mjs} +9 -2
- package/dist/dist-ClyC_d66.mjs.map +1 -0
- package/dist/{dist-CPUIfrtw.mjs → dist-CrK3rmyN.mjs} +180 -58
- package/dist/dist-CrK3rmyN.mjs.map +1 -0
- package/dist/{dist-CturBK2Z.mjs → dist-CspOG4V1.mjs} +1210 -748
- package/dist/dist-CspOG4V1.mjs.map +1 -0
- package/dist/{dist-BY0bIWgr.mjs → dist-SB9qfAko.mjs} +2 -2
- package/dist/{dist-BY0bIWgr.mjs.map → dist-SB9qfAko.mjs.map} +1 -1
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-CW1VgdI5.mjs → effects-DxylPSuI.mjs} +3 -3
- package/dist/{effects-CW1VgdI5.mjs.map → effects-DxylPSuI.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-EgMNL8KE.mjs → fonts-CsMDfqv9.mjs} +2 -2
- package/dist/{fonts-EgMNL8KE.mjs.map → fonts-CsMDfqv9.mjs.map} +1 -1
- package/dist/{gpu-CN14e7Bi.mjs → gpu-DtT5I4ME.mjs} +2 -2
- package/dist/{gpu-CN14e7Bi.mjs.map → gpu-DtT5I4ME.mjs.map} +1 -1
- package/dist/{index-Cg2ptXcs.d.mts → index-B1XcyMm8.d.mts} +2 -2
- package/dist/{index-Cg2ptXcs.d.mts.map → index-B1XcyMm8.d.mts.map} +1 -1
- package/dist/{index-BU51pxZO.d.mts → index-B2Xesdug.d.mts} +4 -4
- package/dist/{index-BU51pxZO.d.mts.map → index-B2Xesdug.d.mts.map} +1 -1
- package/dist/{index-QmkcUL3W.d.mts → index-BxARm93R.d.mts} +2 -2
- package/dist/{index-QmkcUL3W.d.mts.map → index-BxARm93R.d.mts.map} +1 -1
- package/dist/{index-CeRv1KC0.d.mts → index-C0o3lLyA.d.mts} +3 -3
- package/dist/{index-CeRv1KC0.d.mts.map → index-C0o3lLyA.d.mts.map} +1 -1
- package/dist/{index-B3BwLHa6.d.mts → index-D-l-yCv6.d.mts} +3 -3
- package/dist/{index-B3BwLHa6.d.mts.map → index-D-l-yCv6.d.mts.map} +1 -1
- package/dist/{index-AdrZIWT0.d.mts → index-DujpgUUq.d.mts} +19 -2
- package/dist/index-DujpgUUq.d.mts.map +1 -0
- package/dist/index.d.mts +178 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +488 -93
- 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-1sjnhHQL.mjs → preview-D2dMmokw.mjs} +2 -2
- package/dist/{preview-1sjnhHQL.mjs.map → preview-D2dMmokw.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/chunk-266DECPQ.mjs +1 -0
- package/dist/preview-engine/{chunk-SZW5J72T.mjs → chunk-2DDBSI75.mjs} +1 -1
- package/dist/preview-engine/{chunk-QXCY2ATH.mjs → chunk-2GIWWDE4.mjs} +1 -1
- package/dist/preview-engine/{chunk-U4JIFQRR.mjs → chunk-34ACEGNW.mjs} +1 -1
- package/dist/preview-engine/{chunk-AY7UX37L.mjs → chunk-3ACCCPBN.mjs} +1 -1
- package/dist/preview-engine/{chunk-VK2CVMWJ.mjs → chunk-5E5J4KT4.mjs} +1 -1
- package/dist/preview-engine/{chunk-T2FE5VOW.mjs → chunk-5RQHNB6Y.mjs} +1 -1
- package/dist/preview-engine/{chunk-TS3JI3BH.mjs → chunk-67SSYK7D.mjs} +1 -1
- package/dist/preview-engine/{chunk-PL4IH5V4.mjs → chunk-6K7US2WD.mjs} +1 -1
- package/dist/preview-engine/{chunk-PEWYB6WP.mjs → chunk-7LVOSEGN.mjs} +1 -1
- package/dist/preview-engine/chunk-7QJUC6YY.mjs +1525 -0
- package/dist/preview-engine/{chunk-PSRQA3QW.mjs → chunk-A5OVKZ52.mjs} +1 -1
- package/dist/preview-engine/{chunk-PXT52LEH.mjs → chunk-C6Z7H2RZ.mjs} +1 -1
- package/dist/preview-engine/chunk-CPFPY35C.mjs +1 -0
- package/dist/preview-engine/{chunk-7EPIRODI.mjs → chunk-DOCSX45C.mjs} +1 -1
- package/dist/preview-engine/{chunk-GSFN4WCH.mjs → chunk-FFGBUS76.mjs} +1 -1
- package/dist/preview-engine/{chunk-IR5DNNWR.mjs → chunk-FFMPC7QA.mjs} +1 -1
- package/dist/preview-engine/{chunk-IUPDOATX.mjs → chunk-FHKBALVI.mjs} +1 -1
- package/dist/preview-engine/{chunk-HE4R7EZM.mjs → chunk-G4J662EL.mjs} +1 -1
- package/dist/preview-engine/{chunk-5W4AFQP7.mjs → chunk-GNG4YH2W.mjs} +1 -1
- package/dist/preview-engine/{chunk-L6BH5J4P.mjs → chunk-GQLZXCW3.mjs} +1 -1
- package/dist/preview-engine/{chunk-EVXWDOCL.mjs → chunk-HDGFNBYK.mjs} +1 -1
- package/dist/preview-engine/{chunk-JXNG2ACR.mjs → chunk-HNNIVJ2K.mjs} +1 -1
- package/dist/preview-engine/{chunk-FU7AIAMM.mjs → chunk-HUKAC5MJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-44CQSOYE.mjs → chunk-JX22B2FS.mjs} +1 -1
- package/dist/preview-engine/{chunk-DIGIQ5MJ.mjs → chunk-KAQUNOVB.mjs} +1 -1
- package/dist/preview-engine/{chunk-MLY5M7Y5.mjs → chunk-KT35IPCF.mjs} +1 -1
- package/dist/preview-engine/{chunk-VXS5SIEC.mjs → chunk-LIQA5OOU.mjs} +1 -1
- package/dist/preview-engine/{chunk-SGPRLTNF.mjs → chunk-LK3T65RB.mjs} +1 -1
- package/dist/preview-engine/{chunk-YQZOGEPZ.mjs → chunk-LLDIDE5Q.mjs} +1 -1
- package/dist/preview-engine/chunk-NNQUIVTE.mjs +5 -0
- package/dist/preview-engine/{chunk-5AUB4Y3L.mjs → chunk-NRAZV5OA.mjs} +1 -1
- package/dist/preview-engine/{chunk-VGZZSPDN.mjs → chunk-NTVDL3RS.mjs} +1 -1
- package/dist/preview-engine/{chunk-BSOJR4JU.mjs → chunk-O6NRIXS5.mjs} +1 -1
- package/dist/preview-engine/{chunk-OKH2VU2U.mjs → chunk-PZF6T7DM.mjs} +1 -1
- package/dist/preview-engine/{chunk-OJ2PKBXE.mjs → chunk-QJZKIY4H.mjs} +1 -1
- package/dist/preview-engine/{chunk-WFGJXCZT.mjs → chunk-R26SY5D4.mjs} +1 -1
- package/dist/preview-engine/{chunk-EYWPOCZW.mjs → chunk-RDP6QROU.mjs} +1 -1
- package/dist/preview-engine/{chunk-J2R5R7YY.mjs → chunk-RKVB47IA.mjs} +1 -1
- package/dist/preview-engine/{chunk-PAQNDZQB.mjs → chunk-SWXVITCQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-KERW7QJ4.mjs → chunk-UZBVCYRY.mjs} +1 -1
- package/dist/preview-engine/{chunk-Q22PJXFJ.mjs → chunk-WACWOKEP.mjs} +1 -1
- package/dist/preview-engine/{chunk-AXHB4J37.mjs → chunk-WCZ5DKZ4.mjs} +1 -1
- package/dist/preview-engine/{chunk-WH5Q2NFN.mjs → chunk-WJJIISQJ.mjs} +1 -1
- package/dist/preview-engine/chunk-XDMZP3E2.mjs +1 -0
- package/dist/preview-engine/{chunk-7G3XIOP7.mjs → chunk-Z6UKUHPU.mjs} +1 -1
- package/dist/preview-engine/{chunk-WUKH7BD7.mjs → chunk-ZKPQGQE3.mjs} +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +32 -25
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/{renderers-2P6KXWEZ.mjs → renderers-3CXFGRE7.mjs} +1 -1
- package/dist/preview-engine/{renderers-KZWGSKRF.mjs → renderers-3FC3WCJN.mjs} +1 -1
- package/dist/preview-engine/renderers-3S2FM33K.mjs +1 -0
- package/dist/preview-engine/{renderers-5FQA2DP4.mjs → renderers-4AJWVIJG.mjs} +1 -1
- package/dist/preview-engine/renderers-53ZTBI3C.mjs +1 -0
- package/dist/preview-engine/renderers-5USBVCMQ.mjs +1 -0
- package/dist/preview-engine/renderers-65G6BLEA.mjs +1 -0
- package/dist/preview-engine/{renderers-PYWXELLG.mjs → renderers-6JZ4HYIU.mjs} +1 -1
- package/dist/preview-engine/{renderers-3GHEWWVX.mjs → renderers-75TL7RLS.mjs} +1 -1
- package/dist/preview-engine/{renderers-U6KY34TP.mjs → renderers-7CPYTCNW.mjs} +1 -1
- package/dist/preview-engine/renderers-7XU7BXE7.mjs +1 -0
- package/dist/preview-engine/{renderers-2VN3AH45.mjs → renderers-AZYJFJLO.mjs} +1 -1
- package/dist/preview-engine/{renderers-TR2V2HZ2.mjs → renderers-BDWVXYTW.mjs} +1 -1
- package/dist/preview-engine/renderers-BFXM32BC.mjs +1 -0
- package/dist/preview-engine/renderers-CDXHCWWK.mjs +1 -0
- package/dist/preview-engine/{renderers-N7FR54V2.mjs → renderers-CK3ZL3GM.mjs} +1 -1
- package/dist/preview-engine/renderers-CLUN7WU6.mjs +1 -0
- package/dist/preview-engine/renderers-DTB4HEXU.mjs +1 -0
- package/dist/preview-engine/renderers-EFKNRLYF.mjs +1 -0
- package/dist/preview-engine/{renderers-UPTJJE5F.mjs → renderers-FADYGSLK.mjs} +1 -1
- package/dist/preview-engine/{renderers-I5E2RSV4.mjs → renderers-FKH5S64C.mjs} +1 -1
- package/dist/preview-engine/{renderers-BSKZXITT.mjs → renderers-FM6A5YR4.mjs} +1 -1
- package/dist/preview-engine/renderers-G2K7ZA5O.mjs +1 -0
- package/dist/preview-engine/{renderers-D6T6IPER.mjs → renderers-GAIUTII6.mjs} +1 -1
- package/dist/preview-engine/renderers-GTUO5LIV.mjs +1 -0
- package/dist/preview-engine/{renderers-A6HM64UZ.mjs → renderers-GUPEJK3O.mjs} +1 -1
- package/dist/preview-engine/{renderers-IWQ3V6AJ.mjs → renderers-HSJIVP57.mjs} +1 -1
- package/dist/preview-engine/{renderers-4GRVAW2W.mjs → renderers-HZHEGONW.mjs} +1 -1
- package/dist/preview-engine/{renderers-NWHS7N2L.mjs → renderers-IHACBWXI.mjs} +1 -1
- package/dist/preview-engine/{renderers-3YCJOINH.mjs → renderers-IHRFEZNP.mjs} +1 -1
- package/dist/preview-engine/{renderers-A7VH3ON5.mjs → renderers-IJDQJEE5.mjs} +1 -1
- package/dist/preview-engine/{renderers-OT7D3BUA.mjs → renderers-IO3BVVJ7.mjs} +1 -1
- package/dist/preview-engine/renderers-IR772VSN.mjs +1 -0
- package/dist/preview-engine/{renderers-EJWPVVQR.mjs → renderers-K7B5PQBT.mjs} +1 -1
- package/dist/preview-engine/renderers-L6TRJOXA.mjs +1 -0
- package/dist/preview-engine/{renderers-N7TS5562.mjs → renderers-LVLVJHOL.mjs} +1 -1
- package/dist/preview-engine/{renderers-FK72LKQC.mjs → renderers-MBSOKWKB.mjs} +1 -1
- package/dist/preview-engine/{renderers-NC64EQDE.mjs → renderers-N6H6RSF2.mjs} +1 -1
- package/dist/preview-engine/{renderers-ZHZMGMLN.mjs → renderers-NJLGPPX7.mjs} +1 -1
- package/dist/preview-engine/renderers-O5NFQYRQ.mjs +1 -0
- package/dist/preview-engine/renderers-O6V3OEKX.mjs +1 -0
- package/dist/preview-engine/renderers-OODA27UH.mjs +1 -0
- package/dist/preview-engine/{renderers-6CG7DBTB.mjs → renderers-R4WMM6IX.mjs} +1 -1
- package/dist/preview-engine/renderers-RIGW33ZI.mjs +1 -0
- package/dist/preview-engine/{renderers-RLHTNLRE.mjs → renderers-RKZGYWDG.mjs} +1 -1
- package/dist/preview-engine/renderers-RUZRBQ4K.mjs +1 -0
- package/dist/preview-engine/renderers-SKB2GGKS.mjs +1 -0
- package/dist/preview-engine/{renderers-6OGFUSH6.mjs → renderers-SW7FIEKO.mjs} +1 -1
- package/dist/preview-engine/renderers-T4D2TASM.mjs +1 -0
- package/dist/preview-engine/renderers-T74XV36Q.mjs +1 -0
- package/dist/preview-engine/{renderers-F55XFVMP.mjs → renderers-TCNPEANL.mjs} +1 -1
- package/dist/preview-engine/renderers-TOPW2UM3.mjs +1 -0
- package/dist/preview-engine/{renderers-5YEIUTVN.mjs → renderers-TY7DVI7E.mjs} +1 -1
- package/dist/preview-engine/{renderers-WP2LBR5U.mjs → renderers-U55KRIOV.mjs} +3 -3
- package/dist/preview-engine/{renderers-YMPXGYRU.mjs → renderers-UDOBX433.mjs} +1 -1
- package/dist/preview-engine/{renderers-CRRLV7IO.mjs → renderers-UMPOVFRA.mjs} +1 -1
- package/dist/preview-engine/renderers-UO5G3Y2G.mjs +1 -0
- package/dist/preview-engine/renderers-UOV7VOJJ.mjs +1 -0
- package/dist/preview-engine/{renderers-MON4QFRF.mjs → renderers-UWKSTSTA.mjs} +1 -1
- package/dist/preview-engine/renderers-VHPAOUTA.mjs +1 -0
- package/dist/preview-engine/{renderers-E76OKK66.mjs → renderers-WR6MKT5S.mjs} +1 -1
- package/dist/preview-engine/{renderers-MCECHPCL.mjs → renderers-XKHNBARD.mjs} +1 -1
- package/dist/preview-engine/renderers-YEQRQJFC.mjs +1 -0
- package/dist/preview-engine/{renderers-RJO6H4FC.mjs → renderers-YRZ3WODX.mjs} +1 -1
- package/dist/preview-engine/renderers-YUTFGVRY.mjs +1 -0
- package/dist/preview-engine/{renderers-3SRG77SC.mjs → renderers-YXOTRKPA.mjs} +1 -1
- package/dist/preview-engine/renderers-ZOU5ARVD.mjs +1 -0
- package/dist/preview-engine/renderers-ZW75LQTR.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-DtiNMTxO.mjs → program-C2cJayA1.mjs} +4 -4
- package/dist/{program-DtiNMTxO.mjs.map → program-C2cJayA1.mjs.map} +1 -1
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-QMGrRiab.mjs → renderer--ruTGlPo.mjs} +3 -3
- package/dist/{renderer-QMGrRiab.mjs.map → renderer--ruTGlPo.mjs.map} +1 -1
- package/dist/{renderer-BAmGO6Hj.mjs → renderer-7y5Cj8rV.mjs} +3 -3
- package/dist/{renderer-BAmGO6Hj.mjs.map → renderer-7y5Cj8rV.mjs.map} +1 -1
- package/dist/{renderer-B48vtpou.mjs → renderer-92eLJg24.mjs} +4 -4
- package/dist/{renderer-B48vtpou.mjs.map → renderer-92eLJg24.mjs.map} +1 -1
- package/dist/{renderer-ButaUWLr.mjs → renderer-B0gPTXhe.mjs} +3 -3
- package/dist/{renderer-ButaUWLr.mjs.map → renderer-B0gPTXhe.mjs.map} +1 -1
- package/dist/{renderer-BaOC1Pd1.mjs → renderer-B1QREs7J.mjs} +3 -3
- package/dist/{renderer-BaOC1Pd1.mjs.map → renderer-B1QREs7J.mjs.map} +1 -1
- package/dist/{renderer-BI1nmIqA.mjs → renderer-B3e4LSE6.mjs} +3 -3
- package/dist/{renderer-BI1nmIqA.mjs.map → renderer-B3e4LSE6.mjs.map} +1 -1
- package/dist/{renderer-C4puWDLK.mjs → renderer-B4RpSd4A.mjs} +2 -2
- package/dist/{renderer-C4puWDLK.mjs.map → renderer-B4RpSd4A.mjs.map} +1 -1
- package/dist/renderer-BAhZeUUn.mjs +5 -0
- package/dist/{renderer-DmOewVsB.mjs → renderer-BBAbZfBl.mjs} +4 -4
- package/dist/{renderer-DmOewVsB.mjs.map → renderer-BBAbZfBl.mjs.map} +1 -1
- package/dist/{renderer-6QAlE1Mp.mjs → renderer-BDCy8NgT.mjs} +3 -3
- package/dist/{renderer-6QAlE1Mp.mjs.map → renderer-BDCy8NgT.mjs.map} +1 -1
- package/dist/renderer-BHAE_dKq.mjs +5 -0
- package/dist/{renderer-Rg1BFv8B.mjs → renderer-BMKFzfSQ.mjs} +3 -3
- package/dist/{renderer-Rg1BFv8B.mjs.map → renderer-BMKFzfSQ.mjs.map} +1 -1
- package/dist/renderer-BNYZY3FE.mjs +5 -0
- package/dist/{renderer-D8tdGi2P.mjs → renderer-BPixWnmY.mjs} +3 -3
- package/dist/{renderer-D8tdGi2P.mjs.map → renderer-BPixWnmY.mjs.map} +1 -1
- package/dist/renderer-BSvubMvI.mjs +5 -0
- package/dist/{renderer-C2Ff-9u_.mjs → renderer-BTd2sWDC.mjs} +3 -3
- package/dist/{renderer-C2Ff-9u_.mjs.map → renderer-BTd2sWDC.mjs.map} +1 -1
- package/dist/{renderer-YtRSM2cv.mjs → renderer-BTigwMQp.mjs} +3 -3
- package/dist/{renderer-YtRSM2cv.mjs.map → renderer-BTigwMQp.mjs.map} +1 -1
- package/dist/renderer-B_M_yhTc.mjs +5 -0
- package/dist/renderer-B_xSsTuy.mjs +5 -0
- package/dist/renderer-BePHurAU.mjs +5 -0
- package/dist/renderer-BfZquJrW.mjs +5 -0
- package/dist/{renderer-DNhOjz6C.mjs → renderer-Bi6W4RSn.mjs} +2 -2
- package/dist/{renderer-DNhOjz6C.mjs.map → renderer-Bi6W4RSn.mjs.map} +1 -1
- package/dist/{renderer--Da6pAJ4.mjs → renderer-BjCHW9Jp.mjs} +2 -2
- package/dist/{renderer-S6ez0leJ.mjs → renderer-BjvNEbML.mjs} +2 -2
- package/dist/{renderer-S6ez0leJ.mjs.map → renderer-BjvNEbML.mjs.map} +1 -1
- package/dist/{renderer-BFHgl-0f.mjs → renderer-BkWd4-YO.mjs} +2 -2
- package/dist/{renderer-BFHgl-0f.mjs.map → renderer-BkWd4-YO.mjs.map} +1 -1
- package/dist/{renderer-z3YOOR3k.mjs → renderer-Bkrk0M0r.mjs} +3 -3
- package/dist/{renderer-z3YOOR3k.mjs.map → renderer-Bkrk0M0r.mjs.map} +1 -1
- package/dist/{renderer-Kj9AhRCc.mjs → renderer-BljMOvry.mjs} +3 -3
- package/dist/{renderer-Kj9AhRCc.mjs.map → renderer-BljMOvry.mjs.map} +1 -1
- package/dist/renderer-BuY5ypB2.mjs +5 -0
- package/dist/renderer-BvOQgFHo.mjs +5 -0
- package/dist/{renderer-ITtBRR4o.mjs → renderer-BwpgDLYO.mjs} +3 -3
- package/dist/{renderer-ITtBRR4o.mjs.map → renderer-BwpgDLYO.mjs.map} +1 -1
- package/dist/{renderer-B3x-uogM.mjs → renderer-BwwZB2mt.mjs} +4 -4
- package/dist/{renderer-B3x-uogM.mjs.map → renderer-BwwZB2mt.mjs.map} +1 -1
- package/dist/{renderer-GlyeFl5R.mjs → renderer-ByCX4JYg.mjs} +3 -3
- package/dist/{renderer-GlyeFl5R.mjs.map → renderer-ByCX4JYg.mjs.map} +1 -1
- package/dist/{renderer-DDBmBmQN.mjs → renderer-C1E5Rt5q.mjs} +3 -3
- package/dist/{renderer-DDBmBmQN.mjs.map → renderer-C1E5Rt5q.mjs.map} +1 -1
- package/dist/renderer-C7NkSvUz.mjs +5 -0
- package/dist/{renderer-DvoPplvC.mjs → renderer-CCGzT6bX.mjs} +2 -2
- package/dist/{renderer-DJWQWN1E.mjs → renderer-CDOobs18.mjs} +3 -3
- package/dist/{renderer-DJWQWN1E.mjs.map → renderer-CDOobs18.mjs.map} +1 -1
- package/dist/{renderer-DacnnTjY.mjs → renderer-CDUxAtsk.mjs} +4 -4
- package/dist/{renderer-DacnnTjY.mjs.map → renderer-CDUxAtsk.mjs.map} +1 -1
- package/dist/renderer-CIuxV2q1.mjs +5 -0
- package/dist/{renderer-BlafvK-L.mjs → renderer-CJ4bxCld.mjs} +2 -2
- package/dist/renderer-CKp97tSQ.mjs +5 -0
- package/dist/{renderer-_-MCpvGq.mjs → renderer-CNb-DG00.mjs} +71 -71
- package/dist/{renderer-_-MCpvGq.mjs.map → renderer-CNb-DG00.mjs.map} +1 -1
- package/dist/{renderer-BYj8x8YM.mjs → renderer-CNuVJ4nG.mjs} +2 -2
- package/dist/{renderer-BYj8x8YM.mjs.map → renderer-CNuVJ4nG.mjs.map} +1 -1
- package/dist/renderer-CY89dTFR.mjs +5 -0
- package/dist/renderer-C_B_4Bl0.mjs +5 -0
- package/dist/{renderer-R0sJId_6.mjs → renderer-Cbsnj9vV.mjs} +3 -3
- package/dist/{renderer-R0sJId_6.mjs.map → renderer-Cbsnj9vV.mjs.map} +1 -1
- package/dist/{renderer-CBG6ewNf.mjs → renderer-CcoUNzlQ.mjs} +3 -3
- package/dist/{renderer-CBG6ewNf.mjs.map → renderer-CcoUNzlQ.mjs.map} +1 -1
- package/dist/renderer-Cd87JOjP.mjs +5 -0
- package/dist/{renderer-CbNW0KHh.mjs → renderer-CeiCJCg4.mjs} +3 -3
- package/dist/{renderer-CbNW0KHh.mjs.map → renderer-CeiCJCg4.mjs.map} +1 -1
- package/dist/renderer-Cev6orIK.mjs +6 -0
- package/dist/renderer-Cewf6UPh.mjs +5 -0
- package/dist/renderer-CnHsMLIv.mjs +5 -0
- package/dist/renderer-CoxuAr7b.mjs +5 -0
- package/dist/{renderer-BqSiWRoD.mjs → renderer-CqtIbe5n.mjs} +2 -2
- package/dist/{renderer-BqSiWRoD.mjs.map → renderer-CqtIbe5n.mjs.map} +1 -1
- package/dist/renderer-CrdG7trA.mjs +5 -0
- package/dist/{renderer-D-eTVnDS.mjs → renderer-Csss5GFQ.mjs} +2 -2
- package/dist/{renderer-D-eTVnDS.mjs.map → renderer-Csss5GFQ.mjs.map} +1 -1
- package/dist/renderer-Cu5MFgbk.mjs +5 -0
- package/dist/renderer-CuOjhtoo.mjs +5 -0
- package/dist/{renderer-Mdyv_W8K.mjs → renderer-Cv4lchUP.mjs} +3 -3
- package/dist/{renderer-Mdyv_W8K.mjs.map → renderer-Cv4lchUP.mjs.map} +1 -1
- package/dist/{renderer-CJwgsecF.mjs → renderer-Cw6Sagih.mjs} +3 -3
- package/dist/{renderer-CJwgsecF.mjs.map → renderer-Cw6Sagih.mjs.map} +1 -1
- package/dist/{renderer-DlESyfg7.d.mts → renderer-CxqPeATd.d.mts} +2 -2
- package/dist/{renderer-DlESyfg7.d.mts.map → renderer-CxqPeATd.d.mts.map} +1 -1
- package/dist/{renderer-DYo_a5-8.mjs → renderer-CzRqzp8P.mjs} +3 -3
- package/dist/{renderer-DYo_a5-8.mjs.map → renderer-CzRqzp8P.mjs.map} +1 -1
- package/dist/{renderer-BmWH4dK1.mjs → renderer-Czxgaygb.mjs} +8 -7
- package/dist/{renderer-BmWH4dK1.mjs.map → renderer-Czxgaygb.mjs.map} +1 -1
- package/dist/{renderer-CgEMtLOL.mjs → renderer-D0vom99O.mjs} +2 -2
- package/dist/{renderer-CgEMtLOL.mjs.map → renderer-D0vom99O.mjs.map} +1 -1
- package/dist/{renderer-BebePsG7.mjs → renderer-D2-V9nQq.mjs} +3 -3
- package/dist/{renderer-BebePsG7.mjs.map → renderer-D2-V9nQq.mjs.map} +1 -1
- package/dist/renderer-D2_0g6Oi.mjs +5 -0
- package/dist/renderer-D62FwolD.mjs +5 -0
- package/dist/{renderer-CMzd3BrW.mjs → renderer-D6BXR7P4.mjs} +2 -2
- package/dist/{renderer-CMzd3BrW.mjs.map → renderer-D6BXR7P4.mjs.map} +1 -1
- package/dist/renderer-DDNY9N7I.mjs +5 -0
- package/dist/{renderer-MS70wrQB.mjs → renderer-DFJQ6v0F.mjs} +2 -2
- package/dist/{renderer-MS70wrQB.mjs.map → renderer-DFJQ6v0F.mjs.map} +1 -1
- package/dist/renderer-DF_ONJ3v.mjs +5 -0
- package/dist/{renderer-DjPC9l3w.mjs → renderer-DILUmb-e.mjs} +3 -3
- package/dist/{renderer-DjPC9l3w.mjs.map → renderer-DILUmb-e.mjs.map} +1 -1
- package/dist/{renderer-Ch1rv1XP.mjs → renderer-DKfwlE4e.mjs} +3 -3
- package/dist/{renderer-Ch1rv1XP.mjs.map → renderer-DKfwlE4e.mjs.map} +1 -1
- package/dist/{renderer-B5Icb0XW.mjs → renderer-DScyMHpJ.mjs} +2 -2
- package/dist/{renderer-B5Icb0XW.mjs.map → renderer-DScyMHpJ.mjs.map} +1 -1
- package/dist/{renderer-Fm2brScz.mjs → renderer-DTw-W0Yz.mjs} +3 -3
- package/dist/{renderer-Fm2brScz.mjs.map → renderer-DTw-W0Yz.mjs.map} +1 -1
- package/dist/{renderer-dJcu7WqI.mjs → renderer-DZJJHCtm.mjs} +3 -3
- package/dist/{renderer-dJcu7WqI.mjs.map → renderer-DZJJHCtm.mjs.map} +1 -1
- package/dist/{renderer-B6c_Rk_2.mjs → renderer-DaSxr9fM.mjs} +3 -3
- package/dist/{renderer-B6c_Rk_2.mjs.map → renderer-DaSxr9fM.mjs.map} +1 -1
- package/dist/{renderer-BRWpn3dT.mjs → renderer-DaqWTx7s.mjs} +3 -3
- package/dist/{renderer-BRWpn3dT.mjs.map → renderer-DaqWTx7s.mjs.map} +1 -1
- package/dist/renderer-DbzrVHEE.mjs +5 -0
- package/dist/{renderer-CPNLkir4.mjs → renderer-DcBGYN3V.mjs} +3 -3
- package/dist/{renderer-CPNLkir4.mjs.map → renderer-DcBGYN3V.mjs.map} +1 -1
- package/dist/{renderer-BkXqFmNO.mjs → renderer-DjBCWxYy.mjs} +3 -3
- package/dist/{renderer-BkXqFmNO.mjs.map → renderer-DjBCWxYy.mjs.map} +1 -1
- package/dist/{renderer-D90PpIKG.mjs → renderer-DjwITRvg.mjs} +2 -2
- package/dist/renderer-DlYchp1v.mjs +5 -0
- package/dist/renderer-DqcUNP8J.mjs +5 -0
- package/dist/renderer-DqvFhEQj.mjs +5 -0
- package/dist/{renderer-ktpusVT2.mjs → renderer-DwVOxdzC.mjs} +3 -3
- package/dist/{renderer-ktpusVT2.mjs.map → renderer-DwVOxdzC.mjs.map} +1 -1
- package/dist/{renderer-_Fh9IBlE.mjs → renderer-Dwu_zfdL.mjs} +3 -3
- package/dist/{renderer-_Fh9IBlE.mjs.map → renderer-Dwu_zfdL.mjs.map} +1 -1
- package/dist/renderer-DxBav2bE.mjs +5 -0
- package/dist/{renderer-DS64UaYK.mjs → renderer-DyyIXLQK.mjs} +3 -3
- package/dist/{renderer-DS64UaYK.mjs.map → renderer-DyyIXLQK.mjs.map} +1 -1
- package/dist/{renderer-DqlvbOUt.mjs → renderer-DzSMeQBC.mjs} +3 -3
- package/dist/{renderer-DqlvbOUt.mjs.map → renderer-DzSMeQBC.mjs.map} +1 -1
- package/dist/{renderer-BXCZev4l.mjs → renderer-EZp_IIPK.mjs} +3 -3
- package/dist/{renderer-BXCZev4l.mjs.map → renderer-EZp_IIPK.mjs.map} +1 -1
- package/dist/{renderer-Bf4BdBtb.mjs → renderer-G1pMJH5C.mjs} +2 -2
- package/dist/{renderer-Bf4BdBtb.mjs.map → renderer-G1pMJH5C.mjs.map} +1 -1
- package/dist/renderer-GvSRoQje.mjs +5 -0
- package/dist/{renderer-DQtk282o.mjs → renderer-If8JOkBi.mjs} +2 -2
- package/dist/{renderer-DQtk282o.mjs.map → renderer-If8JOkBi.mjs.map} +1 -1
- package/dist/{renderer-CRYO5HQw.mjs → renderer-JvcR1vYI.mjs} +2 -2
- package/dist/{renderer-CRYO5HQw.mjs.map → renderer-JvcR1vYI.mjs.map} +1 -1
- package/dist/renderer-KP7Ita9g.mjs +5 -0
- package/dist/{renderer-Cz11KJmQ.mjs → renderer-NizuhHsH.mjs} +3 -3
- package/dist/{renderer-Cz11KJmQ.mjs.map → renderer-NizuhHsH.mjs.map} +1 -1
- package/dist/renderer-Pc8dyNXt.mjs +5 -0
- package/dist/{renderer-ClK7_Yzz.mjs → renderer-RDCax5CK.mjs} +3 -3
- package/dist/{renderer-ClK7_Yzz.mjs.map → renderer-RDCax5CK.mjs.map} +1 -1
- package/dist/{renderer-Bq9jXYJ5.mjs → renderer-UcdqCarR.mjs} +3 -3
- package/dist/{renderer-Bq9jXYJ5.mjs.map → renderer-UcdqCarR.mjs.map} +1 -1
- package/dist/{renderer-DL4oR40b.mjs → renderer-V5uEyDFz.mjs} +3 -3
- package/dist/{renderer-DL4oR40b.mjs.map → renderer-V5uEyDFz.mjs.map} +1 -1
- package/dist/{renderer-F410V727.mjs → renderer-X0eKSD7v.mjs} +3 -3
- package/dist/{renderer-F410V727.mjs.map → renderer-X0eKSD7v.mjs.map} +1 -1
- package/dist/{renderer-Dw1e5phO.mjs → renderer-Za4D9hej.mjs} +3 -3
- package/dist/{renderer-Dw1e5phO.mjs.map → renderer-Za4D9hej.mjs.map} +1 -1
- package/dist/{renderer-CczmOPAO.mjs → renderer-apeDrNXM.mjs} +3 -3
- package/dist/{renderer-CczmOPAO.mjs.map → renderer-apeDrNXM.mjs.map} +1 -1
- package/dist/renderer-ezRCmU09.mjs +3 -0
- package/dist/{renderer--S2cNYXS.mjs → renderer-gRMkQabv.mjs} +3 -3
- package/dist/{renderer--S2cNYXS.mjs.map → renderer-gRMkQabv.mjs.map} +1 -1
- package/dist/renderer-h6ev1ogx.mjs +5 -0
- package/dist/{renderer-8k-TR_Cy.mjs → renderer-rXgqgAjw.mjs} +3 -3
- package/dist/{renderer-8k-TR_Cy.mjs.map → renderer-rXgqgAjw.mjs.map} +1 -1
- package/dist/{renderer-DjwF10p2.mjs → renderer-ut1GqW89.mjs} +3 -3
- package/dist/{renderer-DjwF10p2.mjs.map → renderer-ut1GqW89.mjs.map} +1 -1
- package/dist/{renderer-w8LKBg_5.mjs → renderer-yyUpCeWb.mjs} +2 -2
- package/dist/{renderer-w8LKBg_5.mjs.map → renderer-yyUpCeWb.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs → renderers-CP8CFWDs-DzGXDs5p.mjs} +3 -3
- package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs.map → renderers-CP8CFWDs-DzGXDs5p.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +6 -6
- package/dist/{signals-DGRs6ddH.mjs → signals-C5nOrRmn.mjs} +3 -3
- package/dist/{signals-DGRs6ddH.mjs.map → signals-C5nOrRmn.mjs.map} +1 -1
- package/package.json +57 -56
- package/dist/dist-CPUIfrtw.mjs.map +0 -1
- package/dist/dist-CturBK2Z.mjs.map +0 -1
- package/dist/dist-fjKpBYkc.mjs.map +0 -1
- package/dist/index-AdrZIWT0.d.mts.map +0 -1
- package/dist/preview-engine/chunk-63SFBHEH.mjs +0 -1
- package/dist/preview-engine/chunk-7J2FWGVD.mjs +0 -1
- package/dist/preview-engine/chunk-M5HZPZHQ.mjs +0 -1
- package/dist/preview-engine/chunk-OG62XGCT.mjs +0 -5
- package/dist/preview-engine/chunk-U7NIY7UC.mjs +0 -1522
- package/dist/preview-engine/renderers-2H7YEUTD.mjs +0 -1
- package/dist/preview-engine/renderers-2ILG23ED.mjs +0 -1
- package/dist/preview-engine/renderers-3RC5FDWX.mjs +0 -1
- package/dist/preview-engine/renderers-6WH7NZCC.mjs +0 -1
- package/dist/preview-engine/renderers-7VJN5L3Z.mjs +0 -1
- package/dist/preview-engine/renderers-B7DSGUMI.mjs +0 -1
- package/dist/preview-engine/renderers-BFNJ7VCI.mjs +0 -1
- package/dist/preview-engine/renderers-CGYIDAVV.mjs +0 -1
- package/dist/preview-engine/renderers-DXHJAMZR.mjs +0 -1
- package/dist/preview-engine/renderers-ECA3P4ON.mjs +0 -1
- package/dist/preview-engine/renderers-FWGMNPYB.mjs +0 -1
- package/dist/preview-engine/renderers-HUW2ZMS3.mjs +0 -1
- package/dist/preview-engine/renderers-HXFRTIJD.mjs +0 -1
- package/dist/preview-engine/renderers-JHFT27YU.mjs +0 -1
- package/dist/preview-engine/renderers-NQXMYNSY.mjs +0 -1
- package/dist/preview-engine/renderers-ORAIXUL3.mjs +0 -1
- package/dist/preview-engine/renderers-Q4OFCMXI.mjs +0 -1
- package/dist/preview-engine/renderers-QVZVEYP5.mjs +0 -1
- package/dist/preview-engine/renderers-RKDPX5JU.mjs +0 -1
- package/dist/preview-engine/renderers-SBFF7JP5.mjs +0 -1
- package/dist/preview-engine/renderers-TAWT3ZSS.mjs +0 -1
- package/dist/preview-engine/renderers-UHTO6BQA.mjs +0 -1
- package/dist/preview-engine/renderers-UNK6I4JJ.mjs +0 -1
- package/dist/preview-engine/renderers-W773SBPV.mjs +0 -1
- package/dist/preview-engine/renderers-XHTMRXC5.mjs +0 -1
- package/dist/preview-engine/renderers-YECY2YFT.mjs +0 -1
- package/dist/preview-engine/renderers-YMN6QXK7.mjs +0 -1
- package/dist/preview-engine/renderers-ZANPE3OK.mjs +0 -1
- package/dist/preview-engine/renderers-ZHTX73PR.mjs +0 -1
- package/dist/preview-engine/renderers-ZJTRANIX.mjs +0 -1
- package/dist/renderer-1hypa-l7.mjs +0 -5
- package/dist/renderer-6D8M4DRu.mjs +0 -5
- package/dist/renderer-APrj6tdP.mjs +0 -5
- package/dist/renderer-BARst3ZD.mjs +0 -3
- package/dist/renderer-BF8wlbN1.mjs +0 -5
- package/dist/renderer-BOUcMCJB.mjs +0 -5
- package/dist/renderer-BSwn6KmG.mjs +0 -5
- package/dist/renderer-BUxvuC5A.mjs +0 -5
- package/dist/renderer-BYOsmJ8F.mjs +0 -5
- package/dist/renderer-Bp7LqSTt.mjs +0 -5
- package/dist/renderer-CD0amH_Q.mjs +0 -5
- package/dist/renderer-CIJGjrt7.mjs +0 -5
- package/dist/renderer-CNFTl94b.mjs +0 -5
- package/dist/renderer-CTJ0gHPS.mjs +0 -5
- package/dist/renderer-Cc3INn7w.mjs +0 -5
- package/dist/renderer-CeHh2lKY.mjs +0 -5
- package/dist/renderer-CfjwkQP4.mjs +0 -5
- package/dist/renderer-CiuOB-Md.mjs +0 -5
- package/dist/renderer-Cor66Y2X.mjs +0 -5
- package/dist/renderer-CtIM0LWe.mjs +0 -5
- package/dist/renderer-CyqgTsnx.mjs +0 -5
- package/dist/renderer-D2QG9yIW.mjs +0 -5
- package/dist/renderer-D2woU27o.mjs +0 -6
- package/dist/renderer-DAhDiQQY.mjs +0 -5
- package/dist/renderer-DIjxOQFi.mjs +0 -5
- package/dist/renderer-DRzalGhU.mjs +0 -5
- package/dist/renderer-DY6S1jWp.mjs +0 -5
- package/dist/renderer-DeW0KNQV.mjs +0 -5
- package/dist/renderer-DsVSVFkl.mjs +0 -5
- package/dist/renderer-DxvcIgEU.mjs +0 -5
- package/dist/renderer-F0MKqmol.mjs +0 -5
- package/dist/renderer-OkbovcAc.mjs +0 -5
- package/dist/renderer-QyBeWMEL.mjs +0 -5
- package/dist/renderer-hSh5IrDp.mjs +0 -5
- package/dist/renderer-puLncHft.mjs +0 -5
- package/dist/renderer-wnFCaw7j.mjs +0 -5
- package/dist/renderer-xjtlyGS1.mjs +0 -5
package/dist/fonts/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Q as registerHeadlessFont, m as SlugGeometry, p as SlugFontCache } from "./dist-
|
|
1
|
+
import { Q as registerHeadlessFont, m as SlugGeometry, p as SlugFontCache } from "./dist-CspOG4V1.mjs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import * as fontkit from "fontkit";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
@@ -256,4 +256,4 @@ var FontManager = class FontManager {
|
|
|
256
256
|
|
|
257
257
|
//#endregion
|
|
258
258
|
export { FontManager as t };
|
|
259
|
-
//# sourceMappingURL=fonts-
|
|
259
|
+
//# sourceMappingURL=fonts-CsMDfqv9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fonts-EgMNL8KE.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\tSlugGeometry,\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 interface MeasureTextOptions {\n\tfontFamily: string;\n\tfontSize?: number;\n\tfontWeight?: string | number;\n\t/** Extra px between characters, as on `Layer.text`. */\n\tletterSpacing?: number;\n\t/** Multiplier of fontSize when < 10, else px. Default 1.2. */\n\tlineHeight?: number;\n\t/** Wrap width in px; omit for one line per `\\n`. */\n\twidth?: number;\n\talign?: \"left\" | \"center\" | \"right\";\n\t/** Paragraph base direction, as on `Layer.text`. Default \"auto\". */\n\tdirection?: \"ltr\" | \"rtl\" | \"auto\";\n}\n\nexport interface MeasuredGlyph {\n\tchar: string;\n\t/** Index into the string (code units), matching `text.slice`. */\n\tindex: number;\n\t/** Left edge of the glyph, relative to the text box. */\n\tx: number;\n\t/** Baseline-relative top of the line box. */\n\ty: number;\n\t/** Advance width in px. */\n\twidth: number;\n\tline: number;\n\t/** Part of a right-to-left run: reading continues to the left. */\n\trtl?: boolean;\n}\n\nexport interface TextMetrics {\n\twidth: number;\n\theight: number;\n\tlines: number;\n\t/** Line box height in px. */\n\tlineHeight: number;\n\tglyphs: MeasuredGlyph[];\n\t/**\n\t * X of a caret placed after `count` characters (0 = before the first),\n\t * relative to the text box. In right-to-left text the caret sits on the\n\t * left of the last character. Pair with a `.keys(\"text\", …)` reveal to make\n\t * a cursor follow typing exactly.\n\t */\n\tcaretX(count: number): number;\n\t/** Width of the first `count` characters (same as `caretX` on one line). */\n\twidthOf(count: number): number;\n}\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 * Measures text with the real font, exactly as `Layer.text` lays it out:\n\t * box size, line count, per-glyph positions and caret offsets. Use it to\n\t * size containers, place cursors, underline a word or center by ink\n\t * instead of guessing advances. The family must be registered first.\n\t *\n\t * ```ts\n\t * const m = FontManager.measure(\"Hello\", { fontFamily: \"Inter\", fontSize: 60 });\n\t * m.width; m.caretX(3); m.glyphs[1].x\n\t * ```\n\t */\n\tpublic static measure(\n\t\ttext: string,\n\t\toptions: MeasureTextOptions,\n\t): TextMetrics {\n\t\tconst fontSize = options.fontSize ?? 48;\n\t\tconst font = SlugFontCache.getFont(\n\t\t\toptions.fontFamily,\n\t\t\toptions.fontWeight,\n\t\t\tnull,\n\t\t\tundefined,\n\t\t\tfontSize,\n\t\t);\n\t\tif (!font) {\n\t\t\tthrow new Error(\n\t\t\t\t`FontManager.measure: font \"${options.fontFamily}\" is not registered. ` +\n\t\t\t\t\t\"Call `await FontManager.register(...)` first.\",\n\t\t\t);\n\t\t}\n\t\tconst lineHeight =\n\t\t\toptions.lineHeight !== undefined && options.lineHeight < 10\n\t\t\t\t? options.lineHeight * fontSize\n\t\t\t\t: (options.lineHeight ?? fontSize * 1.2);\n\t\tconst letterSpacing = options.letterSpacing ?? 0;\n\t\tconst { width, height, layout } = SlugGeometry.measure(\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tfontSize,\n\t\t\tletterSpacing,\n\t\t\tlineHeight,\n\t\t\toptions.width,\n\t\t\tundefined,\n\t\t\toptions.direction,\n\t\t);\n\t\tconst scale = fontSize / font.unitsPerEm;\n\t\t// One entry per cluster (a letter with its marks, or a ligature), in\n\t\t// reading order; textIndex maps it back to the string.\n\t\tconst glyphs: MeasuredGlyph[] = [];\n\t\tconst seen = new Set<number>();\n\t\tlet cursor = 0;\n\t\tfor (const g of layout.glyphs) {\n\t\t\tlet index = g.textIndex;\n\t\t\tif (index === undefined) {\n\t\t\t\tconst at = text.indexOf(g.char, cursor);\n\t\t\t\tindex = at >= 0 ? at : cursor;\n\t\t\t}\n\t\t\tif (seen.has(index)) continue;\n\t\t\tseen.add(index);\n\t\t\tcursor = index + g.char.length;\n\t\t\tconst advance =\n\t\t\t\tg.clusterAdvance ?? g.cp.advanceWidth * (g.fontScale ?? scale);\n\t\t\tglyphs.push({\n\t\t\t\tchar: g.char,\n\t\t\t\tindex,\n\t\t\t\tx: g.clusterX ?? g.x,\n\t\t\t\ty: g.y,\n\t\t\t\twidth: advance + letterSpacing,\n\t\t\t\tline: g.lineIndex,\n\t\t\t\t...(g.rtl && { rtl: true }),\n\t\t\t});\n\t\t}\n\t\tconst caretX = (count: number): number => {\n\t\t\tif (count <= 0 || glyphs.length === 0) {\n\t\t\t\tconst first = glyphs[0];\n\t\t\t\tif (!first) return 0;\n\t\t\t\treturn first.rtl ? first.x + first.width - letterSpacing : first.x;\n\t\t\t}\n\t\t\tconst before = glyphs.filter((g) => g.index < count);\n\t\t\tconst last = before[before.length - 1];\n\t\t\tif (!last) return 0;\n\t\t\treturn last.rtl ? last.x : last.x + last.width - letterSpacing;\n\t\t};\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tlines: layout.linesCount,\n\t\t\tlineHeight,\n\t\t\tglyphs,\n\t\t\tcaretX,\n\t\t\twidthOf: (count: number) => caretX(count) - (glyphs[0]?.x ?? 0),\n\t\t};\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-CsMDfqv9.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\tSlugGeometry,\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 interface MeasureTextOptions {\n\tfontFamily: string;\n\tfontSize?: number;\n\tfontWeight?: string | number;\n\t/** Extra px between characters, as on `Layer.text`. */\n\tletterSpacing?: number;\n\t/** Multiplier of fontSize when < 10, else px. Default 1.2. */\n\tlineHeight?: number;\n\t/** Wrap width in px; omit for one line per `\\n`. */\n\twidth?: number;\n\talign?: \"left\" | \"center\" | \"right\";\n\t/** Paragraph base direction, as on `Layer.text`. Default \"auto\". */\n\tdirection?: \"ltr\" | \"rtl\" | \"auto\";\n}\n\nexport interface MeasuredGlyph {\n\tchar: string;\n\t/** Index into the string (code units), matching `text.slice`. */\n\tindex: number;\n\t/** Left edge of the glyph, relative to the text box. */\n\tx: number;\n\t/** Baseline-relative top of the line box. */\n\ty: number;\n\t/** Advance width in px. */\n\twidth: number;\n\tline: number;\n\t/** Part of a right-to-left run: reading continues to the left. */\n\trtl?: boolean;\n}\n\nexport interface TextMetrics {\n\twidth: number;\n\theight: number;\n\tlines: number;\n\t/** Line box height in px. */\n\tlineHeight: number;\n\tglyphs: MeasuredGlyph[];\n\t/**\n\t * X of a caret placed after `count` characters (0 = before the first),\n\t * relative to the text box. In right-to-left text the caret sits on the\n\t * left of the last character. Pair with a `.keys(\"text\", …)` reveal to make\n\t * a cursor follow typing exactly.\n\t */\n\tcaretX(count: number): number;\n\t/** Width of the first `count` characters (same as `caretX` on one line). */\n\twidthOf(count: number): number;\n}\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 * Measures text with the real font, exactly as `Layer.text` lays it out:\n\t * box size, line count, per-glyph positions and caret offsets. Use it to\n\t * size containers, place cursors, underline a word or center by ink\n\t * instead of guessing advances. The family must be registered first.\n\t *\n\t * ```ts\n\t * const m = FontManager.measure(\"Hello\", { fontFamily: \"Inter\", fontSize: 60 });\n\t * m.width; m.caretX(3); m.glyphs[1].x\n\t * ```\n\t */\n\tpublic static measure(\n\t\ttext: string,\n\t\toptions: MeasureTextOptions,\n\t): TextMetrics {\n\t\tconst fontSize = options.fontSize ?? 48;\n\t\tconst font = SlugFontCache.getFont(\n\t\t\toptions.fontFamily,\n\t\t\toptions.fontWeight,\n\t\t\tnull,\n\t\t\tundefined,\n\t\t\tfontSize,\n\t\t);\n\t\tif (!font) {\n\t\t\tthrow new Error(\n\t\t\t\t`FontManager.measure: font \"${options.fontFamily}\" is not registered. ` +\n\t\t\t\t\t\"Call `await FontManager.register(...)` first.\",\n\t\t\t);\n\t\t}\n\t\tconst lineHeight =\n\t\t\toptions.lineHeight !== undefined && options.lineHeight < 10\n\t\t\t\t? options.lineHeight * fontSize\n\t\t\t\t: (options.lineHeight ?? fontSize * 1.2);\n\t\tconst letterSpacing = options.letterSpacing ?? 0;\n\t\tconst { width, height, layout } = SlugGeometry.measure(\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tfontSize,\n\t\t\tletterSpacing,\n\t\t\tlineHeight,\n\t\t\toptions.width,\n\t\t\tundefined,\n\t\t\toptions.direction,\n\t\t);\n\t\tconst scale = fontSize / font.unitsPerEm;\n\t\t// One entry per cluster (a letter with its marks, or a ligature), in\n\t\t// reading order; textIndex maps it back to the string.\n\t\tconst glyphs: MeasuredGlyph[] = [];\n\t\tconst seen = new Set<number>();\n\t\tlet cursor = 0;\n\t\tfor (const g of layout.glyphs) {\n\t\t\tlet index = g.textIndex;\n\t\t\tif (index === undefined) {\n\t\t\t\tconst at = text.indexOf(g.char, cursor);\n\t\t\t\tindex = at >= 0 ? at : cursor;\n\t\t\t}\n\t\t\tif (seen.has(index)) continue;\n\t\t\tseen.add(index);\n\t\t\tcursor = index + g.char.length;\n\t\t\tconst advance =\n\t\t\t\tg.clusterAdvance ?? g.cp.advanceWidth * (g.fontScale ?? scale);\n\t\t\tglyphs.push({\n\t\t\t\tchar: g.char,\n\t\t\t\tindex,\n\t\t\t\tx: g.clusterX ?? g.x,\n\t\t\t\ty: g.y,\n\t\t\t\twidth: advance + letterSpacing,\n\t\t\t\tline: g.lineIndex,\n\t\t\t\t...(g.rtl && { rtl: true }),\n\t\t\t});\n\t\t}\n\t\tconst caretX = (count: number): number => {\n\t\t\tif (count <= 0 || glyphs.length === 0) {\n\t\t\t\tconst first = glyphs[0];\n\t\t\t\tif (!first) return 0;\n\t\t\t\treturn first.rtl ? first.x + first.width - letterSpacing : first.x;\n\t\t\t}\n\t\t\tconst before = glyphs.filter((g) => g.index < count);\n\t\t\tconst last = before[before.length - 1];\n\t\t\tif (!last) return 0;\n\t\t\treturn last.rtl ? last.x : last.x + last.width - letterSpacing;\n\t\t};\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tlines: layout.linesCount,\n\t\t\tlineHeight,\n\t\t\tglyphs,\n\t\t\tcaretX,\n\t\t\twidthOf: (count: number) => caretX(count) - (glyphs[0]?.x ?? 0),\n\t\t};\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 { Nn as signalRegistry } from "./dist-
|
|
1
|
+
import { Nn as signalRegistry } from "./dist-CspOG4V1.mjs";
|
|
2
2
|
|
|
3
3
|
//#region ../node-sdk/dist/gpu.mjs
|
|
4
4
|
const TRANSPARENT = {
|
|
@@ -212,4 +212,4 @@ function drawFullscreenPass(encoder, target, pipeline, bindGroups) {
|
|
|
212
212
|
|
|
213
213
|
//#endregion
|
|
214
214
|
export { createFullscreenPipeline as a, drawTextureToTarget as c, signalTextureView as d, signalTiming as f, beginTargetPass as i, fragmentBindGroupLayout as l, PREMULTIPLIED_BLEND as n, drawChildToTexture as o, texturesLayout as p, STRAIGHT_ALPHA_BLEND as r, drawFullscreenPass as s, FULLSCREEN_QUAD_WGSL as t, perDevice as u };
|
|
215
|
-
//# sourceMappingURL=gpu-
|
|
215
|
+
//# sourceMappingURL=gpu-DtT5I4ME.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpu-CN14e7Bi.mjs","names":[],"sources":["../../node-sdk/dist/gpu.mjs"],"sourcesContent":["import { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/gpu.ts\nconst TRANSPARENT = {\n\tr: 0,\n\tg: 0,\n\tb: 0,\n\ta: 0\n};\n/**\n* Full-screen quad vertex stage: a 4-vertex triangle strip (draw(4)) that\n* hands `in.uv` (0,0 top-left → 1,1 bottom-right) to an `fs` reading `VSOut`.\n*/\nconst FULLSCREEN_QUAD_WGSL = `\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n`;\n/** Premultiplied-alpha \"over\" blending. */\nconst PREMULTIPLIED_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** Straight-alpha color over a premultiplied-alpha accumulation. */\nconst STRAIGHT_ALPHA_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"src-alpha\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** A bind group layout whose entries are bound at 0, 1, 2… in order. */\nfunction fragmentBindGroupLayout(device, bindings, label) {\n\treturn device.createBindGroupLayout({\n\t\t...label && { label },\n\t\tentries: bindings.map((binding, index) => {\n\t\t\tif (binding === \"uniform\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t};\n\t\t\tif (binding === \"texture\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t};\n\t\t\tif (binding === \"sampler\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tsampler: { type: \"filtering\" }\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t...binding,\n\t\t\t\tbinding: index\n\t\t\t};\n\t\t})\n\t});\n}\n/** `count` float textures followed by one filtering sampler. */\nfunction texturesLayout(device, count) {\n\treturn fragmentBindGroupLayout(device, [...Array(count).fill(\"texture\"), \"sampler\"]);\n}\n/** Memoizes `create` per GPUDevice (resources can't cross devices). */\nfunction perDevice(create) {\n\tconst cache = /* @__PURE__ */ new WeakMap();\n\treturn (device) => {\n\t\tlet value = cache.get(device);\n\t\tif (value === void 0) {\n\t\t\tvalue = create(device);\n\t\t\tcache.set(device, value);\n\t\t}\n\t\treturn value;\n\t};\n}\n/** A triangle-strip pipeline drawing one full-screen quad (`draw(4)`). */\nfunction createFullscreenPipeline(device, options) {\n\tconst { module, format, blend } = options;\n\treturn device.createRenderPipeline({\n\t\t...options.label && { label: options.label },\n\t\tlayout: Array.isArray(options.layouts) ? device.createPipelineLayout({ bindGroupLayouts: options.layouts }) : options.layouts,\n\t\tvertex: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.vertexEntryPoint ?? \"vs\"\n\t\t},\n\t\tfragment: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.fragmentEntryPoint ?? \"fs\",\n\t\t\ttargets: [blend ? {\n\t\t\t\tformat,\n\t\t\t\tblend\n\t\t\t} : { format }]\n\t\t},\n\t\tprimitive: { topology: \"triangle-strip\" }\n\t});\n}\n/**\n* Renders `child` into a cleared temporary texture with an identity\n* transform and a full-size scissor, and returns that texture.\n*/\nasync function drawChildToTexture(args, child, options = {}) {\n\tconst { ctx, encoder, props } = args;\n\tconst width = options.width ?? args.targetWidth;\n\tconst height = options.height ?? args.targetHeight;\n\tconst texture = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\targs.targetTexture,\n\t\t...options.exclude ?? []\n\t]);\n\tconst view = texture.createView();\n\tctx.renderer.beginFrame(encoder, view, TRANSPARENT, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait args.drawChild(child, options.props ?? {\n\t\t...props,\n\t\tvirtualMedia: child\n\t}, view, texture, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\treturn {\n\t\ttexture,\n\t\tview\n\t};\n}\n/**\n* Opens a \"load\" pass on the node's target and makes it the node's current\n* pass (the caller hands it back to the compositor).\n*/\nfunction beginTargetPass(args, width = args.targetWidth, height = args.targetHeight) {\n\tconst pass = args.ctx.renderer.beginFrame(args.encoder, args.targetView, TRANSPARENT, width, height, \"load\");\n\targs.pass = pass;\n\treturn pass;\n}\n/** Draws `texture` over the whole target at `opacity` (the node's output). */\nfunction drawTextureToTarget(args, texture, opacity = 1) {\n\tconst { targetWidth: width, targetHeight: height } = args;\n\targs.ctx.renderer.drawTexture(beginTargetPass(args), texture, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t}, { opacity });\n}\n/** Clock a signal texture is evaluated at, in seconds. */\nfunction signalTiming(props, frame, fps, fallbackDurationSeconds = 0) {\n\tconst metadataDurationMs = props.virtualMedia?.metadata?.durationMs;\n\treturn {\n\t\telapsedSeconds: props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps,\n\t\tdurationSeconds: metadataDurationMs ? metadataDurationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : fallbackDurationSeconds\n\t};\n}\n/**\n* The texture a bound parameter samples: its own GPU binding, the signal's\n* texture (cached under `sd.nodeId`, else `fallbackId`), or a 1×1 dummy.\n*/\nfunction signalTextureView(sc, param, fallbackId) {\n\tconst { args } = sc;\n\tif (param.gpuTextureView) return param.gpuTextureView;\n\tif (param.hasStaticSig && param.sd) return signalRegistry.getOrCreate2DTextureView(args.ctx.device, args.encoder, param.sd.nodeId ?? fallbackId, sc.elapsedSeconds, sc.durationSeconds, param.sd, sc.width, sc.height, args.props.renderId, sc.frame, sc.fps);\n\treturn signalRegistry.getDummy1x1TextureView(args.ctx.device);\n}\n/** Clears `target` to transparent and draws one full-screen quad into it. */\nfunction drawFullscreenPass(encoder, target, pipeline, bindGroups) {\n\tconst pass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: target,\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: TRANSPARENT\n\t}] });\n\tpass.setPipeline(pipeline);\n\tbindGroups.forEach((group, index) => {\n\t\tpass.setBindGroup(index, group);\n\t});\n\tpass.draw(4);\n\tpass.end();\n}\n\n//#endregion\nexport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, STRAIGHT_ALPHA_BLEND, beginTargetPass, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout };\n//# sourceMappingURL=gpu.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gpu-DtT5I4ME.mjs","names":[],"sources":["../../node-sdk/dist/gpu.mjs"],"sourcesContent":["import { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/gpu.ts\nconst TRANSPARENT = {\n\tr: 0,\n\tg: 0,\n\tb: 0,\n\ta: 0\n};\n/**\n* Full-screen quad vertex stage: a 4-vertex triangle strip (draw(4)) that\n* hands `in.uv` (0,0 top-left → 1,1 bottom-right) to an `fs` reading `VSOut`.\n*/\nconst FULLSCREEN_QUAD_WGSL = `\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n`;\n/** Premultiplied-alpha \"over\" blending. */\nconst PREMULTIPLIED_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** Straight-alpha color over a premultiplied-alpha accumulation. */\nconst STRAIGHT_ALPHA_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"src-alpha\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** A bind group layout whose entries are bound at 0, 1, 2… in order. */\nfunction fragmentBindGroupLayout(device, bindings, label) {\n\treturn device.createBindGroupLayout({\n\t\t...label && { label },\n\t\tentries: bindings.map((binding, index) => {\n\t\t\tif (binding === \"uniform\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t};\n\t\t\tif (binding === \"texture\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t};\n\t\t\tif (binding === \"sampler\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tsampler: { type: \"filtering\" }\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t...binding,\n\t\t\t\tbinding: index\n\t\t\t};\n\t\t})\n\t});\n}\n/** `count` float textures followed by one filtering sampler. */\nfunction texturesLayout(device, count) {\n\treturn fragmentBindGroupLayout(device, [...Array(count).fill(\"texture\"), \"sampler\"]);\n}\n/** Memoizes `create` per GPUDevice (resources can't cross devices). */\nfunction perDevice(create) {\n\tconst cache = /* @__PURE__ */ new WeakMap();\n\treturn (device) => {\n\t\tlet value = cache.get(device);\n\t\tif (value === void 0) {\n\t\t\tvalue = create(device);\n\t\t\tcache.set(device, value);\n\t\t}\n\t\treturn value;\n\t};\n}\n/** A triangle-strip pipeline drawing one full-screen quad (`draw(4)`). */\nfunction createFullscreenPipeline(device, options) {\n\tconst { module, format, blend } = options;\n\treturn device.createRenderPipeline({\n\t\t...options.label && { label: options.label },\n\t\tlayout: Array.isArray(options.layouts) ? device.createPipelineLayout({ bindGroupLayouts: options.layouts }) : options.layouts,\n\t\tvertex: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.vertexEntryPoint ?? \"vs\"\n\t\t},\n\t\tfragment: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.fragmentEntryPoint ?? \"fs\",\n\t\t\ttargets: [blend ? {\n\t\t\t\tformat,\n\t\t\t\tblend\n\t\t\t} : { format }]\n\t\t},\n\t\tprimitive: { topology: \"triangle-strip\" }\n\t});\n}\n/**\n* Renders `child` into a cleared temporary texture with an identity\n* transform and a full-size scissor, and returns that texture.\n*/\nasync function drawChildToTexture(args, child, options = {}) {\n\tconst { ctx, encoder, props } = args;\n\tconst width = options.width ?? args.targetWidth;\n\tconst height = options.height ?? args.targetHeight;\n\tconst texture = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\targs.targetTexture,\n\t\t...options.exclude ?? []\n\t]);\n\tconst view = texture.createView();\n\tctx.renderer.beginFrame(encoder, view, TRANSPARENT, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait args.drawChild(child, options.props ?? {\n\t\t...props,\n\t\tvirtualMedia: child\n\t}, view, texture, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\treturn {\n\t\ttexture,\n\t\tview\n\t};\n}\n/**\n* Opens a \"load\" pass on the node's target and makes it the node's current\n* pass (the caller hands it back to the compositor).\n*/\nfunction beginTargetPass(args, width = args.targetWidth, height = args.targetHeight) {\n\tconst pass = args.ctx.renderer.beginFrame(args.encoder, args.targetView, TRANSPARENT, width, height, \"load\");\n\targs.pass = pass;\n\treturn pass;\n}\n/** Draws `texture` over the whole target at `opacity` (the node's output). */\nfunction drawTextureToTarget(args, texture, opacity = 1) {\n\tconst { targetWidth: width, targetHeight: height } = args;\n\targs.ctx.renderer.drawTexture(beginTargetPass(args), texture, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t}, { opacity });\n}\n/** Clock a signal texture is evaluated at, in seconds. */\nfunction signalTiming(props, frame, fps, fallbackDurationSeconds = 0) {\n\tconst metadataDurationMs = props.virtualMedia?.metadata?.durationMs;\n\treturn {\n\t\telapsedSeconds: props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps,\n\t\tdurationSeconds: metadataDurationMs ? metadataDurationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : fallbackDurationSeconds\n\t};\n}\n/**\n* The texture a bound parameter samples: its own GPU binding, the signal's\n* texture (cached under `sd.nodeId`, else `fallbackId`), or a 1×1 dummy.\n*/\nfunction signalTextureView(sc, param, fallbackId) {\n\tconst { args } = sc;\n\tif (param.gpuTextureView) return param.gpuTextureView;\n\tif (param.hasStaticSig && param.sd) return signalRegistry.getOrCreate2DTextureView(args.ctx.device, args.encoder, param.sd.nodeId ?? fallbackId, sc.elapsedSeconds, sc.durationSeconds, param.sd, sc.width, sc.height, args.props.renderId, sc.frame, sc.fps);\n\treturn signalRegistry.getDummy1x1TextureView(args.ctx.device);\n}\n/** Clears `target` to transparent and draws one full-screen quad into it. */\nfunction drawFullscreenPass(encoder, target, pipeline, bindGroups) {\n\tconst pass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: target,\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: TRANSPARENT\n\t}] });\n\tpass.setPipeline(pipeline);\n\tbindGroups.forEach((group, index) => {\n\t\tpass.setBindGroup(index, group);\n\t});\n\tpass.draw(4);\n\tpass.end();\n}\n\n//#endregion\nexport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, STRAIGHT_ALPHA_BLEND, beginTargetPass, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout };\n//# sourceMappingURL=gpu.mjs.map"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ma as OutputItem, po as VirtualMediaData, x as RenderContextValue } from "./index-
|
|
1
|
+
import { ma as OutputItem, po as VirtualMediaData, x as RenderContextValue } from "./index-DujpgUUq.mjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
4
|
//#region ../node-sdk/dist/renderer.d.mts
|
|
@@ -79,4 +79,4 @@ declare const SignalResultSchema: z.ZodObject<{
|
|
|
79
79
|
}, z.core.$strip>;
|
|
80
80
|
//#endregion
|
|
81
81
|
export { NodeRendererPlugin as n, WebGPUNodeRenderer as r, SignalResultSchema as t };
|
|
82
|
-
//# sourceMappingURL=index-
|
|
82
|
+
//# sourceMappingURL=index-B1XcyMm8.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-Cg2ptXcs.d.mts","names":["VirtualMediaData","isSignal","resolveBoolean","resolveNumber","resolveParam","resolveString","RenderContextValue","Point2D","solveHomography","GPUCommandEncoder","globalThis","GPURenderPassEncoder","GPUTextureView","GPUTexture","NodeRenderProps","Record","Partial","WebGPUNodeRenderer","Promise","AudioProcessorContext","GPUDevice","AudioProcessor","Float32Array","resolveFrameNumber","unwrapFrameParam","NodeOperationInputs","HandleParam","SD","resolveHandleParam","resolveSignalField","isHandleConnected","NodeRendererPlugin","defineRenderer","Readonly","WebGPURegistry","webgpuRegistry","registerWebGPURenderer","AudioProcessorRegistry","audioRegistry","AudioProcessor","AudioProcessorContext","GPUCommandEncoder","GPURenderPassEncoder","GPUTexture","GPUTextureView","HandleParam","NodeOperationInputs","NodeRenderProps","NodeRendererPlugin","Point2D","WebGPUNodeRenderer","WebGPURegistry","audioRegistry","defineRenderer","isHandleConnected","isSignal","registerWebGPURenderer","resolveBoolean","resolveFrameNumber","resolveHandleParam","resolveNumber","resolveParam","resolveSignalField","resolveString","solveHomography","unwrapFrameParam","webgpuRegistry","_framefields_core0","FileDataSchema","MultiOutputGenericSchema","SingleOutputGenericSchema","VirtualMediaDataSchema","createOutputItemSchema","z","FieldMeta","FieldOptions","ConfigBuilder","TKey","TType","TShape","ZodRawShape","Record","ZodTypeAny","P","core","$strip","ZodObject","configBuilder","COMPOSITE_OPERATIONS","GlobalCompositeOperation","ZodEnum","ColorSchema","ZodString","ZodOptional","PercentageSchema","ZodNumber","DimensionSchema","AnimationSchema","ZodArray","StrokeSchema","ZodDefault","ImageResultSchema","ZodLiteral","OutputItem","$ZodTypeInternals","ZodType","ZodTuple","ImageResult","infer","VideoResultSchema","VideoResult","AudioResultSchema","AudioResult","TextResultSchema","TextResult","NumberResultSchema","NumberResult","SignalResultSchema","SignalResult","OperationInputsSchema","ZodBoolean","ZodUnknown","ZodNullable","ZodRecord"],"sources":["../../node-sdk/dist/renderer.d.mts","../../node-sdk/dist/index.d.mts"],"sourcesContent":["import { VirtualMediaData, isSignal, resolveBoolean, resolveNumber, resolveParam, resolveString } from \"@framefields/core\";\nimport { RenderContextValue } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/homography.d.ts\ninterface Point2D {\n x: number;\n y: number;\n}\n/**\n * Computes an 8-parameter 3x3 homography matrix mapping destination coordinates (quad)\n * to normalized source coordinates (unit square [0, 1]^2).\n *\n * The homography H maps destination (x, y) to source (u, v):\n * u = (h00*x + h01*y + h02) / (h20*x + h21*y + h22)\n * v = (h10*x + h11*y + h12) / (h20*x + h21*y + h22)\n *\n * Resulting array: [h00, h01, h02, h10, h11, h12, h20, h21, 1.0]\n */\ndeclare function solveHomography(dstPoints: Point2D[], srcPoints?: Point2D[]): number[];\n//#endregion\n//#region renderer/index.d.ts\ntype GPUCommandEncoder = globalThis.GPUCommandEncoder;\ntype GPURenderPassEncoder = globalThis.GPURenderPassEncoder;\ntype GPUTextureView = globalThis.GPUTextureView;\ntype GPUTexture = globalThis.GPUTexture;\ninterface NodeRenderProps {\n renderId: string;\n virtualMedia: VirtualMediaData;\n volume?: number;\n playbackRateOverride?: number;\n trimStartOverride?: number;\n trimEndOverride?: number;\n containerWidth: number;\n containerHeight: number;\n opacity?: number;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n timestampSec?: number;\n renderingContext?: \"visual\" | \"audio\";\n inheritedSeekOffset?: number;\n inheritedClockOffset?: number;\n isHeadless?: boolean;\n forceWait?: boolean;\n isVideoMode?: boolean;\n isPlaying?: boolean;\n excludeTextures?: GPUTexture[];\n /** Signal values that override the node's own (text animators read them). */\n signals?: Record<string, unknown>;\n renderChild?: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>) => unknown;\n}\ntype WebGPUNodeRenderer = (args: {\n ctx: RenderContextValue;\n encoder: GPUCommandEncoder;\n pass: GPURenderPassEncoder;\n targetView: GPUTextureView;\n targetTexture: GPUTexture;\n targetWidth: number;\n targetHeight: number;\n props: NodeRenderProps;\n drawChild: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>, targetViewOverride?: GPUTextureView, targetTextureOverride?: GPUTexture, targetWidthOverride?: number, targetHeightOverride?: number) => Promise<void>;\n}) => Promise<void> | void;\ninterface AudioProcessorContext {\n device?: GPUDevice;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n renderId?: string;\n}\ntype AudioProcessor = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData, ctx?: AudioProcessorContext) => void | Promise<void>;\n/**\n * A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or\n * `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;\n * `fallback` when none of those yields a finite number.\n */\ndeclare function resolveFrameNumber(val: unknown, fallback: number, frame: number, fps: number): number;\n/**\n * A static node parameter at `frame`: calls `get(ctx)` / `(frame, fps)`\n * functions and reads `{ value }` wrappers, keeping a signal's GPU texture\n * binding when it has one. Anything else is returned as-is.\n */\ndeclare function unwrapFrameParam(raw: unknown, frame: number, fps: number): {\n value: unknown;\n gpuTextureView?: GPUTextureView;\n};\n/** The `inputs` map node operations carry: one entry per connected handle. */\ntype NodeOperationInputs = Record<string, {\n connectionValid: boolean;\n outputItem: {\n type: string;\n data: unknown;\n } | null;\n}>;\ninterface HandleParam<SD> {\n val: number;\n /** The value comes from a signal (`sd`) sampled on the GPU. */\n hasStaticSig: boolean;\n sd: SD | null;\n handleId: string | null | undefined;\n}\n/**\n * A numeric parameter fed through `handleId`: a connected Number (clamped), a\n * connected Signal (sampled on the GPU, `val` stays `fallbackVal`), or else\n * `fallbackVal` clamped to [clampMin, clampMax].\n */\ndeclare function resolveHandleParam<SD>(inputs: NodeOperationInputs | undefined, handleId: string | null | undefined, fallbackVal: number, clampMin: number, clampMax: number): HandleParam<SD>;\n/**\n * A numeric field `fieldName` of a node operation, fed through its\n * `${fieldName}HandleId` input: a connected Signal/Numeric (`sd`, sampled on\n * the GPU; `value` is its offset), a connected Number, or the operation's own\n * value — each clamped to [minVal, maxVal].\n */\ndeclare function resolveSignalField<SD>(op: {\n inputs?: NodeOperationInputs;\n}, fieldName: string, defaultValue: number, minVal?: number, maxVal?: number): {\n hasSignal: boolean;\n sd: SD | null;\n value: number;\n};\n/**\n * Whether the handle whose id is stored at `op[handleIdKey]` has a valid\n * Signal or Number connection.\n */\ndeclare function isHandleConnected(op: Record<string, unknown>, handleIdKey: string): boolean;\ninterface NodeRendererPlugin {\n WebGPURenderer?: WebGPUNodeRenderer;\n audioProcessor?: AudioProcessor;\n}\ndeclare function defineRenderer(plugin: NodeRendererPlugin): Readonly<NodeRendererPlugin>;\ndeclare class WebGPURegistry {\n private renderers;\n register(op: string, renderer: WebGPUNodeRenderer): void;\n get(op: string): WebGPUNodeRenderer | undefined;\n has(op: string): boolean;\n}\ndeclare const webgpuRegistry: WebGPURegistry;\ndeclare function registerWebGPURenderer(op: string, renderer: WebGPUNodeRenderer): void;\ndeclare class AudioProcessorRegistry {\n private processors;\n register(opType: string, processor: AudioProcessor): void;\n get(opType: string): AudioProcessor | null;\n}\ndeclare const audioRegistry: AudioProcessorRegistry;\n//#endregion\nexport { AudioProcessor, AudioProcessorContext, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, HandleParam, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, Point2D, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=renderer.d.mts.map","import { AudioProcessor, AudioProcessorContext, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, HandleParam, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, Point2D, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry } from \"./renderer.mjs\";\nimport * as _framefields_core0 from \"@framefields/core\";\nimport { FileDataSchema, MultiOutputGenericSchema, SingleOutputGenericSchema, VirtualMediaDataSchema, createOutputItemSchema } from \"@framefields/core\";\nimport { z } from \"zod\";\n\n//#region shared/config-builder.d.ts\n\n/**\n * Per-field metadata, attached to the field's zod schema with `.meta()`.\n *\n * It is readable from the schema itself (`z.globalRegistry.get(schema)`) and\n * from `z.toJSONSchema(schema)`, which is what `scripts/generate-effects.mts`\n * uses to emit the authoring classes. Raw `z.object` configs can call\n * `.meta({...})` with these keys directly; `configBuilder().field()` is sugar\n * for the same thing. See `spec/sync-node.md` §5.2.\n */\ninterface FieldMeta {\n label?: string;\n description?: string;\n dataTypes?: string[];\n /** Editor: the node shows an input handle for this field. */\n bindable?: boolean;\n /**\n * Authoring: the prop is typed `EffectProp<T>` (value, signal or frame\n * function). Defaults to `bindable`. Set it explicitly where the two differ.\n */\n signal?: boolean;\n /** Editor wiring only. Excluded from the generated authoring surface. */\n editorOnly?: boolean;\n /** Escape hatch for a value zod cannot type, e.g. a GPU texture handle. */\n tsType?: {\n name: string;\n from: string;\n };\n}\n/** @deprecated Use {@link FieldMeta}. */\ntype FieldOptions = FieldMeta;\ndeclare class ConfigBuilder<TShape extends z.ZodRawShape = Record<string, never>> {\n private shape;\n private options;\n constructor(shape?: TShape, options?: {\n strict?: boolean;\n });\n field<TKey extends string, TType extends z.ZodTypeAny>(key: TKey, schema: TType, options?: FieldMeta): ConfigBuilder<TShape & { [K in TKey]: TType }>;\n build(): {\n schema: z.ZodObject<{ -readonly [P in keyof TShape]: TShape[P] }, z.core.$strip>;\n };\n}\ndeclare function configBuilder(options?: {\n strict?: boolean;\n}): ConfigBuilder<{}>;\n//#endregion\n//#region shared/schemas.d.ts\ndeclare const COMPOSITE_OPERATIONS: readonly [\"source-over\", \"source-in\", \"source-out\", \"source-atop\", \"destination-over\", \"destination-in\", \"destination-out\", \"destination-atop\", \"lighter\", \"copy\", \"xor\", \"multiply\", \"screen\", \"overlay\", \"darken\", \"lighten\", \"color-dodge\", \"color-burn\", \"hard-light\", \"soft-light\", \"difference\", \"exclusion\", \"hue\", \"saturation\", \"color\", \"luminosity\"];\ndeclare const GlobalCompositeOperation: z.ZodEnum<{\n \"source-over\": \"source-over\";\n \"source-in\": \"source-in\";\n \"source-out\": \"source-out\";\n \"source-atop\": \"source-atop\";\n \"destination-over\": \"destination-over\";\n \"destination-in\": \"destination-in\";\n \"destination-out\": \"destination-out\";\n \"destination-atop\": \"destination-atop\";\n lighter: \"lighter\";\n copy: \"copy\";\n xor: \"xor\";\n multiply: \"multiply\";\n screen: \"screen\";\n overlay: \"overlay\";\n darken: \"darken\";\n lighten: \"lighten\";\n \"color-dodge\": \"color-dodge\";\n \"color-burn\": \"color-burn\";\n \"hard-light\": \"hard-light\";\n \"soft-light\": \"soft-light\";\n difference: \"difference\";\n exclusion: \"exclusion\";\n hue: \"hue\";\n saturation: \"saturation\";\n color: \"color\";\n luminosity: \"luminosity\";\n}>;\ndeclare const ColorSchema: z.ZodOptional<z.ZodString>;\ndeclare const PercentageSchema: z.ZodNumber;\ndeclare const DimensionSchema: z.ZodOptional<z.ZodNumber>;\ndeclare const AnimationSchema: z.ZodObject<{\n animations: z.ZodOptional<z.ZodArray<z.ZodObject<{\n id: z.ZodString;\n type: z.ZodEnum<{\n \"fade-in\": \"fade-in\";\n \"fade-out\": \"fade-out\";\n \"slide-in-left\": \"slide-in-left\";\n \"slide-in-right\": \"slide-in-right\";\n \"slide-in-top\": \"slide-in-top\";\n \"slide-in-bottom\": \"slide-in-bottom\";\n \"zoom-in\": \"zoom-in\";\n \"zoom-out\": \"zoom-out\";\n \"rotate-cw\": \"rotate-cw\";\n \"rotate-ccw\": \"rotate-ccw\";\n bounce: \"bounce\";\n shake: \"shake\";\n }>;\n value: z.ZodNumber;\n }, z.core.$strip>>>;\n}, z.core.$strip>;\ndeclare const StrokeSchema: z.ZodObject<{\n stroke: z.ZodOptional<z.ZodString>;\n strokeWidth: z.ZodOptional<z.ZodNumber>;\n strokeAlign: z.ZodDefault<z.ZodOptional<z.ZodEnum<{\n inside: \"inside\";\n center: \"center\";\n outside: \"outside\";\n }>>>;\n strokeRadius: z.ZodOptional<z.ZodNumber>;\n}, z.core.$strip>;\ndeclare const ImageResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Image\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Image\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype ImageResult = z.infer<typeof ImageResultSchema>;\ndeclare const VideoResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Video\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Video\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype VideoResult = z.infer<typeof VideoResultSchema>;\ndeclare const AudioResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Audio\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Audio\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype AudioResult = z.infer<typeof AudioResultSchema>;\ndeclare const TextResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Text\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Text\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype TextResult = z.infer<typeof TextResultSchema>;\ndeclare const NumberResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Number\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Number\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype NumberResult = z.infer<typeof NumberResultSchema>;\ndeclare const SignalResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Signal\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Signal\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype SignalResult = z.infer<typeof SignalResultSchema>;\n/** The `inputs` map an operation carries: one entry per connected handle. */\ndeclare const OperationInputsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{\n connectionValid: z.ZodBoolean;\n outputItem: z.ZodOptional<z.ZodNullable<z.ZodObject<{\n type: z.ZodString;\n data: z.ZodUnknown;\n }, z.core.$strip>>>;\n}, z.core.$strip>>;\n//#endregion\nexport { AnimationSchema, AudioProcessor, AudioProcessorContext, AudioResult, AudioResultSchema, COMPOSITE_OPERATIONS, ColorSchema, ConfigBuilder, DimensionSchema, FieldMeta, FieldOptions, FileDataSchema, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, GlobalCompositeOperation, HandleParam, ImageResult, ImageResultSchema, MultiOutputGenericSchema, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, NumberResult, NumberResultSchema, OperationInputsSchema, PercentageSchema, Point2D, SignalResult, SignalResultSchema, SingleOutputGenericSchema, StrokeSchema, TextResult, TextResultSchema, VideoResult, VideoResultSchema, VirtualMediaDataSchema, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, configBuilder, createOutputItemSchema, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;KAqBKS,iBAAAA,GAAoBC,UAAAA,CAAWD,iBAqCnBI;KApCZF,oBAAAA,GAAuBD,UAAAA,CAAWC,oBAuC9BG;KAtCJF,cAAAA,GAAiBF,UAAAA,CAAWE,cAuCZZ;KAtChBa,UAAAA,GAAaH,UAAAA,CAAWG,UAsC8BC;UArCjDA,eAAAA,CAqCyCE;EAA+CJ,QAAAA,EAAAA,MAAAA;EAAwCC,YAAAA,EAnC1Hb,gBAmC0Ha;EAA4EK,MAAAA,CAAAA,EAAAA,MAAAA;EAChNA,oBAAAA,CAAAA,EAAAA,MAAAA;EAAO,iBAAA,CAAA,EAAA,MAAA;EAAA,eACHC,CAAAA,EAAAA,MAAAA;EACU,cAQfE,EAAAA,MAAc;EAAcC,eAAAA,EAAAA,MAAAA;EAAkDtB,OAAAA,CAAAA,EAAAA,MAAAA;EAAwBmB,KAAAA,CAAAA,EAAAA,MAAAA;EAAiCD,gBAAAA,CAAAA,EAAAA,MAAAA;EAAO,GAAA,CAAA,EAAA,MAAA;EAsDtG,SACnCa,CAAAA,EAAAA,MAAAA;;;;ECqBiB,mBACbsF,CAAAA,EAAAA,MAKG;EAJM5C,oBAAE6B,CAAAA,EAAAA,MAAAA;EAEQnC,UAAAA,CAAAA,EAAAA,OAAAA;EAA2EA,SAAAA,CAAAA,EAAAA,OAAAA;EAAzBM,WAAO+B,CAAAA,EAAAA,OAAAA;EAAnE/B,SAAEgC,CAAAA,EAAAA,OAAAA;EAAdhC,eAAEiC,CAAAA,EDzGO7F,UCyGP6F,EAAAA;EACRjC;EAFkBA,OAAEa,CAAAA,EDtGbvE,MCsGauE,CAAAA,MAAAA,EAAAA,OAAAA,CAAAA;EAAdb,WAAEiC,CAAAA,EAAAA,CAAAA,KAAAA,EDrGW1G,gBCqGX0G,EAAAA,SAAAA,CAAAA,EDrGyC1F,OCqGzC0F,CDrGiD5F,eCqGjD4F,CAAAA,EAAAA,GAAAA,OAAAA;;KDnGRzF,kBAAAA,GCiG+BqE,CAAAA,IAAAA,EAAAA;EAAS,GAAA,EDhGtChF,kBCgGsC;WD/FlCG;QACHE;cACMC;iBACGC;;;SAGRC;qBACYd,8BAA8BgB,QAAQF,uCAAuCF,wCAAwCC,4EAA4EK;MAChNA;UACIC,qBAAAA;WACCC;;;;;;;;KAQNC,cAAAA,cAA4BC,kDAAkDtB,wBAAwBmB,iCAAiCD;;;;;;;UAuDlIa,kBAAAA;mBACSd;mBACAI;;;;;cCoBLgG,oBAAoB5C,CAAAA,CAAEa;uBACbb,CAAAA,CAAE6B;WACd7B,CAAAA,CAAEiC,UAAUjC,CAAAA,CAAEa;WACdb,CAAAA,CAAEiC,UAAUjC,CAAAA,CAAEgC,QAAQtC,+BAAkDM,CAAAA,CAAEW,IAAAA,CAAKoB,kBAAkBrC;KACvGM,CAAAA,CAAEW,IAAAA,CAAKC;GACTZ,CAAAA,CAAEW,IAAAA,CAAKC"}
|
|
1
|
+
{"version":3,"file":"index-B1XcyMm8.d.mts","names":["VirtualMediaData","isSignal","resolveBoolean","resolveNumber","resolveParam","resolveString","RenderContextValue","Point2D","solveHomography","GPUCommandEncoder","globalThis","GPURenderPassEncoder","GPUTextureView","GPUTexture","NodeRenderProps","Record","Partial","WebGPUNodeRenderer","Promise","AudioProcessorContext","GPUDevice","AudioProcessor","Float32Array","resolveFrameNumber","unwrapFrameParam","NodeOperationInputs","HandleParam","SD","resolveHandleParam","resolveSignalField","isHandleConnected","NodeRendererPlugin","defineRenderer","Readonly","WebGPURegistry","webgpuRegistry","registerWebGPURenderer","AudioProcessorRegistry","audioRegistry","AudioProcessor","AudioProcessorContext","GPUCommandEncoder","GPURenderPassEncoder","GPUTexture","GPUTextureView","HandleParam","NodeOperationInputs","NodeRenderProps","NodeRendererPlugin","Point2D","WebGPUNodeRenderer","WebGPURegistry","audioRegistry","defineRenderer","isHandleConnected","isSignal","registerWebGPURenderer","resolveBoolean","resolveFrameNumber","resolveHandleParam","resolveNumber","resolveParam","resolveSignalField","resolveString","solveHomography","unwrapFrameParam","webgpuRegistry","_framefields_core0","FileDataSchema","MultiOutputGenericSchema","SingleOutputGenericSchema","VirtualMediaDataSchema","createOutputItemSchema","z","FieldMeta","FieldOptions","ConfigBuilder","TKey","TType","TShape","ZodRawShape","Record","ZodTypeAny","P","core","$strip","ZodObject","configBuilder","COMPOSITE_OPERATIONS","GlobalCompositeOperation","ZodEnum","ColorSchema","ZodString","ZodOptional","PercentageSchema","ZodNumber","DimensionSchema","AnimationSchema","ZodArray","StrokeSchema","ZodDefault","ImageResultSchema","ZodLiteral","OutputItem","$ZodTypeInternals","ZodType","ZodTuple","ImageResult","infer","VideoResultSchema","VideoResult","AudioResultSchema","AudioResult","TextResultSchema","TextResult","NumberResultSchema","NumberResult","SignalResultSchema","SignalResult","OperationInputsSchema","ZodBoolean","ZodUnknown","ZodNullable","ZodRecord"],"sources":["../../node-sdk/dist/renderer.d.mts","../../node-sdk/dist/index.d.mts"],"sourcesContent":["import { VirtualMediaData, isSignal, resolveBoolean, resolveNumber, resolveParam, resolveString } from \"@framefields/core\";\nimport { RenderContextValue } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/homography.d.ts\ninterface Point2D {\n x: number;\n y: number;\n}\n/**\n * Computes an 8-parameter 3x3 homography matrix mapping destination coordinates (quad)\n * to normalized source coordinates (unit square [0, 1]^2).\n *\n * The homography H maps destination (x, y) to source (u, v):\n * u = (h00*x + h01*y + h02) / (h20*x + h21*y + h22)\n * v = (h10*x + h11*y + h12) / (h20*x + h21*y + h22)\n *\n * Resulting array: [h00, h01, h02, h10, h11, h12, h20, h21, 1.0]\n */\ndeclare function solveHomography(dstPoints: Point2D[], srcPoints?: Point2D[]): number[];\n//#endregion\n//#region renderer/index.d.ts\ntype GPUCommandEncoder = globalThis.GPUCommandEncoder;\ntype GPURenderPassEncoder = globalThis.GPURenderPassEncoder;\ntype GPUTextureView = globalThis.GPUTextureView;\ntype GPUTexture = globalThis.GPUTexture;\ninterface NodeRenderProps {\n renderId: string;\n virtualMedia: VirtualMediaData;\n volume?: number;\n playbackRateOverride?: number;\n trimStartOverride?: number;\n trimEndOverride?: number;\n containerWidth: number;\n containerHeight: number;\n opacity?: number;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n timestampSec?: number;\n renderingContext?: \"visual\" | \"audio\";\n inheritedSeekOffset?: number;\n inheritedClockOffset?: number;\n isHeadless?: boolean;\n forceWait?: boolean;\n isVideoMode?: boolean;\n isPlaying?: boolean;\n excludeTextures?: GPUTexture[];\n /** Signal values that override the node's own (text animators read them). */\n signals?: Record<string, unknown>;\n renderChild?: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>) => unknown;\n}\ntype WebGPUNodeRenderer = (args: {\n ctx: RenderContextValue;\n encoder: GPUCommandEncoder;\n pass: GPURenderPassEncoder;\n targetView: GPUTextureView;\n targetTexture: GPUTexture;\n targetWidth: number;\n targetHeight: number;\n props: NodeRenderProps;\n drawChild: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>, targetViewOverride?: GPUTextureView, targetTextureOverride?: GPUTexture, targetWidthOverride?: number, targetHeightOverride?: number) => Promise<void>;\n}) => Promise<void> | void;\ninterface AudioProcessorContext {\n device?: GPUDevice;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n renderId?: string;\n}\ntype AudioProcessor = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData, ctx?: AudioProcessorContext) => void | Promise<void>;\n/**\n * A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or\n * `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;\n * `fallback` when none of those yields a finite number.\n */\ndeclare function resolveFrameNumber(val: unknown, fallback: number, frame: number, fps: number): number;\n/**\n * A static node parameter at `frame`: calls `get(ctx)` / `(frame, fps)`\n * functions and reads `{ value }` wrappers, keeping a signal's GPU texture\n * binding when it has one. Anything else is returned as-is.\n */\ndeclare function unwrapFrameParam(raw: unknown, frame: number, fps: number): {\n value: unknown;\n gpuTextureView?: GPUTextureView;\n};\n/** The `inputs` map node operations carry: one entry per connected handle. */\ntype NodeOperationInputs = Record<string, {\n connectionValid: boolean;\n outputItem: {\n type: string;\n data: unknown;\n } | null;\n}>;\ninterface HandleParam<SD> {\n val: number;\n /** The value comes from a signal (`sd`) sampled on the GPU. */\n hasStaticSig: boolean;\n sd: SD | null;\n handleId: string | null | undefined;\n}\n/**\n * A numeric parameter fed through `handleId`: a connected Number (clamped), a\n * connected Signal (sampled on the GPU, `val` stays `fallbackVal`), or else\n * `fallbackVal` clamped to [clampMin, clampMax].\n */\ndeclare function resolveHandleParam<SD>(inputs: NodeOperationInputs | undefined, handleId: string | null | undefined, fallbackVal: number, clampMin: number, clampMax: number): HandleParam<SD>;\n/**\n * A numeric field `fieldName` of a node operation, fed through its\n * `${fieldName}HandleId` input: a connected Signal/Numeric (`sd`, sampled on\n * the GPU; `value` is its offset), a connected Number, or the operation's own\n * value — each clamped to [minVal, maxVal].\n */\ndeclare function resolveSignalField<SD>(op: {\n inputs?: NodeOperationInputs;\n}, fieldName: string, defaultValue: number, minVal?: number, maxVal?: number): {\n hasSignal: boolean;\n sd: SD | null;\n value: number;\n};\n/**\n * Whether the handle whose id is stored at `op[handleIdKey]` has a valid\n * Signal or Number connection.\n */\ndeclare function isHandleConnected(op: Record<string, unknown>, handleIdKey: string): boolean;\ninterface NodeRendererPlugin {\n WebGPURenderer?: WebGPUNodeRenderer;\n audioProcessor?: AudioProcessor;\n}\ndeclare function defineRenderer(plugin: NodeRendererPlugin): Readonly<NodeRendererPlugin>;\ndeclare class WebGPURegistry {\n private renderers;\n register(op: string, renderer: WebGPUNodeRenderer): void;\n get(op: string): WebGPUNodeRenderer | undefined;\n has(op: string): boolean;\n}\ndeclare const webgpuRegistry: WebGPURegistry;\ndeclare function registerWebGPURenderer(op: string, renderer: WebGPUNodeRenderer): void;\ndeclare class AudioProcessorRegistry {\n private processors;\n register(opType: string, processor: AudioProcessor): void;\n get(opType: string): AudioProcessor | null;\n}\ndeclare const audioRegistry: AudioProcessorRegistry;\n//#endregion\nexport { AudioProcessor, AudioProcessorContext, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, HandleParam, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, Point2D, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=renderer.d.mts.map","import { AudioProcessor, AudioProcessorContext, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, HandleParam, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, Point2D, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry } from \"./renderer.mjs\";\nimport * as _framefields_core0 from \"@framefields/core\";\nimport { FileDataSchema, MultiOutputGenericSchema, SingleOutputGenericSchema, VirtualMediaDataSchema, createOutputItemSchema } from \"@framefields/core\";\nimport { z } from \"zod\";\n\n//#region shared/config-builder.d.ts\n\n/**\n * Per-field metadata, attached to the field's zod schema with `.meta()`.\n *\n * It is readable from the schema itself (`z.globalRegistry.get(schema)`) and\n * from `z.toJSONSchema(schema)`, which is what `scripts/generate-effects.mts`\n * uses to emit the authoring classes. Raw `z.object` configs can call\n * `.meta({...})` with these keys directly; `configBuilder().field()` is sugar\n * for the same thing. See `spec/sync-node.md` §5.2.\n */\ninterface FieldMeta {\n label?: string;\n description?: string;\n dataTypes?: string[];\n /** Editor: the node shows an input handle for this field. */\n bindable?: boolean;\n /**\n * Authoring: the prop is typed `EffectProp<T>` (value, signal or frame\n * function). Defaults to `bindable`. Set it explicitly where the two differ.\n */\n signal?: boolean;\n /** Editor wiring only. Excluded from the generated authoring surface. */\n editorOnly?: boolean;\n /** Escape hatch for a value zod cannot type, e.g. a GPU texture handle. */\n tsType?: {\n name: string;\n from: string;\n };\n}\n/** @deprecated Use {@link FieldMeta}. */\ntype FieldOptions = FieldMeta;\ndeclare class ConfigBuilder<TShape extends z.ZodRawShape = Record<string, never>> {\n private shape;\n private options;\n constructor(shape?: TShape, options?: {\n strict?: boolean;\n });\n field<TKey extends string, TType extends z.ZodTypeAny>(key: TKey, schema: TType, options?: FieldMeta): ConfigBuilder<TShape & { [K in TKey]: TType }>;\n build(): {\n schema: z.ZodObject<{ -readonly [P in keyof TShape]: TShape[P] }, z.core.$strip>;\n };\n}\ndeclare function configBuilder(options?: {\n strict?: boolean;\n}): ConfigBuilder<{}>;\n//#endregion\n//#region shared/schemas.d.ts\ndeclare const COMPOSITE_OPERATIONS: readonly [\"source-over\", \"source-in\", \"source-out\", \"source-atop\", \"destination-over\", \"destination-in\", \"destination-out\", \"destination-atop\", \"lighter\", \"copy\", \"xor\", \"multiply\", \"screen\", \"overlay\", \"darken\", \"lighten\", \"color-dodge\", \"color-burn\", \"hard-light\", \"soft-light\", \"difference\", \"exclusion\", \"hue\", \"saturation\", \"color\", \"luminosity\"];\ndeclare const GlobalCompositeOperation: z.ZodEnum<{\n \"source-over\": \"source-over\";\n \"source-in\": \"source-in\";\n \"source-out\": \"source-out\";\n \"source-atop\": \"source-atop\";\n \"destination-over\": \"destination-over\";\n \"destination-in\": \"destination-in\";\n \"destination-out\": \"destination-out\";\n \"destination-atop\": \"destination-atop\";\n lighter: \"lighter\";\n copy: \"copy\";\n xor: \"xor\";\n multiply: \"multiply\";\n screen: \"screen\";\n overlay: \"overlay\";\n darken: \"darken\";\n lighten: \"lighten\";\n \"color-dodge\": \"color-dodge\";\n \"color-burn\": \"color-burn\";\n \"hard-light\": \"hard-light\";\n \"soft-light\": \"soft-light\";\n difference: \"difference\";\n exclusion: \"exclusion\";\n hue: \"hue\";\n saturation: \"saturation\";\n color: \"color\";\n luminosity: \"luminosity\";\n}>;\ndeclare const ColorSchema: z.ZodOptional<z.ZodString>;\ndeclare const PercentageSchema: z.ZodNumber;\ndeclare const DimensionSchema: z.ZodOptional<z.ZodNumber>;\ndeclare const AnimationSchema: z.ZodObject<{\n animations: z.ZodOptional<z.ZodArray<z.ZodObject<{\n id: z.ZodString;\n type: z.ZodEnum<{\n \"fade-in\": \"fade-in\";\n \"fade-out\": \"fade-out\";\n \"slide-in-left\": \"slide-in-left\";\n \"slide-in-right\": \"slide-in-right\";\n \"slide-in-top\": \"slide-in-top\";\n \"slide-in-bottom\": \"slide-in-bottom\";\n \"zoom-in\": \"zoom-in\";\n \"zoom-out\": \"zoom-out\";\n \"rotate-cw\": \"rotate-cw\";\n \"rotate-ccw\": \"rotate-ccw\";\n bounce: \"bounce\";\n shake: \"shake\";\n }>;\n value: z.ZodNumber;\n }, z.core.$strip>>>;\n}, z.core.$strip>;\ndeclare const StrokeSchema: z.ZodObject<{\n stroke: z.ZodOptional<z.ZodString>;\n strokeWidth: z.ZodOptional<z.ZodNumber>;\n strokeAlign: z.ZodDefault<z.ZodOptional<z.ZodEnum<{\n inside: \"inside\";\n center: \"center\";\n outside: \"outside\";\n }>>>;\n strokeRadius: z.ZodOptional<z.ZodNumber>;\n}, z.core.$strip>;\ndeclare const ImageResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Image\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Image\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype ImageResult = z.infer<typeof ImageResultSchema>;\ndeclare const VideoResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Video\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Video\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype VideoResult = z.infer<typeof VideoResultSchema>;\ndeclare const AudioResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Audio\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Audio\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype AudioResult = z.infer<typeof AudioResultSchema>;\ndeclare const TextResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Text\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Text\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype TextResult = z.infer<typeof TextResultSchema>;\ndeclare const NumberResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Number\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Number\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype NumberResult = z.infer<typeof NumberResultSchema>;\ndeclare const SignalResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Signal\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Signal\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype SignalResult = z.infer<typeof SignalResultSchema>;\n/** The `inputs` map an operation carries: one entry per connected handle. */\ndeclare const OperationInputsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{\n connectionValid: z.ZodBoolean;\n outputItem: z.ZodOptional<z.ZodNullable<z.ZodObject<{\n type: z.ZodString;\n data: z.ZodUnknown;\n }, z.core.$strip>>>;\n}, z.core.$strip>>;\n//#endregion\nexport { AnimationSchema, AudioProcessor, AudioProcessorContext, AudioResult, AudioResultSchema, COMPOSITE_OPERATIONS, ColorSchema, ConfigBuilder, DimensionSchema, FieldMeta, FieldOptions, FileDataSchema, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, GlobalCompositeOperation, HandleParam, ImageResult, ImageResultSchema, MultiOutputGenericSchema, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, NumberResult, NumberResultSchema, OperationInputsSchema, PercentageSchema, Point2D, SignalResult, SignalResultSchema, SingleOutputGenericSchema, StrokeSchema, TextResult, TextResultSchema, VideoResult, VideoResultSchema, VirtualMediaDataSchema, WebGPUNodeRenderer, WebGPURegistry, audioRegistry, configBuilder, createOutputItemSchema, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;KAqBKS,iBAAAA,GAAoBC,UAAAA,CAAWD,iBAqCnBI;KApCZF,oBAAAA,GAAuBD,UAAAA,CAAWC,oBAuC9BG;KAtCJF,cAAAA,GAAiBF,UAAAA,CAAWE,cAuCZZ;KAtChBa,UAAAA,GAAaH,UAAAA,CAAWG,UAsC8BC;UArCjDA,eAAAA,CAqCyCE;EAA+CJ,QAAAA,EAAAA,MAAAA;EAAwCC,YAAAA,EAnC1Hb,gBAmC0Ha;EAA4EK,MAAAA,CAAAA,EAAAA,MAAAA;EAChNA,oBAAAA,CAAAA,EAAAA,MAAAA;EAAO,iBAAA,CAAA,EAAA,MAAA;EAAA,eACHC,CAAAA,EAAAA,MAAAA;EACU,cAQfE,EAAAA,MAAc;EAAcC,eAAAA,EAAAA,MAAAA;EAAkDtB,OAAAA,CAAAA,EAAAA,MAAAA;EAAwBmB,KAAAA,CAAAA,EAAAA,MAAAA;EAAiCD,gBAAAA,CAAAA,EAAAA,MAAAA;EAAO,GAAA,CAAA,EAAA,MAAA;EAsDtG,SACnCa,CAAAA,EAAAA,MAAAA;;;;ECqBiB,mBACbsF,CAAAA,EAAAA,MAKG;EAJM5C,oBAAE6B,CAAAA,EAAAA,MAAAA;EAEQnC,UAAAA,CAAAA,EAAAA,OAAAA;EAA2EA,SAAAA,CAAAA,EAAAA,OAAAA;EAAzBM,WAAO+B,CAAAA,EAAAA,OAAAA;EAAnE/B,SAAEgC,CAAAA,EAAAA,OAAAA;EAAdhC,eAAEiC,CAAAA,EDzGO7F,UCyGP6F,EAAAA;EACRjC;EAFkBA,OAAEa,CAAAA,EDtGbvE,MCsGauE,CAAAA,MAAAA,EAAAA,OAAAA,CAAAA;EAAdb,WAAEiC,CAAAA,EAAAA,CAAAA,KAAAA,EDrGW1G,gBCqGX0G,EAAAA,SAAAA,CAAAA,EDrGyC1F,OCqGzC0F,CDrGiD5F,eCqGjD4F,CAAAA,EAAAA,GAAAA,OAAAA;;KDnGRzF,kBAAAA,GCiG+BqE,CAAAA,IAAAA,EAAAA;EAAS,GAAA,EDhGtChF,kBCgGsC;WD/FlCG;QACHE;cACMC;iBACGC;;;SAGRC;qBACYd,8BAA8BgB,QAAQF,uCAAuCF,wCAAwCC,4EAA4EK;MAChNA;UACIC,qBAAAA;WACCC;;;;;;;;KAQNC,cAAAA,cAA4BC,kDAAkDtB,wBAAwBmB,iCAAiCD;;;;;;;UAuDlIa,kBAAAA;mBACSd;mBACAI;;;;;cCoBLgG,oBAAoB5C,CAAAA,CAAEa;uBACbb,CAAAA,CAAE6B;WACd7B,CAAAA,CAAEiC,UAAUjC,CAAAA,CAAEa;WACdb,CAAAA,CAAEiC,UAAUjC,CAAAA,CAAEgC,QAAQtC,+BAAkDM,CAAAA,CAAEW,IAAAA,CAAKoB,kBAAkBrC;KACvGM,CAAAA,CAAEW,IAAAA,CAAKC;GACTZ,CAAAA,CAAEW,IAAAA,CAAKC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Ca as SegmentationOptions, Ja as TensorPipelineConfig, Li as Landmark3D, Si as FrameContext, Wa as TensorData, Wr as CannyOptions, Zr as ControlNetConditioningOutputs, _i as FaceLandmarksOptions, _o as VisionTask, ci as DepthNormalsOptions, da as ObjectBoundingBox, fa as OpticalFlowOptions, fi as EffectConfigValue, go as VisionNodeSpec, ho as VisionConfig, li as DetectedObject, qa as TensorNode, si as DeflickerOptions, to as TrackedObject, ua as NormalizedLandmarkList, ui as Effect, va as PoseSkeletonOptions, vo as VisionVariant, ya as ProgrammaticSignal } from "./index-
|
|
2
|
-
import { n as NodeRendererPlugin, r as WebGPUNodeRenderer } from "./index-
|
|
3
|
-
import { n as AudioSignalOptions, r as ExtractedAudioSignalsBundle } from "./audio-
|
|
1
|
+
import { Ca as SegmentationOptions, Ja as TensorPipelineConfig, Li as Landmark3D, Si as FrameContext, Wa as TensorData, Wr as CannyOptions, Zr as ControlNetConditioningOutputs, _i as FaceLandmarksOptions, _o as VisionTask, ci as DepthNormalsOptions, da as ObjectBoundingBox, fa as OpticalFlowOptions, fi as EffectConfigValue, go as VisionNodeSpec, ho as VisionConfig, li as DetectedObject, qa as TensorNode, si as DeflickerOptions, to as TrackedObject, ua as NormalizedLandmarkList, ui as Effect, va as PoseSkeletonOptions, vo as VisionVariant, ya as ProgrammaticSignal } from "./index-DujpgUUq.mjs";
|
|
2
|
+
import { n as NodeRendererPlugin, r as WebGPUNodeRenderer } from "./index-B1XcyMm8.mjs";
|
|
3
|
+
import { n as AudioSignalOptions, r as ExtractedAudioSignalsBundle } from "./audio-DHuEMOtQ.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-blur/dist/renderer.d.mts
|
|
6
6
|
//#region src/renderers/index.d.ts
|
|
@@ -5520,4 +5520,4 @@ declare class Modulate extends Effect<ModulateProps> {
|
|
|
5520
5520
|
}
|
|
5521
5521
|
//#endregion
|
|
5522
5522
|
export { Blur as $, COCO17_BONES as $n, _default$14 as $r, LayerStyleColorOverlay as $t, MotionBlur as A, Posterize as An, CannyComputePipeline as Ar, CornerPinPointsItem as At, SelectiveColorProps as B, ResizerScaler as Bn, _default$1 as Br, Flip as Bt, HighPass as C, Painterly as Cn, VisionAnalysisReport as Cr, ColorBalance as Ct, LevelsProps as D, PatchHealProps as Dn, analyzeSequence as Dr, Contour as Dt, Levels as E, PatchHealPatchesItem as En, VisionRunner as Er, ColorKeyProps as Et, Relight3DProps as F, RGBSplitProps as Fn, TensorPipeline as Fr, DisplacementMapProps as Ft, TileOffsetEdgeMode as G, StereoPanningProps as Gn, _default$6 as Gr, IridescenceProps as Gt, ShadowsHighlightsProps as H, Rotate as Hn, _default$3 as Hr, Gooey as Ht, SSAO as I, RefineEdge as In, TensorSource as Ir, Dither as It, UnsharpMaskProps as J, ToonProps as Jn, _default$9 as Jr, KenBurns as Jt, TileOffsetProps as K, TonalShift as Kn, _default$7 as Kr, Kaleidoscope as Kt, SSAOProps as L, RefineEdgeProps as Ln, TensorViewExport as Lr, DitherProps as Lt, PBRGlass as M, ProceduralVFX as Mn, DepthNormalsComputePipeline as Mr, Datamosh as Mt, PBRGlassProps as N, ProceduralVFXProps as Nn, OpticalFlowComputePipeline as Nr, DatamoshProps as Nt, Modulate as O, Pixelate as On, pinNodeToLandmark as Or, ContourProps as Ot, Relight3D as P, RGBSplit as Pn, TemporalDeflickerPipeline as Pr, DisplacementMap as Pt, effectMeta as Q, VignetteProps as Qn, _default$13 as Qr, LayerStyleBevelEmboss as Qt, SelectiveColor as R, RefractionCaustics3D as Rn, EffectProp as Rr, ExtractLUT as Rt, HalftoneScreenProps as S, PaintStrokesItemOption3 as Sn, TemporalObjectTracker as Sr, ChannelSplitterProps as St, LevelChannel as T, PatchHeal as Tn, VisionNode as Tr, ColorKey as Tt, TemporalDeflicker as U, RotateProps as Un, _default$4 as Ur, GooeyProps as Ut, ShadowsHighlights as V, ResizerScalerProps as Vn, _default$2 as Vr, FlipProps as Vt, TileOffset as W, StereoPanning as Wn, _default$5 as Wr, Iridescence as Wt, VisionProps as X, TrailsProps as Xn, _default$11 as Xr, KenBurnsProps as Xt, Vision as Y, Trails as Yn, _default$10 as Yr, KenBurnsKeyframesItem as Yt, effectFactories as Z, Vignette as Zn, _default$12 as Zr, LayerStyle as Zt, GradientMapProps as _, OpArtProps as _n, PoseResult as _r, CameraParallax3D as _t, Crop as a, _default$20 as ai, LayerStyleStroke as an, LandmarkCoordinateSignals as ar, AudioDelay as at, HalftoneMode as b, PaintStrokesItemOption1 as bn, SegmentationTexturePool as br, ChannelMergerProps as bt, CurvesChannelPoint as c, _default$23 as ci, LiquifyProps as cn, ObjectAnchorsSignals as cr, AudioFadeProps as ct, DeflickerProps as d, rendererNode as di, MeshWarp as dn, ObjectKinematicsSignals as dr, AudioParametricEq as dt, _default$15 as ei, LayerStyleDropShadow as en, COCO17_KEYPOINTS as er, BlurProps as et, DepthOfField as f, _default$26 as fi, MeshWarpPointsItem as fn, ObjectTrackSignals as fr, AudioParametricEqProps as ft, GradientMap as g, _default$30 as gi, OpArt as gn, PoseLandmarkSignals as gr, CRTProps as gt, FilmGrainProps as h, _default$29 as hi, NoiseGeneratorProps as hn, PinToObjectOptions as hr, CRT as ht, AudioSignalExtractorProps as i, _default$19 as ii, LayerStyleProps as in, InstanceMask as ir, AudioCompressorProps as it, MotionBlurProps as j, PosterizeProps as jn, ControlNetMultiplexer as jr, CornerPinProps as jt, ModulateProps as k, PixelateProps as kn, pinNodeToObject as kr, CornerPin as kt, CurvesProps as l, _default$24 as li, MaskMath as ln, ObjectBoundingBoxSignals as lr, AudioNoiseGate as lt, FilmGrain as m, _default$28 as mi, NoiseGenerator as mn, PinToLandmarkOptions as mr, AudioReverbProps as mt, ApplyLUTProps as n, _default$17 as ni, LayerStyleInnerShadow as nn, COCO_CLASSES as nr, AsciiProps as nt, CropProps as o, _default$21 as oi, Liquify as on, MaskTrackSignals as or, AudioDelayProps as ot, DepthOfFieldProps as p, _default$27 as pi, MeshWarpProps as pn, PersonMatte as pr, AudioReverb as pt, UnsharpMask as q, Toon as qn, _default$8 as qr, KaleidoscopeProps as qt, AudioSignalExtractor as r, _default$18 as ri, LayerStyleOuterGlow as rn, ClipSubjectSource as rr, AudioCompressor as rt, Curves as s, _default$22 as si, LiquifyOperationsItem as sn, ObjectAnchorName as sr, AudioFade as st, ApplyLUT as t, _default$16 as ti, LayerStyleInnerGlow as tn, COCO17_KEYPOINT_NAMES as tr, Ascii as tt, CustomEffect as u, _default$25 as ui, MaskMathProps as un, ObjectCollectionSignals as ur, AudioNoiseGateProps as ut, GradientMapStop as v, Paint as vn, PoseSkeletonRenderer as vr, CameraParallax3DProps as vt, HighPassProps as w, PainterlyProps as wn, VisionBundle as wr, ColorBalanceProps as wt, HalftoneScreen as x, PaintStrokesItemOption2 as xn, SpatialLandmarkTransformer as xr, ChannelSplitter as xt, HalftoneDotShape as y, PaintProps as yn, SegmentationResult as yr, ChannelMerger as yt, SelectiveColorAdjustment as z, RefractionCaustics3DProps as zn, _default as zr, ExtractLUTProps as zt };
|
|
5523
|
-
//# sourceMappingURL=index-
|
|
5523
|
+
//# sourceMappingURL=index-B2Xesdug.d.mts.map
|