framefields 2.4.2 → 2.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-DHuEMOtQ.d.mts → audio-BymXfAvH.d.mts} +3 -3
  4. package/dist/{audio-DHuEMOtQ.d.mts.map → audio-BymXfAvH.d.mts.map} +1 -1
  5. package/dist/{audio-Bb31xJuX.mjs → audio-BzHHpImj.mjs} +4 -4
  6. package/dist/{audio-Bb31xJuX.mjs.map → audio-BzHHpImj.mjs.map} +1 -1
  7. package/dist/{dist-SB9qfAko.mjs → dist-Bo2_zeCn.mjs} +2 -2
  8. package/dist/{dist-SB9qfAko.mjs.map → dist-Bo2_zeCn.mjs.map} +1 -1
  9. package/dist/{dist-CxGfrigI.mjs → dist-DMa2BbYs.mjs} +3 -3
  10. package/dist/{dist-CxGfrigI.mjs.map → dist-DMa2BbYs.mjs.map} +1 -1
  11. package/dist/{dist-ClyC_d66.mjs → dist-TrtLGPvc.mjs} +117 -40
  12. package/dist/dist-TrtLGPvc.mjs.map +1 -0
  13. package/dist/{dist-CspOG4V1.mjs → dist-hmWTJPik.mjs} +2 -2
  14. package/dist/{dist-CspOG4V1.mjs.map → dist-hmWTJPik.mjs.map} +1 -1
  15. package/dist/effects/index.d.mts +5 -5
  16. package/dist/effects/index.mjs +35 -35
  17. package/dist/{effects-BOk_2kzM.mjs → effects-CiZjSwIh.mjs} +71 -3
  18. package/dist/effects-CiZjSwIh.mjs.map +1 -0
  19. package/dist/fonts/index.mjs +2 -2
  20. package/dist/{fonts-CsMDfqv9.mjs → fonts-Da1JDKpc.mjs} +2 -2
  21. package/dist/{fonts-CsMDfqv9.mjs.map → fonts-Da1JDKpc.mjs.map} +1 -1
  22. package/dist/{gpu-DtT5I4ME.mjs → gpu-CHIgM_YH.mjs} +2 -2
  23. package/dist/{gpu-DtT5I4ME.mjs.map → gpu-CHIgM_YH.mjs.map} +1 -1
  24. package/dist/{index-B1XcyMm8.d.mts → index-B0BZMhtw.d.mts} +7 -7
  25. package/dist/index-B0BZMhtw.d.mts.map +1 -0
  26. package/dist/{index-B2Xesdug.d.mts → index-CJkihekp.d.mts} +293 -143
  27. package/dist/index-CJkihekp.d.mts.map +1 -0
  28. package/dist/{index-DujpgUUq.d.mts → index-DGe83M-p.d.mts} +240 -152
  29. package/dist/index-DGe83M-p.d.mts.map +1 -0
  30. package/dist/{index-BTPLbjt4.d.mts → index-DIvWBm-q.d.mts} +2 -2
  31. package/dist/{index-BTPLbjt4.d.mts.map → index-DIvWBm-q.d.mts.map} +1 -1
  32. package/dist/{index-B3-gwjK6.d.mts → index-Dwf76Qep.d.mts} +3 -3
  33. package/dist/{index-B3-gwjK6.d.mts.map → index-Dwf76Qep.d.mts.map} +1 -1
  34. package/dist/{index-D-l-yCv6.d.mts → index-WMofVN02.d.mts} +3 -3
  35. package/dist/{index-D-l-yCv6.d.mts.map → index-WMofVN02.d.mts.map} +1 -1
  36. package/dist/index.d.mts +138 -72
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +165 -165
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/preview/index.d.mts +2 -2
  41. package/dist/preview/index.mjs +10 -10
  42. package/dist/{preview-DyGw2b3_.mjs → preview-5E4B96RD.mjs} +2 -2
  43. package/dist/{preview-DyGw2b3_.mjs.map → preview-5E4B96RD.mjs.map} +1 -1
  44. package/dist/preview-engine/audio.mjs +1 -1
  45. package/dist/preview-engine/{chunk-3ACCCPBN.mjs → chunk-37P2KIFE.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-GNG4YH2W.mjs → chunk-3SOD7OTO.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-DOCSX45C.mjs → chunk-54HE34HO.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-WJJIISQJ.mjs → chunk-5CWQHYQP.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-Z6UKUHPU.mjs → chunk-5EVEGKWT.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-VONDRBA2.mjs → chunk-5JSSXOBB.mjs} +1 -1
  51. package/dist/preview-engine/chunk-5SVJIGPK.mjs +1 -0
  52. package/dist/preview-engine/{chunk-5RQHNB6Y.mjs → chunk-6MBYREBG.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-WACWOKEP.mjs → chunk-6TGNQ5FD.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-HUKAC5MJ.mjs → chunk-6WKWYUOM.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-SWXVITCQ.mjs → chunk-7J4OK4VE.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-O6NRIXS5.mjs → chunk-7QE6II7R.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-34ACEGNW.mjs → chunk-A2775RSO.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-FFGBUS76.mjs → chunk-AKYUVDKM.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-6K7US2WD.mjs → chunk-AWX4YGC5.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-QJZKIY4H.mjs → chunk-AY2ZIXST.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-LK3T65RB.mjs → chunk-BIS3W4Z5.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-7QJUC6YY.mjs → chunk-C45ROXI6.mjs} +14 -14
  63. package/dist/preview-engine/{chunk-GMGGDADT.mjs → chunk-CEIOI4HO.mjs} +1 -1
  64. package/dist/preview-engine/{chunk-RHRMEBNK.mjs → chunk-E7DH7EPX.mjs} +1 -1
  65. package/dist/preview-engine/{chunk-NNQUIVTE.mjs → chunk-EEOUHDUD.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-ZKPQGQE3.mjs → chunk-FDNR4PRC.mjs} +1 -1
  67. package/dist/preview-engine/chunk-FSAELHVT.mjs +1 -0
  68. package/dist/preview-engine/{chunk-C6Z7H2RZ.mjs → chunk-GIH5QURF.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-RDP6QROU.mjs → chunk-GQN35VLT.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-PZF6T7DM.mjs → chunk-ILBZQLUF.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-2DDBSI75.mjs → chunk-JJA4G3OU.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-KAQUNOVB.mjs → chunk-JJYNYYPA.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-NRAZV5OA.mjs → chunk-JTUK7ZXK.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-HDGFNBYK.mjs → chunk-KJ2DTA77.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-7LVOSEGN.mjs → chunk-LMZHCWXP.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-A5OVKZ52.mjs → chunk-LSBCFJZM.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-FLPSWDX4.mjs → chunk-MJN3LOZ7.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-WCZ5DKZ4.mjs → chunk-N3PRZLZJ.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-XOEEGC4Z.mjs → chunk-NVTPJUNG.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-67SSYK7D.mjs → chunk-O3NOB5IB.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-LIQA5OOU.mjs → chunk-O5LA63CK.mjs} +1 -1
  82. package/dist/preview-engine/chunk-OLLY3Q7M.mjs +1 -0
  83. package/dist/preview-engine/{chunk-FFMPC7QA.mjs → chunk-OZDZQMTB.mjs} +1 -1
  84. package/dist/preview-engine/chunk-PCWWKYFO.mjs +1 -0
  85. package/dist/preview-engine/{chunk-G4J662EL.mjs → chunk-S7NG26UG.mjs} +1 -1
  86. package/dist/preview-engine/{chunk-FHKBALVI.mjs → chunk-TFFG5YFI.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-HNNIVJ2K.mjs → chunk-U4SQUTDV.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-JX22B2FS.mjs → chunk-UDDK5QZF.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-KT35IPCF.mjs → chunk-UMF7NNUA.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-GQLZXCW3.mjs → chunk-UVWGZUKZ.mjs} +1 -1
  91. package/dist/preview-engine/{chunk-NQZKBFC6.mjs → chunk-V6DAD4S4.mjs} +14 -14
  92. package/dist/preview-engine/{chunk-R26SY5D4.mjs → chunk-V6LCSK6Q.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-2GIWWDE4.mjs → chunk-W3QGP5XF.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-RKVB47IA.mjs → chunk-XTPEGKOZ.mjs} +1 -1
  95. package/dist/preview-engine/chunk-YJ6GWVL4.mjs +174 -0
  96. package/dist/preview-engine/{chunk-LLDIDE5Q.mjs → chunk-YQYLBXOX.mjs} +1 -1
  97. package/dist/preview-engine/effects.mjs +1 -1
  98. package/dist/preview-engine/framefields.mjs +17 -17
  99. package/dist/preview-engine/player.mjs +1 -1
  100. package/dist/preview-engine/{renderers-WR6MKT5S.mjs → renderers-2A7YDJMJ.mjs} +1 -1
  101. package/dist/preview-engine/renderers-2AD6AHAO.mjs +1 -0
  102. package/dist/preview-engine/{renderers-K7B5PQBT.mjs → renderers-2GE5HE56.mjs} +1 -1
  103. package/dist/preview-engine/{renderers-SW7FIEKO.mjs → renderers-35G4KCQ2.mjs} +1 -1
  104. package/dist/preview-engine/renderers-37UYW266.mjs +1 -0
  105. package/dist/preview-engine/renderers-3YHETAPE.mjs +1 -0
  106. package/dist/preview-engine/renderers-43LBWRY2.mjs +1 -0
  107. package/dist/preview-engine/{renderers-TY7DVI7E.mjs → renderers-4H34AFW2.mjs} +1 -1
  108. package/dist/preview-engine/renderers-4I4UDLDR.mjs +1 -0
  109. package/dist/preview-engine/renderers-5EITT2FW.mjs +1 -0
  110. package/dist/preview-engine/{renderers-AZYJFJLO.mjs → renderers-5OGAF66H.mjs} +1 -1
  111. package/dist/preview-engine/{renderers-UMPOVFRA.mjs → renderers-6GYRMHGQ.mjs} +1 -1
  112. package/dist/preview-engine/{renderers-RKZGYWDG.mjs → renderers-7M3YOI7E.mjs} +1 -1
  113. package/dist/preview-engine/renderers-7UKFQ75V.mjs +1 -0
  114. package/dist/preview-engine/renderers-AIRDDXRB.mjs +1 -0
  115. package/dist/preview-engine/{renderers-MBSOKWKB.mjs → renderers-ATL5ARUV.mjs} +1 -1
  116. package/dist/preview-engine/renderers-BUOGMWAA.mjs +1 -0
  117. package/dist/preview-engine/renderers-C4XIAG3F.mjs +1 -0
  118. package/dist/preview-engine/{renderers-4AJWVIJG.mjs → renderers-DFJDEPCU.mjs} +1 -1
  119. package/dist/preview-engine/{renderers-6JZ4HYIU.mjs → renderers-DKOWLKDE.mjs} +1 -1
  120. package/dist/preview-engine/renderers-ELARGDRC.mjs +1 -0
  121. package/dist/preview-engine/renderers-EU5VM2S2.mjs +1 -0
  122. package/dist/preview-engine/{renderers-NJLGPPX7.mjs → renderers-FNPXT2EH.mjs} +1 -1
  123. package/dist/preview-engine/renderers-GEPP3YKK.mjs +1 -0
  124. package/dist/preview-engine/renderers-IQNZQWYU.mjs +1 -0
  125. package/dist/preview-engine/renderers-J6DEIWTU.mjs +1 -0
  126. package/dist/preview-engine/{renderers-EI6MQ2EL.mjs → renderers-JQ7AI473.mjs} +1 -1
  127. package/dist/preview-engine/renderers-JTVCE5PV.mjs +1 -0
  128. package/dist/preview-engine/{renderers-CK3ZL3GM.mjs → renderers-K23EAM2J.mjs} +1 -1
  129. package/dist/preview-engine/renderers-KCNUETAD.mjs +1 -0
  130. package/dist/preview-engine/renderers-KKBHXAWS.mjs +1 -0
  131. package/dist/preview-engine/{renderers-UDOBX433.mjs → renderers-KW75FYFG.mjs} +1 -1
  132. package/dist/preview-engine/renderers-LER7SUT2.mjs +1 -0
  133. package/dist/preview-engine/{renderers-GAIUTII6.mjs → renderers-LF6W5P2I.mjs} +1 -1
  134. package/dist/preview-engine/{renderers-FM6A5YR4.mjs → renderers-MHDLRY3S.mjs} +1 -1
  135. package/dist/preview-engine/renderers-MOERLDWF.mjs +1 -0
  136. package/dist/preview-engine/{renderers-XKHNBARD.mjs → renderers-NJAKGI25.mjs} +1 -1
  137. package/dist/preview-engine/renderers-NPKRNXAT.mjs +1 -0
  138. package/dist/preview-engine/renderers-O57YIIAO.mjs +1 -0
  139. package/dist/preview-engine/renderers-OPUIAD7I.mjs +1 -0
  140. package/dist/preview-engine/renderers-PENUAXDD.mjs +1 -0
  141. package/dist/preview-engine/renderers-PFCI7ZFW.mjs +1 -0
  142. package/dist/preview-engine/{renderers-HZHEGONW.mjs → renderers-PM4Q5QOW.mjs} +1 -1
  143. package/dist/preview-engine/renderers-Q4HDP2IE.mjs +1 -0
  144. package/dist/preview-engine/{renderers-GUPEJK3O.mjs → renderers-Q6AO5M54.mjs} +1 -1
  145. package/dist/preview-engine/{renderers-75TL7RLS.mjs → renderers-QJNGN722.mjs} +1 -1
  146. package/dist/preview-engine/renderers-QMHUOKMM.mjs +1 -0
  147. package/dist/preview-engine/renderers-R26YPECG.mjs +1 -0
  148. package/dist/preview-engine/renderers-TAFDMFEA.mjs +1 -0
  149. package/dist/preview-engine/{renderers-IHRFEZNP.mjs → renderers-TFEDHXPY.mjs} +1 -1
  150. package/dist/preview-engine/renderers-TMZLWQP2.mjs +1 -0
  151. package/dist/preview-engine/renderers-TP6ZMGU4.mjs +1 -0
  152. package/dist/preview-engine/renderers-TY63VTZB.mjs +1 -0
  153. package/dist/preview-engine/{renderers-IJDQJEE5.mjs → renderers-U2ZWRL25.mjs} +1 -1
  154. package/dist/preview-engine/renderers-UBO4ZNE6.mjs +1 -0
  155. package/dist/preview-engine/renderers-UCNQ536S.mjs +1 -0
  156. package/dist/preview-engine/{renderers-TCNPEANL.mjs → renderers-VD5GHHK6.mjs} +1 -1
  157. package/dist/preview-engine/{renderers-BDWVXYTW.mjs → renderers-WNMRLGZS.mjs} +1 -1
  158. package/dist/preview-engine/{renderers-FKH5S64C.mjs → renderers-WOLTH5VI.mjs} +1 -1
  159. package/dist/preview-engine/renderers-WOZQDE4A.mjs +1 -0
  160. package/dist/preview-engine/renderers-X2XGDF3R.mjs +1 -0
  161. package/dist/preview-engine/renderers-XG3BDROH.mjs +1 -0
  162. package/dist/preview-engine/{renderers-R4WMM6IX.mjs → renderers-XPO2WQNF.mjs} +1 -1
  163. package/dist/preview-engine/renderers-XS4CFZWR.mjs +1 -0
  164. package/dist/preview-engine/{renderers-FADYGSLK.mjs → renderers-XTCBHTHC.mjs} +1 -1
  165. package/dist/preview-engine/{renderers-LVLVJHOL.mjs → renderers-XTRFEQO4.mjs} +1 -1
  166. package/dist/preview-engine/renderers-ZQDMRWN7.mjs +1 -0
  167. package/dist/preview-engine/{renderers-7CPYTCNW.mjs → renderers-ZRR7BLB7.mjs} +1 -1
  168. package/dist/preview-engine/signals.mjs +1 -1
  169. package/dist/{program-C2cJayA1.mjs → program-KwDdbC0-.mjs} +78 -38
  170. package/dist/program-KwDdbC0-.mjs.map +1 -0
  171. package/dist/renderer/index.d.mts +2 -2
  172. package/dist/renderer/index.mjs +2 -2
  173. package/dist/{renderer-C1E5Rt5q.mjs → renderer-1P3yS8YM.mjs} +3 -3
  174. package/dist/{renderer-C1E5Rt5q.mjs.map → renderer-1P3yS8YM.mjs.map} +1 -1
  175. package/dist/renderer-5C41E6gT.mjs +5 -0
  176. package/dist/renderer-6SXF9Ykm.mjs +5 -0
  177. package/dist/renderer-B2C2w3Wr.mjs +5 -0
  178. package/dist/renderer-B2QSfPYZ.mjs +5 -0
  179. package/dist/{renderer-Bkrk0M0r.mjs → renderer-B4jxP8vF.mjs} +3 -3
  180. package/dist/{renderer-Bkrk0M0r.mjs.map → renderer-B4jxP8vF.mjs.map} +1 -1
  181. package/dist/{renderer-Csss5GFQ.mjs → renderer-B4ydDdo6.mjs} +2 -2
  182. package/dist/{renderer-Csss5GFQ.mjs.map → renderer-B4ydDdo6.mjs.map} +1 -1
  183. package/dist/renderer-B5cQcMl1.mjs +5 -0
  184. package/dist/{renderer-B3e4LSE6.mjs → renderer-B9ssmkbx.mjs} +3 -3
  185. package/dist/{renderer-B3e4LSE6.mjs.map → renderer-B9ssmkbx.mjs.map} +1 -1
  186. package/dist/{renderer-UcdqCarR.mjs → renderer-BAoKytKL.mjs} +3 -3
  187. package/dist/{renderer-UcdqCarR.mjs.map → renderer-BAoKytKL.mjs.map} +1 -1
  188. package/dist/{renderer-Cw6Sagih.mjs → renderer-BCLmYH4S.mjs} +3 -3
  189. package/dist/{renderer-Cw6Sagih.mjs.map → renderer-BCLmYH4S.mjs.map} +1 -1
  190. package/dist/renderer-BDhD8Yab.mjs +3 -0
  191. package/dist/{renderer-Za4D9hej.mjs → renderer-BHLYKy8b.mjs} +3 -3
  192. package/dist/{renderer-Za4D9hej.mjs.map → renderer-BHLYKy8b.mjs.map} +1 -1
  193. package/dist/{renderer-apeDrNXM.mjs → renderer-BI8QhEj9.mjs} +3 -3
  194. package/dist/{renderer-apeDrNXM.mjs.map → renderer-BI8QhEj9.mjs.map} +1 -1
  195. package/dist/{renderer-CCGzT6bX.mjs → renderer-BMLJgnbU.mjs} +2 -2
  196. package/dist/renderer-BSDdTHDh.mjs +5 -0
  197. package/dist/{renderer-CcoUNzlQ.mjs → renderer-BT0x6KPK.mjs} +3 -3
  198. package/dist/{renderer-CcoUNzlQ.mjs.map → renderer-BT0x6KPK.mjs.map} +1 -1
  199. package/dist/renderer-BTUjk8uY.mjs +5 -0
  200. package/dist/{renderer-RDCax5CK.mjs → renderer-BUwHWIf7.mjs} +3 -3
  201. package/dist/{renderer-RDCax5CK.mjs.map → renderer-BUwHWIf7.mjs.map} +1 -1
  202. package/dist/{renderer-DTw-W0Yz.mjs → renderer-B_b8-ztW.mjs} +3 -3
  203. package/dist/{renderer-DTw-W0Yz.mjs.map → renderer-B_b8-ztW.mjs.map} +1 -1
  204. package/dist/{renderer-DwVOxdzC.mjs → renderer-BaJQx0Bp.mjs} +3 -3
  205. package/dist/{renderer-DwVOxdzC.mjs.map → renderer-BaJQx0Bp.mjs.map} +1 -1
  206. package/dist/renderer-Bcey5Gvk.mjs +5 -0
  207. package/dist/renderer-Bd2MuOeJ.mjs +5 -0
  208. package/dist/renderer-Bd5A0zer.mjs +5 -0
  209. package/dist/{renderer-Dwu_zfdL.mjs → renderer-Bhfl-WFX.mjs} +3 -3
  210. package/dist/{renderer-Dwu_zfdL.mjs.map → renderer-Bhfl-WFX.mjs.map} +1 -1
  211. package/dist/{renderer-BjCHW9Jp.mjs → renderer-Bkq1PT0g.mjs} +2 -2
  212. package/dist/{renderer-DjwITRvg.mjs → renderer-Blm4Dv_h.mjs} +2 -2
  213. package/dist/{renderer-BTd2sWDC.mjs → renderer-BtWWpFvl.mjs} +3 -3
  214. package/dist/{renderer-BTd2sWDC.mjs.map → renderer-BtWWpFvl.mjs.map} +1 -1
  215. package/dist/{renderer-92eLJg24.mjs → renderer-C-z6bxj9.mjs} +4 -4
  216. package/dist/{renderer-92eLJg24.mjs.map → renderer-C-z6bxj9.mjs.map} +1 -1
  217. package/dist/{renderer-EZp_IIPK.mjs → renderer-C0ds-UfM.mjs} +3 -3
  218. package/dist/{renderer-EZp_IIPK.mjs.map → renderer-C0ds-UfM.mjs.map} +1 -1
  219. package/dist/{renderer-B4RpSd4A.mjs → renderer-C1U85w9f.mjs} +2 -2
  220. package/dist/{renderer-B4RpSd4A.mjs.map → renderer-C1U85w9f.mjs.map} +1 -1
  221. package/dist/{renderer-X0eKSD7v.mjs → renderer-C4vHq0X8.mjs} +3 -3
  222. package/dist/{renderer-X0eKSD7v.mjs.map → renderer-C4vHq0X8.mjs.map} +1 -1
  223. package/dist/{renderer--ruTGlPo.mjs → renderer-C4xvz_Ft.mjs} +3 -3
  224. package/dist/{renderer--ruTGlPo.mjs.map → renderer-C4xvz_Ft.mjs.map} +1 -1
  225. package/dist/{renderer-ByCX4JYg.mjs → renderer-C5WkQZGR.mjs} +3 -3
  226. package/dist/{renderer-ByCX4JYg.mjs.map → renderer-C5WkQZGR.mjs.map} +1 -1
  227. package/dist/{renderer-CqtIbe5n.mjs → renderer-CAi-lhR2.mjs} +2 -2
  228. package/dist/{renderer-CqtIbe5n.mjs.map → renderer-CAi-lhR2.mjs.map} +1 -1
  229. package/dist/renderer-CC-WlYa2.mjs +5 -0
  230. package/dist/{renderer-DZJJHCtm.mjs → renderer-CDky5Gva.mjs} +3 -3
  231. package/dist/{renderer-DZJJHCtm.mjs.map → renderer-CDky5Gva.mjs.map} +1 -1
  232. package/dist/{renderer-yyUpCeWb.mjs → renderer-CE83KHgr.mjs} +2 -2
  233. package/dist/{renderer-yyUpCeWb.mjs.map → renderer-CE83KHgr.mjs.map} +1 -1
  234. package/dist/{renderer-CoWfz-9p.mjs → renderer-CLxQ4rU6.mjs} +71 -71
  235. package/dist/{renderer-CoWfz-9p.mjs.map → renderer-CLxQ4rU6.mjs.map} +1 -1
  236. package/dist/{renderer-BBAbZfBl.mjs → renderer-CPLfsRe1.mjs} +4 -4
  237. package/dist/{renderer-BBAbZfBl.mjs.map → renderer-CPLfsRe1.mjs.map} +1 -1
  238. package/dist/{renderer-CDOobs18.mjs → renderer-CS8VMTp1.mjs} +3 -3
  239. package/dist/{renderer-CDOobs18.mjs.map → renderer-CS8VMTp1.mjs.map} +1 -1
  240. package/dist/{renderer-D0vom99O.mjs → renderer-CTYKUnDq.mjs} +2 -2
  241. package/dist/{renderer-D0vom99O.mjs.map → renderer-CTYKUnDq.mjs.map} +1 -1
  242. package/dist/{renderer-DILUmb-e.mjs → renderer-CUPWHfEY.mjs} +3 -3
  243. package/dist/{renderer-DILUmb-e.mjs.map → renderer-CUPWHfEY.mjs.map} +1 -1
  244. package/dist/renderer-Cb0qf1UG.mjs +5 -0
  245. package/dist/renderer-CfX13dgQ.mjs +5 -0
  246. package/dist/renderer-ChFkRLrv.mjs +5 -0
  247. package/dist/{renderer-CDUxAtsk.mjs → renderer-Ci6YMa4u.mjs} +4 -4
  248. package/dist/{renderer-CDUxAtsk.mjs.map → renderer-Ci6YMa4u.mjs.map} +1 -1
  249. package/dist/{renderer-DKfwlE4e.mjs → renderer-CjQAYeYz.mjs} +3 -3
  250. package/dist/{renderer-DKfwlE4e.mjs.map → renderer-CjQAYeYz.mjs.map} +1 -1
  251. package/dist/renderer-CjkfJj5R.mjs +5 -0
  252. package/dist/renderer-Ck7Lu6c9.mjs +5 -0
  253. package/dist/{renderer-CJ4bxCld.mjs → renderer-CrwYWVsV.mjs} +2 -2
  254. package/dist/renderer-CuquqG_c.mjs +5 -0
  255. package/dist/{renderer-CzRqzp8P.mjs → renderer-CwO8T8l8.mjs} +3 -3
  256. package/dist/{renderer-CzRqzp8P.mjs.map → renderer-CwO8T8l8.mjs.map} +1 -1
  257. package/dist/renderer-Cwz2E4QD.mjs +5 -0
  258. package/dist/{renderer-BjvNEbML.mjs → renderer-Cy4a31rZ.mjs} +2 -2
  259. package/dist/{renderer-BjvNEbML.mjs.map → renderer-Cy4a31rZ.mjs.map} +1 -1
  260. package/dist/{renderer-If8JOkBi.mjs → renderer-CzgDJcot.mjs} +2 -2
  261. package/dist/{renderer-If8JOkBi.mjs.map → renderer-CzgDJcot.mjs.map} +1 -1
  262. package/dist/renderer-Czkt9YYp.mjs +5 -0
  263. package/dist/{renderer-D2-V9nQq.mjs → renderer-D4No_jA4.mjs} +3 -3
  264. package/dist/{renderer-D2-V9nQq.mjs.map → renderer-D4No_jA4.mjs.map} +1 -1
  265. package/dist/{renderer-DaSxr9fM.mjs → renderer-D96Pu8yX.mjs} +3 -3
  266. package/dist/{renderer-DaSxr9fM.mjs.map → renderer-D96Pu8yX.mjs.map} +1 -1
  267. package/dist/{renderer-B0gPTXhe.mjs → renderer-DBKyuPl1.mjs} +3 -3
  268. package/dist/{renderer-B0gPTXhe.mjs.map → renderer-DBKyuPl1.mjs.map} +1 -1
  269. package/dist/{renderer-CxqPeATd.d.mts → renderer-DBtt-7wt.d.mts} +2 -2
  270. package/dist/{renderer-CxqPeATd.d.mts.map → renderer-DBtt-7wt.d.mts.map} +1 -1
  271. package/dist/{renderer-DcBGYN3V.mjs → renderer-DCsTCvdo.mjs} +3 -3
  272. package/dist/{renderer-DcBGYN3V.mjs.map → renderer-DCsTCvdo.mjs.map} +1 -1
  273. package/dist/renderer-DFTIhSdJ.mjs +5 -0
  274. package/dist/renderer-DFaa-Ats.mjs +5 -0
  275. package/dist/{renderer-DzSMeQBC.mjs → renderer-DGT141pN.mjs} +3 -3
  276. package/dist/{renderer-DzSMeQBC.mjs.map → renderer-DGT141pN.mjs.map} +1 -1
  277. package/dist/{renderer-JvcR1vYI.mjs → renderer-DHUlVqST.mjs} +2 -2
  278. package/dist/{renderer-JvcR1vYI.mjs.map → renderer-DHUlVqST.mjs.map} +1 -1
  279. package/dist/renderer-DIHXKvPl.mjs +5 -0
  280. package/dist/{renderer-Cv4lchUP.mjs → renderer-DK9etIAz.mjs} +3 -3
  281. package/dist/{renderer-Cv4lchUP.mjs.map → renderer-DK9etIAz.mjs.map} +1 -1
  282. package/dist/renderer-DMzOqVM3.mjs +5 -0
  283. package/dist/renderer-DOId5U8x.mjs +5 -0
  284. package/dist/{renderer-BkWd4-YO.mjs → renderer-DOvzHN60.mjs} +2 -2
  285. package/dist/{renderer-BkWd4-YO.mjs.map → renderer-DOvzHN60.mjs.map} +1 -1
  286. package/dist/{renderer-B1QREs7J.mjs → renderer-DOxmmN6Q.mjs} +3 -3
  287. package/dist/{renderer-B1QREs7J.mjs.map → renderer-DOxmmN6Q.mjs.map} +1 -1
  288. package/dist/{renderer-V5uEyDFz.mjs → renderer-DP_In2uT.mjs} +3 -3
  289. package/dist/{renderer-V5uEyDFz.mjs.map → renderer-DP_In2uT.mjs.map} +1 -1
  290. package/dist/renderer-DQXFOup8.mjs +5 -0
  291. package/dist/{renderer-ut1GqW89.mjs → renderer-DQeUc1yY.mjs} +3 -3
  292. package/dist/{renderer-ut1GqW89.mjs.map → renderer-DQeUc1yY.mjs.map} +1 -1
  293. package/dist/renderer-DRt3BSTj.mjs +5 -0
  294. package/dist/{renderer-DFJQ6v0F.mjs → renderer-DSbRWfgl.mjs} +2 -2
  295. package/dist/{renderer-DFJQ6v0F.mjs.map → renderer-DSbRWfgl.mjs.map} +1 -1
  296. package/dist/{renderer-DaqWTx7s.mjs → renderer-DVFFVy9v.mjs} +3 -3
  297. package/dist/{renderer-DaqWTx7s.mjs.map → renderer-DVFFVy9v.mjs.map} +1 -1
  298. package/dist/{renderer-BPixWnmY.mjs → renderer-DWG4Podv.mjs} +3 -3
  299. package/dist/{renderer-BPixWnmY.mjs.map → renderer-DWG4Podv.mjs.map} +1 -1
  300. package/dist/{renderer-BljMOvry.mjs → renderer-DXSIstnn.mjs} +3 -3
  301. package/dist/{renderer-BljMOvry.mjs.map → renderer-DXSIstnn.mjs.map} +1 -1
  302. package/dist/{renderer-DjBCWxYy.mjs → renderer-DYbgd6Ye.mjs} +3 -3
  303. package/dist/{renderer-DjBCWxYy.mjs.map → renderer-DYbgd6Ye.mjs.map} +1 -1
  304. package/dist/{renderer-BDCy8NgT.mjs → renderer-DZhIe8Gj.mjs} +3 -3
  305. package/dist/{renderer-BDCy8NgT.mjs.map → renderer-DZhIe8Gj.mjs.map} +1 -1
  306. package/dist/{renderer-BMKFzfSQ.mjs → renderer-DcOT5c0t.mjs} +3 -3
  307. package/dist/{renderer-BMKFzfSQ.mjs.map → renderer-DcOT5c0t.mjs.map} +1 -1
  308. package/dist/renderer-Di_5vQ81.mjs +6 -0
  309. package/dist/renderer-DkmpsPIa.mjs +5 -0
  310. package/dist/renderer-Ds6wd9Gk.mjs +5 -0
  311. package/dist/{renderer-BTigwMQp.mjs → renderer-Du8eOWWU.mjs} +3 -3
  312. package/dist/{renderer-BTigwMQp.mjs.map → renderer-Du8eOWWU.mjs.map} +1 -1
  313. package/dist/renderer-Dv4p0lp9.mjs +5 -0
  314. package/dist/renderer-DzWoOlVc.mjs +5 -0
  315. package/dist/{renderer-7y5Cj8rV.mjs → renderer-GapR_An3.mjs} +3 -3
  316. package/dist/{renderer-7y5Cj8rV.mjs.map → renderer-GapR_An3.mjs.map} +1 -1
  317. package/dist/{renderer-BV48PFjX.mjs → renderer-GbVNyv-E.mjs} +6 -6
  318. package/dist/{renderer-BV48PFjX.mjs.map → renderer-GbVNyv-E.mjs.map} +1 -1
  319. package/dist/{renderer-NizuhHsH.mjs → renderer-I3Wxk1tL.mjs} +3 -3
  320. package/dist/{renderer-NizuhHsH.mjs.map → renderer-I3Wxk1tL.mjs.map} +1 -1
  321. package/dist/renderer-IOz63OWg.mjs +5 -0
  322. package/dist/renderer-JkSrsUa5.mjs +5 -0
  323. package/dist/{renderer-gRMkQabv.mjs → renderer-OEpwc9Zk.mjs} +3 -3
  324. package/dist/{renderer-gRMkQabv.mjs.map → renderer-OEpwc9Zk.mjs.map} +1 -1
  325. package/dist/renderer-Ocs1Djwu.mjs +5 -0
  326. package/dist/{renderer-rXgqgAjw.mjs → renderer-OsA-Lg4d.mjs} +3 -3
  327. package/dist/{renderer-rXgqgAjw.mjs.map → renderer-OsA-Lg4d.mjs.map} +1 -1
  328. package/dist/{renderer-Bi6W4RSn.mjs → renderer-P4OPsD82.mjs} +2 -2
  329. package/dist/{renderer-Bi6W4RSn.mjs.map → renderer-P4OPsD82.mjs.map} +1 -1
  330. package/dist/{renderer-BwpgDLYO.mjs → renderer-PuN2_AL_.mjs} +3 -3
  331. package/dist/{renderer-BwpgDLYO.mjs.map → renderer-PuN2_AL_.mjs.map} +1 -1
  332. package/dist/{renderer-CNuVJ4nG.mjs → renderer-QaN-aejD.mjs} +2 -2
  333. package/dist/{renderer-CNuVJ4nG.mjs.map → renderer-QaN-aejD.mjs.map} +1 -1
  334. package/dist/renderer-Wdn7m_uN.mjs +5 -0
  335. package/dist/{renderer-BwwZB2mt.mjs → renderer-f7A01ArI.mjs} +4 -4
  336. package/dist/{renderer-BwwZB2mt.mjs.map → renderer-f7A01ArI.mjs.map} +1 -1
  337. package/dist/{renderer-G1pMJH5C.mjs → renderer-gm0zoV4t.mjs} +2 -2
  338. package/dist/{renderer-G1pMJH5C.mjs.map → renderer-gm0zoV4t.mjs.map} +1 -1
  339. package/dist/{renderer-DScyMHpJ.mjs → renderer-kNjMhwiZ.mjs} +2 -2
  340. package/dist/{renderer-DScyMHpJ.mjs.map → renderer-kNjMhwiZ.mjs.map} +1 -1
  341. package/dist/renderer-mKpjaoE3.mjs +5 -0
  342. package/dist/{renderer-Cbsnj9vV.mjs → renderer-mqUBkx-a.mjs} +3 -3
  343. package/dist/{renderer-Cbsnj9vV.mjs.map → renderer-mqUBkx-a.mjs.map} +1 -1
  344. package/dist/{renderer-DyyIXLQK.mjs → renderer-plx7_lUQ.mjs} +3 -3
  345. package/dist/{renderer-DyyIXLQK.mjs.map → renderer-plx7_lUQ.mjs.map} +1 -1
  346. package/dist/{renderer-D6BXR7P4.mjs → renderer-qYhNf6iB.mjs} +2 -2
  347. package/dist/{renderer-D6BXR7P4.mjs.map → renderer-qYhNf6iB.mjs.map} +1 -1
  348. package/dist/{renderer-CeiCJCg4.mjs → renderer-y6k54AM6.mjs} +3 -3
  349. package/dist/{renderer-CeiCJCg4.mjs.map → renderer-y6k54AM6.mjs.map} +1 -1
  350. package/dist/{renderers-CP8CFWDs-DzGXDs5p.mjs → renderers-CP8CFWDs-D1FHpA7I.mjs} +3 -3
  351. package/dist/{renderers-CP8CFWDs-DzGXDs5p.mjs.map → renderers-CP8CFWDs-D1FHpA7I.mjs.map} +1 -1
  352. package/dist/signals/index.d.mts +5 -5
  353. package/dist/signals/index.mjs +6 -6
  354. package/dist/{signals-C5nOrRmn.mjs → signals-BwdVfK3p.mjs} +3 -3
  355. package/dist/{signals-C5nOrRmn.mjs.map → signals-BwdVfK3p.mjs.map} +1 -1
  356. package/package.json +57 -57
  357. package/dist/dist-ClyC_d66.mjs.map +0 -1
  358. package/dist/effects-BOk_2kzM.mjs.map +0 -1
  359. package/dist/index-B1XcyMm8.d.mts.map +0 -1
  360. package/dist/index-B2Xesdug.d.mts.map +0 -1
  361. package/dist/index-DujpgUUq.d.mts.map +0 -1
  362. package/dist/preview-engine/chunk-AQNTIWTK.mjs +0 -1
  363. package/dist/preview-engine/chunk-CPFPY35C.mjs +0 -1
  364. package/dist/preview-engine/chunk-UZBVCYRY.mjs +0 -174
  365. package/dist/preview-engine/chunk-XDMZP3E2.mjs +0 -1
  366. package/dist/preview-engine/chunk-YKMBRUAE.mjs +0 -1
  367. package/dist/preview-engine/renderers-3CXFGRE7.mjs +0 -1
  368. package/dist/preview-engine/renderers-3FC3WCJN.mjs +0 -1
  369. package/dist/preview-engine/renderers-3S2FM33K.mjs +0 -1
  370. package/dist/preview-engine/renderers-53ZTBI3C.mjs +0 -1
  371. package/dist/preview-engine/renderers-5USBVCMQ.mjs +0 -1
  372. package/dist/preview-engine/renderers-65G6BLEA.mjs +0 -1
  373. package/dist/preview-engine/renderers-7XU7BXE7.mjs +0 -1
  374. package/dist/preview-engine/renderers-BFXM32BC.mjs +0 -1
  375. package/dist/preview-engine/renderers-CDXHCWWK.mjs +0 -1
  376. package/dist/preview-engine/renderers-CLUN7WU6.mjs +0 -1
  377. package/dist/preview-engine/renderers-DTB4HEXU.mjs +0 -1
  378. package/dist/preview-engine/renderers-EFKNRLYF.mjs +0 -1
  379. package/dist/preview-engine/renderers-G2K7ZA5O.mjs +0 -1
  380. package/dist/preview-engine/renderers-GTUO5LIV.mjs +0 -1
  381. package/dist/preview-engine/renderers-HSJIVP57.mjs +0 -1
  382. package/dist/preview-engine/renderers-IHACBWXI.mjs +0 -1
  383. package/dist/preview-engine/renderers-IO3BVVJ7.mjs +0 -1
  384. package/dist/preview-engine/renderers-IR772VSN.mjs +0 -1
  385. package/dist/preview-engine/renderers-L6TRJOXA.mjs +0 -1
  386. package/dist/preview-engine/renderers-N6H6RSF2.mjs +0 -1
  387. package/dist/preview-engine/renderers-O5NFQYRQ.mjs +0 -1
  388. package/dist/preview-engine/renderers-O6V3OEKX.mjs +0 -1
  389. package/dist/preview-engine/renderers-OODA27UH.mjs +0 -1
  390. package/dist/preview-engine/renderers-RIGW33ZI.mjs +0 -1
  391. package/dist/preview-engine/renderers-RUZRBQ4K.mjs +0 -1
  392. package/dist/preview-engine/renderers-SKB2GGKS.mjs +0 -1
  393. package/dist/preview-engine/renderers-T4D2TASM.mjs +0 -1
  394. package/dist/preview-engine/renderers-T74XV36Q.mjs +0 -1
  395. package/dist/preview-engine/renderers-TOPW2UM3.mjs +0 -1
  396. package/dist/preview-engine/renderers-UO5G3Y2G.mjs +0 -1
  397. package/dist/preview-engine/renderers-UOV7VOJJ.mjs +0 -1
  398. package/dist/preview-engine/renderers-UWKSTSTA.mjs +0 -1
  399. package/dist/preview-engine/renderers-VHPAOUTA.mjs +0 -1
  400. package/dist/preview-engine/renderers-YEQRQJFC.mjs +0 -1
  401. package/dist/preview-engine/renderers-YRZ3WODX.mjs +0 -1
  402. package/dist/preview-engine/renderers-YUTFGVRY.mjs +0 -1
  403. package/dist/preview-engine/renderers-YXOTRKPA.mjs +0 -1
  404. package/dist/preview-engine/renderers-ZOU5ARVD.mjs +0 -1
  405. package/dist/preview-engine/renderers-ZW75LQTR.mjs +0 -1
  406. package/dist/program-C2cJayA1.mjs.map +0 -1
  407. package/dist/renderer-BAhZeUUn.mjs +0 -5
  408. package/dist/renderer-BHAE_dKq.mjs +0 -5
  409. package/dist/renderer-BNYZY3FE.mjs +0 -5
  410. package/dist/renderer-BSvubMvI.mjs +0 -5
  411. package/dist/renderer-B_M_yhTc.mjs +0 -5
  412. package/dist/renderer-B_xSsTuy.mjs +0 -5
  413. package/dist/renderer-BePHurAU.mjs +0 -5
  414. package/dist/renderer-BfZquJrW.mjs +0 -5
  415. package/dist/renderer-BuY5ypB2.mjs +0 -5
  416. package/dist/renderer-BvOQgFHo.mjs +0 -5
  417. package/dist/renderer-C7NkSvUz.mjs +0 -5
  418. package/dist/renderer-CIuxV2q1.mjs +0 -5
  419. package/dist/renderer-CKp97tSQ.mjs +0 -5
  420. package/dist/renderer-CY89dTFR.mjs +0 -5
  421. package/dist/renderer-C_B_4Bl0.mjs +0 -5
  422. package/dist/renderer-Cd87JOjP.mjs +0 -5
  423. package/dist/renderer-Cev6orIK.mjs +0 -6
  424. package/dist/renderer-Cewf6UPh.mjs +0 -5
  425. package/dist/renderer-CnHsMLIv.mjs +0 -5
  426. package/dist/renderer-CoxuAr7b.mjs +0 -5
  427. package/dist/renderer-CrdG7trA.mjs +0 -5
  428. package/dist/renderer-Cu5MFgbk.mjs +0 -5
  429. package/dist/renderer-CuOjhtoo.mjs +0 -5
  430. package/dist/renderer-D2_0g6Oi.mjs +0 -5
  431. package/dist/renderer-D62FwolD.mjs +0 -5
  432. package/dist/renderer-DDNY9N7I.mjs +0 -5
  433. package/dist/renderer-DF_ONJ3v.mjs +0 -5
  434. package/dist/renderer-DbzrVHEE.mjs +0 -5
  435. package/dist/renderer-DlYchp1v.mjs +0 -5
  436. package/dist/renderer-DqcUNP8J.mjs +0 -5
  437. package/dist/renderer-DqvFhEQj.mjs +0 -5
  438. package/dist/renderer-DxBav2bE.mjs +0 -5
  439. package/dist/renderer-GvSRoQje.mjs +0 -5
  440. package/dist/renderer-KP7Ita9g.mjs +0 -5
  441. package/dist/renderer-Pc8dyNXt.mjs +0 -5
  442. package/dist/renderer-ezRCmU09.mjs +0 -3
  443. package/dist/renderer-h6ev1ogx.mjs +0 -5
