framefields 2.6.1 → 2.7.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 (471) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-CYrO9q9P.mjs → audio-j3ttoRDX.mjs} +4 -4
  4. package/dist/{audio-CYrO9q9P.mjs.map → audio-j3ttoRDX.mjs.map} +1 -1
  5. package/dist/{audio-B5mdR8vv.d.mts → audio-tL8CcPra.d.mts} +3 -3
  6. package/dist/{audio-B5mdR8vv.d.mts.map → audio-tL8CcPra.d.mts.map} +1 -1
  7. package/dist/components/index.d.mts +10 -10
  8. package/dist/components/index.mjs +44 -44
  9. package/dist/{dist-cC6nOaMR.mjs → dist-BHTd-EC1.mjs} +164 -34
  10. package/dist/dist-BHTd-EC1.mjs.map +1 -0
  11. package/dist/{dist-DSKhnhDk.mjs → dist-BM0ilHvQ.mjs} +115 -21
  12. package/dist/dist-BM0ilHvQ.mjs.map +1 -0
  13. package/dist/{dist-D021IFfp.mjs → dist-BRXsfWKQ.mjs} +444 -8
  14. package/dist/dist-BRXsfWKQ.mjs.map +1 -0
  15. package/dist/{dist-BPOi5xb_.mjs → dist-CPtFZxtu.mjs} +2 -2
  16. package/dist/{dist-BPOi5xb_.mjs.map → dist-CPtFZxtu.mjs.map} +1 -1
  17. package/dist/effects/index.d.mts +4 -4
  18. package/dist/effects/index.mjs +35 -35
  19. package/dist/{effects-Dvdwndk0.mjs → effects-Dy661XS_.mjs} +3 -3
  20. package/dist/{effects-Dvdwndk0.mjs.map → effects-Dy661XS_.mjs.map} +1 -1
  21. package/dist/fonts/index.mjs +2 -2
  22. package/dist/{fonts-B6a4CyoM.mjs → fonts-BcFhAqqO.mjs} +2 -2
  23. package/dist/{fonts-B6a4CyoM.mjs.map → fonts-BcFhAqqO.mjs.map} +1 -1
  24. package/dist/{gpu-CrQADlcf.mjs → gpu-zIhSz_0X.mjs} +2 -2
  25. package/dist/{gpu-CrQADlcf.mjs.map → gpu-zIhSz_0X.mjs.map} +1 -1
  26. package/dist/{index-ocZc12ZS.d.mts → index-B1ENegOQ.d.mts} +224 -2
  27. package/dist/index-B1ENegOQ.d.mts.map +1 -0
  28. package/dist/{index-D-Gnyffj.d.mts → index-CJRTBLZ4.d.mts} +4 -4
  29. package/dist/{index-D-Gnyffj.d.mts.map → index-CJRTBLZ4.d.mts.map} +1 -1
  30. package/dist/{index-BhzlG_1Q.d.mts → index-Cg30slle.d.mts} +2 -2
  31. package/dist/{index-BhzlG_1Q.d.mts.map → index-Cg30slle.d.mts.map} +1 -1
  32. package/dist/{index-B4o6F1JC.d.mts → index-DeeMmoEA.d.mts} +2 -2
  33. package/dist/{index-B4o6F1JC.d.mts.map → index-DeeMmoEA.d.mts.map} +1 -1
  34. package/dist/{index-CWG19cm-.d.mts → index-ePGQ_C7f.d.mts} +39 -16
  35. package/dist/index-ePGQ_C7f.d.mts.map +1 -0
  36. package/dist/{index-o8LxWdwz.d.mts → index-l1yRugLc.d.mts} +3 -3
  37. package/dist/{index-o8LxWdwz.d.mts.map → index-l1yRugLc.d.mts.map} +1 -1
  38. package/dist/{index-3Vdef2KE.d.mts → index-uDZ9Yuv-.d.mts} +5 -8
  39. package/dist/index-uDZ9Yuv-.d.mts.map +1 -0
  40. package/dist/index.d.mts +11 -11
  41. package/dist/index.mjs +53 -53
  42. package/dist/preview/index.d.mts +3 -3
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-OTsGYyOU.mjs → preview-IpdVFuxv.mjs} +3 -2
  45. package/dist/{preview-OTsGYyOU.mjs.map → preview-IpdVFuxv.mjs.map} +1 -1
  46. package/dist/preview-engine/audio.mjs +1 -1
  47. package/dist/preview-engine/{chunk-RF62TV3G.mjs → chunk-25WRUINA.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-MMVFX42U.mjs → chunk-2AEWPT6Y.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-IIOHF7MH.mjs → chunk-2MDTUA3W.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-KWTTANYN.mjs → chunk-2TLABBER.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-MUOJMF7M.mjs → chunk-3QOJVABU.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-RDEQ4LQU.mjs → chunk-4Q3ZUTQC.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-OXXRKNHW.mjs → chunk-5BXCJ2QX.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-JTT3YX7W.mjs → chunk-5R4UF7YK.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-4C26NVQY.mjs → chunk-6THE6J3A.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-SVE3XWO7.mjs → chunk-6VDYWMP5.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-ULPLHKM2.mjs → chunk-7B7QQDPZ.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-ULVX4VYT.mjs → chunk-7ZA36EZE.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-LYSU6S4O.mjs → chunk-AJ6BVUDB.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-J24VHZS6.mjs → chunk-BDXGUSSF.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-B7J72YSP.mjs → chunk-CC5V7UBF.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-JD4TBC6Z.mjs → chunk-CP42LYD7.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-LN3YAWUD.mjs → chunk-DJWDD3OE.mjs} +1 -1
  64. package/dist/preview-engine/{chunk-V3FODTPI.mjs → chunk-DZEWY4PR.mjs} +22 -22
  65. package/dist/preview-engine/{chunk-RKNV5N7D.mjs → chunk-ENGQ55LR.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-AGLAJGQJ.mjs → chunk-FBXKVLTB.mjs} +14 -14
  67. package/dist/preview-engine/{chunk-MJCK5FLZ.mjs → chunk-FMEXTHL7.mjs} +1 -1
  68. package/dist/preview-engine/{chunk-UEQIO6AH.mjs → chunk-FQ7UCMWR.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-TPFDAOW7.mjs → chunk-FRIBHQTM.mjs} +1 -1
  70. package/dist/preview-engine/chunk-FT7HJ6IE.mjs +3 -0
  71. package/dist/preview-engine/{chunk-YEPYVASB.mjs → chunk-G3UOUGIE.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-4JX5LBE2.mjs → chunk-H4GDIVX4.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-LHCEQ77S.mjs → chunk-HU73APZL.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-DDFWN7DI.mjs → chunk-I7QIQURU.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-3KHD67Q3.mjs → chunk-ID344UBN.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-5NT7WWJR.mjs → chunk-IGCXUGHT.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-QPBTLJ5W.mjs → chunk-IK3YA6MC.mjs} +1 -1
  78. package/dist/preview-engine/chunk-J5SKQFJ6.mjs +1 -0
  79. package/dist/preview-engine/{chunk-Q7JN4EHX.mjs → chunk-JOPZNSZJ.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-SQ52PBF3.mjs → chunk-JOSNIMFT.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-SXNCNG4L.mjs → chunk-JR443L5E.mjs} +1 -1
  82. package/dist/preview-engine/{chunk-FZLKPBKS.mjs → chunk-KCAFMWDM.mjs} +1 -1
  83. package/dist/preview-engine/{chunk-QRYCB6E3.mjs → chunk-LAEPNVOE.mjs} +1 -1
  84. package/dist/preview-engine/chunk-MAALUQK3.mjs +1974 -0
  85. package/dist/preview-engine/chunk-MHCXSWK7.mjs +1 -0
  86. package/dist/preview-engine/{chunk-4INGTMZ5.mjs → chunk-MWBARRK2.mjs} +1 -1
  87. package/dist/preview-engine/chunk-MXK2PP6K.mjs +1 -0
  88. package/dist/preview-engine/{chunk-GQIRV466.mjs → chunk-MXPN2GB7.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-W2EZFV4Q.mjs → chunk-NHYB5YC3.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-K3IMPV6T.mjs → chunk-PXSKIGAP.mjs} +6 -6
  91. package/dist/preview-engine/{chunk-SP22JWN2.mjs → chunk-PYM2FBFA.mjs} +1 -1
  92. package/dist/preview-engine/chunk-QDTJ4MOJ.mjs +1 -0
  93. package/dist/preview-engine/{chunk-6PMATELR.mjs → chunk-RQU2GFGH.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-UQD2UE6I.mjs → chunk-RWDPBES3.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-QVW5METG.mjs → chunk-S5ONWSZF.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-2YGR5YCN.mjs → chunk-SIU6JU2R.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-NQZRPPUU.mjs → chunk-SJ3Q4AQP.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-Q6CRERSJ.mjs → chunk-T36SKUWK.mjs} +9 -9
  99. package/dist/preview-engine/chunk-TEBZRQPG.mjs +1 -0
  100. package/dist/preview-engine/{chunk-WDWHOXSA.mjs → chunk-UUDML2SN.mjs} +1 -1
  101. package/dist/preview-engine/{chunk-RHXZXWJ4.mjs → chunk-VAS4IJZR.mjs} +1 -1
  102. package/dist/preview-engine/{chunk-DOCFOSA6.mjs → chunk-WTDK6H46.mjs} +1 -1
  103. package/dist/preview-engine/chunk-XNMEVVQB.mjs +1 -0
  104. package/dist/preview-engine/{chunk-AKT4YQWL.mjs → chunk-YVGT4NK6.mjs} +2 -2
  105. package/dist/preview-engine/{chunk-ZGMA27IG.mjs → chunk-ZR4QFIJR.mjs} +1 -1
  106. package/dist/preview-engine/chunk-ZYTXBBIX.mjs +1 -0
  107. package/dist/preview-engine/components.mjs +1 -1
  108. package/dist/preview-engine/effects.mjs +1 -1
  109. package/dist/preview-engine/fonts.mjs +1 -1
  110. package/dist/preview-engine/framefields.mjs +1 -1
  111. package/dist/preview-engine/player.mjs +2 -2
  112. package/dist/preview-engine/{renderers-FC7G7KU7.mjs → renderers-2AKYMAIK.mjs} +1 -1
  113. package/dist/preview-engine/renderers-363CKEIG.mjs +1 -0
  114. package/dist/preview-engine/{renderers-EJGF3PYQ.mjs → renderers-36L24ZVS.mjs} +1 -1
  115. package/dist/preview-engine/renderers-3FMMVDMA.mjs +1 -0
  116. package/dist/preview-engine/{renderers-56TGEFDK.mjs → renderers-44AANAXR.mjs} +1 -1
  117. package/dist/preview-engine/renderers-4UUU62VV.mjs +1 -0
  118. package/dist/preview-engine/renderers-4ZTZFSAR.mjs +1 -0
  119. package/dist/preview-engine/{renderers-PYDOSDEY.mjs → renderers-5ZSB75GY.mjs} +1 -1
  120. package/dist/preview-engine/renderers-6KDD75BM.mjs +1 -0
  121. package/dist/preview-engine/renderers-7BJRD4G2.mjs +1 -0
  122. package/dist/preview-engine/{renderers-HBIBRZD7.mjs → renderers-AIIHGDJM.mjs} +1 -1
  123. package/dist/preview-engine/{renderers-P2FTCDZ7.mjs → renderers-AU746ORP.mjs} +1 -1
  124. package/dist/preview-engine/renderers-BIF2BETK.mjs +1 -0
  125. package/dist/preview-engine/{renderers-FD3ZT73R.mjs → renderers-BTQCHVHV.mjs} +1 -1
  126. package/dist/preview-engine/{renderers-HMNCIEU3.mjs → renderers-CFHBOAZG.mjs} +1 -1
  127. package/dist/preview-engine/renderers-CU5RW5UA.mjs +1 -0
  128. package/dist/preview-engine/renderers-DK5OBTKE.mjs +1 -0
  129. package/dist/preview-engine/renderers-EAKCDGTY.mjs +1 -0
  130. package/dist/preview-engine/{renderers-FYI6QNUH.mjs → renderers-EGBGC7MU.mjs} +1 -1
  131. package/dist/preview-engine/renderers-EVXCU7G7.mjs +1 -0
  132. package/dist/preview-engine/renderers-EXEYEH3F.mjs +1 -0
  133. package/dist/preview-engine/{renderers-RDHHVXRE.mjs → renderers-EXJDPS3T.mjs} +1 -1
  134. package/dist/preview-engine/renderers-F3WALPWI.mjs +1 -0
  135. package/dist/preview-engine/{renderers-4RVSLTCX.mjs → renderers-FS3EOB4J.mjs} +1 -1
  136. package/dist/preview-engine/{renderers-C3YXNKNM.mjs → renderers-GUL2MXDD.mjs} +1 -1
  137. package/dist/preview-engine/{renderers-EQDINUMT.mjs → renderers-H4HC44B5.mjs} +1 -1
  138. package/dist/preview-engine/renderers-H6565HO4.mjs +1 -0
  139. package/dist/preview-engine/renderers-HT5V6OZ2.mjs +1 -0
  140. package/dist/preview-engine/renderers-HXMOARWO.mjs +1 -0
  141. package/dist/preview-engine/renderers-HZ2Q7BGK.mjs +1 -0
  142. package/dist/preview-engine/renderers-I4N2K2KW.mjs +1 -0
  143. package/dist/preview-engine/renderers-I5J7U6CB.mjs +1 -0
  144. package/dist/preview-engine/renderers-IZV6QXR5.mjs +1 -0
  145. package/dist/preview-engine/renderers-JWGAPHWX.mjs +1 -0
  146. package/dist/preview-engine/renderers-KNDSVQTY.mjs +1 -0
  147. package/dist/preview-engine/renderers-KNDUOO6M.mjs +1 -0
  148. package/dist/preview-engine/renderers-KQAO3QEI.mjs +1 -0
  149. package/dist/preview-engine/{renderers-7SW2AHM2.mjs → renderers-LCSQLXRD.mjs} +1 -1
  150. package/dist/preview-engine/renderers-M34LOEHC.mjs +1 -0
  151. package/dist/preview-engine/renderers-ML6GNCWB.mjs +1 -0
  152. package/dist/preview-engine/renderers-NARG274F.mjs +1 -0
  153. package/dist/preview-engine/renderers-NCFPOSWR.mjs +1 -0
  154. package/dist/preview-engine/{renderers-ZAMSS7QN.mjs → renderers-PCOTECQB.mjs} +1 -1
  155. package/dist/preview-engine/renderers-PG5JHI2S.mjs +1 -0
  156. package/dist/preview-engine/{renderers-LTV5RFDJ.mjs → renderers-Q7MNLQJF.mjs} +1 -1
  157. package/dist/preview-engine/{renderers-GHP7SL5M.mjs → renderers-QXVSJYZL.mjs} +1 -1
  158. package/dist/preview-engine/{renderers-H2UI7YEO.mjs → renderers-R3ERZ3ZY.mjs} +1 -1
  159. package/dist/preview-engine/renderers-RXQKV65L.mjs +1 -0
  160. package/dist/preview-engine/renderers-SA73GD2B.mjs +1 -0
  161. package/dist/preview-engine/renderers-SLIXUHNX.mjs +1 -0
  162. package/dist/preview-engine/renderers-T462JZNA.mjs +1 -0
  163. package/dist/preview-engine/{renderers-LV6LLULR.mjs → renderers-TH2XZAYW.mjs} +1 -1
  164. package/dist/preview-engine/{renderers-ART3EGSZ.mjs → renderers-UHZIERVH.mjs} +1 -1
  165. package/dist/preview-engine/renderers-V7CFVGYK.mjs +1 -0
  166. package/dist/preview-engine/renderers-VY5E7BPK.mjs +1 -0
  167. package/dist/preview-engine/{renderers-ZDMDDWLN.mjs → renderers-WKXGELRG.mjs} +1 -1
  168. package/dist/preview-engine/{renderers-GY4R467B.mjs → renderers-WLDIIFR5.mjs} +1 -1
  169. package/dist/preview-engine/{renderers-NTKSN32T.mjs → renderers-WM6WBRH6.mjs} +1 -1
  170. package/dist/preview-engine/renderers-WT5FQZM7.mjs +228 -0
  171. package/dist/preview-engine/{renderers-YK74777T.mjs → renderers-WTKRLNNR.mjs} +1 -1
  172. package/dist/preview-engine/{renderers-BWRNCXR6.mjs → renderers-X6GKEVP7.mjs} +1 -1
  173. package/dist/preview-engine/renderers-Y47N5EYR.mjs +1 -0
  174. package/dist/preview-engine/renderers-Y4CUVZYI.mjs +1 -0
  175. package/dist/preview-engine/renderers-Y6YC7ZAK.mjs +1 -0
  176. package/dist/preview-engine/renderers-Y6ZYUAQG.mjs +1 -0
  177. package/dist/preview-engine/{renderers-YBTWN76S.mjs → renderers-YRWXYT5A.mjs} +1 -1
  178. package/dist/preview-engine/{renderers-SY435YU3.mjs → renderers-YWC4MXPG.mjs} +1 -1
  179. package/dist/preview-engine/{renderers-7GMW52G3.mjs → renderers-ZWNPYZN6.mjs} +1 -1
  180. package/dist/preview-engine/signals.mjs +1 -1
  181. package/dist/{program-W4CWO2bp.mjs → program-KPBfq9tw.mjs} +95 -21
  182. package/dist/program-KPBfq9tw.mjs.map +1 -0
  183. package/dist/registry/index.json +1 -1
  184. package/dist/registry/lower-third.json +1 -1
  185. package/dist/registry/terminal.json +1 -1
  186. package/dist/registry/text-reveal.json +2 -2
  187. package/dist/registry/title-card.json +1 -1
  188. package/dist/renderer/index.d.mts +2 -2
  189. package/dist/renderer/index.mjs +2 -2
  190. package/dist/{renderer-CX4rvqm9.mjs → renderer-1-FLx8kd.mjs} +3 -3
  191. package/dist/{renderer-CX4rvqm9.mjs.map → renderer-1-FLx8kd.mjs.map} +1 -1
  192. package/dist/{renderer-BIMm7lYG.mjs → renderer-47d3etrX.mjs} +4 -4
  193. package/dist/{renderer-BIMm7lYG.mjs.map → renderer-47d3etrX.mjs.map} +1 -1
  194. package/dist/{renderer-CPtyQrJI.mjs → renderer-6GCG6JxD.mjs} +3 -3
  195. package/dist/{renderer-CPtyQrJI.mjs.map → renderer-6GCG6JxD.mjs.map} +1 -1
  196. package/dist/{renderer-BE6K88VR.mjs → renderer-8BIDdgjt.mjs} +3 -3
  197. package/dist/{renderer-BE6K88VR.mjs.map → renderer-8BIDdgjt.mjs.map} +1 -1
  198. package/dist/renderer-B-5TlncB.mjs +5 -0
  199. package/dist/{renderer-FgP_1OgD.mjs → renderer-B1yzSbvC.mjs} +4 -4
  200. package/dist/{renderer-FgP_1OgD.mjs.map → renderer-B1yzSbvC.mjs.map} +1 -1
  201. package/dist/{renderer-158rymL0.mjs → renderer-B2YiXpp-.mjs} +2 -2
  202. package/dist/{renderer-158rymL0.mjs.map → renderer-B2YiXpp-.mjs.map} +1 -1
  203. package/dist/{renderer-eQP0fvgc.mjs → renderer-B55ljMI_.mjs} +2 -2
  204. package/dist/{renderer-eQP0fvgc.mjs.map → renderer-B55ljMI_.mjs.map} +1 -1
  205. package/dist/{renderer-Duorbrb8.mjs → renderer-B6Tg4UgH.mjs} +4 -4
  206. package/dist/{renderer-Duorbrb8.mjs.map → renderer-B6Tg4UgH.mjs.map} +1 -1
  207. package/dist/{renderer-DmrP4dsn.mjs → renderer-BFnf-8Yt.mjs} +3 -3
  208. package/dist/{renderer-DmrP4dsn.mjs.map → renderer-BFnf-8Yt.mjs.map} +1 -1
  209. package/dist/{renderer-CLP6Lm7y.mjs → renderer-BGHHoPiD.mjs} +2 -2
  210. package/dist/{renderer-BO5u8eFS.mjs → renderer-BHUjPi24.mjs} +2 -2
  211. package/dist/{renderer-BO5u8eFS.mjs.map → renderer-BHUjPi24.mjs.map} +1 -1
  212. package/dist/renderer-BHXtDg5_.mjs +3 -0
  213. package/dist/{renderer-HPBahXjt.mjs → renderer-BIk67-jU.mjs} +2 -2
  214. package/dist/{renderer-HPBahXjt.mjs.map → renderer-BIk67-jU.mjs.map} +1 -1
  215. package/dist/{renderer-C-dcd14F.d.mts → renderer-BLEmr0Lt.d.mts} +2 -2
  216. package/dist/{renderer-C-dcd14F.d.mts.map → renderer-BLEmr0Lt.d.mts.map} +1 -1
  217. package/dist/{renderer-tYmQUp4d.mjs → renderer-BLs5sDdk.mjs} +3 -3
  218. package/dist/{renderer-tYmQUp4d.mjs.map → renderer-BLs5sDdk.mjs.map} +1 -1
  219. package/dist/renderer-BPd3gvEt.mjs +5 -0
  220. package/dist/{renderer-BiH29MS6.mjs → renderer-BXul0Wy6.mjs} +3 -3
  221. package/dist/{renderer-BiH29MS6.mjs.map → renderer-BXul0Wy6.mjs.map} +1 -1
  222. package/dist/{renderer-DVdRzDwX.mjs → renderer-B_1SLBPa.mjs} +3 -3
  223. package/dist/{renderer-DVdRzDwX.mjs.map → renderer-B_1SLBPa.mjs.map} +1 -1
  224. package/dist/renderer-B_ep98BH.mjs +5 -0
  225. package/dist/renderer-Ba_KUbKW.mjs +5 -0
  226. package/dist/{renderer-dX7Fy1NR.mjs → renderer-BbyNUjE_.mjs} +3 -3
  227. package/dist/{renderer-dX7Fy1NR.mjs.map → renderer-BbyNUjE_.mjs.map} +1 -1
  228. package/dist/{renderer-0n4A8P2_.mjs → renderer-BcVr_cIk.mjs} +2 -2
  229. package/dist/{renderer-0n4A8P2_.mjs.map → renderer-BcVr_cIk.mjs.map} +1 -1
  230. package/dist/renderer-BeL2hstU.mjs +5 -0
  231. package/dist/renderer-Bj81osPQ.mjs +5 -0
  232. package/dist/{renderer-ZM2jwJbX.mjs → renderer-BjL7sKGU.mjs} +3 -3
  233. package/dist/{renderer-ZM2jwJbX.mjs.map → renderer-BjL7sKGU.mjs.map} +1 -1
  234. package/dist/{renderer-Bh7d3RSt.mjs → renderer-BjNcuJ4H.mjs} +3 -3
  235. package/dist/{renderer-Bh7d3RSt.mjs.map → renderer-BjNcuJ4H.mjs.map} +1 -1
  236. package/dist/{renderer-Sdsy27LH.mjs → renderer-Br8aDmf0.mjs} +2 -2
  237. package/dist/renderer-BvZQngSm.mjs +5 -0
  238. package/dist/renderer-BxgN8oXx.mjs +5 -0
  239. package/dist/{renderer-BQ-pHSPI.mjs → renderer-ByOvGGzp.mjs} +3 -3
  240. package/dist/{renderer-BQ-pHSPI.mjs.map → renderer-ByOvGGzp.mjs.map} +1 -1
  241. package/dist/{renderer-KkDYCAkn.mjs → renderer-C11qLlrz.mjs} +3 -3
  242. package/dist/{renderer-KkDYCAkn.mjs.map → renderer-C11qLlrz.mjs.map} +1 -1
  243. package/dist/{renderer-D52KWsb8.mjs → renderer-C5dyPQjG.mjs} +3 -3
  244. package/dist/{renderer-D52KWsb8.mjs.map → renderer-C5dyPQjG.mjs.map} +1 -1
  245. package/dist/renderer-C5jDrTBc.mjs +5 -0
  246. package/dist/{renderer-DTKtkgTO.mjs → renderer-C6TbU8U5.mjs} +3 -3
  247. package/dist/{renderer-DTKtkgTO.mjs.map → renderer-C6TbU8U5.mjs.map} +1 -1
  248. package/dist/{renderer-aT6MUYPr.mjs → renderer-C9bcEaBE.mjs} +3 -3
  249. package/dist/{renderer-aT6MUYPr.mjs.map → renderer-C9bcEaBE.mjs.map} +1 -1
  250. package/dist/{renderer-CsxO_wBG.mjs → renderer-CAH00Lub.mjs} +2 -2
  251. package/dist/{renderer-Cb74SQHm.mjs → renderer-CAhsBEpU.mjs} +2 -2
  252. package/dist/{renderer-Cb74SQHm.mjs.map → renderer-CAhsBEpU.mjs.map} +1 -1
  253. package/dist/renderer-CBK4M82Y.mjs +5 -0
  254. package/dist/{renderer-CFSh2eG-.mjs → renderer-CCH0gSF7.mjs} +3 -3
  255. package/dist/{renderer-CFSh2eG-.mjs.map → renderer-CCH0gSF7.mjs.map} +1 -1
  256. package/dist/{renderer-CHvEgLHy.mjs → renderer-CCbOp0BM.mjs} +3 -3
  257. package/dist/{renderer-CHvEgLHy.mjs.map → renderer-CCbOp0BM.mjs.map} +1 -1
  258. package/dist/{renderer-DrrWvz8l.mjs → renderer-CEb5GjcU.mjs} +3 -3
  259. package/dist/{renderer-DrrWvz8l.mjs.map → renderer-CEb5GjcU.mjs.map} +1 -1
  260. package/dist/{renderer-1KfQICGK.mjs → renderer-CIL9zh-a.mjs} +3 -3
  261. package/dist/{renderer-1KfQICGK.mjs.map → renderer-CIL9zh-a.mjs.map} +1 -1
  262. package/dist/{renderer-CEvj79Wg.mjs → renderer-CIbXIFOb.mjs} +4 -4
  263. package/dist/{renderer-CEvj79Wg.mjs.map → renderer-CIbXIFOb.mjs.map} +1 -1
  264. package/dist/renderer-CLHtCctc.mjs +5 -0
  265. package/dist/{renderer-DxOJv_G7.mjs → renderer-CLX33fIK.mjs} +3 -3
  266. package/dist/{renderer-DxOJv_G7.mjs.map → renderer-CLX33fIK.mjs.map} +1 -1
  267. package/dist/{renderer-BcaT2j3R.mjs → renderer-CLXpWDqx.mjs} +2 -2
  268. package/dist/{renderer-BcaT2j3R.mjs.map → renderer-CLXpWDqx.mjs.map} +1 -1
  269. package/dist/renderer-CLin7MNN.mjs +5 -0
  270. package/dist/{renderer-COcFh5bK.mjs → renderer-CLypsmiH.mjs} +3 -3
  271. package/dist/{renderer-COcFh5bK.mjs.map → renderer-CLypsmiH.mjs.map} +1 -1
  272. package/dist/renderer-CN7TypOB.mjs +5 -0
  273. package/dist/renderer-CV5Jfwq7.mjs +5 -0
  274. package/dist/renderer-Ca5E46WK.mjs +5 -0
  275. package/dist/renderer-CdbOtoOU.mjs +5 -0
  276. package/dist/renderer-CeD_bqWj.mjs +5 -0
  277. package/dist/{renderer-BnpMAub0.mjs → renderer-CfEuoZ7b.mjs} +3 -3
  278. package/dist/{renderer-BnpMAub0.mjs.map → renderer-CfEuoZ7b.mjs.map} +1 -1
  279. package/dist/renderer-CfzNNUOd.mjs +5 -0
  280. package/dist/{renderer-0W-Ty55h.mjs → renderer-Cg3h0Mz9.mjs} +3 -3
  281. package/dist/{renderer-0W-Ty55h.mjs.map → renderer-Cg3h0Mz9.mjs.map} +1 -1
  282. package/dist/renderer-Cl8TmdU8.mjs +5 -0
  283. package/dist/{renderer-CoaDDIS6.mjs → renderer-ClHqvIps.mjs} +10 -10
  284. package/dist/renderer-ClHqvIps.mjs.map +1 -0
  285. package/dist/renderer-CosBP_IM.mjs +5 -0
  286. package/dist/renderer-CpwVs5Fh.mjs +5 -0
  287. package/dist/renderer-Cq7baxNb.mjs +5 -0
  288. package/dist/{renderer-B_Oz9L3g.mjs → renderer-CqMz_iXy.mjs} +2 -2
  289. package/dist/{renderer-B_Oz9L3g.mjs.map → renderer-CqMz_iXy.mjs.map} +1 -1
  290. package/dist/{renderer-DORydJHm.mjs → renderer-CqSmfrE1.mjs} +3 -3
  291. package/dist/{renderer-DORydJHm.mjs.map → renderer-CqSmfrE1.mjs.map} +1 -1
  292. package/dist/{renderer-WTvo3wo9.d.mts → renderer-CrhJJKFY.d.mts} +5 -3
  293. package/dist/renderer-CrhJJKFY.d.mts.map +1 -0
  294. package/dist/{renderer-Bt3F1tmP.mjs → renderer-CxxwhUwy.mjs} +3 -3
  295. package/dist/{renderer-Bt3F1tmP.mjs.map → renderer-CxxwhUwy.mjs.map} +1 -1
  296. package/dist/{renderer-Cba208C9.mjs → renderer-D24aiXmB.mjs} +3 -3
  297. package/dist/{renderer-Cba208C9.mjs.map → renderer-D24aiXmB.mjs.map} +1 -1
  298. package/dist/renderer-D6GkxwAx.mjs +5 -0
  299. package/dist/renderer-D7SfGdzX.mjs +5 -0
  300. package/dist/renderer-D7wt09_l.mjs +5 -0
  301. package/dist/{renderer-CdJoOfQw.mjs → renderer-DBslE7fc.mjs} +2 -2
  302. package/dist/{renderer-CdJoOfQw.mjs.map → renderer-DBslE7fc.mjs.map} +1 -1
  303. package/dist/{renderer-Df-rf7RC.mjs → renderer-DE3Ki96C.mjs} +3 -3
  304. package/dist/{renderer-Df-rf7RC.mjs.map → renderer-DE3Ki96C.mjs.map} +1 -1
  305. package/dist/{renderer-DqIrYB0P.mjs → renderer-DJCqc98W.mjs} +3 -3
  306. package/dist/{renderer-DqIrYB0P.mjs.map → renderer-DJCqc98W.mjs.map} +1 -1
  307. package/dist/{renderer-E54Vv1_W.mjs → renderer-DODOyrty.mjs} +3 -3
  308. package/dist/{renderer-E54Vv1_W.mjs.map → renderer-DODOyrty.mjs.map} +1 -1
  309. package/dist/{renderer-DuFwDHHF.mjs → renderer-DRYxcfgi.mjs} +2 -2
  310. package/dist/renderer-DSuDMYqY.mjs +5 -0
  311. package/dist/{renderer-BGDKxfsM.mjs → renderer-DYreml_A.mjs} +3 -3
  312. package/dist/{renderer-BGDKxfsM.mjs.map → renderer-DYreml_A.mjs.map} +1 -1
  313. package/dist/{renderer-BGnMRdUK.mjs → renderer-DZJnNISO.mjs} +2 -2
  314. package/dist/{renderer-BGnMRdUK.mjs.map → renderer-DZJnNISO.mjs.map} +1 -1
  315. package/dist/renderer-DaIstCIs.mjs +5 -0
  316. package/dist/renderer-DbOD3Nc0.mjs +5 -0
  317. package/dist/{renderer-B3gQT1uq.mjs → renderer-DbenSRjl.mjs} +3 -3
  318. package/dist/{renderer-B3gQT1uq.mjs.map → renderer-DbenSRjl.mjs.map} +1 -1
  319. package/dist/{renderer-DGsWlXjl.mjs → renderer-DcXxkxds.mjs} +75 -72
  320. package/dist/renderer-DcXxkxds.mjs.map +1 -0
  321. package/dist/renderer-DdRCA1bn.mjs +6 -0
  322. package/dist/{renderer-PDs21Gsq.mjs → renderer-DdUtL-qF.mjs} +3 -3
  323. package/dist/{renderer-PDs21Gsq.mjs.map → renderer-DdUtL-qF.mjs.map} +1 -1
  324. package/dist/renderer-DfO37haf.mjs +5 -0
  325. package/dist/renderer-DjZwzxZ7.mjs +5 -0
  326. package/dist/renderer-DnAvySNy.mjs +5 -0
  327. package/dist/{renderer-BwnQRuce.mjs → renderer-DnbY04Qk.mjs} +3 -3
  328. package/dist/{renderer-BwnQRuce.mjs.map → renderer-DnbY04Qk.mjs.map} +1 -1
  329. package/dist/renderer-DnvEPm5E.mjs +5 -0
  330. package/dist/{renderer-C_-hWBF1.mjs → renderer-Do9mW_-B.mjs} +3 -3
  331. package/dist/{renderer-C_-hWBF1.mjs.map → renderer-Do9mW_-B.mjs.map} +1 -1
  332. package/dist/{renderer-PDAlUGKG.mjs → renderer-Dqg8qxjq.mjs} +3 -3
  333. package/dist/{renderer-PDAlUGKG.mjs.map → renderer-Dqg8qxjq.mjs.map} +1 -1
  334. package/dist/{renderer-wrXFfvpJ.mjs → renderer-DvkRbmb2.mjs} +3 -3
  335. package/dist/{renderer-wrXFfvpJ.mjs.map → renderer-DvkRbmb2.mjs.map} +1 -1
  336. package/dist/renderer-DwNpKnWf.mjs +5 -0
  337. package/dist/{renderer-Cv6od7Be.mjs → renderer-Dw_xy3zx.mjs} +3 -3
  338. package/dist/{renderer-Cv6od7Be.mjs.map → renderer-Dw_xy3zx.mjs.map} +1 -1
  339. package/dist/renderer-Dx3Dghus.mjs +5 -0
  340. package/dist/{renderer-lP23pU1s.mjs → renderer-DyrNti45.mjs} +3 -3
  341. package/dist/{renderer-lP23pU1s.mjs.map → renderer-DyrNti45.mjs.map} +1 -1
  342. package/dist/renderer-KvaoEwIk.mjs +5 -0
  343. package/dist/{renderer-Cw7R1U43.mjs → renderer-SwUFJ4aA.mjs} +3 -3
  344. package/dist/{renderer-Cw7R1U43.mjs.map → renderer-SwUFJ4aA.mjs.map} +1 -1
  345. package/dist/{renderer-C4Jfgjm5.mjs → renderer-XEoQnDs5.mjs} +3 -3
  346. package/dist/{renderer-C4Jfgjm5.mjs.map → renderer-XEoQnDs5.mjs.map} +1 -1
  347. package/dist/{renderer-BXGr426R.mjs → renderer-Xw9Zn3pD.mjs} +2 -2
  348. package/dist/{renderer-BXGr426R.mjs.map → renderer-Xw9Zn3pD.mjs.map} +1 -1
  349. package/dist/{renderer-BEpA2g1_.mjs → renderer-ZWIDTOLV.mjs} +2 -2
  350. package/dist/{renderer-BEpA2g1_.mjs.map → renderer-ZWIDTOLV.mjs.map} +1 -1
  351. package/dist/{renderer-D36Pjp0B.mjs → renderer-bGhRdKB7.mjs} +2 -2
  352. package/dist/{renderer-D36Pjp0B.mjs.map → renderer-bGhRdKB7.mjs.map} +1 -1
  353. package/dist/{renderer-ZarULMvJ.mjs → renderer-d4weUlVq.mjs} +2 -2
  354. package/dist/{renderer-ZarULMvJ.mjs.map → renderer-d4weUlVq.mjs.map} +1 -1
  355. package/dist/{renderer-YEDoDnsE.mjs → renderer-g7CMgD1v.mjs} +3 -3
  356. package/dist/{renderer-YEDoDnsE.mjs.map → renderer-g7CMgD1v.mjs.map} +1 -1
  357. package/dist/{renderer-CZGpETnc.mjs → renderer-gjLFqdv-.mjs} +4 -4
  358. package/dist/{renderer-CZGpETnc.mjs.map → renderer-gjLFqdv-.mjs.map} +1 -1
  359. package/dist/{renderer-H-Adf8Za.mjs → renderer-gv0u9XmU.mjs} +3 -3
  360. package/dist/{renderer-H-Adf8Za.mjs.map → renderer-gv0u9XmU.mjs.map} +1 -1
  361. package/dist/{renderer-FPYVmSf6.mjs → renderer-jJWwrha1.mjs} +3 -3
  362. package/dist/{renderer-FPYVmSf6.mjs.map → renderer-jJWwrha1.mjs.map} +1 -1
  363. package/dist/{renderer-BKhdqykZ.mjs → renderer-kl_pAczD.mjs} +3 -3
  364. package/dist/{renderer-BKhdqykZ.mjs.map → renderer-kl_pAczD.mjs.map} +1 -1
  365. package/dist/{renderer-BKL3UEzN.mjs → renderer-lrKwPhZi.mjs} +2 -2
  366. package/dist/{renderer-BKL3UEzN.mjs.map → renderer-lrKwPhZi.mjs.map} +1 -1
  367. package/dist/{renderer-C2O4nK9x.mjs → renderer-pnYj1REL.mjs} +3 -3
  368. package/dist/{renderer-C2O4nK9x.mjs.map → renderer-pnYj1REL.mjs.map} +1 -1
  369. package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs → renderers-CP8CFWDs-CDikhBRO.mjs} +3 -3
  370. package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs.map → renderers-CP8CFWDs-CDikhBRO.mjs.map} +1 -1
  371. package/dist/signals/index.d.mts +5 -5
  372. package/dist/signals/index.mjs +6 -6
  373. package/dist/{signals-BrNF9l9s.mjs → signals-BeAWA_1Y.mjs} +3 -3
  374. package/dist/{signals-BrNF9l9s.mjs.map → signals-BeAWA_1Y.mjs.map} +1 -1
  375. package/dist/{src-_l81YkMD.mjs → src-LYcH_X8o.mjs} +233 -27
  376. package/dist/src-LYcH_X8o.mjs.map +1 -0
  377. package/package.json +58 -58
  378. package/dist/dist-D021IFfp.mjs.map +0 -1
  379. package/dist/dist-DSKhnhDk.mjs.map +0 -1
  380. package/dist/dist-cC6nOaMR.mjs.map +0 -1
  381. package/dist/index-3Vdef2KE.d.mts.map +0 -1
  382. package/dist/index-CWG19cm-.d.mts.map +0 -1
  383. package/dist/index-ocZc12ZS.d.mts.map +0 -1
  384. package/dist/preview-engine/chunk-3SR6BI4B.mjs +0 -1
  385. package/dist/preview-engine/chunk-5NLDETDV.mjs +0 -1974
  386. package/dist/preview-engine/chunk-ALSOO22Q.mjs +0 -1
  387. package/dist/preview-engine/chunk-NKGXINCU.mjs +0 -1
  388. package/dist/preview-engine/chunk-PJMX2GFY.mjs +0 -1
  389. package/dist/preview-engine/chunk-SIXIF5QZ.mjs +0 -3
  390. package/dist/preview-engine/renderers-4CRXZJ5G.mjs +0 -1
  391. package/dist/preview-engine/renderers-5QF4OLFQ.mjs +0 -1
  392. package/dist/preview-engine/renderers-5SOW6OVE.mjs +0 -1
  393. package/dist/preview-engine/renderers-6M2HPY2J.mjs +0 -1
  394. package/dist/preview-engine/renderers-7HT5NW7W.mjs +0 -1
  395. package/dist/preview-engine/renderers-ATTGUTYY.mjs +0 -1
  396. package/dist/preview-engine/renderers-AYWCRBQC.mjs +0 -1
  397. package/dist/preview-engine/renderers-BA6ZCPI5.mjs +0 -1
  398. package/dist/preview-engine/renderers-BAS7RXTC.mjs +0 -1
  399. package/dist/preview-engine/renderers-CZTCW4FC.mjs +0 -1
  400. package/dist/preview-engine/renderers-D2XEQ2YY.mjs +0 -1
  401. package/dist/preview-engine/renderers-DFIJYBW2.mjs +0 -1
  402. package/dist/preview-engine/renderers-EJN6M6DO.mjs +0 -1
  403. package/dist/preview-engine/renderers-EK3HQUUF.mjs +0 -1
  404. package/dist/preview-engine/renderers-G34C5J27.mjs +0 -1
  405. package/dist/preview-engine/renderers-GKVTNDVH.mjs +0 -1
  406. package/dist/preview-engine/renderers-HZBYQKIQ.mjs +0 -1
  407. package/dist/preview-engine/renderers-IK7ZJJKJ.mjs +0 -1
  408. package/dist/preview-engine/renderers-ISASPH6T.mjs +0 -1
  409. package/dist/preview-engine/renderers-IT5ISWSA.mjs +0 -228
  410. package/dist/preview-engine/renderers-IW5MWDBI.mjs +0 -1
  411. package/dist/preview-engine/renderers-K2PI4WJS.mjs +0 -1
  412. package/dist/preview-engine/renderers-KESHVFL2.mjs +0 -1
  413. package/dist/preview-engine/renderers-KTZZVAB2.mjs +0 -1
  414. package/dist/preview-engine/renderers-KY5CJEOV.mjs +0 -1
  415. package/dist/preview-engine/renderers-M5W6SUQD.mjs +0 -1
  416. package/dist/preview-engine/renderers-MEM3REMI.mjs +0 -1
  417. package/dist/preview-engine/renderers-N36R42RL.mjs +0 -1
  418. package/dist/preview-engine/renderers-O5XMWFPY.mjs +0 -1
  419. package/dist/preview-engine/renderers-QJA35PKC.mjs +0 -1
  420. package/dist/preview-engine/renderers-TJIFTQHV.mjs +0 -1
  421. package/dist/preview-engine/renderers-TN4XN436.mjs +0 -1
  422. package/dist/preview-engine/renderers-UDYLCYCB.mjs +0 -1
  423. package/dist/preview-engine/renderers-WZ7SFIBZ.mjs +0 -1
  424. package/dist/preview-engine/renderers-X6QNDC6R.mjs +0 -1
  425. package/dist/preview-engine/renderers-X6RNTJOV.mjs +0 -1
  426. package/dist/preview-engine/renderers-Y3N7236P.mjs +0 -1
  427. package/dist/preview-engine/renderers-YP3ASXIJ.mjs +0 -1
  428. package/dist/preview-engine/renderers-YVJAG3PD.mjs +0 -1
  429. package/dist/preview-engine/renderers-ZPPZNMKJ.mjs +0 -1
  430. package/dist/program-W4CWO2bp.mjs.map +0 -1
  431. package/dist/renderer-8HnHWqYj.mjs +0 -5
  432. package/dist/renderer-8itujues.mjs +0 -5
  433. package/dist/renderer-BFods-7v.mjs +0 -5
  434. package/dist/renderer-BbQygRwc.mjs +0 -5
  435. package/dist/renderer-Bq_sPaCg.mjs +0 -5
  436. package/dist/renderer-BrkDrvqS.mjs +0 -5
  437. package/dist/renderer-C1diVT5Q.mjs +0 -5
  438. package/dist/renderer-C8E7ajTR.mjs +0 -5
  439. package/dist/renderer-CAz8JW5c.mjs +0 -5
  440. package/dist/renderer-CKfrUdGw.mjs +0 -5
  441. package/dist/renderer-CL0rqBA4.mjs +0 -5
  442. package/dist/renderer-COyavIEv.mjs +0 -5
  443. package/dist/renderer-CUrShvUZ.mjs +0 -5
  444. package/dist/renderer-CWvJ_GaL.mjs +0 -5
  445. package/dist/renderer-Ck0mGIo9.mjs +0 -5
  446. package/dist/renderer-CoaDDIS6.mjs.map +0 -1
  447. package/dist/renderer-CqIXqdf0.mjs +0 -5
  448. package/dist/renderer-Csod6biL.mjs +0 -5
  449. package/dist/renderer-CueO924-.mjs +0 -5
  450. package/dist/renderer-D1vM4obC.mjs +0 -5
  451. package/dist/renderer-DB7QUt90.mjs +0 -5
  452. package/dist/renderer-DGsWlXjl.mjs.map +0 -1
  453. package/dist/renderer-DLMDnKlA.mjs +0 -6
  454. package/dist/renderer-DNs7yWMr.mjs +0 -5
  455. package/dist/renderer-DOrtuoa9.mjs +0 -5
  456. package/dist/renderer-D_JgOawb.mjs +0 -5
  457. package/dist/renderer-DdLo1uoa.mjs +0 -5
  458. package/dist/renderer-DeX3JEZV.mjs +0 -5
  459. package/dist/renderer-DfgZVACG.mjs +0 -5
  460. package/dist/renderer-DoYG7Pn6.mjs +0 -5
  461. package/dist/renderer-Jwqa-BUN.mjs +0 -5
  462. package/dist/renderer-WTvo3wo9.d.mts.map +0 -1
  463. package/dist/renderer-WyaqnVMz.mjs +0 -3
  464. package/dist/renderer-Z2Vs-IqP.mjs +0 -5
  465. package/dist/renderer-ZnyCpdWE.mjs +0 -5
  466. package/dist/renderer-emCnsnTH.mjs +0 -5
  467. package/dist/renderer-ioxa4-Dy.mjs +0 -5
  468. package/dist/renderer-iyIwrDWO.mjs +0 -5
  469. package/dist/renderer-tuudA_RZ.mjs +0 -5
  470. package/dist/renderer-yyn8S821.mjs +0 -5
  471. package/dist/src-_l81YkMD.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import "../chunk-D7gtBK74.mjs";
