framefields 2.0.11 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/README.md +22 -5
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +13 -12
  4. package/dist/{audio-BHanw8Jb.d.mts → audio-C2fLC3Tx.d.mts} +3 -3
  5. package/dist/{audio-BHanw8Jb.d.mts.map → audio-C2fLC3Tx.d.mts.map} +1 -1
  6. package/dist/{audio-TAvPwzLR.mjs → audio-DJeVoE8b.mjs} +1 -1
  7. package/dist/{audio-TAvPwzLR.mjs.map → audio-DJeVoE8b.mjs.map} +1 -1
  8. package/dist/{audio-COOMNwL5.mjs → audio-D_4SeMRK.mjs} +4 -4
  9. package/dist/{audio-COOMNwL5.mjs.map → audio-D_4SeMRK.mjs.map} +1 -1
  10. package/dist/{client-CwRhflHE.mjs → client-dVxUnmHz.mjs} +1 -1
  11. package/dist/{client-CwRhflHE.mjs.map → client-dVxUnmHz.mjs.map} +1 -1
  12. package/dist/{dist-C_hjvkdN.mjs → dist-0QGroRYZ.mjs} +1 -1
  13. package/dist/{dist-C_hjvkdN.mjs.map → dist-0QGroRYZ.mjs.map} +1 -1
  14. package/dist/{dist-BYqNNwsl.mjs → dist-BY0bIWgr.mjs} +10 -2
  15. package/dist/dist-BY0bIWgr.mjs.map +1 -0
  16. package/dist/{dist-Cxi68OuY.mjs → dist-Bun_TUvZ.mjs} +26862 -25638
  17. package/dist/dist-Bun_TUvZ.mjs.map +1 -0
  18. package/dist/{dist-BAVZdFEJ.mjs → dist-DlzqyRar.mjs} +75 -618
  19. package/dist/dist-DlzqyRar.mjs.map +1 -0
  20. package/dist/{dist-cjs-TsA8LFXC.mjs → dist-cjs-91nR6B7Z.mjs} +3 -3
  21. package/dist/{dist-cjs-TsA8LFXC.mjs.map → dist-cjs-91nR6B7Z.mjs.map} +1 -1
  22. package/dist/{dist-cjs-DJ8fcQEe.mjs → dist-cjs-BAIenEMC.mjs} +11 -11
  23. package/dist/{dist-cjs-DJ8fcQEe.mjs.map → dist-cjs-BAIenEMC.mjs.map} +1 -1
  24. package/dist/{dist-cjs-BmyyWYWv.mjs → dist-cjs-BEQhh76X.mjs} +2 -2
  25. package/dist/{dist-cjs-BmyyWYWv.mjs.map → dist-cjs-BEQhh76X.mjs.map} +1 -1
  26. package/dist/{dist-cjs--pxyGFw2.mjs → dist-cjs-BYPq7pfw.mjs} +1 -1
  27. package/dist/{dist-cjs--pxyGFw2.mjs.map → dist-cjs-BYPq7pfw.mjs.map} +1 -1
  28. package/dist/{dist-cjs--lfMLs3U.mjs → dist-cjs-BocDqSCX.mjs} +4 -4
  29. package/dist/{dist-cjs--lfMLs3U.mjs.map → dist-cjs-BocDqSCX.mjs.map} +1 -1
  30. package/dist/{dist-cjs-CsU2sZoX.mjs → dist-cjs-CWiNggTl.mjs} +4 -4
  31. package/dist/{dist-cjs-CsU2sZoX.mjs.map → dist-cjs-CWiNggTl.mjs.map} +1 -1
  32. package/dist/{dist-cjs-DjzmP0-x.mjs → dist-cjs-CwabutT6.mjs} +13 -13
  33. package/dist/{dist-cjs-DjzmP0-x.mjs.map → dist-cjs-CwabutT6.mjs.map} +1 -1
  34. package/dist/{dist-cjs-BDpO-TH_.mjs → dist-cjs-D-EE4Ahy.mjs} +1 -1
  35. package/dist/{dist-cjs-BDpO-TH_.mjs.map → dist-cjs-D-EE4Ahy.mjs.map} +1 -1
  36. package/dist/{dist-cjs-CQwmMllY.mjs → dist-cjs-DNtDUWfk.mjs} +6 -6
  37. package/dist/{dist-cjs-CQwmMllY.mjs.map → dist-cjs-DNtDUWfk.mjs.map} +1 -1
  38. package/dist/{dist-cjs-CND_ghfH.mjs → dist-cjs-DbZhsgS0.mjs} +1 -1
  39. package/dist/{dist-cjs-CND_ghfH.mjs.map → dist-cjs-DbZhsgS0.mjs.map} +1 -1
  40. package/dist/{dist-cjs-CgFzrgj8.mjs → dist-cjs-Dh7REKcN.mjs} +1 -1
  41. package/dist/{dist-cjs-CgFzrgj8.mjs.map → dist-cjs-Dh7REKcN.mjs.map} +1 -1
  42. package/dist/{dist-cjs-DT2jJlcK.mjs → dist-cjs-Dobx0Nz-.mjs} +5 -5
  43. package/dist/{dist-cjs-DT2jJlcK.mjs.map → dist-cjs-Dobx0Nz-.mjs.map} +1 -1
  44. package/dist/{dist-cjs-DzjrlfbE.mjs → dist-cjs-Du0UpNof.mjs} +14 -14
  45. package/dist/{dist-cjs-DzjrlfbE.mjs.map → dist-cjs-Du0UpNof.mjs.map} +1 -1
  46. package/dist/dist-cjs-DyHiUfsr.mjs +6 -0
  47. package/dist/{dist-cjs-M-8QOgS_.mjs → dist-cjs-HHMfMF5a.mjs} +2 -2
  48. package/dist/{dist-cjs-M-8QOgS_.mjs.map → dist-cjs-HHMfMF5a.mjs.map} +1 -1
  49. package/dist/{dist-cjs-BiKQozdJ.mjs → dist-cjs-UJYQzLNT.mjs} +3 -3
  50. package/dist/{dist-cjs-BiKQozdJ.mjs.map → dist-cjs-UJYQzLNT.mjs.map} +1 -1
  51. package/dist/{dist-cjs-agQl9T8M.mjs → dist-cjs-UKxm5cFR.mjs} +6 -6
  52. package/dist/{dist-cjs-agQl9T8M.mjs.map → dist-cjs-UKxm5cFR.mjs.map} +1 -1
  53. package/dist/{dist-CbG3QxDw.mjs → dist-fjKpBYkc.mjs} +12 -27
  54. package/dist/dist-fjKpBYkc.mjs.map +1 -0
  55. package/dist/effects/index.d.mts +4 -4
  56. package/dist/effects/index.mjs +36 -34
  57. package/dist/{effects-DzbjFhyA.mjs → effects-FTlu0dri.mjs} +3 -3
  58. package/dist/{effects-DzbjFhyA.mjs.map → effects-FTlu0dri.mjs.map} +1 -1
  59. package/dist/{event-streams-BaNGaLxh.mjs → event-streams-DnRe8uwT.mjs} +2 -2
  60. package/dist/{event-streams-BaNGaLxh.mjs.map → event-streams-DnRe8uwT.mjs.map} +1 -1
  61. package/dist/fonts/index.d.mts +1 -1
  62. package/dist/fonts/index.mjs +3 -1
  63. package/dist/{fonts-C0W6TgJk.mjs → fonts-UM5xaBOx.mjs} +24 -11
  64. package/dist/fonts-UM5xaBOx.mjs.map +1 -0
  65. package/dist/gpu-RkpiFGOA.mjs +215 -0
  66. package/dist/gpu-RkpiFGOA.mjs.map +1 -0
  67. package/dist/{index-CYGpSVsf.d.mts → index-CHQ39_Oe.d.mts} +2 -2
  68. package/dist/{index-CYGpSVsf.d.mts.map → index-CHQ39_Oe.d.mts.map} +1 -1
  69. package/dist/{index-CDoTrMs1.d.mts → index-CzQseCtg.d.mts} +8 -8
  70. package/dist/{index-CDoTrMs1.d.mts.map → index-CzQseCtg.d.mts.map} +1 -1
  71. package/dist/{index-DDEPvMww.d.mts → index-D67p-rHX.d.mts} +3452 -1675
  72. package/dist/index-D67p-rHX.d.mts.map +1 -0
  73. package/dist/{index-9B8CJowc.d.mts → index-DPicEt8H.d.mts} +10 -2
  74. package/dist/index-DPicEt8H.d.mts.map +1 -0
  75. package/dist/{index-DGJp1d30.d.mts → index-Db8Z3AtX.d.mts} +3 -3
  76. package/dist/{index-DGJp1d30.d.mts.map → index-Db8Z3AtX.d.mts.map} +1 -1
  77. package/dist/{index-DRZu3ezy.d.mts → index-DsOqONsj.d.mts} +3 -3
  78. package/dist/{index-DRZu3ezy.d.mts.map → index-DsOqONsj.d.mts.map} +1 -1
  79. package/dist/{index-DnWsbbuZ.d.mts → index-l03NV8JS.d.mts} +7 -2
  80. package/dist/index-l03NV8JS.d.mts.map +1 -0
  81. package/dist/index.d.mts +28 -1841
  82. package/dist/index.d.mts.map +1 -1
  83. package/dist/index.mjs +79 -65
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/{package-XpCRbTOA.mjs → package-CudzAF-n.mjs} +1 -1
  86. package/dist/{package-XpCRbTOA.mjs.map → package-CudzAF-n.mjs.map} +1 -1
  87. package/dist/preview/index.d.mts +2 -2
  88. package/dist/preview/index.mjs +13 -12
  89. package/dist/{preview-BV2C4Fk6.mjs → preview-DwClLMlU.mjs} +3 -3
  90. package/dist/{preview-BV2C4Fk6.mjs.map → preview-DwClLMlU.mjs.map} +1 -1
  91. package/dist/preview-engine/audio.mjs +1 -1
  92. package/dist/preview-engine/{chunk-Y6HWYPKX.mjs → chunk-3GNP7TJH.mjs} +3 -3
  93. package/dist/preview-engine/{chunk-LIHUEYI5.mjs → chunk-44CQSOYE.mjs} +2 -2
  94. package/dist/preview-engine/{chunk-6JW37VJA.mjs → chunk-5AUB4Y3L.mjs} +3 -23
  95. package/dist/preview-engine/chunk-5DOD2NVY.mjs +26 -0
  96. package/dist/preview-engine/chunk-5FC7GOWW.mjs +474 -0
  97. package/dist/preview-engine/chunk-5W4AFQP7.mjs +97 -0
  98. package/dist/preview-engine/chunk-63SFBHEH.mjs +1 -0
  99. package/dist/preview-engine/chunk-7EPIRODI.mjs +91 -0
  100. package/dist/preview-engine/{chunk-PQD5UPHG.mjs → chunk-7G3XIOP7.mjs} +1 -1
  101. package/dist/preview-engine/chunk-7J2FWGVD.mjs +1 -0
  102. package/dist/preview-engine/chunk-AXHB4J37.mjs +147 -0
  103. package/dist/preview-engine/chunk-AY7UX37L.mjs +450 -0
  104. package/dist/preview-engine/chunk-B43Z3J7J.mjs +5 -0
  105. package/dist/preview-engine/chunk-BWJS6G7R.mjs +314 -0
  106. package/dist/preview-engine/{chunk-24DXIKXL.mjs → chunk-DIGIQ5MJ.mjs} +2 -2
  107. package/dist/preview-engine/{chunk-AEK5BO3J.mjs → chunk-E4RAFHZM.mjs} +1 -1
  108. package/dist/preview-engine/chunk-ENKKLU7B.mjs +22 -0
  109. package/dist/preview-engine/{chunk-XLFYM7KH.mjs → chunk-EVXWDOCL.mjs} +2 -2
  110. package/dist/preview-engine/{chunk-EQ4QZRXB.mjs → chunk-EYWPOCZW.mjs} +2 -2
  111. package/dist/preview-engine/{chunk-IYVN2QEL.mjs → chunk-FLPSWDX4.mjs} +1 -1
  112. package/dist/preview-engine/chunk-FU7AIAMM.mjs +88 -0
  113. package/dist/preview-engine/{chunk-CBM7B7EW.mjs → chunk-GMGGDADT.mjs} +1 -1
  114. package/dist/preview-engine/chunk-GSFN4WCH.mjs +62 -0
  115. package/dist/preview-engine/chunk-HE4R7EZM.mjs +121 -0
  116. package/dist/preview-engine/chunk-IQC2I5A5.mjs +1 -0
  117. package/dist/preview-engine/{chunk-RJUAM52F.mjs → chunk-IR5DNNWR.mjs} +3 -23
  118. package/dist/preview-engine/chunk-IUPDOATX.mjs +114 -0
  119. package/dist/preview-engine/{chunk-GHMCGTJ2.mjs → chunk-J2R5R7YY.mjs} +3 -23
  120. package/dist/preview-engine/chunk-JAJOZG5P.mjs +1 -0
  121. package/dist/preview-engine/chunk-JXNG2ACR.mjs +118 -0
  122. package/dist/preview-engine/{chunk-V6VU46ZG.mjs → chunk-L6BH5J4P.mjs} +1 -1
  123. package/dist/preview-engine/chunk-LGVEFPOG.mjs +3 -0
  124. package/dist/preview-engine/{chunk-MDDF2GCF.mjs → chunk-MLY5M7Y5.mjs} +3 -23
  125. package/dist/preview-engine/chunk-NPD6W3RP.mjs +1 -0
  126. package/dist/preview-engine/chunk-OCX5AD23.mjs +1 -0
  127. package/dist/preview-engine/{chunk-D3TETPLI.mjs → chunk-OG62XGCT.mjs} +1 -1
  128. package/dist/preview-engine/chunk-OJ2PKBXE.mjs +40 -0
  129. package/dist/preview-engine/chunk-OKH2VU2U.mjs +97 -0
  130. package/dist/preview-engine/chunk-PAQNDZQB.mjs +83 -0
  131. package/dist/preview-engine/chunk-PEWYB6WP.mjs +43 -0
  132. package/dist/preview-engine/chunk-PL4IH5V4.mjs +89 -0
  133. package/dist/preview-engine/chunk-PSRQA3QW.mjs +84 -0
  134. package/dist/preview-engine/{chunk-QYRDQMNB.mjs → chunk-PXT52LEH.mjs} +3 -23
  135. package/dist/preview-engine/chunk-Q22PJXFJ.mjs +69 -0
  136. package/dist/preview-engine/chunk-Q4Z54DQ7.mjs +1 -0
  137. package/dist/preview-engine/{chunk-BHFI3Y4T.mjs → chunk-QBEUICZD.mjs} +1 -1
  138. package/dist/preview-engine/chunk-RQLMW6MA.mjs +4 -0
  139. package/dist/preview-engine/chunk-RSMO7NPN.mjs +1 -0
  140. package/dist/preview-engine/chunk-RW2F3XLQ.mjs +90 -0
  141. package/dist/preview-engine/{chunk-25IW7NYO.mjs → chunk-S2CTIJSI.mjs} +1 -1
  142. package/dist/preview-engine/chunk-SGPRLTNF.mjs +52 -0
  143. package/dist/preview-engine/{chunk-Y6FEU4TV.mjs → chunk-SZW5J72T.mjs} +3 -23
  144. package/dist/preview-engine/{chunk-ECPP3UG6.mjs → chunk-T2FE5VOW.mjs} +3 -23
  145. package/dist/preview-engine/{chunk-ZSIJB76A.mjs → chunk-TS3JI3BH.mjs} +2 -2
  146. package/dist/preview-engine/{chunk-AMBSW6OA.mjs → chunk-U4JIFQRR.mjs} +2 -2
  147. package/dist/preview-engine/{chunk-BJKH76OM.mjs → chunk-VXS5SIEC.mjs} +3 -23
  148. package/dist/preview-engine/chunk-WFGJXCZT.mjs +53 -0
  149. package/dist/preview-engine/chunk-WH5Q2NFN.mjs +32 -0
  150. package/dist/preview-engine/{chunk-AWTH2WZO.mjs → chunk-WUKH7BD7.mjs} +1 -1
  151. package/dist/preview-engine/chunk-XC5WZNOY.mjs +1448 -0
  152. package/dist/preview-engine/chunk-YQZOGEPZ.mjs +186 -0
  153. package/dist/preview-engine/{chunk-6256GQFP.mjs → chunk-ZDQF3OTC.mjs} +1 -1
  154. package/dist/preview-engine/chunk-ZIIFTWDH.mjs +58 -0
  155. package/dist/preview-engine/effects.mjs +1 -1
  156. package/dist/preview-engine/fonts.mjs +1 -1
  157. package/dist/preview-engine/framefields.mjs +127 -130
  158. package/dist/preview-engine/player.mjs +6 -6
  159. package/dist/preview-engine/renderers-2H7YEUTD.mjs +1 -0
  160. package/dist/preview-engine/renderers-2ILG23ED.mjs +1 -0
  161. package/dist/preview-engine/renderers-2P6KXWEZ.mjs +1 -0
  162. package/dist/preview-engine/renderers-2SVWAB42.mjs +1 -0
  163. package/dist/preview-engine/renderers-2VN3AH45.mjs +104 -0
  164. package/dist/preview-engine/renderers-3RC5FDWX.mjs +1 -0
  165. package/dist/preview-engine/renderers-57WDL6XN.mjs +1 -0
  166. package/dist/preview-engine/{renderers-CAUWP4XH.mjs → renderers-6OGFUSH6.mjs} +3 -23
  167. package/dist/preview-engine/renderers-6WH7NZCC.mjs +1 -0
  168. package/dist/preview-engine/renderers-7VJN5L3Z.mjs +1 -0
  169. package/dist/preview-engine/renderers-A6HM64UZ.mjs +1 -0
  170. package/dist/preview-engine/{renderers-WLH4HRUE.mjs → renderers-A7VH3ON5.mjs} +1 -1
  171. package/dist/preview-engine/renderers-B7DSGUMI.mjs +1 -0
  172. package/dist/preview-engine/renderers-BFNJ7VCI.mjs +1 -0
  173. package/dist/preview-engine/renderers-BSKZXITT.mjs +35 -0
  174. package/dist/preview-engine/renderers-CGYIDAVV.mjs +1 -0
  175. package/dist/preview-engine/renderers-CRRLV7IO.mjs +1 -0
  176. package/dist/preview-engine/{renderers-JQHUBWLL.mjs → renderers-D6T6IPER.mjs} +3 -23
  177. package/dist/preview-engine/renderers-DXHJAMZR.mjs +1 -0
  178. package/dist/preview-engine/renderers-ECA3P4ON.mjs +1 -0
  179. package/dist/preview-engine/{renderers-W5CVDJVH.mjs → renderers-F55XFVMP.mjs} +1 -1
  180. package/dist/preview-engine/renderers-FWGMNPYB.mjs +1 -0
  181. package/dist/preview-engine/renderers-H46TS3IG.mjs +228 -0
  182. package/dist/preview-engine/renderers-HXFRTIJD.mjs +1 -0
  183. package/dist/preview-engine/renderers-IWQ3V6AJ.mjs +1 -0
  184. package/dist/preview-engine/renderers-JHFT27YU.mjs +1 -0
  185. package/dist/preview-engine/renderers-KZWGSKRF.mjs +1 -0
  186. package/dist/preview-engine/renderers-MON4QFRF.mjs +1 -0
  187. package/dist/preview-engine/renderers-NQXMYNSY.mjs +1 -0
  188. package/dist/preview-engine/renderers-NWHS7N2L.mjs +1 -0
  189. package/dist/preview-engine/renderers-ORAIXUL3.mjs +1 -0
  190. package/dist/preview-engine/renderers-OT7D3BUA.mjs +1 -0
  191. package/dist/preview-engine/renderers-Q4OFCMXI.mjs +1 -0
  192. package/dist/preview-engine/renderers-QVZVEYP5.mjs +1 -0
  193. package/dist/preview-engine/renderers-RJO6H4FC.mjs +1 -0
  194. package/dist/preview-engine/renderers-RKDPX5JU.mjs +1 -0
  195. package/dist/preview-engine/{renderers-2US2NIUG.mjs → renderers-RLHTNLRE.mjs} +3 -23
  196. package/dist/preview-engine/renderers-SBFF7JP5.mjs +1 -0
  197. package/dist/preview-engine/renderers-SCJ6OKTB.mjs +1 -0
  198. package/dist/preview-engine/renderers-T4JMJXWL.mjs +1 -0
  199. package/dist/preview-engine/renderers-TAWT3ZSS.mjs +1 -0
  200. package/dist/preview-engine/renderers-U6KY34TP.mjs +100 -0
  201. package/dist/preview-engine/renderers-UHTO6BQA.mjs +1 -0
  202. package/dist/preview-engine/renderers-UNK6I4JJ.mjs +1 -0
  203. package/dist/preview-engine/renderers-UPTJJE5F.mjs +1 -0
  204. package/dist/preview-engine/renderers-W773SBPV.mjs +1 -0
  205. package/dist/preview-engine/renderers-XHTMRXC5.mjs +1 -0
  206. package/dist/preview-engine/renderers-YECY2YFT.mjs +1 -0
  207. package/dist/preview-engine/renderers-YMN6QXK7.mjs +1 -0
  208. package/dist/preview-engine/renderers-ZANPE3OK.mjs +1 -0
  209. package/dist/preview-engine/renderers-ZHTX73PR.mjs +1 -0
  210. package/dist/preview-engine/renderers-ZJTRANIX.mjs +1 -0
  211. package/dist/preview-engine/signals.mjs +1 -1
  212. package/dist/preview-engine/skia-canvas-QBXAOGPB.mjs +1 -0
  213. package/dist/{program-BmNKgzja.mjs → program-BqFVw5Mu.mjs} +93 -2335
  214. package/dist/program-BqFVw5Mu.mjs.map +1 -0
  215. package/dist/renderer/index.d.mts +2 -2
  216. package/dist/renderer/index.mjs +3 -3
  217. package/dist/{renderer-CnXW28b9.mjs → renderer-2Nf9ypST.mjs} +85 -279
  218. package/dist/renderer-2Nf9ypST.mjs.map +1 -0
  219. package/dist/{renderer-BREIjsUU.mjs → renderer-2uN2cd0y.mjs} +14 -40
  220. package/dist/renderer-2uN2cd0y.mjs.map +1 -0
  221. package/dist/renderer-31jAuNzF.mjs +5 -0
  222. package/dist/renderer-36EI7Rsz.mjs +5 -0
  223. package/dist/renderer-3io-cjTt.mjs +5 -0
  224. package/dist/renderer-9_zWTHbg.mjs +5 -0
  225. package/dist/{renderer-WSGuj_V6.mjs → renderer-B12_76qk.mjs} +4 -3
  226. package/dist/{renderer-WSGuj_V6.mjs.map → renderer-B12_76qk.mjs.map} +1 -1
  227. package/dist/{renderer-bsWnRNpJ.mjs → renderer-B4oS8ZFO.mjs} +29 -98
  228. package/dist/renderer-B4oS8ZFO.mjs.map +1 -0
  229. package/dist/renderer-B6KnbfdA.mjs +5 -0
  230. package/dist/renderer-B7Y2bmRc.mjs +5 -0
  231. package/dist/renderer-BA6miaaI.mjs +5 -0
  232. package/dist/{renderer-Bv6q84TU.mjs → renderer-BGr_cBKV.mjs} +61 -208
  233. package/dist/renderer-BGr_cBKV.mjs.map +1 -0
  234. package/dist/renderer-BHi-Q6Z_.mjs +5 -0
  235. package/dist/{renderer-Bv21DbWy.mjs → renderer-BLcu9RDt.mjs} +3 -1
  236. package/dist/{renderer-D2XD4QYk.mjs → renderer-BO2lYmtE.mjs} +34 -147
  237. package/dist/renderer-BO2lYmtE.mjs.map +1 -0
  238. package/dist/renderer-BOlN9HeG.mjs +5 -0
  239. package/dist/renderer-BSitV56h.mjs +268 -0
  240. package/dist/renderer-BSitV56h.mjs.map +1 -0
  241. package/dist/renderer-BTOW-ceB.mjs +5 -0
  242. package/dist/{renderer-Bhdf90Zq.mjs → renderer-BYqfkwLf.mjs} +51 -163
  243. package/dist/renderer-BYqfkwLf.mjs.map +1 -0
  244. package/dist/{renderer-bZU_ndxf.mjs → renderer-BajIOuZH.mjs} +2 -2
  245. package/dist/{renderer-bZU_ndxf.mjs.map → renderer-BajIOuZH.mjs.map} +1 -1
  246. package/dist/{renderer-DirxsOjq.mjs → renderer-BgnJUx24.mjs} +80 -258
  247. package/dist/renderer-BgnJUx24.mjs.map +1 -0
  248. package/dist/renderer-BiQ0PYOp.mjs +5 -0
  249. package/dist/{renderer-DIgsilTw.mjs → renderer-BjTq3a0L.mjs} +5 -4
  250. package/dist/{renderer-DIgsilTw.mjs.map → renderer-BjTq3a0L.mjs.map} +1 -1
  251. package/dist/{renderer-DEJwPRkR.mjs → renderer-BkN20ZKO.mjs} +15 -51
  252. package/dist/renderer-BkN20ZKO.mjs.map +1 -0
  253. package/dist/renderer-Bla7GDyV.mjs +5 -0
  254. package/dist/renderer-BoYyLVKy.mjs +5 -0
  255. package/dist/{renderer-D7zvPHKn.mjs → renderer-BpZaHFRc.mjs} +18 -28
  256. package/dist/renderer-BpZaHFRc.mjs.map +1 -0
  257. package/dist/renderer-BqOgb7bM.mjs +5 -0
  258. package/dist/{renderer-cgxO2xN6.mjs → renderer-Bq_dO0LG.mjs} +10 -17
  259. package/dist/renderer-Bq_dO0LG.mjs.map +1 -0
  260. package/dist/renderer-BqeM8yTJ.mjs +5 -0
  261. package/dist/{renderer-dncoIVdd.mjs → renderer-BqsV75Ml.mjs} +3 -1
  262. package/dist/{renderer-ChdLYS-G.mjs → renderer-Bs4tz_pw.mjs} +20 -87
  263. package/dist/renderer-Bs4tz_pw.mjs.map +1 -0
  264. package/dist/{renderer-DpGc-N3G.mjs → renderer-Bsaokil3.mjs} +24 -104
  265. package/dist/renderer-Bsaokil3.mjs.map +1 -0
  266. package/dist/{renderer-CXn5HAnK.mjs → renderer-BvG1GF1c.mjs} +10 -16
  267. package/dist/renderer-BvG1GF1c.mjs.map +1 -0
  268. package/dist/{renderer-CI7sG_cv.mjs → renderer-BvpSIFkw.mjs} +83 -266
  269. package/dist/renderer-BvpSIFkw.mjs.map +1 -0
  270. package/dist/{renderer-B8UaFNqb.mjs → renderer-BwAqwTQq.mjs} +62 -209
  271. package/dist/renderer-BwAqwTQq.mjs.map +1 -0
  272. package/dist/{renderer-CzPWB0Ss.mjs → renderer-BwVfhrEx.mjs} +13 -45
  273. package/dist/renderer-BwVfhrEx.mjs.map +1 -0
  274. package/dist/renderer-BzpRe50i.mjs +5 -0
  275. package/dist/renderer-C0eAPwpr.mjs +5 -0
  276. package/dist/{renderer-CtyD_Xju.mjs → renderer-C3RfT8Gv.mjs} +59 -194
  277. package/dist/renderer-C3RfT8Gv.mjs.map +1 -0
  278. package/dist/{renderer-B1YMwl2B.mjs → renderer-C3cYDT3m.mjs} +3 -1
  279. package/dist/{renderer-1VuQTY1Z.mjs → renderer-CEGbqT2m.mjs} +236 -96
  280. package/dist/renderer-CEGbqT2m.mjs.map +1 -0
  281. package/dist/{renderer-DxTs4Iyi.mjs → renderer-CGldH-Zx.mjs} +40 -142
  282. package/dist/renderer-CGldH-Zx.mjs.map +1 -0
  283. package/dist/renderer-CGn8V63v.mjs +5 -0
  284. package/dist/{renderer-kwmlLQOO.mjs → renderer-CH9Qtpy7.mjs} +4 -4
  285. package/dist/{renderer-kwmlLQOO.mjs.map → renderer-CH9Qtpy7.mjs.map} +1 -1
  286. package/dist/{renderer-ho_jXJ0H.mjs → renderer-CLyuu_19.mjs} +23 -117
  287. package/dist/renderer-CLyuu_19.mjs.map +1 -0
  288. package/dist/renderer-CM5Syo9r.mjs +5 -0
  289. package/dist/{renderer-D2nCGcjv.mjs → renderer-CRIM_XRK.mjs} +3 -3
  290. package/dist/{renderer-D2nCGcjv.mjs.map → renderer-CRIM_XRK.mjs.map} +1 -1
  291. package/dist/{renderer-BTdOMMEx.d.mts → renderer-CTGe8SqQ.d.mts} +2 -2
  292. package/dist/{renderer-BTdOMMEx.d.mts.map → renderer-CTGe8SqQ.d.mts.map} +1 -1
  293. package/dist/renderer-CWCEW6Wv.mjs +5 -0
  294. package/dist/{renderer-Dy0utCl7.mjs → renderer-CgyOylPO.mjs} +10 -17
  295. package/dist/renderer-CgyOylPO.mjs.map +1 -0
  296. package/dist/{renderer-C_TPMHiH.mjs → renderer-CjT5Zy-J.mjs} +81 -221
  297. package/dist/renderer-CjT5Zy-J.mjs.map +1 -0
  298. package/dist/{renderer-_uvdg48N.mjs → renderer-Cjq1s3br.mjs} +24 -93
  299. package/dist/renderer-Cjq1s3br.mjs.map +1 -0
  300. package/dist/renderer-Cl70zxkP.mjs +5 -0
  301. package/dist/renderer-ClJjoVpB.mjs +6 -0
  302. package/dist/{renderer-BSaYG8aw.mjs → renderer-CpKNqciR.mjs} +3 -1
  303. package/dist/{renderer-Bfgd4N0O.mjs → renderer-Cwhux4VX.mjs} +9 -16
  304. package/dist/renderer-Cwhux4VX.mjs.map +1 -0
  305. package/dist/{renderer-BJ1aTkZf.mjs → renderer-D0nWLogn.mjs} +99 -282
  306. package/dist/renderer-D0nWLogn.mjs.map +1 -0
  307. package/dist/{renderer-vqkKWqa5.mjs → renderer-D1lynYuy.mjs} +23 -107
  308. package/dist/renderer-D1lynYuy.mjs.map +1 -0
  309. package/dist/{renderer-B8-kzZdP.mjs → renderer-D4sYVV-I.mjs} +41 -140
  310. package/dist/renderer-D4sYVV-I.mjs.map +1 -0
  311. package/dist/{renderer-Bc04fivZ.mjs → renderer-D5z3WDkm.mjs} +99 -287
  312. package/dist/renderer-D5z3WDkm.mjs.map +1 -0
  313. package/dist/renderer-D8C-pamu.mjs +148 -0
  314. package/dist/renderer-D8C-pamu.mjs.map +1 -0
  315. package/dist/{renderer-D_1oDOCP.mjs → renderer-DAtBnNGC.mjs} +14 -69
  316. package/dist/renderer-DAtBnNGC.mjs.map +1 -0
  317. package/dist/{renderer-DZGtBUCx.mjs → renderer-DG1NFsSV.mjs} +35 -185
  318. package/dist/renderer-DG1NFsSV.mjs.map +1 -0
  319. package/dist/{renderer-BM05sB8m.mjs → renderer-DHAErBtJ.mjs} +11 -74
  320. package/dist/renderer-DHAErBtJ.mjs.map +1 -0
  321. package/dist/{renderer-RKsXlF_0.mjs → renderer-DIDSmoFA.mjs} +73 -73
  322. package/dist/{renderer-RKsXlF_0.mjs.map → renderer-DIDSmoFA.mjs.map} +1 -1
  323. package/dist/{renderer-BDbTWSpP.mjs → renderer-DKtP7-fr.mjs} +58 -234
  324. package/dist/renderer-DKtP7-fr.mjs.map +1 -0
  325. package/dist/renderer-DLnF-V_h.mjs +5 -0
  326. package/dist/renderer-DN1rjmcL.mjs +5 -0
  327. package/dist/{renderer-CfC_aiew.mjs → renderer-DOEsFT7Q.mjs} +57 -192
  328. package/dist/renderer-DOEsFT7Q.mjs.map +1 -0
  329. package/dist/{renderer-Ctk2zzfy.mjs → renderer-DPYB6ZcB.mjs} +57 -197
  330. package/dist/renderer-DPYB6ZcB.mjs.map +1 -0
  331. package/dist/{renderer-CWTpc4ff.mjs → renderer-DRsPCkxr.mjs} +76 -210
  332. package/dist/renderer-DRsPCkxr.mjs.map +1 -0
  333. package/dist/renderer-DXTw9Oqb.mjs +5 -0
  334. package/dist/{renderer-CaaOKMSd.mjs → renderer-DZLJnnU2.mjs} +63 -190
  335. package/dist/renderer-DZLJnnU2.mjs.map +1 -0
  336. package/dist/{renderer-B2ieylQ3.mjs → renderer-DZrQffIP.mjs} +56 -167
  337. package/dist/renderer-DZrQffIP.mjs.map +1 -0
  338. package/dist/renderer-DbAVSBNI.mjs +5 -0
  339. package/dist/renderer-Dg8rD--8.mjs +5 -0
  340. package/dist/{renderer-DML9qpmS.mjs → renderer-DhEyjn6Q.mjs} +52 -202
  341. package/dist/renderer-DhEyjn6Q.mjs.map +1 -0
  342. package/dist/{renderer-CdciwwMI.mjs → renderer-Dmv_Aj6x.mjs} +161 -457
  343. package/dist/renderer-Dmv_Aj6x.mjs.map +1 -0
  344. package/dist/renderer-DnFxegGu.mjs +5 -0
  345. package/dist/renderer-DnfmelHn.mjs +5 -0
  346. package/dist/{renderer-BIIWCg_J.mjs → renderer-Dpj68gTn.mjs} +11 -18
  347. package/dist/renderer-Dpj68gTn.mjs.map +1 -0
  348. package/dist/renderer-DuOjzggd.mjs +5 -0
  349. package/dist/renderer-DuuOlYIG.mjs +3 -0
  350. package/dist/renderer-DvYql0Cl.mjs +5 -0
  351. package/dist/{renderer-BfAWZziM.mjs → renderer-DzhRNdBS.mjs} +58 -225
  352. package/dist/renderer-DzhRNdBS.mjs.map +1 -0
  353. package/dist/renderer-GSFP7v2z.mjs +3 -0
  354. package/dist/renderer-LfUdjgjF.mjs +5 -0
  355. package/dist/{renderer-Djlb4TLO.mjs → renderer-Q63y7HP_.mjs} +8 -15
  356. package/dist/renderer-Q63y7HP_.mjs.map +1 -0
  357. package/dist/renderer-SecCv3U8.mjs +5 -0
  358. package/dist/{renderer-BhZZEyFX.mjs → renderer-mp1NN5zk.mjs} +4 -4
  359. package/dist/{renderer-BhZZEyFX.mjs.map → renderer-mp1NN5zk.mjs.map} +1 -1
  360. package/dist/renderer-oZyoB4CT.mjs +5 -0
  361. package/dist/renderer-rzci_kTy.mjs +5 -0
  362. package/dist/{renderer-CpkiHRhh.mjs → renderer-to9DwqXK.mjs} +17 -99
  363. package/dist/renderer-to9DwqXK.mjs.map +1 -0
  364. package/dist/{renderer-CepMDQ06.mjs → renderer-v0vuUUUI.mjs} +19 -106
  365. package/dist/renderer-v0vuUUUI.mjs.map +1 -0
  366. package/dist/renderer-vLaZuZbX.mjs +5 -0
  367. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs → renderers-CP8CFWDs-DlFq8jmz.mjs} +4 -4
  368. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs.map → renderers-CP8CFWDs-DlFq8jmz.mjs.map} +1 -1
  369. package/dist/signals/index.d.mts +5 -5
  370. package/dist/signals/index.mjs +7 -7
  371. package/dist/{signals-Bv1OweKd.mjs → signals-BDkO0xcZ.mjs} +3 -3
  372. package/dist/{signals-Bv1OweKd.mjs.map → signals-BDkO0xcZ.mjs.map} +1 -1
  373. package/dist/{signin-Db08vl-g.mjs → signin-SVSXQw9i.mjs} +9 -9
  374. package/dist/{signin-Db08vl-g.mjs.map → signin-SVSXQw9i.mjs.map} +1 -1
  375. package/dist/{sso-oidc-CpLz_lIu.mjs → sso-oidc-B3Sagl43.mjs} +9 -9
  376. package/dist/{sso-oidc-CpLz_lIu.mjs.map → sso-oidc-B3Sagl43.mjs.map} +1 -1
  377. package/dist/{sts-BQefGuml.mjs → sts-CYeWec9i.mjs} +2 -2
  378. package/dist/{sts-Dgl0kH-t.mjs → sts-ClVtt-bV.mjs} +9 -9
  379. package/dist/{sts-Dgl0kH-t.mjs.map → sts-ClVtt-bV.mjs.map} +1 -1
  380. package/package.json +55 -55
  381. package/dist/dist-BAVZdFEJ.mjs.map +0 -1
  382. package/dist/dist-BYqNNwsl.mjs.map +0 -1
  383. package/dist/dist-CbG3QxDw.mjs.map +0 -1
  384. package/dist/dist-Cxi68OuY.mjs.map +0 -1
  385. package/dist/dist-cjs-3pon9kTt.mjs +0 -6
  386. package/dist/fonts-C0W6TgJk.mjs.map +0 -1
  387. package/dist/index-9B8CJowc.d.mts.map +0 -1
  388. package/dist/index-DDEPvMww.d.mts.map +0 -1
  389. package/dist/index-DnWsbbuZ.d.mts.map +0 -1
  390. package/dist/preview-engine/chunk-36YGYLKD.mjs +0 -58
  391. package/dist/preview-engine/chunk-7O24H4YT.mjs +0 -117
  392. package/dist/preview-engine/chunk-AUFSM5KI.mjs +0 -141
  393. package/dist/preview-engine/chunk-BQ65MU6H.mjs +0 -138
  394. package/dist/preview-engine/chunk-BWDARDO6.mjs +0 -117
  395. package/dist/preview-engine/chunk-DLXQDDIN.mjs +0 -46
  396. package/dist/preview-engine/chunk-EJGLUZMW.mjs +0 -1
  397. package/dist/preview-engine/chunk-FE6RSVKZ.mjs +0 -73
  398. package/dist/preview-engine/chunk-FGHOHCFG.mjs +0 -110
  399. package/dist/preview-engine/chunk-HPIULG7P.mjs +0 -111
  400. package/dist/preview-engine/chunk-HRIKNYPF.mjs +0 -60
  401. package/dist/preview-engine/chunk-IMV5SBQV.mjs +0 -1
  402. package/dist/preview-engine/chunk-JPXQPP6J.mjs +0 -1
  403. package/dist/preview-engine/chunk-K52S5DJX.mjs +0 -109
  404. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +0 -474
  405. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +0 -3
  406. package/dist/preview-engine/chunk-MJM3NFEC.mjs +0 -315
  407. package/dist/preview-engine/chunk-NFAGEP43.mjs +0 -1448
  408. package/dist/preview-engine/chunk-NRHSNPZV.mjs +0 -182
  409. package/dist/preview-engine/chunk-OWOSYNMF.mjs +0 -104
  410. package/dist/preview-engine/chunk-Q66QQI6N.mjs +0 -8
  411. package/dist/preview-engine/chunk-QGBSLNFI.mjs +0 -52
  412. package/dist/preview-engine/chunk-QM3XFEJN.mjs +0 -63
  413. package/dist/preview-engine/chunk-R3ZH7YF3.mjs +0 -89
  414. package/dist/preview-engine/chunk-R6YNSBKL.mjs +0 -108
  415. package/dist/preview-engine/chunk-S4CSX6K5.mjs +0 -610
  416. package/dist/preview-engine/chunk-SNYAHQ25.mjs +0 -186
  417. package/dist/preview-engine/chunk-SRT2OCQW.mjs +0 -1
  418. package/dist/preview-engine/chunk-SUUUYXXT.mjs +0 -1
  419. package/dist/preview-engine/chunk-T6COGNOW.mjs +0 -134
  420. package/dist/preview-engine/chunk-XFYXT76H.mjs +0 -52
  421. package/dist/preview-engine/chunk-XUM42I4R.mjs +0 -1
  422. package/dist/preview-engine/chunk-YITWSOG4.mjs +0 -103
  423. package/dist/preview-engine/chunk-ZDCA6NVT.mjs +0 -82
  424. package/dist/preview-engine/chunk-ZNGOAGAI.mjs +0 -1
  425. package/dist/preview-engine/renderers-27Q5X3U6.mjs +0 -1
  426. package/dist/preview-engine/renderers-4AHH6BHF.mjs +0 -1
  427. package/dist/preview-engine/renderers-5BV6JGTU.mjs +0 -248
  428. package/dist/preview-engine/renderers-6PRVCTYV.mjs +0 -1
  429. package/dist/preview-engine/renderers-76PQY2SO.mjs +0 -1
  430. package/dist/preview-engine/renderers-7X2W6QWX.mjs +0 -1
  431. package/dist/preview-engine/renderers-B52QT6MT.mjs +0 -55
  432. package/dist/preview-engine/renderers-BE6RVJSE.mjs +0 -1
  433. package/dist/preview-engine/renderers-BMM2BH56.mjs +0 -1
  434. package/dist/preview-engine/renderers-CHOGQHVQ.mjs +0 -1
  435. package/dist/preview-engine/renderers-CRKRWR2Y.mjs +0 -1
  436. package/dist/preview-engine/renderers-DEYDSGJX.mjs +0 -1
  437. package/dist/preview-engine/renderers-DZTNRCR7.mjs +0 -1
  438. package/dist/preview-engine/renderers-ELO3KWTK.mjs +0 -1
  439. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +0 -1
  440. package/dist/preview-engine/renderers-F2KJNDWA.mjs +0 -124
  441. package/dist/preview-engine/renderers-FCV4COVB.mjs +0 -1
  442. package/dist/preview-engine/renderers-G5KQISVL.mjs +0 -1
  443. package/dist/preview-engine/renderers-GJSUN5HU.mjs +0 -1
  444. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +0 -1
  445. package/dist/preview-engine/renderers-GXCRINGC.mjs +0 -1
  446. package/dist/preview-engine/renderers-IHKORHMT.mjs +0 -1
  447. package/dist/preview-engine/renderers-JA4SLMG3.mjs +0 -1
  448. package/dist/preview-engine/renderers-JLN77CFZ.mjs +0 -1
  449. package/dist/preview-engine/renderers-KBFW7B5F.mjs +0 -1
  450. package/dist/preview-engine/renderers-LJRJMFCR.mjs +0 -1
  451. package/dist/preview-engine/renderers-LPAPZ5QS.mjs +0 -1
  452. package/dist/preview-engine/renderers-NQUDQEHY.mjs +0 -1
  453. package/dist/preview-engine/renderers-NS3AIJVG.mjs +0 -1
  454. package/dist/preview-engine/renderers-NSY2SDIE.mjs +0 -1
  455. package/dist/preview-engine/renderers-PW4OJWHF.mjs +0 -120
  456. package/dist/preview-engine/renderers-PWLWOZY4.mjs +0 -1
  457. package/dist/preview-engine/renderers-Q3MD34JN.mjs +0 -1
  458. package/dist/preview-engine/renderers-RXGNA2Q7.mjs +0 -1
  459. package/dist/preview-engine/renderers-TVTQ2R74.mjs +0 -1
  460. package/dist/preview-engine/renderers-VTTGFO55.mjs +0 -1
  461. package/dist/preview-engine/renderers-W3VVM5HB.mjs +0 -1
  462. package/dist/preview-engine/renderers-WG7QBD4D.mjs +0 -1
  463. package/dist/preview-engine/renderers-WLLJFZTF.mjs +0 -1
  464. package/dist/preview-engine/renderers-WN4SYFCU.mjs +0 -1
  465. package/dist/preview-engine/renderers-WSMLLSWX.mjs +0 -1
  466. package/dist/preview-engine/renderers-XFBSGTHU.mjs +0 -1
  467. package/dist/preview-engine/renderers-XFC6ZPO5.mjs +0 -1
  468. package/dist/preview-engine/renderers-XUHRY3XH.mjs +0 -1
  469. package/dist/preview-engine/renderers-YAOB5XU6.mjs +0 -1
  470. package/dist/preview-engine/renderers-YTB4FOHT.mjs +0 -1
  471. package/dist/preview-engine/renderers-ZIMBODX6.mjs +0 -1
  472. package/dist/program-BmNKgzja.mjs.map +0 -1
  473. package/dist/renderer-1VuQTY1Z.mjs.map +0 -1
  474. package/dist/renderer-6oMSare3.mjs +0 -3
  475. package/dist/renderer-B1ComPb2.mjs +0 -3
  476. package/dist/renderer-B2XzjK0z.mjs +0 -3
  477. package/dist/renderer-B2ieylQ3.mjs.map +0 -1
  478. package/dist/renderer-B8-kzZdP.mjs.map +0 -1
  479. package/dist/renderer-B8UaFNqb.mjs.map +0 -1
  480. package/dist/renderer-BDbTWSpP.mjs.map +0 -1
  481. package/dist/renderer-BIIWCg_J.mjs.map +0 -1
  482. package/dist/renderer-BJ1aTkZf.mjs.map +0 -1
  483. package/dist/renderer-BM05sB8m.mjs.map +0 -1
  484. package/dist/renderer-BQ5Bz5D0.mjs +0 -3
  485. package/dist/renderer-BREIjsUU.mjs.map +0 -1
  486. package/dist/renderer-BTu2EVhF.mjs +0 -3
  487. package/dist/renderer-BZcn_iBl.mjs +0 -3
  488. package/dist/renderer-Bc04fivZ.mjs.map +0 -1
  489. package/dist/renderer-BfAWZziM.mjs.map +0 -1
  490. package/dist/renderer-BfJSUjPN.mjs +0 -3
  491. package/dist/renderer-Bfgd4N0O.mjs.map +0 -1
  492. package/dist/renderer-Bhdf90Zq.mjs.map +0 -1
  493. package/dist/renderer-Bp6sDMa6.mjs +0 -3
  494. package/dist/renderer-Bt7_sb_Y.mjs +0 -3
  495. package/dist/renderer-Bv6q84TU.mjs.map +0 -1
  496. package/dist/renderer-C-H680_l.mjs +0 -3
  497. package/dist/renderer-C606ZPUn.mjs +0 -3
  498. package/dist/renderer-C9jyKn1i.mjs +0 -3
  499. package/dist/renderer-CDLrNgfo.mjs +0 -3
  500. package/dist/renderer-CERfcxgv.mjs +0 -3
  501. package/dist/renderer-CG5PzNkv.mjs +0 -3
  502. package/dist/renderer-CI7sG_cv.mjs.map +0 -1
  503. package/dist/renderer-CPoIMVdk.mjs +0 -3
  504. package/dist/renderer-CQdVj2JS.mjs +0 -3
  505. package/dist/renderer-CQiTodg9.mjs +0 -337
  506. package/dist/renderer-CQiTodg9.mjs.map +0 -1
  507. package/dist/renderer-CWTpc4ff.mjs.map +0 -1
  508. package/dist/renderer-CXn5HAnK.mjs.map +0 -1
  509. package/dist/renderer-CZgB5st8.mjs +0 -3
  510. package/dist/renderer-C_TPMHiH.mjs.map +0 -1
  511. package/dist/renderer-Ca7L1EOp.mjs +0 -3
  512. package/dist/renderer-CaaOKMSd.mjs.map +0 -1
  513. package/dist/renderer-CdciwwMI.mjs.map +0 -1
  514. package/dist/renderer-CepMDQ06.mjs.map +0 -1
  515. package/dist/renderer-CfC_aiew.mjs.map +0 -1
  516. package/dist/renderer-ChdLYS-G.mjs.map +0 -1
  517. package/dist/renderer-CkykdR_D.mjs +0 -3
  518. package/dist/renderer-Cl6GkeHx.mjs +0 -3
  519. package/dist/renderer-ClcjrFyo.mjs +0 -3
  520. package/dist/renderer-CnXW28b9.mjs.map +0 -1
  521. package/dist/renderer-CpkiHRhh.mjs.map +0 -1
  522. package/dist/renderer-CtVkU_GA.mjs +0 -44
  523. package/dist/renderer-CtVkU_GA.mjs.map +0 -1
  524. package/dist/renderer-Ctk2zzfy.mjs.map +0 -1
  525. package/dist/renderer-CtyD_Xju.mjs.map +0 -1
  526. package/dist/renderer-CySUP_wk.mjs +0 -3
  527. package/dist/renderer-CzPWB0Ss.mjs.map +0 -1
  528. package/dist/renderer-D2XD4QYk.mjs.map +0 -1
  529. package/dist/renderer-D2l_Odyg.mjs +0 -3
  530. package/dist/renderer-D7zvPHKn.mjs.map +0 -1
  531. package/dist/renderer-D9NnIx7o.mjs +0 -3
  532. package/dist/renderer-DCPCYySt.mjs +0 -3
  533. package/dist/renderer-DEJwPRkR.mjs.map +0 -1
  534. package/dist/renderer-DIkpJEOZ.mjs +0 -3
  535. package/dist/renderer-DML9qpmS.mjs.map +0 -1
  536. package/dist/renderer-DNSXPkf_.mjs +0 -3
  537. package/dist/renderer-DP-CvZ_Z.mjs +0 -3
  538. package/dist/renderer-DZGtBUCx.mjs.map +0 -1
  539. package/dist/renderer-D_1oDOCP.mjs.map +0 -1
  540. package/dist/renderer-DeXb8R6h.mjs +0 -3
  541. package/dist/renderer-DezO-ZaP.mjs +0 -4
  542. package/dist/renderer-DhXe04fC.mjs +0 -3
  543. package/dist/renderer-DirxsOjq.mjs.map +0 -1
  544. package/dist/renderer-Djlb4TLO.mjs.map +0 -1
  545. package/dist/renderer-DnH3SI7w.mjs +0 -3
  546. package/dist/renderer-DpGc-N3G.mjs.map +0 -1
  547. package/dist/renderer-Dpw4oi33.mjs +0 -3
  548. package/dist/renderer-DxTs4Iyi.mjs.map +0 -1
  549. package/dist/renderer-Dy0utCl7.mjs.map +0 -1
  550. package/dist/renderer-Md-ytU0v.mjs +0 -3
  551. package/dist/renderer-U-bhWO9Q.mjs +0 -3
  552. package/dist/renderer-_uvdg48N.mjs.map +0 -1
  553. package/dist/renderer-bsWnRNpJ.mjs.map +0 -1
  554. package/dist/renderer-cgxO2xN6.mjs.map +0 -1
  555. package/dist/renderer-d5-F_48R.mjs +0 -3
  556. package/dist/renderer-ho_jXJ0H.mjs.map +0 -1
  557. package/dist/renderer-vqkKWqa5.mjs.map +0 -1
  558. package/dist/renderer-zA5okHds.mjs +0 -3
  559. /package/dist/{renderer-C2n-EHxg.mjs → renderer-B-BcgA6d.mjs} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./chunk-GMkBE123.mjs";