@@ -1 +1 @@
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
+ {"version":3,"file":"fonts-Da1JDKpc.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-CspOG4V1.mjs";
1
+ import { Nn as signalRegistry } from "./dist-hmWTJPik.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-DtT5I4ME.mjs.map
215
+ //# sourceMappingURL=gpu-CHIgM_YH.mjs.map
@@ -1 +1 @@
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
+ {"version":3,"file":"gpu-CHIgM_YH.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-DujpgUUq.mjs";
1
+ import { Ea as OutputItem, Oo as VirtualMediaData, Yi as MediaOperation, x as RenderContextValue } from "./index-DGe83M-p.mjs";
2
2
  import { z } from "zod";
3
3
 
4
4
  //#region ../node-sdk/dist/renderer.d.mts
@@ -9,9 +9,9 @@ type GPUCommandEncoder = globalThis.GPUCommandEncoder;
9
9
  type GPURenderPassEncoder = globalThis.GPURenderPassEncoder;
10
10
  type GPUTextureView = globalThis.GPUTextureView;
11
11
  type GPUTexture = globalThis.GPUTexture;
12
- interface NodeRenderProps {
12
+ interface NodeRenderProps<TOperation extends MediaOperation = MediaOperation> {
13
13
  renderId: string;
14
- virtualMedia: VirtualMediaData;
14
+ virtualMedia: VirtualMediaData<TOperation>;
15
15
  volume?: number;
16
16
  playbackRateOverride?: number;
17
17
  trimStartOverride?: number;
@@ -37,7 +37,7 @@ interface NodeRenderProps {
37
37
  signals?: Record<string, unknown>;
38
38
  renderChild?: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>) => unknown;
39
39
  }
40
- type WebGPUNodeRenderer = (args: {
40
+ type WebGPUNodeRenderer<TOperation extends MediaOperation = MediaOperation> = (args: {
41
41
  ctx: RenderContextValue;
42
42
  encoder: GPUCommandEncoder;
43
43
  pass: GPURenderPassEncoder;
@@ -45,7 +45,7 @@ type WebGPUNodeRenderer = (args: {
45
45
  targetTexture: GPUTexture;
46
46
  targetWidth: number;
47
47
  targetHeight: number;
48
- props: NodeRenderProps;
48
+ props: NodeRenderProps<TOperation>;
49
49
  drawChild: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>, targetViewOverride?: GPUTextureView, targetTextureOverride?: GPUTexture, targetWidthOverride?: number, targetHeightOverride?: number) => Promise<void>;
50
50
  }) => Promise<void> | void;
51
51
  interface AudioProcessorContext {
@@ -57,7 +57,7 @@ interface AudioProcessorContext {
57
57
  durationMs?: number;
58
58
  renderId?: string;
59
59
  }
60
- type AudioProcessor = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData, ctx?: AudioProcessorContext) => void | Promise<void>;
60
+ type AudioProcessor<TOperation extends MediaOperation = MediaOperation> = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData<TOperation>, ctx?: AudioProcessorContext) => void | Promise<void>;
61
61
  /**
62
62
  * A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or
63
63
  * `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;
@@ -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-B1XcyMm8.d.mts.map
82
+ //# sourceMappingURL=index-B0BZMhtw.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-B0BZMhtw.d.mts","names":["MediaOperation","NodeInputConnection","NodeOperation","VirtualMediaData","isSignal","resolveBoolean","resolveNumber","resolveParam","resolveString","RenderContextValue","Point2D","solveHomography","GPUCommandEncoder","globalThis","GPURenderPassEncoder","GPUTextureView","GPUTexture","NodeRenderProps","TOperation","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","MediaOperation","NodeInputConnection","NodeOperation","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 { MediaOperation, NodeInputConnection, NodeOperation, 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<TOperation extends MediaOperation = MediaOperation> {\n renderId: string;\n virtualMedia: VirtualMediaData<TOperation>;\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<TOperation extends MediaOperation = MediaOperation> = (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<TOperation>;\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<TOperation extends MediaOperation = MediaOperation> = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData<TOperation>, 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, type MediaOperation, type NodeInputConnection, type NodeOperation, 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, MediaOperation, NodeInputConnection, NodeOperation, 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, MediaOperation, MultiOutputGenericSchema, NodeInputConnection, NodeOperation, 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":"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"}