2
- import "../dist-cC6nOaMR.mjs";
3
- import { t as FontManager } from "../fonts-B6a4CyoM.mjs";
2
+ import "../dist-BHTd-EC1.mjs";
3
+ import { t as FontManager } from "../fonts-BcFhAqqO.mjs";
4
4
 
5
5
  export { FontManager };
@@ -1,4 +1,4 @@
1
- import { et as registerHeadlessFont, m as SlugGeometry, nt as setRegisteredFontSource, p as SlugFontCache } from "./dist-cC6nOaMR.mjs";
1
+ import { et as registerHeadlessFont, m as SlugGeometry, nt as setRegisteredFontSource, p as SlugFontCache } from "./dist-BHTd-EC1.mjs";
2
2
  import path from "node:path";
3
3
  import * as fontkit from "fontkit";
4
4
  import fs from "node:fs/promises";
@@ -261,4 +261,4 @@ var FontManager = class FontManager {
261
261
 
262
262
  //#endregion
263
263
  export { FontManager as t };
264
- //# sourceMappingURL=fonts-B6a4CyoM.mjs.map
264
+ //# sourceMappingURL=fonts-BcFhAqqO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fonts-B6a4CyoM.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\tsetRegisteredFontSource,\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\t// A URL path is percent-encoded (\"My%20Film\"); files aren't. On\n\t\t\t// Windows \"/C:/…\" loses its leading slash.\n\t\t\tcleanPath = decodeURIComponent(new URL(cleanPath).pathname).replace(\n\t\t\t\t/^\\/([A-Za-z]:)/,\n\t\t\t\t\"$1\",\n\t\t\t);\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/** Whether a color emoji font is registered (or set to load from a path / URL). */\n\tpublic static hasEmojiFont(): boolean {\n\t\treturn SlugFontCache.hasEmojiFont();\n\t}\n\n\t/**\n\t * Measures text with the real font, exactly as `Layer.text` lays it out:\n\t * box size, line count, per-glyph positions and caret offsets. Use it to\n\t * size containers, place cursors, underline a word or center by ink\n\t * instead of guessing advances. The family must be registered first.\n\t *\n\t * ```ts\n\t * const m = FontManager.measure(\"Hello\", { fontFamily: \"Inter\", fontSize: 60 });\n\t * m.width; m.caretX(3); m.glyphs[1].x\n\t * ```\n\t */\n\tpublic static measure(\n\t\ttext: string,\n\t\toptions: MeasureTextOptions,\n\t): TextMetrics {\n\t\tconst fontSize = options.fontSize ?? 48;\n\t\tconst font = SlugFontCache.getFont(\n\t\t\toptions.fontFamily,\n\t\t\toptions.fontWeight,\n\t\t\tnull,\n\t\t\tundefined,\n\t\t\tfontSize,\n\t\t);\n\t\tif (!font) {\n\t\t\tthrow new Error(\n\t\t\t\t`FontManager.measure: font \"${options.fontFamily}\" is not registered. ` +\n\t\t\t\t\t\"Call `await FontManager.register(...)` first.\",\n\t\t\t);\n\t\t}\n\t\tconst lineHeight =\n\t\t\toptions.lineHeight !== undefined && options.lineHeight < 10\n\t\t\t\t? options.lineHeight * fontSize\n\t\t\t\t: (options.lineHeight ?? fontSize * 1.2);\n\t\tconst letterSpacing = options.letterSpacing ?? 0;\n\t\tconst { width, height, layout } = SlugGeometry.measure(\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tfontSize,\n\t\t\tletterSpacing,\n\t\t\tlineHeight,\n\t\t\toptions.width,\n\t\t\tundefined,\n\t\t\toptions.direction,\n\t\t);\n\t\tconst scale = fontSize / font.unitsPerEm;\n\t\t// One entry per cluster (a letter with its marks, or a ligature), in\n\t\t// reading order; textIndex maps it back to the string.\n\t\tconst glyphs: MeasuredGlyph[] = [];\n\t\tconst seen = new Set<number>();\n\t\tlet cursor = 0;\n\t\tfor (const g of layout.glyphs) {\n\t\t\tlet index = g.textIndex;\n\t\t\tif (index === undefined) {\n\t\t\t\tconst at = text.indexOf(g.char, cursor);\n\t\t\t\tindex = at >= 0 ? at : cursor;\n\t\t\t}\n\t\t\tif (seen.has(index)) continue;\n\t\t\tseen.add(index);\n\t\t\tcursor = index + g.char.length;\n\t\t\tconst advance =\n\t\t\t\tg.clusterAdvance ?? g.cp.advanceWidth * (g.fontScale ?? scale);\n\t\t\tglyphs.push({\n\t\t\t\tchar: g.char,\n\t\t\t\tindex,\n\t\t\t\tx: g.clusterX ?? g.x,\n\t\t\t\ty: g.y,\n\t\t\t\twidth: advance + letterSpacing,\n\t\t\t\tline: g.lineIndex,\n\t\t\t\t...(g.rtl && { rtl: true }),\n\t\t\t});\n\t\t}\n\t\tconst caretX = (count: number): number => {\n\t\t\tif (count <= 0 || glyphs.length === 0) {\n\t\t\t\tconst first = glyphs[0];\n\t\t\t\tif (!first) return 0;\n\t\t\t\treturn first.rtl ? first.x + first.width - letterSpacing : first.x;\n\t\t\t}\n\t\t\tconst before = glyphs.filter((g) => g.index < count);\n\t\t\tconst last = before[before.length - 1];\n\t\t\tif (!last) return 0;\n\t\t\treturn last.rtl ? last.x : last.x + last.width - letterSpacing;\n\t\t};\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tlines: layout.linesCount,\n\t\t\tlineHeight,\n\t\t\tglyphs,\n\t\t\tcaretX,\n\t\t\twidthOf: (count: number) => caretX(count) - (glyphs[0]?.x ?? 0),\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves registered font metadata by family name.\n\t */\n\tpublic static get(family: string): RegisteredFont | undefined {\n\t\treturn FontManager.getInstance().get(family);\n\t}\n\n\t/**\n\t * Checks if a font family has been registered.\n\t */\n\tpublic static has(family: string): boolean {\n\t\treturn FontManager.getInstance().has(family);\n\t}\n\n\t/**\n\t * Returns all currently registered fonts.\n\t */\n\tpublic static getAll(): RegisteredFont[] {\n\t\treturn FontManager.getInstance().getAll();\n\t}\n\n\t/**\n\t * Returns relative or absolute file paths of all registered fonts for composition spec serialization.\n\t */\n\tpublic static getRegisteredFontPaths(): string[] {\n\t\treturn FontManager.getInstance().getRegisteredFontPaths();\n\t}\n\n\t/**\n\t * Clears all registered fonts from the manager.\n\t */\n\tpublic static clear(): void {\n\t\tFontManager.getInstance().clear();\n\t}\n\n\t/**\n\t * Instance registration method with format validation and Slug WebGPU cache population.\n\t */\n\tpublic async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\tlet family: string | undefined;\n\t\tlet rawSource: string | Uint8Array;\n\t\tlet weight: number | string | undefined;\n\t\tlet style: \"normal\" | \"italic\" | \"oblique\" | undefined;\n\n\t\tif (\n\t\t\ttypeof optionsOrFamilyOrSource === \"object\" &&\n\t\t\toptionsOrFamilyOrSource !== null\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource.family;\n\t\t\trawSource = optionsOrFamilyOrSource.source;\n\t\t\tweight = optionsOrFamilyOrSource.weight;\n\t\t\tstyle = optionsOrFamilyOrSource.style;\n\t\t} else if (\n\t\t\ttypeof optionsOrFamilyOrSource === \"string\" &&\n\t\t\tsource !== undefined\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource;\n\t\t\trawSource = source;\n\t\t} else if (typeof optionsOrFamilyOrSource === \"string\") {\n\t\t\tfamily = undefined;\n\t\t\trawSource = optionsOrFamilyOrSource;\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid arguments passed to FontManager.register\");\n\t\t}\n\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(rawSource);\n\t\tconst sourceLabel =\n\t\t\tfilePath ?? (typeof rawSource === \"string\" ? rawSource : \"Uint8Array\");\n\t\tconst format = validateFontBinaryHeader(buffer, sourceLabel);\n\n\t\tlet parsedFontkit: fontkit.Font;\n\t\ttry {\n\t\t\tconst parsed = fontkit.create(buffer as unknown as Buffer);\n\t\t\tif (\n\t\t\t\tparsed &&\n\t\t\t\t\"fonts\" in parsed &&\n\t\t\t\tArray.isArray(parsed.fonts) &&\n\t\t\t\tparsed.fonts.length > 0\n\t\t\t) {\n\t\t\t\tparsedFontkit = parsed.fonts[0] as fontkit.Font;\n\t\t\t} else {\n\t\t\t\tparsedFontkit = parsed as fontkit.Font;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse TrueType/OpenType font binary for \"${sourceLabel}\": ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tconst detectedFamily =\n\t\t\tparsedFontkit.familyName ||\n\t\t\tparsedFontkit.postscriptName ||\n\t\t\tpath.parse(sourceLabel).name;\n\t\tconst resolvedFamily = family?.trim() || detectedFamily;\n\n\t\tconst registered: RegisteredFont = {\n\t\t\tfamily: resolvedFamily,\n\t\t\tsource: rawSource,\n\t\t\tfilePath,\n\t\t\tformat,\n\t\t\tpostscriptName: parsedFontkit.postscriptName,\n\t\t\tunitsPerEm: parsedFontkit.unitsPerEm,\n\t\t\tweight,\n\t\t\tstyle,\n\t\t};\n\n\t\tthis.fonts.set(resolvedFamily, registered);\n\n\t\tsetRegisteredFontSource(resolvedFamily, filePath ?? rawSource);\n\t\t// Populate headless font registries\n\t\tif (filePath) {\n\t\t\tawait registerHeadlessFont(resolvedFamily, filePath);\n\t\t}\n\t\tSlugFontCache.setParsed(resolvedFamily, parsedFontkit);\n\n\t\treturn registered;\n\t}\n\n\tpublic get(family: string): RegisteredFont | undefined {\n\t\treturn this.fonts.get(family);\n\t}\n\n\tpublic has(family: string): boolean {\n\t\treturn this.fonts.has(family);\n\t}\n\n\tpublic getAll(): RegisteredFont[] {\n\t\treturn Array.from(this.fonts.values());\n\t}\n\n\tpublic getRegisteredFontPaths(): string[] {\n\t\tconst paths: string[] = [];\n\t\tfor (const font of this.fonts.values()) {\n\t\t\tif (font.filePath) {\n\t\t\t\tpaths.push(font.filePath);\n\t\t\t} else if (typeof font.source === \"string\") {\n\t\t\t\tpaths.push(font.source);\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.fonts.clear();\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fonts-BcFhAqqO.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\tsetRegisteredFontSource,\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\t// A URL path is percent-encoded (\"My%20Film\"); files aren't. On\n\t\t\t// Windows \"/C:/…\" loses its leading slash.\n\t\t\tcleanPath = decodeURIComponent(new URL(cleanPath).pathname).replace(\n\t\t\t\t/^\\/([A-Za-z]:)/,\n\t\t\t\t\"$1\",\n\t\t\t);\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/** Whether a color emoji font is registered (or set to load from a path / URL). */\n\tpublic static hasEmojiFont(): boolean {\n\t\treturn SlugFontCache.hasEmojiFont();\n\t}\n\n\t/**\n\t * Measures text with the real font, exactly as `Layer.text` lays it out:\n\t * box size, line count, per-glyph positions and caret offsets. Use it to\n\t * size containers, place cursors, underline a word or center by ink\n\t * instead of guessing advances. The family must be registered first.\n\t *\n\t * ```ts\n\t * const m = FontManager.measure(\"Hello\", { fontFamily: \"Inter\", fontSize: 60 });\n\t * m.width; m.caretX(3); m.glyphs[1].x\n\t * ```\n\t */\n\tpublic static measure(\n\t\ttext: string,\n\t\toptions: MeasureTextOptions,\n\t): TextMetrics {\n\t\tconst fontSize = options.fontSize ?? 48;\n\t\tconst font = SlugFontCache.getFont(\n\t\t\toptions.fontFamily,\n\t\t\toptions.fontWeight,\n\t\t\tnull,\n\t\t\tundefined,\n\t\t\tfontSize,\n\t\t);\n\t\tif (!font) {\n\t\t\tthrow new Error(\n\t\t\t\t`FontManager.measure: font \"${options.fontFamily}\" is not registered. ` +\n\t\t\t\t\t\"Call `await FontManager.register(...)` first.\",\n\t\t\t);\n\t\t}\n\t\tconst lineHeight =\n\t\t\toptions.lineHeight !== undefined && options.lineHeight < 10\n\t\t\t\t? options.lineHeight * fontSize\n\t\t\t\t: (options.lineHeight ?? fontSize * 1.2);\n\t\tconst letterSpacing = options.letterSpacing ?? 0;\n\t\tconst { width, height, layout } = SlugGeometry.measure(\n\t\t\ttext,\n\t\t\tfont,\n\t\t\tfontSize,\n\t\t\tletterSpacing,\n\t\t\tlineHeight,\n\t\t\toptions.width,\n\t\t\tundefined,\n\t\t\toptions.direction,\n\t\t);\n\t\tconst scale = fontSize / font.unitsPerEm;\n\t\t// One entry per cluster (a letter with its marks, or a ligature), in\n\t\t// reading order; textIndex maps it back to the string.\n\t\tconst glyphs: MeasuredGlyph[] = [];\n\t\tconst seen = new Set<number>();\n\t\tlet cursor = 0;\n\t\tfor (const g of layout.glyphs) {\n\t\t\tlet index = g.textIndex;\n\t\t\tif (index === undefined) {\n\t\t\t\tconst at = text.indexOf(g.char, cursor);\n\t\t\t\tindex = at >= 0 ? at : cursor;\n\t\t\t}\n\t\t\tif (seen.has(index)) continue;\n\t\t\tseen.add(index);\n\t\t\tcursor = index + g.char.length;\n\t\t\tconst advance =\n\t\t\t\tg.clusterAdvance ?? g.cp.advanceWidth * (g.fontScale ?? scale);\n\t\t\tglyphs.push({\n\t\t\t\tchar: g.char,\n\t\t\t\tindex,\n\t\t\t\tx: g.clusterX ?? g.x,\n\t\t\t\ty: g.y,\n\t\t\t\twidth: advance + letterSpacing,\n\t\t\t\tline: g.lineIndex,\n\t\t\t\t...(g.rtl && { rtl: true }),\n\t\t\t});\n\t\t}\n\t\tconst caretX = (count: number): number => {\n\t\t\tif (count <= 0 || glyphs.length === 0) {\n\t\t\t\tconst first = glyphs[0];\n\t\t\t\tif (!first) return 0;\n\t\t\t\treturn first.rtl ? first.x + first.width - letterSpacing : first.x;\n\t\t\t}\n\t\t\tconst before = glyphs.filter((g) => g.index < count);\n\t\t\tconst last = before[before.length - 1];\n\t\t\tif (!last) return 0;\n\t\t\treturn last.rtl ? last.x : last.x + last.width - letterSpacing;\n\t\t};\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tlines: layout.linesCount,\n\t\t\tlineHeight,\n\t\t\tglyphs,\n\t\t\tcaretX,\n\t\t\twidthOf: (count: number) => caretX(count) - (glyphs[0]?.x ?? 0),\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves registered font metadata by family name.\n\t */\n\tpublic static get(family: string): RegisteredFont | undefined {\n\t\treturn FontManager.getInstance().get(family);\n\t}\n\n\t/**\n\t * Checks if a font family has been registered.\n\t */\n\tpublic static has(family: string): boolean {\n\t\treturn FontManager.getInstance().has(family);\n\t}\n\n\t/**\n\t * Returns all currently registered fonts.\n\t */\n\tpublic static getAll(): RegisteredFont[] {\n\t\treturn FontManager.getInstance().getAll();\n\t}\n\n\t/**\n\t * Returns relative or absolute file paths of all registered fonts for composition spec serialization.\n\t */\n\tpublic static getRegisteredFontPaths(): string[] {\n\t\treturn FontManager.getInstance().getRegisteredFontPaths();\n\t}\n\n\t/**\n\t * Clears all registered fonts from the manager.\n\t */\n\tpublic static clear(): void {\n\t\tFontManager.getInstance().clear();\n\t}\n\n\t/**\n\t * Instance registration method with format validation and Slug WebGPU cache population.\n\t */\n\tpublic async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\tlet family: string | undefined;\n\t\tlet rawSource: string | Uint8Array;\n\t\tlet weight: number | string | undefined;\n\t\tlet style: \"normal\" | \"italic\" | \"oblique\" | undefined;\n\n\t\tif (\n\t\t\ttypeof optionsOrFamilyOrSource === \"object\" &&\n\t\t\toptionsOrFamilyOrSource !== null\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource.family;\n\t\t\trawSource = optionsOrFamilyOrSource.source;\n\t\t\tweight = optionsOrFamilyOrSource.weight;\n\t\t\tstyle = optionsOrFamilyOrSource.style;\n\t\t} else if (\n\t\t\ttypeof optionsOrFamilyOrSource === \"string\" &&\n\t\t\tsource !== undefined\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource;\n\t\t\trawSource = source;\n\t\t} else if (typeof optionsOrFamilyOrSource === \"string\") {\n\t\t\tfamily = undefined;\n\t\t\trawSource = optionsOrFamilyOrSource;\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid arguments passed to FontManager.register\");\n\t\t}\n\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(rawSource);\n\t\tconst sourceLabel =\n\t\t\tfilePath ?? (typeof rawSource === \"string\" ? rawSource : \"Uint8Array\");\n\t\tconst format = validateFontBinaryHeader(buffer, sourceLabel);\n\n\t\tlet parsedFontkit: fontkit.Font;\n\t\ttry {\n\t\t\tconst parsed = fontkit.create(buffer as unknown as Buffer);\n\t\t\tif (\n\t\t\t\tparsed &&\n\t\t\t\t\"fonts\" in parsed &&\n\t\t\t\tArray.isArray(parsed.fonts) &&\n\t\t\t\tparsed.fonts.length > 0\n\t\t\t) {\n\t\t\t\tparsedFontkit = parsed.fonts[0] as fontkit.Font;\n\t\t\t} else {\n\t\t\t\tparsedFontkit = parsed as fontkit.Font;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse TrueType/OpenType font binary for \"${sourceLabel}\": ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tconst detectedFamily =\n\t\t\tparsedFontkit.familyName ||\n\t\t\tparsedFontkit.postscriptName ||\n\t\t\tpath.parse(sourceLabel).name;\n\t\tconst resolvedFamily = family?.trim() || detectedFamily;\n\n\t\tconst registered: RegisteredFont = {\n\t\t\tfamily: resolvedFamily,\n\t\t\tsource: rawSource,\n\t\t\tfilePath,\n\t\t\tformat,\n\t\t\tpostscriptName: parsedFontkit.postscriptName,\n\t\t\tunitsPerEm: parsedFontkit.unitsPerEm,\n\t\t\tweight,\n\t\t\tstyle,\n\t\t};\n\n\t\tthis.fonts.set(resolvedFamily, registered);\n\n\t\tsetRegisteredFontSource(resolvedFamily, filePath ?? rawSource);\n\t\t// Populate headless font registries\n\t\tif (filePath) {\n\t\t\tawait registerHeadlessFont(resolvedFamily, filePath);\n\t\t}\n\t\tSlugFontCache.setParsed(resolvedFamily, parsedFontkit);\n\n\t\treturn registered;\n\t}\n\n\tpublic get(family: string): RegisteredFont | undefined {\n\t\treturn this.fonts.get(family);\n\t}\n\n\tpublic has(family: string): boolean {\n\t\treturn this.fonts.has(family);\n\t}\n\n\tpublic getAll(): RegisteredFont[] {\n\t\treturn Array.from(this.fonts.values());\n\t}\n\n\tpublic getRegisteredFontPaths(): string[] {\n\t\tconst paths: string[] = [];\n\t\tfor (const font of this.fonts.values()) {\n\t\t\tif (font.filePath) {\n\t\t\t\tpaths.push(font.filePath);\n\t\t\t} else if (typeof font.source === \"string\") {\n\t\t\t\tpaths.push(font.source);\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.fonts.clear();\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { In as signalRegistry } from "./dist-cC6nOaMR.mjs";
1
+ import { In as signalRegistry } from "./dist-BHTd-EC1.mjs";
2
2
 
3
3
  //#region ../node-sdk/dist/gpu.mjs
4
4
  const TRANSPARENT = {
@@ -212,4 +212,4 @@ function drawFullscreenPass(encoder, target, pipeline, bindGroups) {
212
212
 
213
213
  //#endregion
214
214
  export { createFullscreenPipeline as a, drawTextureToTarget as c, signalTextureView as d, signalTiming as f, beginTargetPass as i, fragmentBindGroupLayout as l, PREMULTIPLIED_BLEND as n, drawChildToTexture as o, texturesLayout as p, STRAIGHT_ALPHA_BLEND as r, drawFullscreenPass as s, FULLSCREEN_QUAD_WGSL as t, perDevice as u };
215
- //# sourceMappingURL=gpu-CrQADlcf.mjs.map
215
+ //# sourceMappingURL=gpu-zIhSz_0X.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"gpu-CrQADlcf.mjs","names":[],"sources":["../../node-sdk/dist/gpu.mjs"],"sourcesContent":["import { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/gpu.ts\nconst TRANSPARENT = {\n\tr: 0,\n\tg: 0,\n\tb: 0,\n\ta: 0\n};\n/**\n* Full-screen quad vertex stage: a 4-vertex triangle strip (draw(4)) that\n* hands `in.uv` (0,0 top-left → 1,1 bottom-right) to an `fs` reading `VSOut`.\n*/\nconst FULLSCREEN_QUAD_WGSL = `\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n`;\n/** Premultiplied-alpha \"over\" blending. */\nconst PREMULTIPLIED_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** Straight-alpha color over a premultiplied-alpha accumulation. */\nconst STRAIGHT_ALPHA_BLEND = {\n\tcolor: {\n\t\tsrcFactor: \"src-alpha\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t},\n\talpha: {\n\t\tsrcFactor: \"one\",\n\t\tdstFactor: \"one-minus-src-alpha\",\n\t\toperation: \"add\"\n\t}\n};\n/** A bind group layout whose entries are bound at 0, 1, 2… in order. */\nfunction fragmentBindGroupLayout(device, bindings, label) {\n\treturn device.createBindGroupLayout({\n\t\t...label && { label },\n\t\tentries: bindings.map((binding, index) => {\n\t\t\tif (binding === \"uniform\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t};\n\t\t\tif (binding === \"texture\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t};\n\t\t\tif (binding === \"sampler\") return {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tsampler: { type: \"filtering\" }\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t...binding,\n\t\t\t\tbinding: index\n\t\t\t};\n\t\t})\n\t});\n}\n/** `count` float textures followed by one filtering sampler. */\nfunction texturesLayout(device, count) {\n\treturn fragmentBindGroupLayout(device, [...Array(count).fill(\"texture\"), \"sampler\"]);\n}\n/** Memoizes `create` per GPUDevice (resources can't cross devices). */\nfunction perDevice(create) {\n\tconst cache = /* @__PURE__ */ new WeakMap();\n\treturn (device) => {\n\t\tlet value = cache.get(device);\n\t\tif (value === void 0) {\n\t\t\tvalue = create(device);\n\t\t\tcache.set(device, value);\n\t\t}\n\t\treturn value;\n\t};\n}\n/** A triangle-strip pipeline drawing one full-screen quad (`draw(4)`). */\nfunction createFullscreenPipeline(device, options) {\n\tconst { module, format, blend } = options;\n\treturn device.createRenderPipeline({\n\t\t...options.label && { label: options.label },\n\t\tlayout: Array.isArray(options.layouts) ? device.createPipelineLayout({ bindGroupLayouts: options.layouts }) : options.layouts,\n\t\tvertex: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.vertexEntryPoint ?? \"vs\"\n\t\t},\n\t\tfragment: {\n\t\t\tmodule,\n\t\t\tentryPoint: options.fragmentEntryPoint ?? \"fs\",\n\t\t\ttargets: [blend ? {\n\t\t\t\tformat,\n\t\t\t\tblend\n\t\t\t} : { format }]\n\t\t},\n\t\tprimitive: { topology: \"triangle-strip\" }\n\t});\n}\n/**\n* Renders `child` into a cleared temporary texture with an identity\n* transform and a full-size scissor, and returns that texture.\n*/\nasync function drawChildToTexture(args, child, options = {}) {\n\tconst { ctx, encoder, props } = args;\n\tconst width = options.width ?? args.targetWidth;\n\tconst height = options.height ?? args.targetHeight;\n\tconst texture = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\targs.targetTexture,\n\t\t...options.exclude ?? []\n\t]);\n\tconst view = texture.createView();\n\tctx.renderer.beginFrame(encoder, view, TRANSPARENT, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait args.drawChild(child, options.props ?? {\n\t\t...props,\n\t\tvirtualMedia: child\n\t}, view, texture, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\treturn {\n\t\ttexture,\n\t\tview\n\t};\n}\n/**\n* Opens a \"load\" pass on the node's target and makes it the node's current\n* pass (the caller hands it back to the compositor).\n*/\nfunction beginTargetPass(args, width = args.targetWidth, height = args.targetHeight) {\n\tconst pass = args.ctx.renderer.beginFrame(args.encoder, args.targetView, TRANSPARENT, width, height, \"load\");\n\targs.pass = pass;\n\treturn pass;\n}\n/** Draws `texture` over the whole target at `opacity` (the node's output). */\nfunction drawTextureToTarget(args, texture, opacity = 1) {\n\tconst { targetWidth: width, targetHeight: height } = args;\n\targs.ctx.renderer.drawTexture(beginTargetPass(args), texture, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t}, { opacity });\n}\n/** Clock a signal texture is evaluated at, in seconds. */\nfunction signalTiming(props, frame, fps, fallbackDurationSeconds = 0) {\n\tconst metadataDurationMs = props.virtualMedia?.metadata?.durationMs;\n\treturn {\n\t\telapsedSeconds: props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps,\n\t\tdurationSeconds: metadataDurationMs ? metadataDurationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : fallbackDurationSeconds\n\t};\n}\n/**\n* The texture a bound parameter samples: its own GPU binding, the signal's\n* texture (cached under `sd.nodeId`, else `fallbackId`), or a 1×1 dummy.\n*/\nfunction signalTextureView(sc, param, fallbackId) {\n\tconst { args } = sc;\n\tif (param.gpuTextureView) return param.gpuTextureView;\n\tif (param.hasStaticSig && param.sd) return signalRegistry.getOrCreate2DTextureView(args.ctx.device, args.encoder, param.sd.nodeId ?? fallbackId, sc.elapsedSeconds, sc.durationSeconds, param.sd, sc.width, sc.height, args.props.renderId, sc.frame, sc.fps);\n\treturn signalRegistry.getDummy1x1TextureView(args.ctx.device);\n}\n/** Clears `target` to transparent and draws one full-screen quad into it. */\nfunction drawFullscreenPass(encoder, target, pipeline, bindGroups) {\n\tconst pass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: target,\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: TRANSPARENT\n\t}] });\n\tpass.setPipeline(pipeline);\n\tbindGroups.forEach((group, index) => {\n\t\tpass.setBindGroup(index, group);\n\t});\n\tpass.draw(4);\n\tpass.end();\n}\n\n//#endregion\nexport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, STRAIGHT_ALPHA_BLEND, beginTargetPass, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout };\n//# sourceMappingURL=gpu.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"gpu-zIhSz_0X.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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"}
@@ -26,6 +26,7 @@ declare class ProgrammaticSignal implements FrameSignal<number> {
26
26
  private _fps;
27
27
  private _durationFrames?;
28
28
  private _cachedFrame;
29
+ private _cachedContext?;
29
30
  private _cachedValue;
30
31
  private _seekedFrame;
31
32
  private _subscribers;
@@ -1847,6 +1848,207 @@ declare class ModerationUnrefundableError extends Error {
1847
1848
  */
1848
1849
  declare const generateId: (size?: number) => string;
1849
1850
  //#endregion
1851
+ //#region src/media-time-signal.d.ts
1852
+ /** A sampled source-time curve or the integral of a sampled playback rate. */
1853
+ type SampledMediaSignal = {
1854
+ readonly mode: "source-time";
1855
+ readonly values: Float64Array;
1856
+ readonly fps: number;
1857
+ } | {
1858
+ readonly mode: "speed";
1859
+ readonly values: Float64Array;
1860
+ readonly positions: Float64Array;
1861
+ readonly fps: number;
1862
+ };
1863
+ /**
1864
+ * Sample a signal at every composition-frame boundary in layer order.
1865
+ * Values between boundaries are linearly interpolated; speeds are integrated
1866
+ * analytically, so picture and audio can query the same fractional frame.
1867
+ */
1868
+ declare function sampleMediaSignal(options: {
1869
+ mode: "source-time" | "speed";
1870
+ fps: number;
1871
+ startFrame: number;
1872
+ durationFrames: number;
1873
+ sourceStartSec?: number;
1874
+ sample: (compositionFrame: number) => number;
1875
+ }): SampledMediaSignal;
1876
+ /** Sample an engine signal with its composition clock and full frame context. */
1877
+ declare function sampleFrameMediaSignal(options: {
1878
+ mode: "source-time" | "speed";
1879
+ fps: number;
1880
+ startFrame: number;
1881
+ durationFrames: number;
1882
+ compositionDurationFrames: number;
1883
+ sourceStartSec?: number;
1884
+ signal: Signal<number>;
1885
+ }): SampledMediaSignal;
1886
+ /** The frame context a composition-clock signal sees at a composition frame. */
1887
+ declare function compositionFrameContext(frame: number, fps: number, compositionDurationFrames: number): FrameContext;
1888
+ /** Evaluate at any fractional local frame, independent of query order. */
1889
+ declare function sampledMediaSourceTime(map: SampledMediaSignal, frame: number): number;
1890
+ /** Source-time bounds over a layer interval; `max` is exclusive unless included. */
1891
+ interface MediaSourceRange {
1892
+ min: number;
1893
+ max: number;
1894
+ maxIncluded: boolean;
1895
+ }
1896
+ /** Range includes direction changes inside a speed-signal interval. */
1897
+ declare function sampledMediaSourceRange(map: SampledMediaSignal, from: number, to: number): MediaSourceRange;
1898
+ /**
1899
+ * Records a live signal at each composition-frame boundary, so its history can
1900
+ * be replayed for audio, seeks and vision without evaluating it a second time.
1901
+ * With a sampler, boundaries are evaluated on demand, but never past the
1902
+ * frame the composition has reached ({@link advance}): no look-ahead.
1903
+ */
1904
+ declare class MediaSignalRecorder {
1905
+ private readonly values;
1906
+ private readonly positions;
1907
+ private recorded;
1908
+ private evaluating;
1909
+ private horizon;
1910
+ private sampler;
1911
+ private check;
1912
+ readonly startFrame: number;
1913
+ readonly durationFrames: number;
1914
+ readonly fps: number;
1915
+ readonly mode: "source-time" | "speed";
1916
+ constructor(options: {
1917
+ mode: "source-time" | "speed";
1918
+ fps: number;
1919
+ startFrame: number;
1920
+ durationFrames: number;
1921
+ sourceStartSec?: number;
1922
+ sample?: (compositionFrame: number) => number;
1923
+ });
1924
+ /** The first composition frame whose boundary is not yet recorded. */
1925
+ get nextFrame(): number;
1926
+ get complete(): boolean;
1927
+ /** Allow on-demand sampling through a composition frame the clock has reached. */
1928
+ advance(frame: number): void;
1929
+ /**
1930
+ * Validate source bounds as history arrives: the recorded part now, each
1931
+ * further interval as it is recorded.
1932
+ */
1933
+ checkRange(check: (range: MediaSourceRange) => void): void;
1934
+ /** Each boundary is recorded once in composition-frame order. */
1935
+ record(frame: number, value: number): void;
1936
+ /**
1937
+ * Evaluate a boundary once, reporting recursive time dependencies. A
1938
+ * boundary already recorded is kept, and `sample` is not called again.
1939
+ */
1940
+ recordFrom(frame: number, sample: () => number): void;
1941
+ /** Sample every boundary through `frame` that the clock has reached. */
1942
+ ensure(frame: number): void;
1943
+ /**
1944
+ * Close a layer that outlives the clock: the boundaries past the last
1945
+ * rendered frame hold the last recorded value.
1946
+ */
1947
+ close(): void;
1948
+ /** The known source position at an already-recorded frame boundary. */
1949
+ at(frame: number): number;
1950
+ /** Read a recorded local frame, including fractional audio sample positions. */
1951
+ sourceTime(localFrame: number): number;
1952
+ /** Read the instantaneous speed for an interval whose endpoints are known. */
1953
+ rate(localFrame: number): number;
1954
+ isHold(localFrame: number): boolean;
1955
+ range(from: number, to: number): MediaSourceRange;
1956
+ /** A self-contained snapshot, available only when every boundary was recorded. */
1957
+ finish(): SampledMediaSignal;
1958
+ private knownInterval;
1959
+ /** Bounds of the interval starting at boundary `i`, its end exclusive. */
1960
+ private interval;
1961
+ private history;
1962
+ }
1963
+ //#endregion
1964
+ //#region src/media-time.d.ts
1965
+ /** Maps layer-local frames to absolute source seconds. */
1966
+ declare const MediaTimeRemapSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1967
+ kind: z.ZodLiteral<"rate">;
1968
+ sourceStartSec: z.ZodNumber;
1969
+ rate: z.ZodNumber;
1970
+ }, z.core.$strict>, z.ZodObject<{
1971
+ kind: z.ZodLiteral<"keyframes">;
1972
+ keyframes: z.ZodArray<z.ZodObject<{
1973
+ frame: z.ZodNumber;
1974
+ sourceSec: z.ZodNumber;
1975
+ interpolation: z.ZodOptional<z.ZodEnum<{
1976
+ linear: "linear";
1977
+ "ease-in": "ease-in";
1978
+ "ease-out": "ease-out";
1979
+ smooth: "smooth";
1980
+ }>>;
1981
+ }, z.core.$strict>>;
1982
+ }, z.core.$strict>], "kind">;
1983
+ type MediaTimeRemap = z.infer<typeof MediaTimeRemapSchema>;
1984
+ /**
1985
+ * Drives source time from a signal on the composition clock: `"speed"` is
1986
+ * playback rate (source seconds per second, integrated from `sourceStartSec`),
1987
+ * `"source-time"` is absolute source seconds. `signal` is a signal instance or
1988
+ * the name of a composition signal. The signal is read at every frame
1989
+ * boundary of the layer, after that frame's hooks have run.
1990
+ */
1991
+ interface MediaTimeSignalRemap {
1992
+ kind: "signal";
1993
+ mode: "speed" | "source-time";
1994
+ signal: Signal<number> | string;
1995
+ sourceStartSec?: number;
1996
+ }
1997
+ declare const MediaTimeSignalRemapSchema: z.ZodObject<{
1998
+ kind: z.ZodLiteral<"signal">;
1999
+ mode: z.ZodEnum<{
2000
+ speed: "speed";
2001
+ "source-time": "source-time";
2002
+ }>;
2003
+ signal: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<Signal<number>, Signal<number>>]>;
2004
+ sourceStartSec: z.ZodOptional<z.ZodNumber>;
2005
+ }, z.core.$strict>;
2006
+ /** Every `timeRemap` an author can write: a fixed map or a signal binding. */
2007
+ type MediaTimeRemapInput = MediaTimeRemap | MediaTimeSignalRemap;
2008
+ declare const MediaTimeRemapInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
2009
+ kind: z.ZodLiteral<"rate">;
2010
+ sourceStartSec: z.ZodNumber;
2011
+ rate: z.ZodNumber;
2012
+ }, z.core.$strict>, z.ZodObject<{
2013
+ kind: z.ZodLiteral<"keyframes">;
2014
+ keyframes: z.ZodArray<z.ZodObject<{
2015
+ frame: z.ZodNumber;
2016
+ sourceSec: z.ZodNumber;
2017
+ interpolation: z.ZodOptional<z.ZodEnum<{
2018
+ linear: "linear";
2019
+ "ease-in": "ease-in";
2020
+ "ease-out": "ease-out";
2021
+ smooth: "smooth";
2022
+ }>>;
2023
+ }, z.core.$strict>>;
2024
+ }, z.core.$strict>, z.ZodObject<{
2025
+ kind: z.ZodLiteral<"signal">;
2026
+ mode: z.ZodEnum<{
2027
+ speed: "speed";
2028
+ "source-time": "source-time";
2029
+ }>;
2030
+ signal: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<Signal<number>, Signal<number>>]>;
2031
+ sourceStartSec: z.ZodOptional<z.ZodNumber>;
2032
+ }, z.core.$strict>], "kind">;
2033
+ /** A per-render signal history resolved by the media timing scheduler. */
2034
+ type ResolvedMediaTimeRemap = MediaTimeRemap | {
2035
+ readonly kind: "sampled";
2036
+ readonly history: SampledMediaSignal;
2037
+ } | {
2038
+ readonly kind: "recorded";
2039
+ readonly recorder: MediaSignalRecorder;
2040
+ };
2041
+ /** Validate the map against its explicit, exclusive layer duration. */
2042
+ declare function validateMediaTimeRemap(map: MediaTimeRemapInput, durationFrames: number): string | undefined;
2043
+ /** Absolute source seconds at a fractional layer-local frame. */
2044
+ declare function mediaSourceTime(map: ResolvedMediaTimeRemap, localFrame: number, fps: number): number;
2045
+ /** True only for a constant source-time interval, not a ramp with zero instantaneous velocity. */
2046
+ declare function mediaSourceIsHold(map: ResolvedMediaTimeRemap, frame: number): boolean;
2047
+ /** Source seconds per output second at a layer-local frame. */
2048
+ declare function mediaSourceRate(map: ResolvedMediaTimeRemap, frame: number, fps: number): number;
2049
+ /** Bounds over a local-frame interval, including intermediate turns. */
2050
+ declare function mediaSourceRange(map: ResolvedMediaTimeRemap, fromFrame: number, toFrame: number, fps: number): MediaSourceRange;
2051
+ //#endregion
1850
2052
  //#region src/node-metadata.d.ts