2
- import { t as require_dist_cjs } from "./dist-cjs-BDpO-TH_.mjs";
2
+ import { t as require_dist_cjs } from "./dist-cjs-D-EE4Ahy.mjs";
3
3
 
4
4
  //#region ../../node_modules/.pnpm/@smithy+core@3.23.12/node_modules/@smithy/core/dist-es/submodules/event-streams/EventStreamSerde.js
5
5
  var import_dist_cjs, EventStreamSerde;
@@ -201,4 +201,4 @@ var init_event_streams = __esmMin((() => {
201
201
  //#endregion
202
202
  init_event_streams();
203
203
  export { EventStreamSerde };
204
- //# sourceMappingURL=event-streams-BaNGaLxh.mjs.map
204
+ //# sourceMappingURL=event-streams-DnRe8uwT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-streams-BaNGaLxh.mjs","names":["toUtf8","fromUtf8"],"sources":["../../../node_modules/.pnpm/@smithy+core@3.23.12/node_modules/@smithy/core/dist-es/submodules/event-streams/EventStreamSerde.js","../../../node_modules/.pnpm/@smithy+core@3.23.12/node_modules/@smithy/core/dist-es/submodules/event-streams/index.js"],"sourcesContent":["import { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nexport class EventStreamSerde {\n marshaller;\n serializer;\n deserializer;\n serdeContext;\n defaultContentType;\n constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType, }) {\n this.marshaller = marshaller;\n this.serializer = serializer;\n this.deserializer = deserializer;\n this.serdeContext = serdeContext;\n this.defaultContentType = defaultContentType;\n }\n async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = requestSchema.getEventStreamMember();\n const unionSchema = requestSchema.getMemberSchema(eventStreamMember);\n const serializer = this.serializer;\n const defaultContentType = this.defaultContentType;\n const initialRequestMarker = Symbol(\"initialRequestMarker\");\n const eventStreamIterable = {\n async *[Symbol.asyncIterator]() {\n if (initialRequest) {\n const headers = {\n \":event-type\": { type: \"string\", value: \"initial-request\" },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: defaultContentType },\n };\n serializer.write(requestSchema, initialRequest);\n const body = serializer.flush();\n yield {\n [initialRequestMarker]: true,\n headers,\n body,\n };\n }\n for await (const page of eventStream) {\n yield page;\n }\n },\n };\n return marshaller.serialize(eventStreamIterable, (event) => {\n if (event[initialRequestMarker]) {\n return {\n headers: event.headers,\n body: event.body,\n };\n }\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody(unionMember, unionSchema, event);\n const headers = {\n \":event-type\": { type: \"string\", value: eventType },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: explicitPayloadContentType ?? defaultContentType },\n ...additionalHeaders,\n };\n return {\n headers,\n body,\n };\n });\n }\n async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = responseSchema.getEventStreamMember();\n const unionSchema = responseSchema.getMemberSchema(eventStreamMember);\n const memberSchemas = unionSchema.getMemberSchemas();\n const initialResponseMarker = Symbol(\"initialResponseMarker\");\n const asyncIterable = marshaller.deserialize(response.body, async (event) => {\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const body = event[unionMember].body;\n if (unionMember === \"initial-response\") {\n const dataObject = await this.deserializer.read(responseSchema, body);\n delete dataObject[eventStreamMember];\n return {\n [initialResponseMarker]: true,\n ...dataObject,\n };\n }\n else if (unionMember in memberSchemas) {\n const eventStreamSchema = memberSchemas[unionMember];\n if (eventStreamSchema.isStructSchema()) {\n const out = {};\n let hasBindings = false;\n for (const [name, member] of eventStreamSchema.structIterator()) {\n const { eventHeader, eventPayload } = member.getMergedTraits();\n hasBindings = hasBindings || Boolean(eventHeader || eventPayload);\n if (eventPayload) {\n if (member.isBlobSchema()) {\n out[name] = body;\n }\n else if (member.isStringSchema()) {\n out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body);\n }\n else if (member.isStructSchema()) {\n out[name] = await this.deserializer.read(member, body);\n }\n }\n else if (eventHeader) {\n const value = event[unionMember].headers[name]?.value;\n if (value != null) {\n if (member.isNumericSchema()) {\n if (value && typeof value === \"object\" && \"bytes\" in value) {\n out[name] = BigInt(value.toString());\n }\n else {\n out[name] = Number(value);\n }\n }\n else {\n out[name] = value;\n }\n }\n }\n }\n if (hasBindings) {\n return {\n [unionMember]: out,\n };\n }\n if (body.byteLength === 0) {\n return {\n [unionMember]: {},\n };\n }\n }\n return {\n [unionMember]: await this.deserializer.read(eventStreamSchema, body),\n };\n }\n else {\n return {\n $unknown: event,\n };\n }\n });\n const asyncIterator = asyncIterable[Symbol.asyncIterator]();\n const firstEvent = await asyncIterator.next();\n if (firstEvent.done) {\n return asyncIterable;\n }\n if (firstEvent.value?.[initialResponseMarker]) {\n if (!responseSchema) {\n throw new Error(\"@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.\");\n }\n for (const [key, value] of Object.entries(firstEvent.value)) {\n initialResponseContainer[key] = value;\n }\n }\n return {\n async *[Symbol.asyncIterator]() {\n if (!firstEvent?.value?.[initialResponseMarker]) {\n yield firstEvent.value;\n }\n while (true) {\n const { done, value } = await asyncIterator.next();\n if (done) {\n break;\n }\n yield value;\n }\n },\n };\n }\n writeEventBody(unionMember, unionSchema, event) {\n const serializer = this.serializer;\n let eventType = unionMember;\n let explicitPayloadMember = null;\n let explicitPayloadContentType;\n const isKnownSchema = (() => {\n const struct = unionSchema.getSchema();\n return struct[4].includes(unionMember);\n })();\n const additionalHeaders = {};\n if (!isKnownSchema) {\n const [type, value] = event[unionMember];\n eventType = type;\n serializer.write(15, value);\n }\n else {\n const eventSchema = unionSchema.getMemberSchema(unionMember);\n if (eventSchema.isStructSchema()) {\n for (const [memberName, memberSchema] of eventSchema.structIterator()) {\n const { eventHeader, eventPayload } = memberSchema.getMergedTraits();\n if (eventPayload) {\n explicitPayloadMember = memberName;\n }\n else if (eventHeader) {\n const value = event[unionMember][memberName];\n let type = \"binary\";\n if (memberSchema.isNumericSchema()) {\n if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) {\n type = \"integer\";\n }\n else {\n type = \"long\";\n }\n }\n else if (memberSchema.isTimestampSchema()) {\n type = \"timestamp\";\n }\n else if (memberSchema.isStringSchema()) {\n type = \"string\";\n }\n else if (memberSchema.isBooleanSchema()) {\n type = \"boolean\";\n }\n if (value != null) {\n additionalHeaders[memberName] = {\n type,\n value,\n };\n delete event[unionMember][memberName];\n }\n }\n }\n if (explicitPayloadMember !== null) {\n const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember);\n if (payloadSchema.isBlobSchema()) {\n explicitPayloadContentType = \"application/octet-stream\";\n }\n else if (payloadSchema.isStringSchema()) {\n explicitPayloadContentType = \"text/plain\";\n }\n serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]);\n }\n else {\n serializer.write(eventSchema, event[unionMember]);\n }\n }\n else if (eventSchema.isUnitSchema()) {\n serializer.write(eventSchema, {});\n }\n else {\n throw new Error(\"@smithy/core/event-streams - non-struct member not supported in event stream union.\");\n }\n }\n const messageSerialization = serializer.flush() ?? new Uint8Array();\n const body = typeof messageSerialization === \"string\"\n ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization)\n : messageSerialization;\n return {\n body,\n eventType,\n explicitPayloadContentType,\n additionalHeaders,\n };\n }\n}\n","export * from \"./EventStreamSerde\";\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"event-streams-DnRe8uwT.mjs","names":["toUtf8","fromUtf8"],"sources":["../../../node_modules/.pnpm/@smithy+core@3.23.12/node_modules/@smithy/core/dist-es/submodules/event-streams/EventStreamSerde.js","../../../node_modules/.pnpm/@smithy+core@3.23.12/node_modules/@smithy/core/dist-es/submodules/event-streams/index.js"],"sourcesContent":["import { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nexport class EventStreamSerde {\n marshaller;\n serializer;\n deserializer;\n serdeContext;\n defaultContentType;\n constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType, }) {\n this.marshaller = marshaller;\n this.serializer = serializer;\n this.deserializer = deserializer;\n this.serdeContext = serdeContext;\n this.defaultContentType = defaultContentType;\n }\n async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = requestSchema.getEventStreamMember();\n const unionSchema = requestSchema.getMemberSchema(eventStreamMember);\n const serializer = this.serializer;\n const defaultContentType = this.defaultContentType;\n const initialRequestMarker = Symbol(\"initialRequestMarker\");\n const eventStreamIterable = {\n async *[Symbol.asyncIterator]() {\n if (initialRequest) {\n const headers = {\n \":event-type\": { type: \"string\", value: \"initial-request\" },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: defaultContentType },\n };\n serializer.write(requestSchema, initialRequest);\n const body = serializer.flush();\n yield {\n [initialRequestMarker]: true,\n headers,\n body,\n };\n }\n for await (const page of eventStream) {\n yield page;\n }\n },\n };\n return marshaller.serialize(eventStreamIterable, (event) => {\n if (event[initialRequestMarker]) {\n return {\n headers: event.headers,\n body: event.body,\n };\n }\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody(unionMember, unionSchema, event);\n const headers = {\n \":event-type\": { type: \"string\", value: eventType },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: explicitPayloadContentType ?? defaultContentType },\n ...additionalHeaders,\n };\n return {\n headers,\n body,\n };\n });\n }\n async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = responseSchema.getEventStreamMember();\n const unionSchema = responseSchema.getMemberSchema(eventStreamMember);\n const memberSchemas = unionSchema.getMemberSchemas();\n const initialResponseMarker = Symbol(\"initialResponseMarker\");\n const asyncIterable = marshaller.deserialize(response.body, async (event) => {\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const body = event[unionMember].body;\n if (unionMember === \"initial-response\") {\n const dataObject = await this.deserializer.read(responseSchema, body);\n delete dataObject[eventStreamMember];\n return {\n [initialResponseMarker]: true,\n ...dataObject,\n };\n }\n else if (unionMember in memberSchemas) {\n const eventStreamSchema = memberSchemas[unionMember];\n if (eventStreamSchema.isStructSchema()) {\n const out = {};\n let hasBindings = false;\n for (const [name, member] of eventStreamSchema.structIterator()) {\n const { eventHeader, eventPayload } = member.getMergedTraits();\n hasBindings = hasBindings || Boolean(eventHeader || eventPayload);\n if (eventPayload) {\n if (member.isBlobSchema()) {\n out[name] = body;\n }\n else if (member.isStringSchema()) {\n out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body);\n }\n else if (member.isStructSchema()) {\n out[name] = await this.deserializer.read(member, body);\n }\n }\n else if (eventHeader) {\n const value = event[unionMember].headers[name]?.value;\n if (value != null) {\n if (member.isNumericSchema()) {\n if (value && typeof value === \"object\" && \"bytes\" in value) {\n out[name] = BigInt(value.toString());\n }\n else {\n out[name] = Number(value);\n }\n }\n else {\n out[name] = value;\n }\n }\n }\n }\n if (hasBindings) {\n return {\n [unionMember]: out,\n };\n }\n if (body.byteLength === 0) {\n return {\n [unionMember]: {},\n };\n }\n }\n return {\n [unionMember]: await this.deserializer.read(eventStreamSchema, body),\n };\n }\n else {\n return {\n $unknown: event,\n };\n }\n });\n const asyncIterator = asyncIterable[Symbol.asyncIterator]();\n const firstEvent = await asyncIterator.next();\n if (firstEvent.done) {\n return asyncIterable;\n }\n if (firstEvent.value?.[initialResponseMarker]) {\n if (!responseSchema) {\n throw new Error(\"@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.\");\n }\n for (const [key, value] of Object.entries(firstEvent.value)) {\n initialResponseContainer[key] = value;\n }\n }\n return {\n async *[Symbol.asyncIterator]() {\n if (!firstEvent?.value?.[initialResponseMarker]) {\n yield firstEvent.value;\n }\n while (true) {\n const { done, value } = await asyncIterator.next();\n if (done) {\n break;\n }\n yield value;\n }\n },\n };\n }\n writeEventBody(unionMember, unionSchema, event) {\n const serializer = this.serializer;\n let eventType = unionMember;\n let explicitPayloadMember = null;\n let explicitPayloadContentType;\n const isKnownSchema = (() => {\n const struct = unionSchema.getSchema();\n return struct[4].includes(unionMember);\n })();\n const additionalHeaders = {};\n if (!isKnownSchema) {\n const [type, value] = event[unionMember];\n eventType = type;\n serializer.write(15, value);\n }\n else {\n const eventSchema = unionSchema.getMemberSchema(unionMember);\n if (eventSchema.isStructSchema()) {\n for (const [memberName, memberSchema] of eventSchema.structIterator()) {\n const { eventHeader, eventPayload } = memberSchema.getMergedTraits();\n if (eventPayload) {\n explicitPayloadMember = memberName;\n }\n else if (eventHeader) {\n const value = event[unionMember][memberName];\n let type = \"binary\";\n if (memberSchema.isNumericSchema()) {\n if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) {\n type = \"integer\";\n }\n else {\n type = \"long\";\n }\n }\n else if (memberSchema.isTimestampSchema()) {\n type = \"timestamp\";\n }\n else if (memberSchema.isStringSchema()) {\n type = \"string\";\n }\n else if (memberSchema.isBooleanSchema()) {\n type = \"boolean\";\n }\n if (value != null) {\n additionalHeaders[memberName] = {\n type,\n value,\n };\n delete event[unionMember][memberName];\n }\n }\n }\n if (explicitPayloadMember !== null) {\n const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember);\n if (payloadSchema.isBlobSchema()) {\n explicitPayloadContentType = \"application/octet-stream\";\n }\n else if (payloadSchema.isStringSchema()) {\n explicitPayloadContentType = \"text/plain\";\n }\n serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]);\n }\n else {\n serializer.write(eventSchema, event[unionMember]);\n }\n }\n else if (eventSchema.isUnitSchema()) {\n serializer.write(eventSchema, {});\n }\n else {\n throw new Error(\"@smithy/core/event-streams - non-struct member not supported in event stream union.\");\n }\n }\n const messageSerialization = serializer.flush() ?? new Uint8Array();\n const body = typeof messageSerialization === \"string\"\n ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization)\n : messageSerialization;\n return {\n body,\n eventType,\n explicitPayloadContentType,\n additionalHeaders,\n };\n }\n}\n","export * from \"./EventStreamSerde\";\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as RegisteredFont, i as RegisterFontOptions, n as MeasureTextOptions, o as TextMetrics, r as MeasuredGlyph, t as FontManager } from "../index-DnWsbbuZ.mjs";
1
+ import { a as RegisteredFont, i as RegisterFontOptions, n as MeasureTextOptions, o as TextMetrics, r as MeasuredGlyph, t as FontManager } from "../index-l03NV8JS.mjs";
2
2
  export { FontManager, MeasureTextOptions, MeasuredGlyph, RegisterFontOptions, RegisteredFont, TextMetrics };
@@ -1,3 +1,5 @@
1
- import { t as FontManager } from "../fonts-C0W6TgJk.mjs";
1
+ import "../chunk-GMkBE123.mjs";
2
+ import "../dist-Bun_TUvZ.mjs";
3
+ import { t as FontManager } from "../fonts-UM5xaBOx.mjs";
2
4
 
3
5
  export { FontManager };
@@ -1,6 +1,6 @@
1
- import { b as SlugGeometry, tt as registerHeadlessFont, y as SlugFontCache } from "./dist-Cxi68OuY.mjs";
2
- import * as fontkit from "fontkit";
1
+ import { J as registerHeadlessFont, m as SlugGeometry, p as SlugFontCache } from "./dist-Bun_TUvZ.mjs";
3
2
  import path from "node:path";
3
+ import * as fontkit from "fontkit";
4
4
  import fs from "node:fs/promises";
5
5
 
6
6
  //#region src/fonts/manager.ts
@@ -109,28 +109,41 @@ var FontManager = class FontManager {
109
109
  if (!font) throw new Error(`FontManager.measure: font "${options.fontFamily}" is not registered. Call \`await FontManager.register(...)\` first.`);
110
110
  const lineHeight = options.lineHeight !== void 0 && options.lineHeight < 10 ? options.lineHeight * fontSize : options.lineHeight ?? fontSize * 1.2;
111
111
  const letterSpacing = options.letterSpacing ?? 0;
112
- const { width, height, layout } = SlugGeometry.measure(text, font, fontSize, letterSpacing, lineHeight, options.width);
112
+ const { width, height, layout } = SlugGeometry.measure(text, font, fontSize, letterSpacing, lineHeight, options.width, void 0, options.direction);
113
113
  const scale = fontSize / font.unitsPerEm;
114
114
  const glyphs = [];
115
+ const seen = /* @__PURE__ */ new Set();
115
116
  let cursor = 0;
116
117
  for (const g of layout.glyphs) {
117
- const at = text.indexOf(g.char, cursor);
118
- const index = at >= 0 ? at : cursor;
118
+ let index = g.textIndex;
119
+ if (index === void 0) {
120
+ const at = text.indexOf(g.char, cursor);
121
+ index = at >= 0 ? at : cursor;
122
+ }
123
+ if (seen.has(index)) continue;
124
+ seen.add(index);
119
125
  cursor = index + g.char.length;
126
+ const advance = g.clusterAdvance ?? g.cp.advanceWidth * (g.fontScale ?? scale);
120
127
  glyphs.push({
121
128
  char: g.char,
122
129
  index,
123
- x: g.x,
130
+ x: g.clusterX ?? g.x,
124
131
  y: g.y,
125
- width: g.cp.advanceWidth * (g.fontScale ?? scale) + letterSpacing,
126
- line: g.lineIndex
132
+ width: advance + letterSpacing,
133
+ line: g.lineIndex,
134
+ ...g.rtl && { rtl: true }
127
135
  });
128
136
  }
129
137
  const caretX = (count) => {
130
- if (count <= 0 || glyphs.length === 0) return glyphs[0]?.x ?? 0;
138
+ if (count <= 0 || glyphs.length === 0) {
139
+ const first = glyphs[0];
140
+ if (!first) return 0;
141
+ return first.rtl ? first.x + first.width - letterSpacing : first.x;
142
+ }
131
143
  const before = glyphs.filter((g) => g.index < count);
132
144
  const last = before[before.length - 1];
133
- return last ? last.x + last.width - letterSpacing : 0;
145
+ if (!last) return 0;
146
+ return last.rtl ? last.x : last.x + last.width - letterSpacing;
134
147
  };
135
148
  return {
136
149
  width,
@@ -243,4 +256,4 @@ var FontManager = class FontManager {
243
256
 
244
257
  //#endregion
245
258
  export { FontManager as t };
246
- //# sourceMappingURL=fonts-C0W6TgJk.mjs.map
259
+ //# sourceMappingURL=fonts-UM5xaBOx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts-UM5xaBOx.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);\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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"}
@@ -0,0 +1,215 @@
1
+ import { An as signalRegistry } from "./dist-Bun_TUvZ.mjs";
2
+
3
+ //#region ../node-sdk/dist/gpu.mjs
4
+ const TRANSPARENT = {
5
+ r: 0,
6
+ g: 0,
7
+ b: 0,
8
+ a: 0
9
+ };
10
+ /**
11
+ * Full-screen quad vertex stage: a 4-vertex triangle strip (draw(4)) that
12
+ * hands `in.uv` (0,0 top-left → 1,1 bottom-right) to an `fs` reading `VSOut`.
13
+ */
14
+ const FULLSCREEN_QUAD_WGSL = `
15
+ struct VSOut {
16
+ @builtin(position) pos : vec4<f32>,
17
+ @location(0) uv : vec2<f32>,
18
+ };
19
+
20
+ @vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
21
+ var pos = array<vec2<f32>, 4>(
22
+ vec2<f32>(-1.0, 1.0),
23
+ vec2<f32>(1.0, 1.0),
24
+ vec2<f32>(-1.0, -1.0),
25
+ vec2<f32>(1.0, -1.0)
26
+ );
27
+ var uv = array<vec2<f32>, 4>(
28
+ vec2<f32>(0.0, 0.0),
29
+ vec2<f32>(1.0, 0.0),
30
+ vec2<f32>(0.0, 1.0),
31
+ vec2<f32>(1.0, 1.0)
32
+ );
33
+ return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
34
+ }
35
+ `;
36
+ /** Premultiplied-alpha "over" blending. */
37
+ const PREMULTIPLIED_BLEND = {
38
+ color: {
39
+ srcFactor: "one",
40
+ dstFactor: "one-minus-src-alpha",
41
+ operation: "add"
42
+ },
43
+ alpha: {
44
+ srcFactor: "one",
45
+ dstFactor: "one-minus-src-alpha",
46
+ operation: "add"
47
+ }
48
+ };
49
+ /** Straight-alpha color over a premultiplied-alpha accumulation. */
50
+ const STRAIGHT_ALPHA_BLEND = {
51
+ color: {
52
+ srcFactor: "src-alpha",
53
+ dstFactor: "one-minus-src-alpha",
54
+ operation: "add"
55
+ },
56
+ alpha: {
57
+ srcFactor: "one",
58
+ dstFactor: "one-minus-src-alpha",
59
+ operation: "add"
60
+ }
61
+ };
62
+ /** A bind group layout whose entries are bound at 0, 1, 2… in order. */
63
+ function fragmentBindGroupLayout(device, bindings, label) {
64
+ return device.createBindGroupLayout({
65
+ ...label && { label },
66
+ entries: bindings.map((binding, index) => {
67
+ if (binding === "uniform") return {
68
+ binding: index,
69
+ visibility: GPUShaderStage.FRAGMENT,
70
+ buffer: { type: "uniform" }
71
+ };
72
+ if (binding === "texture") return {
73
+ binding: index,
74
+ visibility: GPUShaderStage.FRAGMENT,
75
+ texture: { sampleType: "float" }
76
+ };
77
+ if (binding === "sampler") return {
78
+ binding: index,
79
+ visibility: GPUShaderStage.FRAGMENT,
80
+ sampler: { type: "filtering" }
81
+ };
82
+ return {
83
+ visibility: GPUShaderStage.FRAGMENT,
84
+ ...binding,
85
+ binding: index
86
+ };
87
+ })
88
+ });
89
+ }
90
+ /** `count` float textures followed by one filtering sampler. */
91
+ function texturesLayout(device, count) {
92
+ return fragmentBindGroupLayout(device, [...Array(count).fill("texture"), "sampler"]);
93
+ }
94
+ /** Memoizes `create` per GPUDevice (resources can't cross devices). */
95
+ function perDevice(create) {
96
+ const cache = /* @__PURE__ */ new WeakMap();
97
+ return (device) => {
98
+ let value = cache.get(device);
99
+ if (value === void 0) {
100
+ value = create(device);
101
+ cache.set(device, value);
102
+ }
103
+ return value;
104
+ };
105
+ }
106
+ /** A triangle-strip pipeline drawing one full-screen quad (`draw(4)`). */
107
+ function createFullscreenPipeline(device, options) {
108
+ const { module, format, blend } = options;
109
+ return device.createRenderPipeline({
110
+ ...options.label && { label: options.label },
111
+ layout: Array.isArray(options.layouts) ? device.createPipelineLayout({ bindGroupLayouts: options.layouts }) : options.layouts,
112
+ vertex: {
113
+ module,
114
+ entryPoint: options.vertexEntryPoint ?? "vs"
115
+ },
116
+ fragment: {
117
+ module,
118
+ entryPoint: options.fragmentEntryPoint ?? "fs",
119
+ targets: [blend ? {
120
+ format,
121
+ blend
122
+ } : { format }]
123
+ },
124
+ primitive: { topology: "triangle-strip" }
125
+ });
126
+ }
127
+ /**
128
+ * Renders `child` into a cleared temporary texture with an identity
129
+ * transform and a full-size scissor, and returns that texture.
130
+ */
131
+ async function drawChildToTexture(args, child, options = {}) {
132
+ const { ctx, encoder, props } = args;
133
+ const width = options.width ?? args.targetWidth;
134
+ const height = options.height ?? args.targetHeight;
135
+ const texture = ctx.renderer.getTemporaryTexture(width, height, [
136
+ ...props.excludeTextures || [],
137
+ args.targetTexture,
138
+ ...options.exclude ?? []
139
+ ]);
140
+ const view = texture.createView();
141
+ ctx.renderer.beginFrame(encoder, view, TRANSPARENT, width, height, "clear").end();
142
+ ctx.renderer.pushScissor({
143
+ x: 0,
144
+ y: 0,
145
+ width,
146
+ height
147
+ });
148
+ ctx.renderer.pushIdentity();
149
+ await args.drawChild(child, options.props ?? {
150
+ ...props,
151
+ virtualMedia: child
152
+ }, view, texture, width, height);
153
+ ctx.renderer.popTransform();
154
+ ctx.renderer.popScissor();
155
+ return {
156
+ texture,
157
+ view
158
+ };
159
+ }
160
+ /**
161
+ * Opens a "load" pass on the node's target and makes it the node's current
162
+ * pass (the caller hands it back to the compositor).
163
+ */
164
+ function beginTargetPass(args, width = args.targetWidth, height = args.targetHeight) {
165
+ const pass = args.ctx.renderer.beginFrame(args.encoder, args.targetView, TRANSPARENT, width, height, "load");
166
+ args.pass = pass;
167
+ return pass;
168
+ }
169
+ /** Draws `texture` over the whole target at `opacity` (the node's output). */
170
+ function drawTextureToTarget(args, texture, opacity = 1) {
171
+ const { targetWidth: width, targetHeight: height } = args;
172
+ args.ctx.renderer.drawTexture(beginTargetPass(args), texture, {
173
+ x: 0,
174
+ y: 0,
175
+ width,
176
+ height
177
+ }, { opacity });
178
+ }
179
+ /** Clock a signal texture is evaluated at, in seconds. */
180
+ function signalTiming(props, frame, fps, fallbackDurationSeconds = 0) {
181
+ const metadataDurationMs = props.virtualMedia?.metadata?.durationMs;
182
+ return {
183
+ elapsedSeconds: props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps,
184
+ durationSeconds: metadataDurationMs ? metadataDurationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : fallbackDurationSeconds
185
+ };
186
+ }
187
+ /**
188
+ * The texture a bound parameter samples: its own GPU binding, the signal's
189
+ * texture (cached under `sd.nodeId`, else `fallbackId`), or a 1×1 dummy.
190
+ */
191
+ function signalTextureView(sc, param, fallbackId) {
192
+ const { args } = sc;
193
+ if (param.gpuTextureView) return param.gpuTextureView;
194
+ if (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);
195
+ return signalRegistry.getDummy1x1TextureView(args.ctx.device);
196
+ }
197
+ /** Clears `target` to transparent and draws one full-screen quad into it. */
198
+ function drawFullscreenPass(encoder, target, pipeline, bindGroups) {
199
+ const pass = encoder.beginRenderPass({ colorAttachments: [{
200
+ view: target,
201
+ loadOp: "clear",
202
+ storeOp: "store",
203
+ clearValue: TRANSPARENT
204
+ }] });
205
+ pass.setPipeline(pipeline);
206
+ bindGroups.forEach((group, index) => {
207
+ pass.setBindGroup(index, group);
208
+ });
209
+ pass.draw(4);
210
+ pass.end();
211
+ }
212
+
213
+ //#endregion
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-RkpiFGOA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu-RkpiFGOA.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 { Pr as VirtualMediaData } from "./index-DDEPvMww.mjs";
1
+ import { do as VirtualMediaData } from "./index-D67p-rHX.mjs";
2
2
  import { VideoSampleSource } from "mediabunny";
3
3
  import { VideoFrame } from "@napi-rs/webcodecs";
4
4
 
@@ -313,4 +313,4 @@ type FrameGridRenderable = {
313
313
  declare function renderFrameGrid(target: FrameGridRenderable, options?: FrameGridOptions): Promise<Buffer>;
314
314
  //#endregion
315
315
  export { renderFrameGrid as a, HeadlessMediaRenderer as c, QaSegment as d, VideoQaOptions as f, renderSemaphore as g, formatQaReport as h, computeGridLayout as i, HeadlessWebGPURenderer as l, VideoQaStats as m, FrameGridRenderable as n, resolveSamplePoints as o, VideoQaReport as p, FrameSamplePoint as r, AudioQaStats as s, FrameGridOptions as t, QaIssue as u };
316
- //# sourceMappingURL=index-CYGpSVsf.d.mts.map
316
+ //# sourceMappingURL=index-CHQ39_Oe.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CYGpSVsf.d.mts","names":["VideoColorPrimaries","VideoFrame","VideoMatrixCoefficients","VideoTransferCharacteristics","RenderDiagnostic","VirtualMediaData","VideoSampleSource","preloadFonts","GPUDevice","Promise","StagingSlotStatus","VideoColorSpaceConfig","DmaStagingRingOptions","GPUTextureFormat","StagingSlotInfo","DmaStagingRing","GPUCommandEncoder","GPUTexture","Uint8Array","findNodesDir","discoverAndRegisterNodeRenderers","VideoQaOptions","QaSegment","QaIssue","VideoQaStats","AudioQaStats","VideoQaReport","FrameInspector","analyzeAudio","Float32Array","integratedLoudness","buildQaReport","formatQaReport","WorkerInput","WorkerMessage","Array","RenderSemaphore","renderSemaphore","HeadlessWebGPURenderer","Buffer","HeadlessMediaRenderer","NODE_KINDS","NodeKind","NodeRendererExports","NodeManifest","NodeManifestError","Error","parseNodeManifest","loadNodeManifests","ZeroCopyWebCodecsPipelineOptions","WebCodecsPipelineStats","ZeroCopyWebCodecsPipeline"],"sources":["../../renderer/dist/index.d.mts","../src/renderer/framegrid.ts"],"sourcesContent":["import { VideoColorPrimaries, VideoFrame, VideoMatrixCoefficients, VideoTransferCharacteristics } from \"@napi-rs/webcodecs\";\nimport { RenderDiagnostic, VirtualMediaData } from \"@framefields/core\";\nimport { VideoSampleSource } from \"mediabunny\";\n\n//#region src/asset-preloader.d.ts\n\n/**\n * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n * typography renders correctly on Node.js without loading its media. Shared\n * with the browser preview; emoji need a font set with\n * `FontManager.registerEmojiFont()`.\n */\ndeclare function preloadFonts(media: VirtualMediaData, device?: GPUDevice | null): Promise<void>;\n//#endregion\n//#region src/dma-staging-ring.d.ts\ntype StagingSlotStatus = \"idle\" | \"rendering\" | \"mapping\" | \"mapped\";\ninterface VideoColorSpaceConfig {\n readonly primaries?: VideoColorPrimaries;\n readonly transfer?: VideoTransferCharacteristics;\n readonly matrix?: VideoMatrixCoefficients;\n readonly fullRange?: boolean;\n}\ninterface DmaStagingRingOptions {\n readonly width: number;\n readonly height: number;\n readonly capacity?: number;\n readonly format?: GPUTextureFormat;\n}\ninterface StagingSlotInfo {\n readonly index: number;\n readonly status: StagingSlotStatus;\n readonly inFlightFrame: number | null;\n}\n/**\n * Pipelined Asynchronous DMA Staging Ring for WebGPU.\n *\n * Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n * GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n * Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n * is asynchronously mapped and consumed by the hardware video encoder.\n */\ndeclare class DmaStagingRing {\n readonly width: number;\n readonly height: number;\n readonly capacity: number;\n readonly bytesPerRow: number;\n readonly unpaddedBytesPerRow: number;\n readonly bufferSize: number;\n readonly format: GPUTextureFormat;\n readonly device: GPUDevice;\n private readonly slots;\n private isDestroyed;\n constructor(device: GPUDevice, options: DmaStagingRingOptions);\n /**\n * Prepares the staging buffer slot for writing by ensuring any prior mapping\n * from a previous cycle has been completed and unmapped.\n */\n prepareSlot(frameIndex: number): Promise<void>;\n /**\n * Records a GPU-to-buffer DMA copy command into the provided command encoder.\n */\n stageTexture(encoder: GPUCommandEncoder, texture: GPUTexture, frameIndex: number): void;\n /**\n * Initiates asynchronous DMA mapping on the slot for the specified frame.\n * Must be called immediately after submitting the command encoder to the device queue.\n */\n scheduleMap(frameIndex: number): Promise<void>;\n /**\n * Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n * The slot remains in the \"mapped\" state until releaseFrame() is called.\n */\n readFramePixels(frameIndex: number): Promise<Uint8Array>;\n /**\n * Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n * returning the slot to \"idle\" state so it can be reused immediately.\n */\n readAndReleaseFrame(frameIndex: number): Promise<Uint8Array>;\n /**\n * Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n * bypassing redundant intermediate JS allocations when row pitches align,\n * and immediately unmaps the buffer.\n */\n readFrameToVideoFrame(frameIndex: number, timestampUs: number, colorSpace?: VideoColorSpaceConfig, /** Sees the tightly packed RGBA pixels while they are mapped; must not keep them. */\n inspect?: (rgba: Uint8Array) => void): Promise<VideoFrame>;\n /**\n * Unmaps the staging buffer for the specified frame and marks the slot idle.\n */\n releaseFrame(frameIndex: number): void;\n /**\n * Returns current status info for each slot in the ring.\n */\n getSlotInfos(): readonly StagingSlotInfo[];\n /**\n * Destroys all staging buffers and releases resources.\n */\n destroy(): void;\n private checkDestroyed;\n}\n//#endregion\n//#region src/dynamic-node-discovery.d.ts\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\ndeclare function findNodesDir(startDir?: string): string | null;\n/**\n * Registers the built-in node renderers, then any extra nodes found in the\n * directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n * that directory overrides the built-in renderer for the same op.\n */\ndeclare function discoverAndRegisterNodeRenderers(): Promise<void>;\n//#endregion\n//#region src/video-qa.d.ts\n/**\n * Quality checks run on a video while it renders: frames are measured as\n * they are read back for the encoder and audio as it is mixed, so the report\n * describes exactly what was encoded without decoding the file again.\n */\ninterface VideoQaOptions {\n /** Luma (0-1) at or below which a pixel counts as black. Default 0.1. */\n readonly blackPixelThreshold?: number;\n /** Share of black pixels that makes a frame black. Default 0.98. */\n readonly blackFrameRatio?: number;\n /** Shortest run of black frames reported. Default 0.5 s. */\n readonly minBlackSec?: number;\n /** Shortest run of unchanging frames reported. Default 2 s. */\n readonly minFrozenSec?: number;\n /** Level (dBFS, 100 ms windows) below which audio counts as silent. Default -60. */\n readonly silenceDbfs?: number;\n /** Shortest silent stretch reported. Default 2 s. */\n readonly minSilenceSec?: number;\n /** Integrated loudness to hit, e.g. -14 for most streaming platforms. Unchecked when unset. */\n readonly targetLufs?: number;\n /** Allowed distance from `targetLufs`, in LU. Default 1. */\n readonly lufsTolerance?: number;\n}\ninterface QaSegment {\n readonly startSec: number;\n readonly endSec: number;\n}\ninterface QaIssue {\n readonly severity: \"error\" | \"warning\" | \"info\";\n /** Stable machine-readable kind, e.g. \"black_frames\", \"audio_clipping\" */\n readonly code: string;\n readonly message: string;\n readonly startSec?: number;\n readonly endSec?: number;\n readonly layerId?: string;\n}\ninterface VideoQaStats {\n readonly expectedFrames: number;\n readonly encodedFrames: number;\n readonly fps: number;\n readonly width: number;\n readonly height: number;\n /** Average luma over the whole video, 0-1 */\n readonly meanLuma: number;\n readonly blackSegments: readonly QaSegment[];\n readonly frozenSegments: readonly QaSegment[];\n}\ninterface AudioQaStats {\n readonly sampleRate: number;\n readonly channels: number;\n readonly durationSec: number;\n /** Highest sample, dBFS (sample peak, not true peak) */\n readonly peakDbfs: number;\n /** Mean level over the whole track, dBFS */\n readonly rmsDbfs: number;\n /** ITU-R BS.1770 integrated loudness; null when the track is silent */\n readonly integratedLufs: number | null;\n /** Samples at or beyond full scale */\n readonly clippedSamples: number;\n readonly silentSegments: readonly QaSegment[];\n}\ninterface VideoQaReport {\n /** No errors or warnings (info issues do not fail a render) */\n readonly passed: boolean;\n readonly video?: VideoQaStats;\n readonly audio?: AudioQaStats;\n readonly issues: readonly QaIssue[];\n}\n/** Measures frames handed to it in order, as RGBA bytes. */\ndeclare class FrameInspector {\n private readonly blackLuma;\n private readonly blackRatio;\n private readonly black;\n private readonly sameAsPrevious;\n private lumaSum;\n private previous;\n constructor(options?: VideoQaOptions);\n get frameCount(): number;\n inspect(rgba: Uint8Array, width: number, height: number): void;\n stats(expectedFrames: number, encodedFrames: number, fps: number, width: number, height: number, options?: VideoQaOptions): VideoQaStats;\n}\n/** Measures a mixed audio track (one Float32Array per channel). */\ndeclare function analyzeAudio(channels: readonly Float32Array[], sampleRate: number, options?: VideoQaOptions): AudioQaStats;\n/**\n * ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n * 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n * the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n */\ndeclare function integratedLoudness(channels: readonly Float32Array[], sampleRate: number): number | null;\n/** Turn measurements and document diagnostics into a report with issues. */\ndeclare function buildQaReport(parts: {\n video?: VideoQaStats;\n audio?: AudioQaStats;\n diagnostics?: readonly RenderDiagnostic[];\n options?: VideoQaOptions;\n}): VideoQaReport;\n/** A short human- and agent-readable summary of a report. */\ndeclare function formatQaReport(report: VideoQaReport): string;\n//#endregion\n//#region src/headless-webgpu-renderer.d.ts\ninterface WorkerInput {\n virtualMedia: VirtualMediaData;\n width: number;\n height: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n renderId: string;\n outputFormat: \"png\" | \"pixels\";\n workerIndex: number;\n}\ntype WorkerMessage = {\n type: \"frame\";\n renderId: string;\n frameIndex: number;\n pixels: Uint8Array;\n} | {\n type: \"png\";\n renderId: string;\n data: Uint8Array;\n} | {\n type: \"done\";\n renderId: string;\n} | {\n type: \"lut\";\n renderId: string;\n raw: {\n points: Array<[number, number, number]>;\n size: number;\n type: \"1D\" | \"3D\";\n };\n} | {\n type: \"error\";\n renderId?: string;\n error: string;\n};\ndeclare class RenderSemaphore {\n private _running;\n private readonly _max;\n private readonly _queue;\n constructor(max: number);\n acquire(timeoutMs?: number): Promise<void>;\n release(): void;\n get stats(): {\n active: number;\n queued: number;\n max: number;\n };\n}\ndeclare const renderSemaphore: RenderSemaphore;\ndeclare class HeadlessWebGPURenderer {\n private static isInitialized;\n private static initPromise;\n private static initFailureCount;\n private static readonly MAX_INIT_FAILURES;\n private static nextRetryAt;\n static initialize(): Promise<void>;\n renderImage(virtualMedia: VirtualMediaData, frame?: number, fps?: number, options?: {\n renderId?: string;\n /** \"rgba\" skips PNG encoding and returns width*height*4 raw pixels. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n */\n renderFrame(source: VirtualMediaData | {\n toVirtualMedia(): VirtualMediaData;\n }, options?: {\n atMs?: number;\n frame?: number;\n fps?: number;\n /** Reuse compiled state across calls; see `renderImage`. */\n renderId?: string;\n /** \"rgba\" returns raw width*height*4 pixels instead of a PNG. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Mixes the composition's full audio timeline (clips, effects, synthesized\n * tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n */\n renderAudio(virtualMedia: VirtualMediaData, options?: {\n fps?: number;\n sampleRate?: number;\n }): Promise<{\n channels: Float32Array[];\n sampleRate: number;\n }>;\n renderLut(virtualMedia: VirtualMediaData, frame?: number, fps?: number): Promise<Buffer>;\n private resolveMediaDuration;\n renderVideo(virtualMedia: VirtualMediaData, options?: {\n codec?: string;\n audioCodec?: string;\n quality?: string;\n concurrency?: number;\n /**\n * Depth of the DMA staging ring (default 2, clamped 2–8). A deeper\n * ring overlaps more encoder latency at the cost of VRAM\n * (~8.3MB/slot at 1080p RGBA). Also settable via\n * `FRAMEFIELDS_RING_CAPACITY`.\n */\n ringCapacity?: number;\n /**\n * Measure the output while it renders (black and frozen frames,\n * dropped frames, loudness, clipping, silence, document warnings)\n * and return the findings as `qa`. `true` uses default thresholds.\n */\n qa?: boolean | VideoQaOptions;\n }): Promise<{\n filePath: string;\n cleanup: () => Promise<void>;\n qa?: VideoQaReport;\n }>;\n}\ndeclare const HeadlessMediaRenderer: typeof HeadlessWebGPURenderer;\ntype HeadlessMediaRenderer = HeadlessWebGPURenderer;\n//#endregion\n//#region src/node-manifest.d.ts\n/**\n * The `framefields` block of a node package's `package.json`.\n *\n * This is the single declaration of a node's op: renderer discovery, the\n * effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n * read it from here. There is deliberately no fallback that derives an op from\n * the package name. See `spec/sync-node.md` §5.1.\n */\ndeclare const NODE_KINDS: readonly [\"effect\", \"audio\", \"source\", \"signal\", \"utility\"];\ntype NodeKind = (typeof NODE_KINDS)[number];\ninterface NodeRendererExports {\n development?: string;\n import?: string;\n default?: string;\n}\ninterface NodeManifest {\n /** Directory name under `nodes/`, e.g. `node-apply-lut`. */\n dir: string;\n /** Absolute path of the node package. */\n path: string;\n /** npm package name, e.g. `@framefields/node-lut`. */\n packageName: string;\n /** Canonical op literal used in the operation AST and the renderer registry. */\n type: string;\n kind: NodeKind;\n /** Legacy ops that resolve to the same renderer. */\n aliases: readonly string[];\n /** Named zod schema export of `src/shared/config.ts`. */\n schema?: string;\n /** Authoring class name. Defaults to `type`. */\n className?: string;\n /** Key on `Effect.*`. Defaults to `className` with a lower-cased first letter. */\n factory?: string;\n /** A hand-written subclass exists under `effects/custom/`. */\n custom: boolean;\n /** `false` when the package opts out of discovery. */\n enabled: boolean;\n rendererExports?: NodeRendererExports;\n}\ndeclare class NodeManifestError extends Error {\n readonly problems: readonly string[];\n constructor(problems: readonly string[]);\n}\n/**\n * Validates one parsed `package.json`. Returns the manifest, or the list of\n * problems that make it unusable. Never throws.\n */\ndeclare function parseNodeManifest(pkg: unknown, dir: string, nodePath?: string): {\n manifest?: NodeManifest;\n problems: string[];\n};\n/**\n * Reads every `nodes/node-*` package and returns its manifest, sorted by\n * directory name. Throws a single {@link NodeManifestError} listing every\n * problem: a missing or malformed block, or an op/alias claimed twice.\n */\ndeclare function loadNodeManifests(nodesDir: string): NodeManifest[];\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.d.ts\ninterface ZeroCopyWebCodecsPipelineOptions {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly videoSource: VideoSampleSource;\n readonly ringCapacity?: number;\n readonly colorSpace?: VideoColorSpaceConfig;\n readonly directCanvasSource?: unknown;\n /**\n * Called with each frame's RGBA pixels, in frame order, just before it is\n * encoded (staging-ring path only). The buffer is reused: read, don't keep.\n */\n readonly onFrame?: (rgba: Uint8Array, frameIndex: number) => void;\n}\ninterface WebCodecsPipelineStats {\n readonly totalFramesEnqueued: number;\n readonly totalFramesEncoded: number;\n readonly averageGpuSubmitTimeMs: number;\n readonly averageEncodeTimeMs: number;\n readonly averageCycleTimeMs: number;\n readonly maxCycleTimeMs: number;\n readonly minCycleTimeMs: number;\n readonly throughputFps: number;\n readonly ringCapacity: number;\n readonly isDirectZeroCopy: boolean;\n}\n/**\n * High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n *\n * Provides:\n * 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n * 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n * allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n */\ndeclare class ZeroCopyWebCodecsPipeline {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly ringCapacity: number;\n private readonly device;\n private readonly videoSource;\n private readonly stagingRing;\n private readonly colorSpace?;\n private readonly directCanvasSource?;\n private readonly onFrame?;\n private readonly inFlightFrames;\n private readonly cycleStartTimes;\n private totalFramesEnqueued;\n private totalFramesEncoded;\n private totalGpuSubmitTimeMs;\n private totalEncodeTimeMs;\n private totalCycleTimeMs;\n private maxCycleTimeMs;\n private minCycleTimeMs;\n private pipelineStartTime;\n constructor(device: GPUDevice, options: ZeroCopyWebCodecsPipelineOptions);\n /**\n * Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n */\n canDirectZeroCopy(): boolean;\n /**\n * Enqueues a rendered GPU texture frame into the pipeline.\n *\n * Uses double-buffered DMA staging: if the staging ring has reached capacity,\n * the oldest in-flight frame is asynchronously consumed and added to the video encoder\n * before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n */\n enqueueFrame(frameIndex: number, targetTexture: GPUTexture, encoder: GPUCommandEncoder): Promise<void>;\n /**\n * Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n * frame has been encoded and added to the video sample source.\n */\n drain(): Promise<void>;\n /**\n * Returns runtime throughput, latency, and pipeline statistics.\n */\n getStats(): WebCodecsPipelineStats;\n /**\n * Destroys the pipeline and releases all staging buffers.\n */\n destroy(): void;\n private consumeAndEncode;\n}\n//#endregion\nexport { AudioQaStats, DmaStagingRing, DmaStagingRingOptions, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeKind, NodeManifest, NodeManifestError, NodeRendererExports, QaIssue, QaSegment, StagingSlotInfo, StagingSlotStatus, VideoColorSpaceConfig, VideoQaOptions, VideoQaReport, VideoQaStats, WebCodecsPipelineStats, WorkerInput, WorkerMessage, ZeroCopyWebCodecsPipeline, ZeroCopyWebCodecsPipelineOptions, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;;;;;;;UAmHUqB,cAAAA;;;;;;;;;;;;;;;;;;UAkBAC,SAAAA;;;;UAIAC,OAAAA;;;;;;;;;UASAC,YAAAA;;;;;;;;mCAQyBF;oCACCA;;UAE1BG,YAAAA;;;;;;;;;;;;oCAY0BH;;UAE1BI,aAAAA;;;mBAGSF;mBACAC;4BACSF;;;;;iBA+BXS,cAAAA,SAAuBN;;;;cAuC1BU,eAAAA;;;;;+BAKiB3B;;;;;;;;cAQjB4B,iBAAiBD;cACjBE,sBAAAA;;;;;;uBAMS7B;4BACKJ;;;;MAItBI,QAAQ8B;;;;sBAIQlC;sBACAA;;;;;;;;;MAShBI,QAAQ8B;;;;;4BAKclC;;;MAGtBI;cACQoB;;;0BAGYxB,iDAAiDI,QAAQ8B;;4BAEvDlC;;;;;;;;;;;;;;;;;mBAiBTgB;MACbZ;;mBAEaA;SACViB;;;cAGKc,8BAA8BF;KACvCE,qBAAAA,GAAwBF;;;;;;;;;;;;;UC/TZ,gBAAA;;;ADsG2C;AA0BlDhB,UC3HO,gBAAA,CD2HE;EAITC;AAAO;AAkB4B;EAgBnCG,UAAAA,CAAAA,EAAAA,MAAa;EAGJF;;;EAEgB,QAAA,CAAA,EAAA,MAAA;EA+BlBQ;AA8BA;AAcqB;EASxBM,UAAAA,CAAAA,EAAAA,MAAAA;EAMS7B;;;EAKjBA,MAAAA,CAAAA,EAAAA,MAAAA,EAAAA;EAIgBJ;;;EAUhBI,OAAAA,CAAAA,EAAAA,MAAAA;EAKsBJ;;;EAOFA,KAAAA,CAAAA,EAAAA,MAAAA;EAAyDkC;;;EAmBhElB,MAAAA,CAAAA,EAAAA,MAAAA;EAGAZ;;;EAFN,OAAA,CAAA,EAAA,MAAA,EAAA;EAMC+B;AAAoD;;;;AC9TlE;AAKA;EA0HgB,OAAA,CAAA,EAAA,MAAA;EAsGA;AAiFhB;;;EAOa,SAAA,CAAA,EAAA,MAAA;EAAR;;AAWL;EACS,UAAA,CAAA,EAAA,MAAA;EACC;;;EACA,GAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAlNE;;;;;iBAMI,mBAAA,UACN;WAGI;;;;;;iBAkGE,iBAAA,mDAGN;;;;;;;;;;;KA8EE,mBAAA;oBACO;;;;;eAKN;MACR,QAAQ;;;;;;;;;;iBAWS,eAAA,SACb,+BACC,mBACP,QAAQ"}
1
+ {"version":3,"file":"index-CHQ39_Oe.d.mts","names":["VideoColorPrimaries","VideoFrame","VideoMatrixCoefficients","VideoTransferCharacteristics","RenderDiagnostic","VirtualMediaData","VideoSampleSource","preloadFonts","GPUDevice","Promise","StagingSlotStatus","VideoColorSpaceConfig","DmaStagingRingOptions","GPUTextureFormat","StagingSlotInfo","DmaStagingRing","GPUCommandEncoder","GPUTexture","Uint8Array","findNodesDir","discoverAndRegisterNodeRenderers","VideoQaOptions","QaSegment","QaIssue","VideoQaStats","AudioQaStats","VideoQaReport","FrameInspector","analyzeAudio","Float32Array","integratedLoudness","buildQaReport","formatQaReport","WorkerInput","WorkerMessage","Array","RenderSemaphore","renderSemaphore","HeadlessWebGPURenderer","Buffer","HeadlessMediaRenderer","NODE_KINDS","NodeKind","NodeRendererExports","NodeManifest","NodeManifestError","Error","parseNodeManifest","loadNodeManifests","ZeroCopyWebCodecsPipelineOptions","WebCodecsPipelineStats","ZeroCopyWebCodecsPipeline"],"sources":["../../renderer/dist/index.d.mts","../src/renderer/framegrid.ts"],"sourcesContent":["import { VideoColorPrimaries, VideoFrame, VideoMatrixCoefficients, VideoTransferCharacteristics } from \"@napi-rs/webcodecs\";\nimport { RenderDiagnostic, VirtualMediaData } from \"@framefields/core\";\nimport { VideoSampleSource } from \"mediabunny\";\n\n//#region src/asset-preloader.d.ts\n\n/**\n * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n * typography renders correctly on Node.js without loading its media. Shared\n * with the browser preview; emoji need a font set with\n * `FontManager.registerEmojiFont()`.\n */\ndeclare function preloadFonts(media: VirtualMediaData, device?: GPUDevice | null): Promise<void>;\n//#endregion\n//#region src/dma-staging-ring.d.ts\ntype StagingSlotStatus = \"idle\" | \"rendering\" | \"mapping\" | \"mapped\";\ninterface VideoColorSpaceConfig {\n readonly primaries?: VideoColorPrimaries;\n readonly transfer?: VideoTransferCharacteristics;\n readonly matrix?: VideoMatrixCoefficients;\n readonly fullRange?: boolean;\n}\ninterface DmaStagingRingOptions {\n readonly width: number;\n readonly height: number;\n readonly capacity?: number;\n readonly format?: GPUTextureFormat;\n}\ninterface StagingSlotInfo {\n readonly index: number;\n readonly status: StagingSlotStatus;\n readonly inFlightFrame: number | null;\n}\n/**\n * Pipelined Asynchronous DMA Staging Ring for WebGPU.\n *\n * Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n * GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n * Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n * is asynchronously mapped and consumed by the hardware video encoder.\n */\ndeclare class DmaStagingRing {\n readonly width: number;\n readonly height: number;\n readonly capacity: number;\n readonly bytesPerRow: number;\n readonly unpaddedBytesPerRow: number;\n readonly bufferSize: number;\n readonly format: GPUTextureFormat;\n readonly device: GPUDevice;\n private readonly slots;\n private isDestroyed;\n constructor(device: GPUDevice, options: DmaStagingRingOptions);\n /**\n * Prepares the staging buffer slot for writing by ensuring any prior mapping\n * from a previous cycle has been completed and unmapped.\n */\n prepareSlot(frameIndex: number): Promise<void>;\n /**\n * Records a GPU-to-buffer DMA copy command into the provided command encoder.\n */\n stageTexture(encoder: GPUCommandEncoder, texture: GPUTexture, frameIndex: number): void;\n /**\n * Initiates asynchronous DMA mapping on the slot for the specified frame.\n * Must be called immediately after submitting the command encoder to the device queue.\n */\n scheduleMap(frameIndex: number): Promise<void>;\n /**\n * Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n * The slot remains in the \"mapped\" state until releaseFrame() is called.\n */\n readFramePixels(frameIndex: number): Promise<Uint8Array>;\n /**\n * Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n * returning the slot to \"idle\" state so it can be reused immediately.\n */\n readAndReleaseFrame(frameIndex: number): Promise<Uint8Array>;\n /**\n * Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n * bypassing redundant intermediate JS allocations when row pitches align,\n * and immediately unmaps the buffer.\n */\n readFrameToVideoFrame(frameIndex: number, timestampUs: number, colorSpace?: VideoColorSpaceConfig, /** Sees the tightly packed RGBA pixels while they are mapped; must not keep them. */\n inspect?: (rgba: Uint8Array) => void): Promise<VideoFrame>;\n /**\n * Unmaps the staging buffer for the specified frame and marks the slot idle.\n */\n releaseFrame(frameIndex: number): void;\n /**\n * Returns current status info for each slot in the ring.\n */\n getSlotInfos(): readonly StagingSlotInfo[];\n /**\n * Destroys all staging buffers and releases resources.\n */\n destroy(): void;\n private checkDestroyed;\n}\n//#endregion\n//#region src/dynamic-node-discovery.d.ts\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\ndeclare function findNodesDir(startDir?: string): string | null;\n/**\n * Registers the built-in node renderers, then any extra nodes found in the\n * directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n * that directory overrides the built-in renderer for the same op.\n */\ndeclare function discoverAndRegisterNodeRenderers(): Promise<void>;\n//#endregion\n//#region src/video-qa.d.ts\n/**\n * Quality checks run on a video while it renders: frames are measured as\n * they are read back for the encoder and audio as it is mixed, so the report\n * describes exactly what was encoded without decoding the file again.\n */\ninterface VideoQaOptions {\n /** Luma (0-1) at or below which a pixel counts as black. Default 0.1. */\n readonly blackPixelThreshold?: number;\n /** Share of black pixels that makes a frame black. Default 0.98. */\n readonly blackFrameRatio?: number;\n /** Shortest run of black frames reported. Default 0.5 s. */\n readonly minBlackSec?: number;\n /** Shortest run of unchanging frames reported. Default 2 s. */\n readonly minFrozenSec?: number;\n /** Level (dBFS, 100 ms windows) below which audio counts as silent. Default -60. */\n readonly silenceDbfs?: number;\n /** Shortest silent stretch reported. Default 2 s. */\n readonly minSilenceSec?: number;\n /** Integrated loudness to hit, e.g. -14 for most streaming platforms. Unchecked when unset. */\n readonly targetLufs?: number;\n /** Allowed distance from `targetLufs`, in LU. Default 1. */\n readonly lufsTolerance?: number;\n}\ninterface QaSegment {\n readonly startSec: number;\n readonly endSec: number;\n}\ninterface QaIssue {\n readonly severity: \"error\" | \"warning\" | \"info\";\n /** Stable machine-readable kind, e.g. \"black_frames\", \"audio_clipping\" */\n readonly code: string;\n readonly message: string;\n readonly startSec?: number;\n readonly endSec?: number;\n readonly layerId?: string;\n}\ninterface VideoQaStats {\n readonly expectedFrames: number;\n readonly encodedFrames: number;\n readonly fps: number;\n readonly width: number;\n readonly height: number;\n /** Average luma over the whole video, 0-1 */\n readonly meanLuma: number;\n readonly blackSegments: readonly QaSegment[];\n readonly frozenSegments: readonly QaSegment[];\n}\ninterface AudioQaStats {\n readonly sampleRate: number;\n readonly channels: number;\n readonly durationSec: number;\n /** Highest sample, dBFS (sample peak, not true peak) */\n readonly peakDbfs: number;\n /** Mean level over the whole track, dBFS */\n readonly rmsDbfs: number;\n /** ITU-R BS.1770 integrated loudness; null when the track is silent */\n readonly integratedLufs: number | null;\n /** Samples at or beyond full scale */\n readonly clippedSamples: number;\n readonly silentSegments: readonly QaSegment[];\n}\ninterface VideoQaReport {\n /** No errors or warnings (info issues do not fail a render) */\n readonly passed: boolean;\n readonly video?: VideoQaStats;\n readonly audio?: AudioQaStats;\n readonly issues: readonly QaIssue[];\n}\n/** Measures frames handed to it in order, as RGBA bytes. */\ndeclare class FrameInspector {\n private readonly blackLuma;\n private readonly blackRatio;\n private readonly black;\n private readonly sameAsPrevious;\n private lumaSum;\n private previous;\n constructor(options?: VideoQaOptions);\n get frameCount(): number;\n inspect(rgba: Uint8Array, width: number, height: number): void;\n stats(expectedFrames: number, encodedFrames: number, fps: number, width: number, height: number, options?: VideoQaOptions): VideoQaStats;\n}\n/** Measures a mixed audio track (one Float32Array per channel). */\ndeclare function analyzeAudio(channels: readonly Float32Array[], sampleRate: number, options?: VideoQaOptions): AudioQaStats;\n/**\n * ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n * 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n * the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n */\ndeclare function integratedLoudness(channels: readonly Float32Array[], sampleRate: number): number | null;\n/** Turn measurements and document diagnostics into a report with issues. */\ndeclare function buildQaReport(parts: {\n video?: VideoQaStats;\n audio?: AudioQaStats;\n diagnostics?: readonly RenderDiagnostic[];\n options?: VideoQaOptions;\n}): VideoQaReport;\n/** A short human- and agent-readable summary of a report. */\ndeclare function formatQaReport(report: VideoQaReport): string;\n//#endregion\n//#region src/headless-webgpu-renderer.d.ts\ninterface WorkerInput {\n virtualMedia: VirtualMediaData;\n width: number;\n height: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n renderId: string;\n outputFormat: \"png\" | \"pixels\";\n workerIndex: number;\n}\ntype WorkerMessage = {\n type: \"frame\";\n renderId: string;\n frameIndex: number;\n pixels: Uint8Array;\n} | {\n type: \"png\";\n renderId: string;\n data: Uint8Array;\n} | {\n type: \"done\";\n renderId: string;\n} | {\n type: \"lut\";\n renderId: string;\n raw: {\n points: Array<[number, number, number]>;\n size: number;\n type: \"1D\" | \"3D\";\n };\n} | {\n type: \"error\";\n renderId?: string;\n error: string;\n};\ndeclare class RenderSemaphore {\n private _running;\n private readonly _max;\n private readonly _queue;\n constructor(max: number);\n acquire(timeoutMs?: number): Promise<void>;\n release(): void;\n get stats(): {\n active: number;\n queued: number;\n max: number;\n };\n}\ndeclare const renderSemaphore: RenderSemaphore;\ndeclare class HeadlessWebGPURenderer {\n private static isInitialized;\n private static initPromise;\n private static initFailureCount;\n private static readonly MAX_INIT_FAILURES;\n private static nextRetryAt;\n static initialize(): Promise<void>;\n renderImage(virtualMedia: VirtualMediaData, frame?: number, fps?: number, options?: {\n renderId?: string;\n /** \"rgba\" skips PNG encoding and returns width*height*4 raw pixels. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n */\n renderFrame(source: VirtualMediaData | {\n toVirtualMedia(): VirtualMediaData;\n }, options?: {\n atMs?: number;\n frame?: number;\n fps?: number;\n /** Reuse compiled state across calls; see `renderImage`. */\n renderId?: string;\n /** \"rgba\" returns raw width*height*4 pixels instead of a PNG. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Mixes the composition's full audio timeline (clips, effects, synthesized\n * tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n */\n renderAudio(virtualMedia: VirtualMediaData, options?: {\n fps?: number;\n sampleRate?: number;\n }): Promise<{\n channels: Float32Array[];\n sampleRate: number;\n }>;\n renderLut(virtualMedia: VirtualMediaData, frame?: number, fps?: number): Promise<Buffer>;\n private resolveMediaDuration;\n renderVideo(virtualMedia: VirtualMediaData, options?: {\n codec?: string;\n audioCodec?: string;\n quality?: string;\n concurrency?: number;\n /**\n * Depth of the DMA staging ring (default 2, clamped 2–8). A deeper\n * ring overlaps more encoder latency at the cost of VRAM\n * (~8.3MB/slot at 1080p RGBA). Also settable via\n * `FRAMEFIELDS_RING_CAPACITY`.\n */\n ringCapacity?: number;\n /**\n * Measure the output while it renders (black and frozen frames,\n * dropped frames, loudness, clipping, silence, document warnings)\n * and return the findings as `qa`. `true` uses default thresholds.\n */\n qa?: boolean | VideoQaOptions;\n }): Promise<{\n filePath: string;\n cleanup: () => Promise<void>;\n qa?: VideoQaReport;\n }>;\n}\ndeclare const HeadlessMediaRenderer: typeof HeadlessWebGPURenderer;\ntype HeadlessMediaRenderer = HeadlessWebGPURenderer;\n//#endregion\n//#region src/node-manifest.d.ts\n/**\n * The `framefields` block of a node package's `package.json`.\n *\n * This is the single declaration of a node's op: renderer discovery, the\n * effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n * read it from here. There is deliberately no fallback that derives an op from\n * the package name. See `spec/sync-node.md` §5.1.\n */\ndeclare const NODE_KINDS: readonly [\"effect\", \"audio\", \"source\", \"signal\", \"utility\"];\ntype NodeKind = (typeof NODE_KINDS)[number];\ninterface NodeRendererExports {\n development?: string;\n import?: string;\n default?: string;\n}\ninterface NodeManifest {\n /** Directory name under `nodes/`, e.g. `node-apply-lut`. */\n dir: string;\n /** Absolute path of the node package. */\n path: string;\n /** npm package name, e.g. `@framefields/node-lut`. */\n packageName: string;\n /** Canonical op literal used in the operation AST and the renderer registry. */\n type: string;\n kind: NodeKind;\n /** Legacy ops that resolve to the same renderer. */\n aliases: readonly string[];\n /** Named zod schema export of `src/shared/config.ts`. */\n schema?: string;\n /** Authoring class name. Defaults to `type`. */\n className?: string;\n /** Key on `Effect.*`. Defaults to `className` with a lower-cased first letter. */\n factory?: string;\n /** A hand-written subclass exists under `effects/custom/`. */\n custom: boolean;\n /** `false` when the package opts out of discovery. */\n enabled: boolean;\n rendererExports?: NodeRendererExports;\n}\ndeclare class NodeManifestError extends Error {\n readonly problems: readonly string[];\n constructor(problems: readonly string[]);\n}\n/**\n * Validates one parsed `package.json`. Returns the manifest, or the list of\n * problems that make it unusable. Never throws.\n */\ndeclare function parseNodeManifest(pkg: unknown, dir: string, nodePath?: string): {\n manifest?: NodeManifest;\n problems: string[];\n};\n/**\n * Reads every `nodes/node-*` package and returns its manifest, sorted by\n * directory name. Throws a single {@link NodeManifestError} listing every\n * problem: a missing or malformed block, or an op/alias claimed twice.\n */\ndeclare function loadNodeManifests(nodesDir: string): NodeManifest[];\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.d.ts\ninterface ZeroCopyWebCodecsPipelineOptions {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly videoSource: VideoSampleSource;\n readonly ringCapacity?: number;\n readonly colorSpace?: VideoColorSpaceConfig;\n readonly directCanvasSource?: unknown;\n /**\n * Called with each frame's RGBA pixels, in frame order, just before it is\n * encoded (staging-ring path only). The buffer is reused: read, don't keep.\n */\n readonly onFrame?: (rgba: Uint8Array, frameIndex: number) => void;\n}\ninterface WebCodecsPipelineStats {\n readonly totalFramesEnqueued: number;\n readonly totalFramesEncoded: number;\n readonly averageGpuSubmitTimeMs: number;\n readonly averageEncodeTimeMs: number;\n readonly averageCycleTimeMs: number;\n readonly maxCycleTimeMs: number;\n readonly minCycleTimeMs: number;\n readonly throughputFps: number;\n readonly ringCapacity: number;\n readonly isDirectZeroCopy: boolean;\n}\n/**\n * High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n *\n * Provides:\n * 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n * 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n * allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n */\ndeclare class ZeroCopyWebCodecsPipeline {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly ringCapacity: number;\n private readonly device;\n private readonly videoSource;\n private readonly stagingRing;\n private readonly colorSpace?;\n private readonly directCanvasSource?;\n private readonly onFrame?;\n private readonly inFlightFrames;\n private readonly cycleStartTimes;\n private totalFramesEnqueued;\n private totalFramesEncoded;\n private totalGpuSubmitTimeMs;\n private totalEncodeTimeMs;\n private totalCycleTimeMs;\n private maxCycleTimeMs;\n private minCycleTimeMs;\n private pipelineStartTime;\n constructor(device: GPUDevice, options: ZeroCopyWebCodecsPipelineOptions);\n /**\n * Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n */\n canDirectZeroCopy(): boolean;\n /**\n * Enqueues a rendered GPU texture frame into the pipeline.\n *\n * Uses double-buffered DMA staging: if the staging ring has reached capacity,\n * the oldest in-flight frame is asynchronously consumed and added to the video encoder\n * before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n */\n enqueueFrame(frameIndex: number, targetTexture: GPUTexture, encoder: GPUCommandEncoder): Promise<void>;\n /**\n * Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n * frame has been encoded and added to the video sample source.\n */\n drain(): Promise<void>;\n /**\n * Returns runtime throughput, latency, and pipeline statistics.\n */\n getStats(): WebCodecsPipelineStats;\n /**\n * Destroys the pipeline and releases all staging buffers.\n */\n destroy(): void;\n private consumeAndEncode;\n}\n//#endregion\nexport { AudioQaStats, DmaStagingRing, DmaStagingRingOptions, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeKind, NodeManifest, NodeManifestError, NodeRendererExports, QaIssue, QaSegment, StagingSlotInfo, StagingSlotStatus, VideoColorSpaceConfig, VideoQaOptions, VideoQaReport, VideoQaStats, WebCodecsPipelineStats, WorkerInput, WorkerMessage, ZeroCopyWebCodecsPipeline, ZeroCopyWebCodecsPipelineOptions, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;;;;;;;UAmHUqB,cAAAA;;;;;;;;;;;;;;;;;;UAkBAC,SAAAA;;;;UAIAC,OAAAA;;;;;;;;;UASAC,YAAAA;;;;;;;;mCAQyBF;oCACCA;;UAE1BG,YAAAA;;;;;;;;;;;;oCAY0BH;;UAE1BI,aAAAA;;;mBAGSF;mBACAC;4BACSF;;;;;iBA+BXS,cAAAA,SAAuBN;;;;cAuC1BU,eAAAA;;;;;+BAKiB3B;;;;;;;;cAQjB4B,iBAAiBD;cACjBE,sBAAAA;;;;;;uBAMS7B;4BACKJ;;;;MAItBI,QAAQ8B;;;;sBAIQlC;sBACAA;;;;;;;;;MAShBI,QAAQ8B;;;;;4BAKclC;;;MAGtBI;cACQoB;;;0BAGYxB,iDAAiDI,QAAQ8B;;4BAEvDlC;;;;;;;;;;;;;;;;;mBAiBTgB;MACbZ;;mBAEaA;SACViB;;;cAGKc,8BAA8BF;KACvCE,qBAAAA,GAAwBF;;;;;;;;;;;;;UC/TZ,gBAAA;;;ADsG2C;AA0BlDhB,UC3HO,gBAAA,CD2HE;EAITC;AAAO;AAkB4B;EAgBnCG,UAAAA,CAAAA,EAAAA,MAAa;EAGJF;;;EAEgB,QAAA,CAAA,EAAA,MAAA;EA+BlBQ;AA8BA;AAcqB;EASxBM,UAAAA,CAAAA,EAAAA,MAAAA;EAMS7B;;;EAKjBA,MAAAA,CAAAA,EAAAA,MAAAA,EAAAA;EAIgBJ;;;EAUhBI,OAAAA,CAAAA,EAAAA,MAAAA;EAKsBJ;;;EAOFA,KAAAA,CAAAA,EAAAA,MAAAA;EAAyDkC;;;EAmBhElB,MAAAA,CAAAA,EAAAA,MAAAA;EAGAZ;;;EAFN,OAAA,CAAA,EAAA,MAAA,EAAA;EAMC+B;AAAoD;;;;AC9TlE;AAKA;EA0HgB,OAAA,CAAA,EAAA,MAAA;EAsGA;AAiFhB;;;EAOa,SAAA,CAAA,EAAA,MAAA;EAAR;;AAWL;EACS,UAAA,CAAA,EAAA,MAAA;EACC;;;EACA,GAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAlNE;;;;;iBAMI,mBAAA,UACN;WAGI;;;;;;iBAkGE,iBAAA,mDAGN;;;;;;;;;;;KA8EE,mBAAA;oBACO;;;;;eAKN;MACR,QAAQ;;;;;;;;;;iBAWS,eAAA,SACb,+BACC,mBACP,QAAQ"}