1851
2053
  declare const ConfigHandleSchema: z$1.ZodObject<{
1852
2054
  configKey: z$1.ZodString;
@@ -2042,6 +2244,23 @@ declare const Color$1: {
2042
2244
  readonly readableOn: (background: string) => string;
2043
2245
  };
2044
2246
  //#endregion
2247
+ //#region src/utils/emoji.d.ts
2248
+ /**
2249
+ * How a grapheme presents, after Unicode's emoji presentation rules
2250
+ * (UTS #51): as a color emoji, as text, or as text when the text font has
2251
+ * the glyph. Layout and the emoji preload use it, and so does the
2252
+ * `missing_emoji_font` lint, so they agree on which characters need the
2253
+ * color emoji font.
2254
+ */
2255
+ /**
2256
+ * `"emoji"`: draw from the color emoji font. `"text"`: draw from the text
2257
+ * font (✓ ★ ❯, letters). `"either"`: a pictograph that defaults to text
2258
+ * (❤ ✈ ☀ © ™ without VS16), drawn from the text font when it has the glyph
2259
+ * and from the emoji font when it doesn't, as browsers fall back.
2260
+ */
2261
+ type EmojiPresentation = "emoji" | "text" | "either";
2262
+ declare function emojiPresentation(grapheme: string): EmojiPresentation;
2263
+ //#endregion
2045
2264
  //#region src/utils/gradient.d.ts
2046
2265
  type GradientType = "linear" | "radial" | "conic";
2047
2266
  interface ParsedGradientStop {
@@ -5931,6 +6150,7 @@ interface FontkitFont {
5931
6150
  numGlyphs: number;
5932
6151
  getGlyph?(id: number): FontkitGlyph;
5933
6152
  glyphForCodePoint?(codePoint: number): FontkitGlyph;
6153
+ hasGlyphForCodePoint?(codePoint: number): boolean;
5934
6154
  characterSet: number[] | Iterable<number>;
5935
6155
  ascent: number;
5936
6156
  descent: number;
@@ -5958,6 +6178,8 @@ declare class SlugFontCache {
5958
6178
  /** Register an already parsed font (e.g. by FontManager) under a family name. */
5959
6179
  static setParsed(fontFamily: string, font: FontkitFont): void;
5960
6180
  static getParsed(fontFamily: string): FontkitFont | null;
6181
+ /** Registered families, in registration order (font fallback tries them in turn). */
6182
+ static families(): string[];
5961
6183
  static getAllParsed(): FontkitFont[];
5962
6184
  static getFirstParsed(): FontkitFont | null;
5963
6185
  static hasPending(): boolean;
@@ -6056,5 +6278,5 @@ declare global {
6056
6278
  var __GATEWAI_DELAYS__: Set<number>;
6057
6279
  }
6058
6280
  //#endregion
6059
- export { AdvancedTextAnimatorSchema as $, SignalValue as $a, MediaSourceInput as $i, samplePathChainGeometry as $n, frameArraySignal as $o, DATA_TYPE_EXTENSIONS as $r, TextCursorConfig as $t, SlugFontCache as A, Pixels as Aa, GateSignalOptions as Ai, buildPathLUT as An, VirtualMediaDataSchema as Ao, resolveEnvironment as Ar, progressSignal as As, LongShadowConfig as At, loadModel3D as B, Signal as Ba, JsonArray as Bi, evaluateMarqueeOffset as Bn, computeVideoCropRenderProps as Bo, BaseVideoLayerPropsSchema as Br, sampleColorStops as Bs, SelectorShape as Bt, Renderer3D as C, ObjectBoundingBox as Ca, FileData as Ci, VariableFontAxesSchema as Cn, VideoLayerType as Co, Path3DPoint as Cr, normalizeColorStops as Cs, GlyphAnchorGroupingSchema as Ct, SignalRegistry as D, OutputItemSchema as Da, FrameIndex as Di, VolumetricFormationConfigSchema as Dn, VideoTextPropsSchema as Do, Vec3 as Dr, parseCssGradient as Ds, KineticMarqueeConfigSchema as Dt, ShadowPipeline as E, OutputItem as Ea, FrameContext as Ei, VolumetricFormationConfig as En, VideoStylePropsSchema as Eo, ShadowUniformInfo as Er, parseCssColor as Es, KineticMarqueeConfig as Et, describeGpu as F, Radians as Fa, GradientType as Fi, distanceToCurveParameter as Fn, WritableSignal as Fo, AudioExtractorSignalData as Fr, resolveMediaMimeType as Fs, PathChainLUTEntry as Ft, parseOBJ as G, SignalData as Ga, MAX_GRADIENT_STOPS as Gi, evaluateVolumetricFormation as Gn, dataTypeColors as Go, CannyOptions as Gr, sineSignal as Gs, SkewPropertiesSchema as Gt, lutStore as H, SignalChannelMeta as Ha, JsonValue as Hi, evaluateSkewMatrix as Hn, cosineSignal as Ho, CAPTION_LAYER_DEFAULTS as Hr, serializeSignalData as Hs, SelectorUnits as Ht, ensureDevice as I, RenderDiagnostic as Ia, HandleId as Ii, ellipseToCubicBeziers as In, XYPosition as Io, AudioExtractorSignalDataSchema as Ir, resolveNumber as Is, SelectorBasedOn as It, textureCache as J, SignalGateDataSchema as Ja, MediaMetadataSchema as Ji, getScramblePool as Jn, extractSvgDimensions as Jo, ConfigHandle as Jr, timeSignal as Js, SpringPhysics as Jt, shaderStore as K, SignalDataSchema as Ka, MIME_TYPES as Ki, generateArcLengthLUT as Kn, degrees as Ko, Color$1 as Kr, stampResult as Ks, Spatial3DProperties as Kt, initHeadlessWebGPU as L, Rgba as La, HandleLabel as Li, evaluateCubicBezier as Ln, appendOperation as Lo, BaseMediaOperationProps as Lr, resolveParam as Ls, SelectorBasedOnSchema as Lt, SphereGeometryOptions as M, ProgrammaticSignal as Ma, GeneratorSignalDataSchema as Mi, computeLineLeadingDisplacement as Mn, VisionNodeSpec as Mo, AnimationTypeSchema as Mr, registerSignalDependency as Ms, ParticleDissolveConfig as Mt, WebGPUAudioProcessor as N, ProgrammaticSignalOptions as Na, GlobalCompositeOperation as Ni, computeRangeSelectorWeight as Nn, VisionTask as No, AnyOutputUnion as Nr, reportRenderDiagnostic as Ns, ParticleDissolveConfigSchema as Nt, SignalRegistryResource as O, ParsedGradient as Oa, FrameSignal as Oi, VolumetricFormationMode as On, VideoTimingPropsSchema as Oo, Vector3Math as Or, pixels as Os, LineSpacingDynamics as Ot, buildWGSLSignalFn as P, RadialExtent as Pa, Gradient as Pi, deterministicWigglyNoise as Pn, VisionVariant as Po, AnyOutputUnionSchema as Pr, resolveBoolean as Ps, PathChainLUT as Pt, AdvancedTextAnimatorBuilder as Q, SignalStatsSchema as Qa, MediaSourceDescriptor as Qi, sampleCurveGeometry as Qn, frame as Qo, ControlNetConditioningOutputs as Qr, TextAnimatorBuilder as Qt, inputStore as R, Seconds as Ra, HandleType as Ri, evaluateCubicBezierDerivative as Rn, assertNever as Ro, BaseMediaOperationPropsSchema as Rr, resolveString as Rs, SelectorMode as Rt, Renderer2D as S, NormalizedLandmarkList as Sa, FileAssetSchema as Si, VariableFontAxes as Sn, VideoAnimationSchema as So, Path3D as Sr, nodeId as Ss, GlyphAnchorGrouping as St, SSAOPipeline as T, Output$1 as Ta, Fps as Ti, Vec2Schema as Tn, VideoSpatialPropsSchema as To, ResolvedEnvironment as Tr, oklabToRgb as Ts, GlyphAnchorPointSchema as Tt, parseFBX as U, SignalChannelMetaSchema as Ua, JsonValueSchema as Ui, evaluateSpringProgress as Un, createOutputItemSchema as Uo, COMPOSITE_OPERATIONS as Ur, signal as Us, SelectorUnitsSchema as Ut, loadOBJ as V, SignalBuilderConfig as Va, JsonObject as Vi, evaluateSelectorCombination as Vn, computed as Vo, Brand as Vr, seconds as Vs, SelectorShapeSchema as Vt, parseMTL as W, SignalContext as Wa, Landmark3D as Wi, evaluateTypewriterState as Wn, createVirtualMedia as Wo, COMPOSITOR_DEFAULTS as Wr, signalBuilder as Ws, SkewProperties as Wt, AETextAnimatorSchema as X, SignalMathDataSchema as Xa, MediaOperationSchema as Xi, parseSvgPathToCubicBeziers as Xn, formatHex as Xo, ConfigSchemaRegistry as Xr, TextAnchorConfig as Xt, AETextAnimator as Y, SignalMathData as Ya, MediaOperation as Yi, getShuffledOrder as Yn, findSourceAsset as Yo, ConfigHandleSchema as Yr, updateClockSignals as Ys, SpringPhysicsSchema as Yt, AdvancedTextAnimator as Z, SignalStats as Za, MediaService as Zi, sampleAudioSpectrumScale as Zn, fps as Zo, ConnectedInput as Zr, TextAnchorConfigSchema as Zt, Mesh3DData as _, NodeValidationFn as _a, ExportResultSchema as _i, TextWigglySelectorSchema as _n, TrackedObject as _o, LightKind as _r, isValueSignal as _s, ExpressionEvaluationContext as _t, AudioMeshDeformPipeline as a, MultiOutputGeneric as aa, DataTypeEnum as ai, TextPathOptionsSchema as an, TEXT_LAYER_DEFAULTS as ao, CatmullRomOptions as ar, getLeafMediaType as as, AnimatableGlyphPropsSchema as at, NodeAnimationTrack3D as b, NormalRelightingOptions as ba, FaceLandmarksOptions as bi, TypingCadence as bn, TransitionTypeSchema as bo, Mat4 as br, mixColors as bs, ExtendedGlyphProperties as bt, BlendMode as c, NodeInputConnection as ca, DeflickerOptions as ci, TextRangeSelector as cn, TensorFormat as co, Environment3DFog as cr, gradientStopsToOklab as cs, AudioSpectrumTypographySchema as ct, EffectPipeline as d, NodeOperation as da, DetectedObject as di, TextScrambleConfigSchema as dn, TextOperationSchema as do, FrustumPlanes as dr, hasOnlySingleSource as ds, CubicBezierSegment as dt, MediaSourceSchema as ea, DEFAULT_DURATION_MS as ei, TextCursorConfigSchema as en, SineSignalOptions as eo, waveToCubicBeziers as er, frameSignal as es, AnchorGrouping as et, GlassPipeline as f, NodeProcessorContext as fa, Effect as fi, TextSelector as fn, TextSpan as fo, GPULightData as fr, isCssGradient as fs, CubicBezierSegmentSchema as ft, Material3D as g, NodeRunFunction as ga, ExportResult as gi, TextWigglySelector as gn, TimelineTransformSchema as go, Light3DOptions as gr, isSignal as gs, EnhancedTextNodeSchema as gt, MasterAudioEntry as h, NodeResultSchema as ha, EffectDomain as hi, TextSignalSelectorSchema as hn, TimelineTransform as ho, Light3D as hr, isNormalized as hs, EnhancedTextNode as ht, AudioLatentTrackCache as i, ModerationUnrefundableError as ia, DataType as ii, TextPathOptions as in, StorageService as io, CameraShakeOptions as ir, getFingerprint as is, AnimatableGlyphProps as it, SlugPipeline as j, PoseSkeletonOptions as ja, GeneratorSignalData as ji, computeAnchorPivotOffset as jn, VisionConfig as jo, AnimationType as jr, radians as js, LongShadowConfigSchema as jt, Skeleton3D as k, ParsedGradientStop as ka, GPUTextureBinding as ki, VolumetricFormationModeSchema as kn, VirtualMediaData as ko, parseColorToRgb as kr, programmaticSignal as ks, LineSpacingDynamicsSchema as kt, Bone3D as l, NodeMetadata as la, Degrees as li, TextRangeSelectorSchema as ln, TensorNode as lo, Environment3DOptions as lr, handleId as ls, ChromaticGlitchConfig as lt, LoadModelOptions as m, NodeResult as ma, EffectConfigValue as mi, TextSignalSelector as mn, TimelineSegmentSchema as mo, LIGHT_UNIFORM_SIZE_BYTES as mr, isFrameIndex as ms, DynamicStrokePropertiesSchema as mt, AudioLatentData as n, Milliseconds as na, DEFAULT_MEDIA_DIMENSION as ni, TextCursorStyleSchema as nn, SingleOutputGenericSchema as no, Camera3D as nr, getActiveMediaMetadata as ns, AnchorPreset as nt, AudioSignalComputeConfig as o, MultiOutputGenericSchema as oa, DataTypeVal as oi, TextPathSource as on, TensorData as oo, CirclePathOptions as or, getMediaType as os, ArcLengthLUTEntry as ot, GpuAdapterDescription as p, NodeProcessorParams as pa, EffectConfig as pi, TextSelectorSchema as pn, TextSpanMark as po, HelixOptions as pr, isEqual as ps, DynamicStrokeProperties as pt, signalRegistry as q, SignalGateData as qa, MediaMetadata as qi, generatePathSegments as qn, deserializeSignalData as qo, ColorStopLike as qr, takeRenderDiagnostics as qs, Spatial3DPropertiesSchema as qt, AudioLatentEngine as r, ModerationError as ra, DataForType as ri, TextPathBuilder as rn, SourceOperationSchema as ro, Camera3DPose as rr, getFileDataMetadata as rs, AnchorPresetSchema as rt, AudioSignalComputePipeline as s, NodeId as sa, DataTypes as si, TextPathSourceSchema as sn, TensorDimensions as so, ENVIRONMENT_PRESETS as sr, getRenderFingerprint as ss, AudioSpectrumTypography as st, AnimationClip3D as t, MeshAudioDeformConfig as ta, DEFAULT_FPS as ti, TextCursorStyle as tn, SingleOutputGeneric as to, BezierSegment3D as tr, generateId as ts, AnchorGroupingSchema as tt, CylinderGeometryOptions as u, NodeMetadataSchema as ua, DepthNormalsOptions as ui, TextScrambleConfig as un, TensorPipelineConfig as uo, FrustumPlane as ur, handleLabel as us, ChromaticGlitchConfigSchema as ut, Model3DData as v, NodeVisualConfig as va, ExtendedLayer as vi, TypewriterAnimator as vn, TransitionSchema as vo, LightsUniformData as vr, isVirtualMediaData as vs, ExpressionSelector as vt, RoundedBoxGeometryOptions as w, OpticalFlowOptions as wa, FileDataSchema as wi, Vec2 as wn, VideoLayerTypeSchema as wo, Path3DSample as wr, normalized as ws, GlyphAnchorPoint as wt, RenderContextValue as x, Normalized as xa, FileAsset as xi, TypingCadenceSchema as xn, VideoAnimation as xo, Matrix4Math as xr, ms as xs, ExtendedGlyphPropertiesSchema as xt, MotionBlurPipeline as y, NodeVisualConfigSchema as ya, ExtendedLayerSchema as yi, TypewriterAnimatorSchema as yn, TransitionType as yo, MAX_LIGHTS as yr, limitGradientStops as ys, ExpressionSelectorSchema as yt, loadFBX as z, SegmentationOptions as za, HandleTypeVal as zi, evaluateExpressionSelector as zn, checkNodeResultCache as zo, BaseVideoLayerProps as zr, rgbToOklab as zs, SelectorModeSchema as zt };
6060
- //# sourceMappingURL=index-ocZc12ZS.d.mts.map
6281
+ export { AdvancedTextAnimatorSchema as $, SignalChannelMeta as $a, MediaSignalRecorder as $i, samplePathChainGeometry as $n, computed as $o, DATA_TYPE_EXTENSIONS as $r, resolveNumber as $s, TextCursorConfig as $t, SlugFontCache as A, Normalized as Aa, GPUTextureBinding as Ai, buildPathLUT as An, TransitionType as Ao, resolveEnvironment as Ar, isValueSignal as As, LongShadowConfig as At, loadModel3D as B, PoseSkeletonOptions as Ba, HandleTypeVal as Bi, evaluateMarqueeOffset as Bn, VirtualMediaData as Bo, BaseVideoLayerPropsSchema as Br, normalizeColorStops as Bs, SelectorShape as Bt, Renderer3D as C, NodeResult as Ca, FileAssetSchema as Ci, VariableFontAxesSchema as Cn, TextSpan as Co, Path3DPoint as Cr, handleLabel as Cs, GlyphAnchorGroupingSchema as Ct, SignalRegistry as D, NodeVisualConfig as Da, FrameContext as Di, VolumetricFormationConfigSchema as Dn, TimelineTransformSchema as Do, Vec3 as Dr, isFrameIndex as Ds, KineticMarqueeConfigSchema as Dt, ShadowPipeline as E, NodeValidationFn as Ea, Fps as Ei, VolumetricFormationConfig as En, TimelineTransform as Eo, ShadowUniformInfo as Er, isEqual as Es, KineticMarqueeConfig as Et, describeGpu as F, OutputItem as Fa, Gradient as Fi, distanceToCurveParameter as Fn, VideoLayerTypeSchema as Fo, AudioExtractorSignalData as Fr, mediaSourceRate as Fs, PathChainLUTEntry as Ft, parseOBJ as G, RenderDiagnostic as Ga, Landmark3D as Gi, evaluateVolumetricFormation as Gn, VisionVariant as Go, CannyOptions as Gr, pixels as Gs, SkewPropertiesSchema as Gt, lutStore as H, ProgrammaticSignalOptions as Ha, JsonObject as Hi, evaluateSkewMatrix as Hn, VisionConfig as Ho, CAPTION_LAYER_DEFAULTS as Hr, oklabToRgb as Hs, SelectorUnits as Ht, ensureDevice as I, OutputItemSchema as Ia, GradientType as Ii, ellipseToCubicBeziers as In, VideoSpatialPropsSchema as Io, AudioExtractorSignalDataSchema as Ir, mediaSourceTime as Is, SelectorBasedOn as It, textureCache as J, SampledMediaSignal as Ja, MediaMetadata as Ji, getScramblePool as Jn, appendOperation as Jo, ConfigHandle as Jr, radians as Js, SpringPhysics as Jt, shaderStore as K, ResolvedMediaTimeRemap as Ka, MAX_GRADIENT_STOPS as Ki, generateArcLengthLUT as Kn, WritableSignal as Ko, Color$1 as Kr, programmaticSignal as Ks, Spatial3DProperties as Kt, initHeadlessWebGPU as L, ParsedGradient as La, HandleId as Li, evaluateCubicBezier as Ln, VideoStylePropsSchema as Lo, BaseMediaOperationProps as Lr, mixColors as Ls, SelectorBasedOnSchema as Lt, SphereGeometryOptions as M, ObjectBoundingBox as Ma, GeneratorSignalData as Mi, computeLineLeadingDisplacement as Mn, VideoAnimation as Mo, AnimationTypeSchema as Mr, limitGradientStops as Ms, ParticleDissolveConfig as Mt, WebGPUAudioProcessor as N, OpticalFlowOptions as Na, GeneratorSignalDataSchema as Ni, computeRangeSelectorWeight as Nn, VideoAnimationSchema as No, AnyOutputUnion as Nr, mediaSourceIsHold as Ns, ParticleDissolveConfigSchema as Nt, SignalRegistryResource as O, NodeVisualConfigSchema as Oa, FrameIndex as Oi, VolumetricFormationMode as On, TrackedObject as Oo, Vector3Math as Or, isNormalized as Os, LineSpacingDynamics as Ot, buildWGSLSignalFn as P, Output$1 as Pa, GlobalCompositeOperation as Pi, deterministicWigglyNoise as Pn, VideoLayerType as Po, AnyOutputUnionSchema as Pr, mediaSourceRange as Ps, PathChainLUT as Pt, AdvancedTextAnimatorBuilder as Q, SignalBuilderConfig as Qa, MediaService as Qi, sampleCurveGeometry as Qn, computeVideoCropRenderProps as Qo, ControlNetConditioningOutputs as Qr, resolveMediaMimeType as Qs, TextAnimatorBuilder as Qt, inputStore as R, ParsedGradientStop as Ra, HandleLabel as Ri, evaluateCubicBezierDerivative as Rn, VideoTextPropsSchema as Ro, BaseMediaOperationPropsSchema as Rr, ms as Rs, SelectorMode as Rt, Renderer2D as S, NodeProcessorParams as Sa, FileAsset as Si, VariableFontAxes as Sn, TextOperationSchema as So, Path3D as Sr, handleId as Ss, GlyphAnchorGrouping as St, SSAOPipeline as T, NodeRunFunction as Ta, FileDataSchema as Ti, Vec2Schema as Tn, TimelineSegmentSchema as To, ResolvedEnvironment as Tr, isCssGradient as Ts, GlyphAnchorPointSchema as Tt, parseFBX as U, RadialExtent as Ua, JsonValue as Ui, evaluateSpringProgress as Un, VisionNodeSpec as Uo, COMPOSITE_OPERATIONS as Ur, parseCssColor as Us, SelectorUnitsSchema as Ut, loadOBJ as V, ProgrammaticSignal as Va, JsonArray as Vi, evaluateSelectorCombination as Vn, VirtualMediaDataSchema as Vo, Brand as Vr, normalized as Vs, SelectorShapeSchema as Vt, parseMTL as W, Radians as Wa, JsonValueSchema as Wi, evaluateTypewriterState as Wn, VisionTask as Wo, COMPOSITOR_DEFAULTS as Wr, parseCssGradient as Ws, SkewProperties as Wt, AETextAnimatorSchema as X, SegmentationOptions as Xa, MediaOperation as Xi, parseSvgPathToCubicBeziers as Xn, checkNodeResultCache as Xo, ConfigSchemaRegistry as Xr, reportRenderDiagnostic as Xs, TextAnchorConfig as Xt, AETextAnimator as Y, Seconds as Ya, MediaMetadataSchema as Yi, getShuffledOrder as Yn, assertNever as Yo, ConfigHandleSchema as Yr, registerSignalDependency as Ys, SpringPhysicsSchema as Yt, AdvancedTextAnimator as Z, Signal as Za, MediaOperationSchema as Zi, sampleAudioSpectrumScale as Zn, compositionFrameContext as Zo, ConnectedInput as Zr, resolveBoolean as Zs, TextAnchorConfigSchema as Zt, Mesh3DData as _, NodeInputConnection as _a, validateMediaTimeRemap as _c, ExportResult as _i, TextWigglySelectorSchema as _n, TensorData as _o, LightKind as _r, getFingerprint as _s, ExpressionEvaluationContext as _t, AudioMeshDeformPipeline as a, MediaTimeRemapInput as aa, sampleMediaSignal as ac, DataTypeEnum as ai, TextPathOptionsSchema as an, SignalGateDataSchema as ao, CatmullRomOptions as ar, deserializeSignalData as as, AnimatableGlyphPropsSchema as at, NodeAnimationTrack3D as b, NodeOperation as ba, ExtendedLayerSchema as bi, TypingCadence as bn, TensorNode as bo, Mat4 as br, getRenderFingerprint as bs, ExtendedGlyphProperties as bt, BlendMode as c, MediaTimeSignalRemap as ca, seconds as cc, DeflickerOptions as ci, TextRangeSelector as cn, SignalStats as co, Environment3DFog as cr, findSourceAsset as cs, AudioSpectrumTypographySchema as ct, EffectPipeline as d, Milliseconds as da, signalBuilder as dc, DetectedObject as di, TextScrambleConfigSchema as dn, SineSignalOptions as do, FrustumPlanes as dr, frame as ds, CubicBezierSegment as dt, MediaSourceDescriptor as ea, resolveParam as ec, DEFAULT_DURATION_MS as ei, TextCursorConfigSchema as en, SignalChannelMetaSchema as eo, waveToCubicBeziers as er, cosineSignal as es, AnchorGrouping as et, GlassPipeline as f, ModerationError as fa, sineSignal as fc, Effect as fi, TextSelector as fn, SingleOutputGeneric as fo, GPULightData as fr, frameArraySignal as fs, CubicBezierSegmentSchema as ft, Material3D as g, NodeId as ga, updateClockSignals as gc, EmojiPresentation as gi, TextWigglySelector as gn, TEXT_LAYER_DEFAULTS as go, Light3DOptions as gr, getFileDataMetadata as gs, EnhancedTextNodeSchema as gt, MasterAudioEntry as h, MultiOutputGenericSchema as ha, timeSignal as hc, EffectDomain as hi, TextSignalSelectorSchema as hn, StorageService as ho, Light3D as hr, getActiveMediaMetadata as hs, EnhancedTextNode as ht, AudioLatentTrackCache as i, MediaTimeRemap as ia, sampleFrameMediaSignal as ic, DataType as ii, TextPathOptions as in, SignalGateData as io, CameraShakeOptions as ir, degrees as is, AnimatableGlyphProps as it, SlugPipeline as j, NormalizedLandmarkList as ja, GateSignalOptions as ji, computeAnchorPivotOffset as jn, TransitionTypeSchema as jo, AnimationType as jr, isVirtualMediaData as js, LongShadowConfigSchema as jt, Skeleton3D as k, NormalRelightingOptions as ka, FrameSignal as ki, VolumetricFormationModeSchema as kn, TransitionSchema as ko, parseColorToRgb as kr, isSignal as ks, LineSpacingDynamicsSchema as kt, Bone3D as l, MediaTimeSignalRemapSchema as la, serializeSignalData as lc, Degrees as li, TextRangeSelectorSchema as ln, SignalStatsSchema as lo, Environment3DOptions as lr, formatHex as ls, ChromaticGlitchConfig as lt, LoadModelOptions as m, MultiOutputGeneric as ma, takeRenderDiagnostics as mc, EffectConfigValue as mi, TextSignalSelector as mn, SourceOperationSchema as mo, LIGHT_UNIFORM_SIZE_BYTES as mr, generateId as ms, DynamicStrokePropertiesSchema as mt, AudioLatentData as n, MediaSourceRange as na, rgbToOklab as nc, DEFAULT_MEDIA_DIMENSION as ni, TextCursorStyleSchema as nn, SignalData as no, Camera3D as nr, createVirtualMedia as ns, AnchorPreset as nt, AudioSignalComputeConfig as o, MediaTimeRemapInputSchema as oa, sampledMediaSourceRange as oc, DataTypeVal as oi, TextPathSource as on, SignalMathData as oo, CirclePathOptions as or, emojiPresentation as os, ArcLengthLUTEntry as ot, GpuAdapterDescription as p, ModerationUnrefundableError as pa, stampResult as pc, EffectConfig as pi, TextSelectorSchema as pn, SingleOutputGenericSchema as po, HelixOptions as pr, frameSignal as ps, DynamicStrokeProperties as pt, signalRegistry as q, Rgba as qa, MIME_TYPES as qi, generatePathSegments as qn, XYPosition as qo, ColorStopLike as qr, progressSignal as qs, Spatial3DPropertiesSchema as qt, AudioLatentEngine as r, MediaSourceSchema as ra, sampleColorStops as rc, DataForType as ri, TextPathBuilder as rn, SignalDataSchema as ro, Camera3DPose as rr, dataTypeColors as rs, AnchorPresetSchema as rt, AudioSignalComputePipeline as s, MediaTimeRemapSchema as sa, sampledMediaSourceTime as sc, DataTypes as si, TextPathSourceSchema as sn, SignalMathDataSchema as so, ENVIRONMENT_PRESETS as sr, extractSvgDimensions as ss, AudioSpectrumTypography as st, AnimationClip3D as t, MediaSourceInput as ta, resolveString as tc, DEFAULT_FPS as ti, TextCursorStyle as tn, SignalContext as to, BezierSegment3D as tr, createOutputItemSchema as ts, AnchorGroupingSchema as tt, CylinderGeometryOptions as u, MeshAudioDeformConfig as ua, signal as uc, DepthNormalsOptions as ui, TextScrambleConfig as un, SignalValue as uo, FrustumPlane as ur, fps as us, ChromaticGlitchConfigSchema as ut, Model3DData as v, NodeMetadata as va, ExportResultSchema as vi, TypewriterAnimator as vn, TensorDimensions as vo, LightsUniformData as vr, getLeafMediaType as vs, ExpressionSelector as vt, RoundedBoxGeometryOptions as w, NodeResultSchema as wa, FileData as wi, Vec2 as wn, TextSpanMark as wo, Path3DSample as wr, hasOnlySingleSource as ws, GlyphAnchorPoint as wt, RenderContextValue as x, NodeProcessorContext as xa, FaceLandmarksOptions as xi, TypingCadenceSchema as xn, TensorPipelineConfig as xo, Matrix4Math as xr, gradientStopsToOklab as xs, ExtendedGlyphPropertiesSchema as xt, MotionBlurPipeline as y, NodeMetadataSchema as ya, ExtendedLayer as yi, TypewriterAnimatorSchema as yn, TensorFormat as yo, MAX_LIGHTS as yr, getMediaType as ys, ExpressionSelectorSchema as yt, loadFBX as z, Pixels as za, HandleType as zi, evaluateExpressionSelector as zn, VideoTimingPropsSchema as zo, BaseVideoLayerProps as zr, nodeId as zs, SelectorModeSchema as zt };
6282
+ //# sourceMappingURL=index-B1ENegOQ.d.mts.map