framefields 2.0.9 → 2.0.11

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 (241) hide show
  1. package/README.md +17 -6
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BxA0sL9z.d.mts → audio-BHanw8Jb.d.mts} +3 -3
  5. package/dist/{audio-BxA0sL9z.d.mts.map → audio-BHanw8Jb.d.mts.map} +1 -1
  6. package/dist/{audio-Dev4NGPa.mjs → audio-COOMNwL5.mjs} +4 -4
  7. package/dist/{audio-Dev4NGPa.mjs.map → audio-COOMNwL5.mjs.map} +1 -1
  8. package/dist/{dist-CoSg-CWr.mjs → dist-BAVZdFEJ.mjs} +3 -3
  9. package/dist/{dist-CoSg-CWr.mjs.map → dist-BAVZdFEJ.mjs.map} +1 -1
  10. package/dist/{dist-DzUJmIHt.mjs → dist-BYqNNwsl.mjs} +2 -2
  11. package/dist/{dist-DzUJmIHt.mjs.map → dist-BYqNNwsl.mjs.map} +1 -1
  12. package/dist/{dist-B9Afsv83.mjs → dist-CbG3QxDw.mjs} +651 -2
  13. package/dist/dist-CbG3QxDw.mjs.map +1 -0
  14. package/dist/{dist-DgfykO99.mjs → dist-Cxi68OuY.mjs} +5347 -3286
  15. package/dist/dist-Cxi68OuY.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +4 -4
  17. package/dist/effects/index.mjs +25 -25
  18. package/dist/{effects-hxRwxjyC.mjs → effects-DzbjFhyA.mjs} +3 -3
  19. package/dist/{effects-hxRwxjyC.mjs.map → effects-DzbjFhyA.mjs.map} +1 -1
  20. package/dist/fonts/index.d.mts +2 -2
  21. package/dist/fonts/index.mjs +1 -1
  22. package/dist/{fonts-BznIea-I.mjs → fonts-C0W6TgJk.mjs} +52 -5
  23. package/dist/fonts-C0W6TgJk.mjs.map +1 -0
  24. package/dist/{index-J9CIK_nu.d.mts → index-9B8CJowc.d.mts} +2 -2
  25. package/dist/{index-J9CIK_nu.d.mts.map → index-9B8CJowc.d.mts.map} +1 -1
  26. package/dist/{index-CvDVpaKn.d.mts → index-CDoTrMs1.d.mts} +4 -4
  27. package/dist/{index-CvDVpaKn.d.mts.map → index-CDoTrMs1.d.mts.map} +1 -1
  28. package/dist/{index-BXNNJVs8.d.mts → index-CYGpSVsf.d.mts} +2 -2
  29. package/dist/{index-BXNNJVs8.d.mts.map → index-CYGpSVsf.d.mts.map} +1 -1
  30. package/dist/{index-D1zaOwEU.d.mts → index-DDEPvMww.d.mts} +520 -71
  31. package/dist/index-DDEPvMww.d.mts.map +1 -0
  32. package/dist/{index-oodg5k9K.d.mts → index-DGJp1d30.d.mts} +3 -3
  33. package/dist/{index-oodg5k9K.d.mts.map → index-DGJp1d30.d.mts.map} +1 -1
  34. package/dist/{index-fo4E7A6C.d.mts → index-DRZu3ezy.d.mts} +3 -3
  35. package/dist/{index-fo4E7A6C.d.mts.map → index-DRZu3ezy.d.mts.map} +1 -1
  36. package/dist/{index-CQcdKyxF.d.mts → index-DnWsbbuZ.d.mts} +54 -2
  37. package/dist/index-DnWsbbuZ.d.mts.map +1 -0
  38. package/dist/index.d.mts +398 -18
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +633 -57
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/preview/index.d.mts +2 -2
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-DZTbEON9.mjs → preview-BV2C4Fk6.mjs} +2 -2
  45. package/dist/{preview-DZTbEON9.mjs.map → preview-BV2C4Fk6.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-VVLM6LZ3.mjs → chunk-6256GQFP.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-VWLR2AZR.mjs → chunk-AEK5BO3J.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-YG35X5R5.mjs → chunk-AWTH2WZO.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-7DIAFPQP.mjs → chunk-ECPP3UG6.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-5JD65JSJ.mjs → chunk-FGHOHCFG.mjs} +1 -1
  51. package/dist/preview-engine/chunk-IMV5SBQV.mjs +1 -0
  52. package/dist/preview-engine/chunk-IQKIHFNZ.mjs +1 -0
  53. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +474 -0
  54. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +3 -0
  55. package/dist/preview-engine/chunk-MJM3NFEC.mjs +315 -0
  56. package/dist/preview-engine/chunk-NFAGEP43.mjs +1448 -0
  57. package/dist/preview-engine/{chunk-5PPSCISJ.mjs → chunk-Q66QQI6N.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-JAOXXYXG.mjs → chunk-QYRDQMNB.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-XCYFPA34.mjs → chunk-RJUAM52F.mjs} +1 -1
  60. package/dist/preview-engine/chunk-VRGREB3V.mjs +1 -0
  61. package/dist/preview-engine/{chunk-AW7HNZKR.mjs → chunk-Y6HWYPKX.mjs} +1 -1
  62. package/dist/preview-engine/effects.mjs +1 -1
  63. package/dist/preview-engine/fonts.mjs +1 -1
  64. package/dist/preview-engine/framefields.mjs +27 -27
  65. package/dist/preview-engine/player.mjs +1 -1
  66. package/dist/preview-engine/renderers-5BV6JGTU.mjs +248 -0
  67. package/dist/preview-engine/renderers-7X2W6QWX.mjs +1 -0
  68. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +1 -0
  69. package/dist/preview-engine/renderers-G5KQISVL.mjs +1 -0
  70. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +1 -0
  71. package/dist/preview-engine/renderers-TVTQ2R74.mjs +1 -0
  72. package/dist/preview-engine/renderers-ZIMBODX6.mjs +1 -0
  73. package/dist/{program-C797QMRL.mjs → program-BmNKgzja.mjs} +281 -23
  74. package/dist/program-BmNKgzja.mjs.map +1 -0
  75. package/dist/renderer/index.d.mts +2 -2
  76. package/dist/renderer/index.mjs +2 -2
  77. package/dist/{renderer-D-4Yh-RK.mjs → renderer-1VuQTY1Z.mjs} +2 -2
  78. package/dist/{renderer-D-4Yh-RK.mjs.map → renderer-1VuQTY1Z.mjs.map} +1 -1
  79. package/dist/renderer-6oMSare3.mjs +3 -0
  80. package/dist/renderer-B1ComPb2.mjs +3 -0
  81. package/dist/{renderer-DgSO5OO0.mjs → renderer-B1YMwl2B.mjs} +1 -1
  82. package/dist/{renderer-9QCHY8Kh.mjs → renderer-B2ieylQ3.mjs} +2 -2
  83. package/dist/{renderer-9QCHY8Kh.mjs.map → renderer-B2ieylQ3.mjs.map} +1 -1
  84. package/dist/{renderer-CuqhAB4i.mjs → renderer-B8-kzZdP.mjs} +2 -2
  85. package/dist/{renderer-CuqhAB4i.mjs.map → renderer-B8-kzZdP.mjs.map} +1 -1
  86. package/dist/{renderer-Dn8v2o9L.mjs → renderer-B8UaFNqb.mjs} +3 -3
  87. package/dist/{renderer-Dn8v2o9L.mjs.map → renderer-B8UaFNqb.mjs.map} +1 -1
  88. package/dist/{renderer-DPpgBTlK.mjs → renderer-BDbTWSpP.mjs} +3 -3
  89. package/dist/{renderer-DPpgBTlK.mjs.map → renderer-BDbTWSpP.mjs.map} +1 -1
  90. package/dist/{renderer-CrVAvP92.mjs → renderer-BIIWCg_J.mjs} +3 -3
  91. package/dist/{renderer-CrVAvP92.mjs.map → renderer-BIIWCg_J.mjs.map} +1 -1
  92. package/dist/{renderer-5jfDUKd4.mjs → renderer-BJ1aTkZf.mjs} +3 -3
  93. package/dist/{renderer-5jfDUKd4.mjs.map → renderer-BJ1aTkZf.mjs.map} +1 -1
  94. package/dist/renderer-BQ5Bz5D0.mjs +3 -0
  95. package/dist/{renderer-D6Gi_h4K.mjs → renderer-BSaYG8aw.mjs} +1 -1
  96. package/dist/{renderer-2NQWaZd7.d.mts → renderer-BTdOMMEx.d.mts} +2 -2
  97. package/dist/{renderer-2NQWaZd7.d.mts.map → renderer-BTdOMMEx.d.mts.map} +1 -1
  98. package/dist/renderer-BZcn_iBl.mjs +3 -0
  99. package/dist/{renderer-DnF3aXPX.mjs → renderer-Bc04fivZ.mjs} +3 -3
  100. package/dist/{renderer-DnF3aXPX.mjs.map → renderer-Bc04fivZ.mjs.map} +1 -1
  101. package/dist/{renderer-B1UeU7lX.mjs → renderer-BfAWZziM.mjs} +193 -12
  102. package/dist/renderer-BfAWZziM.mjs.map +1 -0
  103. package/dist/{renderer-CKJb_Lky.mjs → renderer-Bfgd4N0O.mjs} +3 -3
  104. package/dist/{renderer-CKJb_Lky.mjs.map → renderer-Bfgd4N0O.mjs.map} +1 -1
  105. package/dist/{renderer-b6sZN90h.mjs → renderer-BhZZEyFX.mjs} +2 -2
  106. package/dist/{renderer-b6sZN90h.mjs.map → renderer-BhZZEyFX.mjs.map} +1 -1
  107. package/dist/{renderer-C-PfbkPu.mjs → renderer-Bhdf90Zq.mjs} +2 -2
  108. package/dist/{renderer-C-PfbkPu.mjs.map → renderer-Bhdf90Zq.mjs.map} +1 -1
  109. package/dist/renderer-Bp6sDMa6.mjs +3 -0
  110. package/dist/renderer-Bt7_sb_Y.mjs +3 -0
  111. package/dist/{renderer-CB8hMQgm.mjs → renderer-Bv21DbWy.mjs} +1 -1
  112. package/dist/{renderer-gT0ADXMW.mjs → renderer-Bv6q84TU.mjs} +2 -2
  113. package/dist/{renderer-gT0ADXMW.mjs.map → renderer-Bv6q84TU.mjs.map} +1 -1
  114. package/dist/renderer-C606ZPUn.mjs +3 -0
  115. package/dist/renderer-C9jyKn1i.mjs +3 -0
  116. package/dist/renderer-CERfcxgv.mjs +3 -0
  117. package/dist/renderer-CG5PzNkv.mjs +3 -0
  118. package/dist/{renderer-CpUbDJAV.mjs → renderer-CI7sG_cv.mjs} +2 -2
  119. package/dist/{renderer-CpUbDJAV.mjs.map → renderer-CI7sG_cv.mjs.map} +1 -1
  120. package/dist/renderer-CPoIMVdk.mjs +3 -0
  121. package/dist/{renderer-B4ecTNR7.mjs → renderer-CWTpc4ff.mjs} +2 -2
  122. package/dist/{renderer-B4ecTNR7.mjs.map → renderer-CWTpc4ff.mjs.map} +1 -1
  123. package/dist/{renderer-D3uNI10l.mjs → renderer-CXn5HAnK.mjs} +3 -3
  124. package/dist/{renderer-D3uNI10l.mjs.map → renderer-CXn5HAnK.mjs.map} +1 -1
  125. package/dist/{renderer-DCK73tcD.mjs → renderer-C_TPMHiH.mjs} +2 -2
  126. package/dist/{renderer-DCK73tcD.mjs.map → renderer-C_TPMHiH.mjs.map} +1 -1
  127. package/dist/renderer-Ca7L1EOp.mjs +3 -0
  128. package/dist/{renderer-6PqlYQjC.mjs → renderer-CaaOKMSd.mjs} +2 -2
  129. package/dist/{renderer-6PqlYQjC.mjs.map → renderer-CaaOKMSd.mjs.map} +1 -1
  130. package/dist/{renderer-DX38J6mK.mjs → renderer-CdciwwMI.mjs} +3 -3
  131. package/dist/{renderer-DX38J6mK.mjs.map → renderer-CdciwwMI.mjs.map} +1 -1
  132. package/dist/{renderer-DRpE3ZW4.mjs → renderer-CfC_aiew.mjs} +3 -3
  133. package/dist/{renderer-DRpE3ZW4.mjs.map → renderer-CfC_aiew.mjs.map} +1 -1
  134. package/dist/{renderer-BE4Ns0nw.mjs → renderer-ChdLYS-G.mjs} +3 -3
  135. package/dist/{renderer-BE4Ns0nw.mjs.map → renderer-ChdLYS-G.mjs.map} +1 -1
  136. package/dist/renderer-Cl6GkeHx.mjs +3 -0
  137. package/dist/renderer-ClcjrFyo.mjs +3 -0
  138. package/dist/{renderer-B8gTyU3w.mjs → renderer-CnXW28b9.mjs} +2 -2
  139. package/dist/{renderer-B8gTyU3w.mjs.map → renderer-CnXW28b9.mjs.map} +1 -1
  140. package/dist/{renderer-C2gnWTQZ.mjs → renderer-Ctk2zzfy.mjs} +3 -3
  141. package/dist/{renderer-C2gnWTQZ.mjs.map → renderer-Ctk2zzfy.mjs.map} +1 -1
  142. package/dist/{renderer-EmG34sT2.mjs → renderer-CtyD_Xju.mjs} +2 -2
  143. package/dist/{renderer-EmG34sT2.mjs.map → renderer-CtyD_Xju.mjs.map} +1 -1
  144. package/dist/renderer-CySUP_wk.mjs +3 -0
  145. package/dist/renderer-D2l_Odyg.mjs +3 -0
  146. package/dist/{renderer-CckJJHbM.mjs → renderer-D2nCGcjv.mjs} +2 -2
  147. package/dist/{renderer-CckJJHbM.mjs.map → renderer-D2nCGcjv.mjs.map} +1 -1
  148. package/dist/renderer-DCPCYySt.mjs +3 -0
  149. package/dist/{renderer-BgqjWI7K.mjs → renderer-DIgsilTw.mjs} +3 -3
  150. package/dist/{renderer-BgqjWI7K.mjs.map → renderer-DIgsilTw.mjs.map} +1 -1
  151. package/dist/renderer-DIkpJEOZ.mjs +3 -0
  152. package/dist/{renderer-CxQ5v4fJ.mjs → renderer-DML9qpmS.mjs} +2 -2
  153. package/dist/{renderer-CxQ5v4fJ.mjs.map → renderer-DML9qpmS.mjs.map} +1 -1
  154. package/dist/renderer-DNSXPkf_.mjs +3 -0
  155. package/dist/renderer-DP-CvZ_Z.mjs +3 -0
  156. package/dist/renderer-DeXb8R6h.mjs +3 -0
  157. package/dist/renderer-DezO-ZaP.mjs +4 -0
  158. package/dist/renderer-DhXe04fC.mjs +3 -0
  159. package/dist/{renderer-BwmZUkvd.mjs → renderer-DirxsOjq.mjs} +2 -2
  160. package/dist/{renderer-BwmZUkvd.mjs.map → renderer-DirxsOjq.mjs.map} +1 -1
  161. package/dist/{renderer-BcPpcKDI.mjs → renderer-Djlb4TLO.mjs} +3 -3
  162. package/dist/{renderer-BcPpcKDI.mjs.map → renderer-Djlb4TLO.mjs.map} +1 -1
  163. package/dist/renderer-DnH3SI7w.mjs +3 -0
  164. package/dist/{renderer-xp_J0ln7.mjs → renderer-DpGc-N3G.mjs} +3 -3
  165. package/dist/{renderer-xp_J0ln7.mjs.map → renderer-DpGc-N3G.mjs.map} +1 -1
  166. package/dist/renderer-Dpw4oi33.mjs +3 -0
  167. package/dist/{renderer-DAFyJ4dv.mjs → renderer-DxTs4Iyi.mjs} +2 -2
  168. package/dist/{renderer-DAFyJ4dv.mjs.map → renderer-DxTs4Iyi.mjs.map} +1 -1
  169. package/dist/{renderer-BXaK02qA.mjs → renderer-Dy0utCl7.mjs} +3 -3
  170. package/dist/{renderer-BXaK02qA.mjs.map → renderer-Dy0utCl7.mjs.map} +1 -1
  171. package/dist/renderer-Md-ytU0v.mjs +3 -0
  172. package/dist/{renderer-BTYncYDf.mjs → renderer-RKsXlF_0.mjs} +43 -43
  173. package/dist/{renderer-BTYncYDf.mjs.map → renderer-RKsXlF_0.mjs.map} +1 -1
  174. package/dist/renderer-U-bhWO9Q.mjs +3 -0
  175. package/dist/{renderer-CV8diddR.mjs → renderer-WSGuj_V6.mjs} +2 -2
  176. package/dist/{renderer-CV8diddR.mjs.map → renderer-WSGuj_V6.mjs.map} +1 -1
  177. package/dist/{renderer-_bygZSKk.mjs → renderer-bsWnRNpJ.mjs} +2 -2
  178. package/dist/{renderer-_bygZSKk.mjs.map → renderer-bsWnRNpJ.mjs.map} +1 -1
  179. package/dist/{renderer-lq4n1hSS.mjs → renderer-cgxO2xN6.mjs} +3 -3
  180. package/dist/{renderer-lq4n1hSS.mjs.map → renderer-cgxO2xN6.mjs.map} +1 -1
  181. package/dist/{renderer-zvtpCnqy.mjs → renderer-dncoIVdd.mjs} +1 -1
  182. package/dist/{renderer-BpJgfBQ8.mjs → renderer-kwmlLQOO.mjs} +3 -3
  183. package/dist/{renderer-BpJgfBQ8.mjs.map → renderer-kwmlLQOO.mjs.map} +1 -1
  184. package/dist/{renderer--vY6O19V.mjs → renderer-vqkKWqa5.mjs} +2 -2
  185. package/dist/{renderer--vY6O19V.mjs.map → renderer-vqkKWqa5.mjs.map} +1 -1
  186. package/dist/renderer-zA5okHds.mjs +3 -0
  187. package/dist/{renderers-CP8CFWDs-Ciap7y_j.mjs → renderers-CP8CFWDs-DwQTx8S7.mjs} +3 -3
  188. package/dist/{renderers-CP8CFWDs-Ciap7y_j.mjs.map → renderers-CP8CFWDs-DwQTx8S7.mjs.map} +1 -1
  189. package/dist/signals/index.d.mts +5 -5
  190. package/dist/signals/index.mjs +6 -6
  191. package/dist/{signals-CsxqD2AA.mjs → signals-Bv1OweKd.mjs} +3 -3
  192. package/dist/{signals-CsxqD2AA.mjs.map → signals-Bv1OweKd.mjs.map} +1 -1
  193. package/package.json +55 -55
  194. package/dist/dist-B9Afsv83.mjs.map +0 -1
  195. package/dist/dist-DgfykO99.mjs.map +0 -1
  196. package/dist/fonts-BznIea-I.mjs.map +0 -1
  197. package/dist/index-CQcdKyxF.d.mts.map +0 -1
  198. package/dist/index-D1zaOwEU.d.mts.map +0 -1
  199. package/dist/preview-engine/chunk-BUWK5RJ4.mjs +0 -997
  200. package/dist/preview-engine/chunk-CNSHAFEA.mjs +0 -1
  201. package/dist/preview-engine/chunk-OF75EHTX.mjs +0 -418
  202. package/dist/preview-engine/chunk-UC7CSW2A.mjs +0 -1
  203. package/dist/preview-engine/chunk-WQ7BFSKF.mjs +0 -3
  204. package/dist/preview-engine/chunk-ZJFAGIOM.mjs +0 -315
  205. package/dist/preview-engine/renderers-32PIFHPS.mjs +0 -1
  206. package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +0 -1
  207. package/dist/preview-engine/renderers-CHJWUJVI.mjs +0 -1
  208. package/dist/preview-engine/renderers-CI2GXWLP.mjs +0 -1
  209. package/dist/preview-engine/renderers-EE2GFG7J.mjs +0 -1
  210. package/dist/preview-engine/renderers-LTNTQLWE.mjs +0 -248
  211. package/dist/preview-engine/renderers-UGZUPONY.mjs +0 -1
  212. package/dist/program-C797QMRL.mjs.map +0 -1
  213. package/dist/renderer-3uTfN95I.mjs +0 -3
  214. package/dist/renderer-B1UeU7lX.mjs.map +0 -1
  215. package/dist/renderer-B5GslTP-.mjs +0 -3
  216. package/dist/renderer-BUIWeIKQ.mjs +0 -3
  217. package/dist/renderer-B_LfC88A.mjs +0 -3
  218. package/dist/renderer-B_zmicsE.mjs +0 -3
  219. package/dist/renderer-BtNxtXkR.mjs +0 -3
  220. package/dist/renderer-C-sZSHtf.mjs +0 -3
  221. package/dist/renderer-C1zifktw.mjs +0 -3
  222. package/dist/renderer-CCt2XTSM.mjs +0 -3
  223. package/dist/renderer-CL3evUmF.mjs +0 -3
  224. package/dist/renderer-CMXcaArD.mjs +0 -3
  225. package/dist/renderer-CW9D5zCP.mjs +0 -3
  226. package/dist/renderer-CjY77sB_.mjs +0 -3
  227. package/dist/renderer-D1R7vBUl.mjs +0 -3
  228. package/dist/renderer-D5yawxtJ.mjs +0 -3
  229. package/dist/renderer-DC8jr1Ay.mjs +0 -3
  230. package/dist/renderer-DCv-Abvn.mjs +0 -4
  231. package/dist/renderer-DPLFhzaV.mjs +0 -3
  232. package/dist/renderer-DVsF2FDr.mjs +0 -3
  233. package/dist/renderer-DetDm3ep.mjs +0 -3
  234. package/dist/renderer-DhMhJh_G.mjs +0 -3
  235. package/dist/renderer-DhQld4Qt.mjs +0 -3
  236. package/dist/renderer-Dn3rc3ah.mjs +0 -3
  237. package/dist/renderer-Dw9LxE2f.mjs +0 -3
  238. package/dist/renderer-HvrQZw5E.mjs +0 -3
  239. package/dist/renderer-QdJE56ts.mjs +0 -3
  240. package/dist/renderer-euGyUN2O.mjs +0 -3
  241. package/dist/renderer-p3SmBFP9.mjs +0 -3
@@ -0,0 +1,474 @@
1
+ import{a as rt}from"./chunk-LKYN3BM2.mjs";import{a as St}from"./chunk-JPXQPP6J.mjs";import{c as ft,d as mt,e as L}from"./chunk-VRGREB3V.mjs";import{a as D}from"./chunk-IMV5SBQV.mjs";import{a as Pt,b as et,d as vt,e as O}from"./chunk-36YGYLKD.mjs";import{a as gt,b as xt}from"./chunk-AEK5BO3J.mjs";import{d as _,f as w,g as M,i as bt}from"./chunk-MJM3NFEC.mjs";import{d as yt}from"./chunk-HYBAPT6I.mjs";import{e as g}from"./chunk-BVF64D6H.mjs";g();var $=class{constructor(t,e){this.url=t;this.isHeadless=e}url;isHeadless;input=null;initPromise=null;iterator=null;iteratorStartTimestamp=-1;currentFetchId=0;fetchLock=Promise.resolve();destroyed=!1;async init(){if(!this.input)return this.initPromise?this.initPromise:(this.destroyed=!1,this.initPromise=(async()=>{try{let t=await O.acquire(this.url);this.destroyed?O.release(this.url):this.input=t}catch(t){throw this.initPromise=null,t}})(),this.initPromise)}destroy(){this.destroyed=!0,this.iterator?.return(),this.input&&(O.release(this.url),this.input=null),this.initPromise=null,this.onDestroy()}},it=class extends ${canvasSink=null;videoSampleSink=null;currentFrame=null;nextFrame=null;currentSample=null;nextSample=null;headlessQueue=[];isDecoding=!1;decodeBuffer=null;nextRequest=null;pushHeadlessQueue(t){let e=this.headlessQueue.findIndex(r=>r.timestamp>t.timestamp);e===-1?this.headlessQueue.push(t):this.headlessQueue.splice(e,0,t)}async fillHeadlessQueue(t){if(this.iterator)for(;this.headlessQueue.length<2;){let e=await this.iterator.next();if(this.currentFetchId!==t){e.value?.close?.();return}if(e.done||!e.value)break;this.pushHeadlessQueue(e.value)}}async closeIterator(t){if(t)try{await t.return()}catch{}}resetSinks(){let t=this.iterator;if(this.iterator=null,t)try{t.return()}catch{}this.canvasSink=null,this.videoSampleSink=null,this.currentFrame=null,this.nextFrame=null,this.currentSample?.close(),this.currentSample=null,this.nextSample?.close(),this.nextSample=null;for(let e of this.headlessQueue)try{e.close()}catch{}this.headlessQueue=[],this.decodeBuffer=null,this.iteratorStartTimestamp=-1}onDestroy(){this.resetSinks()}async startIterator(t,e){if(!this.canvasSink)return;let r=Math.max(0,Number.isFinite(t)?t:0),i=this.iterator;if(this.iterator=null,await this.closeIterator(i),this.currentFetchId!==e||this.destroyed)return;this.iterator=this.canvasSink.canvases(r);let n=await this.iterator.next();if(this.currentFetchId!==e||this.destroyed)return;this.currentFrame=n.value??null;let s=await this.iterator.next();this.currentFetchId!==e||this.destroyed||(this.nextFrame=s.value??null,this.iteratorStartTimestamp=r)}async startIteratorHeadless(t,e){if(!this.videoSampleSink)return;let r=Math.max(0,Number.isFinite(t)?t:0),i=this.iterator;if(this.iterator=null,await this.closeIterator(i),this.currentFetchId!==e||this.destroyed)return;for(let s of this.headlessQueue)s.close();this.headlessQueue=[];let n=Math.max(0,r-.1);this.iterator=this.videoSampleSink.samples(n),await this.fillHeadlessQueue(e),!(this.currentFetchId!==e||this.destroyed)&&(this.iteratorStartTimestamp=r)}async getFrame(t){if(await this.init(),this.destroyed||!this.input)return null;let e=Math.max(0,Number.isFinite(t)?t:0);return this.isDecoding?(this.nextRequest&&this.nextRequest.resolve(null),new Promise((r,i)=>{this.nextRequest={timestampSec:e,resolve:r,reject:i}})):this.executeDecode(e)}async executeDecode(t){this.isDecoding=!0;try{return await this.performDecode(t)}finally{if(this.isDecoding=!1,this.nextRequest){let e=this.nextRequest;this.nextRequest=null,this.executeDecode(e.timestampSec).then(e.resolve).catch(e.reject)}}}async performDecodeHeadless(t,e){if(!this.videoSampleSink){if(this.destroyed||!this.input)return null;let h=await this.input.getPrimaryVideoTrack();if(!h)return null;this.videoSampleSink=new Pt(h)}let r=1e-4;if((!this.iterator||t<this.iteratorStartTimestamp-r||this.headlessQueue.length>0&&t<this.headlessQueue[0].timestamp-.01||this.headlessQueue.length>0&&t-this.headlessQueue[0].timestamp>1)&&(await this.startIteratorHeadless(t,e),this.currentFetchId!==e||this.destroyed||!this.input))return null;for(;;){if(await this.fillHeadlessQueue(e),this.currentFetchId!==e||this.destroyed||!this.input)return null;if(this.headlessQueue.length>=2&&this.headlessQueue[1].timestamp<=t+r){this.headlessQueue.shift()?.close();continue}break}let s=this.headlessQueue[0];if(!s)return null;let a=s.displayWidth,o=s.displayHeight,c=a*o*4,l=this.decodeBuffer;return(!l||l.length!==c)&&(l=new Uint8Array(c),this.decodeBuffer=l),await s.copyTo(l,{format:"RGBA"}),this.currentFetchId!==e||this.destroyed||!this.input?null:{width:a,height:o,buffer:l}}async performDecodeInternal(t){this.currentFetchId++;let e=this.currentFetchId;if(this.isHeadless)return this.performDecodeHeadless(t,e);if(!this.canvasSink){if(this.destroyed||!this.input)return null;let a=await this.input.getPrimaryVideoTrack();if(!a)return null;this.canvasSink=new et(a,{poolSize:3,alpha:!0})}let r=1e-4;if((!this.iterator||t<this.iteratorStartTimestamp-r||this.currentFrame&&t<this.currentFrame.timestamp-.01||this.currentFrame&&t-this.currentFrame.timestamp>1)&&(await this.startIterator(t,e),this.currentFetchId!==e||this.destroyed||!this.input))return null;for(;this.nextFrame&&this.nextFrame.timestamp<=t+r;)if(this.currentFrame=this.nextFrame,this.nextFrame=null,this.iterator){let a=await this.iterator.next();if(this.currentFetchId!==e||this.destroyed||!this.input)return null;this.nextFrame=a.value??null}if(!this.currentFrame)return null;let s=this.currentFrame.canvas;return{width:s.width,height:s.height,canvas:s}}async performDecode(t){let e=Math.max(0,Number.isFinite(t)?t:0);try{return await this.performDecodeInternal(e)}catch(r){let i=r;if(i?.name==="InputDisposedError"||i?.message?.includes("disposed")||this.destroyed||!this.input)return null;this.resetSinks();try{if(!this.isHeadless&&this.input&&!this.destroyed){let n=await this.input.getPrimaryVideoTrack();if(n&&!this.destroyed)return this.canvasSink=new et(n,{poolSize:3,alpha:!0,decoderOptions:{hardwareAcceleration:"prefer-software"}}),await this.performDecodeInternal(e)}}catch{}throw r}}},ot=class extends ${audioSink=null;onDestroy(){this.audioSink=null}async startIterator(t,e){this.audioSink&&(this.iterator?.return(),this.iterator=this.audioSink.buffers(t),this.iteratorStartTimestamp=t)}async*getBuffers(t){try{if(await this.init(),this.destroyed||!this.input)return;if(!this.audioSink){let i=await this.input.getPrimaryAudioTrack();if(!i)return;this.audioSink=new vt(i)}(!this.iterator||Math.abs(t-this.iteratorStartTimestamp)>.05)&&(this.currentFetchId++,await this.startIterator(t,this.currentFetchId));let r=this.currentFetchId;if(!this.iterator)return;for await(let i of this.iterator){if(this.currentFetchId!==r||this.destroyed||!this.input)break;this.iteratorStartTimestamp=i.timestamp+i.duration,yield i}}catch(e){let r=e;if(r?.name==="InputDisposedError"||r?.message?.includes("disposed")||this.destroyed||!this.input)return;throw e}finally{let e=this.currentFetchId;this.currentFetchId===e&&(this.iterator=null)}}},st=class{videoDecoders=new Map;audioDecoders=new Map;lastAccessed=new Map;touchKey(t){this.lastAccessed.set(t,Date.now())}destroy(){for(let t of this.videoDecoders.values())try{t.destroy()}catch{}this.videoDecoders.clear();for(let t of this.audioDecoders.values())try{t.destroy()}catch{}this.audioDecoders.clear(),this.lastAccessed.clear()}prune(t=3e5){let e=Date.now();for(let[r,i]of this.lastAccessed.entries())if(e-i>t){let n=this.videoDecoders.get(r);n&&(n.destroy(),this.videoDecoders.delete(r));let s=this.audioDecoders.get(r);s&&(s.destroy(),this.audioDecoders.delete(r)),this.lastAccessed.delete(r)}}getVideo(t,e,r){let i=`${t}-${e}-${r??"default"}`,n=this.videoDecoders.get(i);return n||(n=new it(t,e),this.videoDecoders.set(i,n)),this.touchKey(i),this.prune(),n}getAudio(t,e){let r=`${t}-${e??"default"}`,i=this.audioDecoders.get(r);return i||(i=new ot(t,!1),this.audioDecoders.set(r,i)),this.touchKey(r),this.prune(),i}clearNode(t){for(let[e,r]of this.videoDecoders)e.includes(t)&&(r.destroy(),this.videoDecoders.delete(e),this.lastAccessed.delete(e));for(let[e,r]of this.audioDecoders)e.includes(t)&&(r.destroy(),this.audioDecoders.delete(e),this.lastAccessed.delete(e))}},Yt=new st;g();g();var Gt=`
2
+ struct CompositeUniforms {
3
+ blendMode : u32,
4
+ padding1 : u32,
5
+ padding2 : u32,
6
+ padding3 : u32,
7
+ };
8
+
9
+ @group(0) @binding(0) var<uniform> u : CompositeUniforms;
10
+ @group(1) @binding(0) var baseTex : texture_2d<f32>;
11
+ @group(1) @binding(1) var overlayTex : texture_2d<f32>;
12
+ @group(1) @binding(2) var samp : sampler;
13
+
14
+ struct VSOut {
15
+ @builtin(position) pos : vec4<f32>,
16
+ @location(0) uv : vec2<f32>,
17
+ };
18
+
19
+ @vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
20
+ var pos = array<vec2<f32>, 4>(
21
+ vec2<f32>(-1.0, 1.0),
22
+ vec2<f32>(1.0, 1.0),
23
+ vec2<f32>(-1.0, -1.0),
24
+ vec2<f32>(1.0, -1.0)
25
+ );
26
+ var uv = array<vec2<f32>, 4>(
27
+ vec2<f32>(0.0, 0.0),
28
+ vec2<f32>(1.0, 0.0),
29
+ vec2<f32>(0.0, 1.0),
30
+ vec2<f32>(1.0, 1.0)
31
+ );
32
+ return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
33
+ }
34
+
35
+ fn lum(c: vec3<f32>) -> f32 {
36
+ return 0.3 * c.r + 0.59 * c.g + 0.11 * c.b;
37
+ }
38
+
39
+ fn clip_color(c: vec3<f32>) -> vec3<f32> {
40
+ let l = lum(c);
41
+ let n = min(min(c.r, c.g), c.b);
42
+ let x = max(max(c.r, c.g), c.b);
43
+ var res = c;
44
+ if (n < 0.0) {
45
+ res = l + (((res - l) * l) / (l - n));
46
+ }
47
+ if (x > 1.0) {
48
+ res = l + (((res - l) * (1.0 - l)) / (x - l));
49
+ }
50
+ return res;
51
+ }
52
+
53
+ fn set_lum(c: vec3<f32>, l: f32) -> vec3<f32> {
54
+ let diff = l - lum(c);
55
+ return clip_color(c + vec3<f32>(diff));
56
+ }
57
+
58
+ fn sat(c: vec3<f32>) -> f32 {
59
+ return max(max(c.r, c.g), c.b) - min(min(c.r, c.g), c.b);
60
+ }
61
+
62
+ fn set_sat(c: vec3<f32>, s: f32) -> vec3<f32> {
63
+ let c_min = min(min(c.r, c.g), c.b);
64
+ let c_max = max(max(c.r, c.g), c.b);
65
+ if (c_max <= c_min) {
66
+ return vec3<f32>(0.0);
67
+ }
68
+ return (c - vec3<f32>(c_min)) * s / (c_max - c_min);
69
+ }
70
+
71
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
72
+ let d = textureSample(baseTex, samp, in.uv);
73
+ let s = textureSample(overlayTex, samp, in.uv);
74
+ let sa = s.a;
75
+ let da = d.a;
76
+
77
+ switch (u.blendMode) {
78
+ case 16u: { return d * sa; } // mask-in / destination-in
79
+ case 17u: { return d * (1.0 - sa); } // mask-out / destination-out
80
+ case 18u: { return s * da; } // source-in
81
+ case 19u: { return s * (1.0 - da); } // source-out
82
+ case 20u: { return s * da + d * (1.0 - sa); } // source-atop
83
+ case 21u: { return d + s * (1.0 - da); } // destination-over
84
+ case 22u: { return d * sa + s * (1.0 - da); } // destination-atop
85
+ case 23u: { return s + d; } // lighter
86
+ case 24u: { return s; } // copy
87
+ case 25u: { return s * (1.0 - da) + d * (1.0 - sa); } // xor
88
+ // Luma mattes: the overlay's brightness (premultiplied, so transparent = black) masks the base.
89
+ case 26u: { return d * clamp(dot(s.rgb, vec3<f32>(0.2126, 0.7152, 0.0722)), 0.0, 1.0); } // luma-in
90
+ case 27u: { return d * (1.0 - clamp(dot(s.rgb, vec3<f32>(0.2126, 0.7152, 0.0722)), 0.0, 1.0)); } // luma-out
91
+ default: {
92
+ if (sa <= 0.0) { return d; }
93
+ if (da <= 0.0) { return s; }
94
+ }
95
+ }
96
+
97
+ let s_rgb = select(s.rgb / sa, vec3<f32>(0.0), sa < 0.001);
98
+ let d_rgb = select(d.rgb / da, vec3<f32>(0.0), da < 0.001);
99
+
100
+ var b_rgb = s_rgb;
101
+
102
+ switch (u.blendMode) {
103
+ case 1u: { b_rgb = s_rgb * d_rgb; } // multiply
104
+ case 2u: { b_rgb = s_rgb + d_rgb - s_rgb * d_rgb; } // screen
105
+ case 3u: { // overlay
106
+ b_rgb = select(1.0 - 2.0 * (1.0 - s_rgb) * (1.0 - d_rgb), 2.0 * s_rgb * d_rgb, d_rgb < vec3<f32>(0.5));
107
+ }
108
+ case 4u: { b_rgb = min(s_rgb, d_rgb); } // darken
109
+ case 5u: { b_rgb = max(s_rgb, d_rgb); } // lighten
110
+ case 6u: { // color-dodge
111
+ b_rgb = select(min(d_rgb / (1.0 - s_rgb), vec3<f32>(1.0)), vec3<f32>(0.0), s_rgb == vec3<f32>(1.0));
112
+ }
113
+ case 7u: { // color-burn
114
+ b_rgb = select(1.0 - min((1.0 - d_rgb) / s_rgb, vec3<f32>(1.0)), vec3<f32>(1.0), s_rgb == vec3<f32>(0.0));
115
+ }
116
+ case 8u: { // hard-light
117
+ b_rgb = select(1.0 - 2.0 * (1.0 - s_rgb) * (1.0 - d_rgb), 2.0 * s_rgb * d_rgb, s_rgb < vec3<f32>(0.5));
118
+ }
119
+ case 9u: { // soft-light
120
+ b_rgb = select(
121
+ d_rgb + (2.0 * s_rgb - 1.0) * (sqrt(d_rgb) - d_rgb),
122
+ d_rgb - (1.0 - 2.0 * s_rgb) * d_rgb * (1.0 - d_rgb),
123
+ s_rgb <= vec3<f32>(0.5)
124
+ );
125
+ }
126
+ case 10u: { b_rgb = abs(d_rgb - s_rgb); } // difference
127
+ case 11u: { b_rgb = s_rgb + d_rgb - 2.0 * s_rgb * d_rgb; } // exclusion
128
+ case 12u: { b_rgb = set_lum(set_sat(s_rgb, sat(d_rgb)), lum(d_rgb)); } // hue
129
+ case 13u: { b_rgb = set_lum(set_sat(d_rgb, sat(s_rgb)), lum(d_rgb)); } // saturation
130
+ case 14u: { b_rgb = set_lum(s_rgb, lum(d_rgb)); } // color
131
+ case 15u: { b_rgb = set_lum(d_rgb, lum(s_rgb)); } // luminosity
132
+ case 16u: { return d * s.a; } // mask-in
133
+ case 17u: { return d * (1.0 - s.a); } // mask-out
134
+ default: { b_rgb = s_rgb; } // normal
135
+ }
136
+
137
+ let out_a = sa + da * (1.0 - sa);
138
+ let out_rgb = (1.0 - da) * s.rgb + (1.0 - sa) * d.rgb + sa * da * b_rgb;
139
+
140
+ return vec4<f32>(out_rgb, out_a);
141
+ }
142
+ `;var Ot=`
143
+ struct MotionBlur2DUniforms {
144
+ vel: vec2<f32>,
145
+ _pad: vec2<f32>,
146
+ shutterFraction: f32,
147
+ samples: f32,
148
+ viewportWidth: f32,
149
+ viewportHeight: f32,
150
+ };
151
+
152
+ @group(0) @binding(0) var<uniform> u: MotionBlur2DUniforms;
153
+ @group(1) @binding(0) var sourceTexture: texture_2d<f32>;
154
+ @group(1) @binding(1) var colorSampler: sampler;
155
+
156
+ @vertex
157
+ fn vs(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
158
+ var pos = array<vec2<f32>, 3>(
159
+ vec2<f32>(-1.0, -3.0),
160
+ vec2<f32>( 3.0, 1.0),
161
+ vec2<f32>(-1.0, 1.0)
162
+ );
163
+ return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
164
+ }
165
+
166
+ @fragment
167
+ fn fs(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
168
+ let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
169
+ let sampleCount = u32(max(u.samples, 1.0));
170
+ let velUV = u.vel * u.shutterFraction;
171
+ let halfSamples = f32(sampleCount) * 0.5;
172
+
173
+ var accum = vec4<f32>(0.0);
174
+ var totalWeight = 0.0;
175
+
176
+ for (var i = 0u; i < sampleCount; i = i + 1u) {
177
+ let t = (f32(i) - halfSamples) / max(halfSamples, 1.0);
178
+ let sampleUV = clamp(uv + velUV * t, vec2<f32>(0.0), vec2<f32>(1.0));
179
+ let w = exp(-2.5 * t * t);
180
+ accum += textureSampleLevel(sourceTexture, colorSampler, sampleUV, 0.0) * w;
181
+ totalWeight += w;
182
+ }
183
+
184
+ return accum / max(totalWeight, 0.0001);
185
+ }
186
+ `,nt=class{textures=[];texturesByKey=new Map;index=0;getTexture(t,e,r,i,n){let s=new Set(Array.isArray(n)?n:n?[n]:[]),a=`${e}x${r}:${i}`,o=this.texturesByKey.get(a);if(o)for(let l=0;l<o.length;l++){let h=o[l];if(!s.has(h)){o.splice(l,1),o.unshift(h);let p=this.textures.indexOf(h);return p>=this.index&&(this.textures.splice(p,1),this.textures.splice(this.index,0,h),this.index++),h}}let c=t.createTexture({size:[e,r],format:i,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});return this.texturesByKey.has(a)||this.texturesByKey.set(a,[]),this.texturesByKey.get(a).unshift(c),this.textures.splice(this.index,0,c),this.index++,c}reset(){this.index=0}destroy(){for(let t of this.textures)t.destroy();this.textures=[],this.texturesByKey.clear(),this.index=0}},$t={normal:0,"source-over":0,multiply:1,screen:2,overlay:3,darken:4,lighten:5,"color-dodge":6,"color-burn":7,"hard-light":8,"soft-light":9,difference:10,exclusion:11,hue:12,saturation:13,color:14,luminosity:15,"mask-in":16,"destination-in":16,"mask-out":17,"destination-out":17,"source-in":18,"source-out":19,"source-atop":20,"destination-over":21,"destination-atop":22,lighter:23,copy:24,xor:25,"luma-in":26,"luma-out":27},A=class{device;compositeUniformLayout;dualTextureLayout;motionBlurUniformLayout;singleTextureLayout;compositePipeline;motionBlurPipeline;compositePool;motionBlurPool;texturePool;compositeUniformBindGroupCache=new M;motionBlurUniformBindGroupCache=new M;compositeData=new Uint32Array(4);motionBlurData=new Float32Array(8);constructor(t,e){this.device=t,this.compositePool=new w(1024,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.motionBlurPool=new w(1024,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.texturePool=new nt,this.compositeUniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.dualTextureLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),this.motionBlurUniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.singleTextureLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]});let r=t.createPipelineLayout({bindGroupLayouts:[this.compositeUniformLayout,this.dualTextureLayout]}),i=t.createShaderModule({label:"composite.wgsl",code:Gt});this.compositePipeline=t.createRenderPipeline({label:"CompositePipeline",layout:r,vertex:{module:i,entryPoint:"vs"},fragment:{module:i,entryPoint:"fs",targets:[{format:e}]},primitive:{topology:"triangle-strip"}});let n=t.createPipelineLayout({bindGroupLayouts:[this.motionBlurUniformLayout,this.singleTextureLayout]}),s=t.createShaderModule({label:"motion-blur-2d.wgsl",code:Ot});this.motionBlurPipeline=t.createRenderPipeline({label:"MotionBlurPipeline",layout:n,vertex:{module:s,entryPoint:"vs"},fragment:{module:s,entryPoint:"fs",targets:[{format:e}]},primitive:{topology:"triangle-list"}})}resetPools(){this.compositePool.reset(),this.motionBlurPool.reset(),this.texturePool.reset()}getTexture(t,e,r,i,n){return this.texturePool.getTexture(t,e,r,i,n)}getBuffer(t,e){return this.compositePool.getBuffer(t,e)}composite(t,e,r,i,n,s,a,o){let c=r.getSampler(this.device),l=[i,n];o&&(Array.isArray(o)?l.push(...o):l.push(o));let h=this.texturePool.getTexture(this.device,i.width,i.height,a,l);this.compositeData[0]=$t[s]??0;let p=this.compositePool.getBuffer(this.device,this.compositeData),f=t.beginRenderPass({colorAttachments:[{view:h.createView(),loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});f.setPipeline(this.compositePipeline);let d=this.compositeUniformBindGroupCache.getBindGroup(this.device,this.compositeUniformLayout,p);f.setBindGroup(0,d);let m=e.getCompositeBindGroup(this.device,this.dualTextureLayout,i,n,c);return f.setBindGroup(1,m),f.draw(4),f.end(),h}applyMotionBlur(t,e,r,i,n,s,a=180,o=16,c,l){if(Math.abs(n)<.1&&Math.abs(s)<.1||a<=0)return i;let h=r.getSampler(this.device),p=[i];l&&(Array.isArray(l)?p.push(...l):p.push(l));let f=this.texturePool.getTexture(this.device,i.width,i.height,c,p);this.motionBlurData[0]=n/i.width,this.motionBlurData[1]=s/i.height,this.motionBlurData[2]=0,this.motionBlurData[3]=0,this.motionBlurData[4]=a/360,this.motionBlurData[5]=o,this.motionBlurData[6]=i.width,this.motionBlurData[7]=i.height;let d=this.motionBlurPool.getBuffer(this.device,this.motionBlurData),m=t.beginRenderPass({colorAttachments:[{view:f.createView(),loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});m.setPipeline(this.motionBlurPipeline);let y=this.motionBlurUniformBindGroupCache.getBindGroup(this.device,this.motionBlurUniformLayout,d);return m.setBindGroup(0,y),m.setBindGroup(1,e.getBindGroup(this.device,this.singleTextureLayout,i,h)),m.draw(3),m.end(),f}destroy(){this.compositePool.destroy(),this.motionBlurPool.destroy(),this.texturePool.destroy(),this.compositeUniformBindGroupCache.destroy(),this.motionBlurUniformBindGroupCache.destroy()}};g();g();var E=class{cache=new WeakMap;dualCache=new WeakMap;getBindGroup(t,e,r,i){let n=this.cache.get(r);n||(n=new Map,this.cache.set(r,n));let s=n.get(e);return s||(s=t.createBindGroup({layout:e,entries:[{binding:0,resource:r.createView()},{binding:1,resource:i}]}),n.set(e,s)),s}getCompositeBindGroup(t,e,r,i,n){let s=this.dualCache.get(r);s||(s=new WeakMap,this.dualCache.set(r,s));let a=s.get(i);a||(a=new Map,s.set(i,a));let o=a.get(e);return o||(o=t.createBindGroup({layout:e,entries:[{binding:0,resource:r.createView()},{binding:1,resource:i.createView()},{binding:2,resource:n}]}),a.set(e,o)),o}destroy(){this.cache=new WeakMap,this.dualCache=new WeakMap}};g();var I=class{scissorStack=[];stencilStack=[];pushScissor(t,e,r){this.scissorStack.push({rect:t,surfaceWidth:e,surfaceHeight:r})}popScissor(){this.scissorStack.length>0&&this.scissorStack.pop()}saveScissors(){return[...this.scissorStack]}restoreScissors(t){this.scissorStack=[...t]}clearScissors(){this.scissorStack=[]}getCurrentScissor(t,e){let r=this.scissorStack[this.scissorStack.length-1];if(r&&!(t!==void 0&&e!==void 0&&r.surfaceWidth!==void 0&&r.surfaceHeight!==void 0&&r.surfaceWidth!==0&&r.surfaceHeight!==0&&(r.surfaceWidth!==t||r.surfaceHeight!==e)))return r.rect}pushStencilClip(t){this.stencilStack.push(t)}popStencilClip(){this.stencilStack.length>0&&this.stencilStack.pop()}getCurrentStencil(){return this.stencilStack[this.stencilStack.length-1]}applyScissorToPass(t,e,r){let i=this.getCurrentScissor(e,r);if(!i){t.setScissorRect(0,0,Math.max(1,Math.floor(e)),Math.max(1,Math.floor(r)));return}let n=Math.max(0,Math.floor(i.x)),s=Math.max(0,Math.floor(i.y)),a=Math.min(e,Math.ceil(i.x+i.width)),o=Math.min(r,Math.ceil(i.y+i.height)),c=Math.max(0,a-n),l=Math.max(0,o-s);if(!Number.isFinite(n)||!Number.isFinite(s)||!Number.isFinite(c)||!Number.isFinite(l)||c<=0||l<=0)t.setScissorRect(0,0,1,1);else{let h=Math.min(c,Math.max(0,e-n)),p=Math.min(l,Math.max(0,r-s));h<=0||p<=0?t.setScissorRect(0,0,1,1):t.setScissorRect(Math.floor(n),Math.floor(s),Math.floor(h),Math.floor(p))}}destroy(){this.scissorStack=[],this.stencilStack=[]}};g();function wt(u,t,e,r,i=24){let n=[],s=u;for(let a=1;a<=i;a++){let o=a/i,c=1-o,l=c*c,h=l*c,p=o*o,f=p*o,d={x:h*u.x+3*l*o*t.x+3*c*p*e.x+f*r.x,y:h*u.y+3*l*o*t.y+3*c*p*e.y+f*r.y};n.push({p0:s,p1:d}),s=d}return n}function Ut(u,t,e,r=16){let i=[],n=u;for(let s=1;s<=r;s++){let a=s/r,o=1-a,c=o*o,l=a*a,h={x:c*u.x+2*o*a*t.x+l*e.x,y:c*u.y+2*o*a*t.y+l*e.y};i.push({p0:n,p1:h}),n=h}return i}function At(u,t,e,r,i,n,s){let a=Math.abs(t),o=Math.abs(e);if(a<1e-9||o<1e-9)return[{p0:u,p1:s}];if(Math.hypot(s.x-u.x,s.y-u.y)<1e-9)return[];let c=r*Math.PI/180,l=Math.cos(c),h=Math.sin(c),p=(u.x-s.x)/2,f=(u.y-s.y)/2,d=l*p+h*f,m=-h*p+l*f,y=d*d/(a*a)+m*m/(o*o);y>1&&(a*=Math.sqrt(y),o*=Math.sqrt(y));let x=a*a*o*o-a*a*m*m-o*o*d*d,P=a*a*m*m+o*o*d*d,v=(i===n?-1:1)*Math.sqrt(Math.max(0,x/P)),b=v*a*m/o,S=-v*o*d/a,U=l*b-h*S+(u.x+s.x)/2,k=h*b+l*S+(u.y+s.y)/2,Z=(C,T,F,R)=>Math.atan2(C*R-T*F,C*F+T*R),J=Z(1,0,(d-b)/a,(m-S)/o),B=Z((d-b)/a,(m-S)/o,(-d-b)/a,(-m-S)/o);!n&&B>0&&(B-=2*Math.PI),n&&B<0&&(B+=2*Math.PI);let tt=Math.max(4,Math.ceil(Math.abs(B)/(2*Math.PI)*64)),ht=[],pt=u;for(let C=1;C<=tt;C++){let T=J+B*C/tt,F=a*Math.cos(T),R=o*Math.sin(T),dt=C===tt?s:{x:l*F-h*R+U,y:h*F+l*R+k};ht.push({p0:pt,p1:dt}),pt=dt}return ht}function V(u){let t=[];if(!u||typeof u!="string")return t;let e=[],r=/([a-df-z])|([-+]?(?:\d*\.\d+|\d+)(?:[eE][-+]?\d+)?)/gi,i;for(;(i=r.exec(u))!==null;)i[1]?e.push(i[1]):i[2]&&e.push(parseFloat(i[2]));let n=0,s={x:0,y:0},a={x:0,y:0},o=null,c=null;for(;n<e.length;){let l=e[n++];if(typeof l!="string")continue;let h=l,p=h===h.toLowerCase(),f=h.toUpperCase(),d=()=>n<e.length&&typeof e[n]=="number"?e[n++]:0;switch(f){case"M":{let m=!0;for(;n<e.length&&typeof e[n]=="number";){let y=d(),x=d();p&&(y+=s.x,x+=s.y),m?(s={x:y,y:x},a={x:y,y:x},m=!1):(t.push({p0:s,p1:{x:y,y:x}}),s={x:y,y:x})}o=null,c=null;break}case"L":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d();p&&(m+=s.x,y+=s.y),t.push({p0:s,p1:{x:m,y}}),s={x:m,y}}o=null,c=null;break}case"H":{for(;n<e.length&&typeof e[n]=="number";){let m=d();p&&(m+=s.x);let y={x:m,y:s.y};t.push({p0:s,p1:y}),s=y}o=null,c=null;break}case"V":{for(;n<e.length&&typeof e[n]=="number";){let m=d();p&&(m+=s.y);let y={x:s.x,y:m};t.push({p0:s,p1:y}),s=y}o=null,c=null;break}case"C":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d(),x=d(),P=d(),v=d(),b=d();p&&(m+=s.x,y+=s.y,x+=s.x,P+=s.y,v+=s.x,b+=s.y);let S={x:m,y},U={x,y:P},k={x:v,y:b};t.push(...wt(s,S,U,k)),s=k,o=U}c=null;break}case"S":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d(),x=d(),P=d();p&&(m+=s.x,y+=s.y,x+=s.x,P+=s.y);let v;o?v={x:2*s.x-o.x,y:2*s.y-o.y}:v={x:s.x,y:s.y};let b={x:m,y},S={x,y:P};t.push(...wt(s,v,b,S)),s=S,o=b}c=null;break}case"Q":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d(),x=d(),P=d();p&&(m+=s.x,y+=s.y,x+=s.x,P+=s.y);let v={x:m,y},b={x,y:P};t.push(...Ut(s,v,b)),s=b,c=v}o=null;break}case"T":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d();p&&(m+=s.x,y+=s.y);let x;c?x={x:2*s.x-c.x,y:2*s.y-c.y}:x={x:s.x,y:s.y};let P={x:m,y};t.push(...Ut(s,x,P)),s=P,c=x}o=null;break}case"A":{for(;n<e.length&&typeof e[n]=="number";){let m=d(),y=d(),x=d(),P=d()!==0,v=d()!==0,b=d(),S=d();p&&(b+=s.x,S+=s.y);let U={x:b,y:S};t.push(...At(s,m,y,x,P,v,U)),s=U}o=null,c=null;break}case"Z":{Math.hypot(s.x-a.x,s.y-a.y)>1e-5&&t.push({p0:s,p1:a}),s=a,o=null,c=null;break}default:break}}return t}function W(u,t,e,r=0){if(u.length===0)return[];let i=[],n=0;for(let l of u){let h=Math.hypot(l.p1.x-l.p0.x,l.p1.y-l.p0.y);i.push(h),n+=h}if(n<1e-6)return[];let s=Math.abs(r)>1?r%360/360:r,a=(t+s)%1,o=(e+s)%1;a<0&&(a+=1),o<0&&(o+=1);let c=(l,h)=>{if(l>=h)return[];let p=[],f=0;for(let d=0;d<u.length;d++){let m=u[d],y=i[d],x=f,P=f+y;if(f=P,P<=l||x>=h||y<1e-6)continue;let v=Math.max(0,(l-x)/y),b=Math.min(1,(h-x)/y);if(b>v){let S={x:m.p0.x+(m.p1.x-m.p0.x)*v,y:m.p0.y+(m.p1.y-m.p0.y)*v},U={x:m.p0.x+(m.p1.x-m.p0.x)*b,y:m.p0.y+(m.p1.y-m.p0.y)*b};p.push({p0:S,p1:U})}}return p};if(t===0&&e===1&&r===0)return[...u];if(Math.abs(a-o)<1e-5)return[];if(a<=o)return c(a*n,o*n);{let l=c(a*n,n),h=c(0,o*n);return[...l,...h]}}function at(u,t,e=0){if(u.length===0||t.length===0)return u;let r=0;for(let f of t)r+=f;if(r<1e-5)return u;let i=0,n=[];for(let f of u){let d=Math.hypot(f.p1.x-f.p0.x,f.p1.y-f.p0.y);n.push(d),i+=d}let s=[],a=(e%r+r)%r,o=0,c=!0,l=a;for(;l>t[o];)l-=t[o],o=(o+1)%t.length,c=!c;let h=t[o]-l,p=0;for(;p<i;){let f=Math.min(h,i-p);if(c&&f>1e-4){let d=W(u,p/i,(p+f)/i);s.push(...d)}p+=f,o=(o+1)%t.length,c=!c,h=t[o]}return s}function Bt(u,t,e=0,r=0,i=0,n=0){let s=Math.min(u/2,t/2),a=Math.min(e,s),o=Math.min(r,s),c=Math.min(i,s),l=Math.min(n,s);return a===0&&o===0&&c===0&&l===0?`M 0 0 L ${u} 0 L ${u} ${t} L 0 ${t} Z`:[`M ${a} 0`,`L ${u-o} 0`,o>0?`Q ${u} 0 ${u} ${o}`:`L ${u} 0`,`L ${u} ${t-c}`,c>0?`Q ${u} ${t} ${u-c} ${t}`:`L ${u} ${t}`,`L ${l} ${t}`,l>0?`Q 0 ${t} 0 ${t-l}`:`L 0 ${t}`,`L 0 ${a}`,a>0?`Q 0 0 ${a} 0`:"L 0 0","Z"].join(" ")}function Et(u,t){let e=Math.min(u,t)/2,r=u/2,i=t/2,n=e*.5522847498;return[`M ${r} ${i-e}`,`C ${r+n} ${i-e} ${r+e} ${i-n} ${r+e} ${i}`,`C ${r+e} ${i+n} ${r+n} ${i+e} ${r} ${i+e}`,`C ${r-n} ${i+e} ${r-e} ${i+n} ${r-e} ${i}`,`C ${r-e} ${i-n} ${r-n} ${i-e} ${r} ${i-e}`,"Z"].join(" ")}function It(u,t){let e=u/2,r=t/2,i=e,n=r,s=e*.5522847498,a=r*.5522847498;return[`M ${i} ${n-r}`,`C ${i+s} ${n-r} ${i+e} ${n-a} ${i+e} ${n}`,`C ${i+e} ${n+a} ${i+s} ${n+r} ${i} ${n+r}`,`C ${i-s} ${n+r} ${i-e} ${n+a} ${i-e} ${n}`,`C ${i-e} ${n-a} ${i-s} ${n-r} ${i} ${n-r}`,"Z"].join(" ")}function Vt(u,t,e=5){let r=Math.max(3,e),i=Math.min(u,t)/2,n=u/2,s=t/2,a=[];for(let o=0;o<r;o++){let c=-Math.PI/2+o*2*Math.PI/r;a.push({x:n+i*Math.cos(c),y:s+i*Math.sin(c)})}return a.map((o,c)=>`${c===0?"M":"L"} ${o.x} ${o.y}`).join(" ")+" Z"}function Wt(u,t,e=5,r=.5){let i=Math.max(3,e),n=Math.min(u,t)/2,s=n*Math.max(.01,Math.min(.99,r)),a=u/2,o=t/2,c=[];for(let l=0;l<i*2;l++){let h=-Math.PI/2+l*Math.PI/i,p=l%2===0?n:s;c.push({x:a+p*Math.cos(h),y:o+p*Math.sin(h)})}return c.map((l,h)=>`${h===0?"M":"L"} ${l.x} ${l.y}`).join(" ")+" Z"}function zt(u,t,e=40,r=40,i=20){let n=Math.min(e,t),s=Math.min(r,u),a=Math.min(i,n),o=t/2;return[`M 0 ${o-a/2}`,`L ${u-s} ${o-a/2}`,`L ${u-s} ${o-n/2}`,`L ${u} ${o}`,`L ${u-s} ${o+n/2}`,`L ${u-s} ${o+a/2}`,`L 0 ${o+a/2}`,"Z"].join(" ")}function ut(u){let{shapeType:t,width:e,height:r}=u;switch(t){case"rect":return Bt(e,r,u.cornerRadius??0,u.cornerRadius??0,u.cornerRadius??0,u.cornerRadius??0);case"circle":return Et(e,r);case"ellipse":return It(e,r);case"polygon":return Vt(e,r,u.polygonSides??5);case"star":return Wt(e,r,u.starPoints??5,u.starInnerRadiusRatio??.5);case"arrow":return zt(e,r,u.arrowHeadWidth??40,u.arrowHeadLength??40,u.arrowShaftWidth??20);case"path":return u.path??"";default:return""}}function Mt(u){if(u.length<3)return[];if(u.length===3)return[u[0],u[1],u[2]];let t=[...u],e=t[t.length-1],r=t[0];if(Math.hypot(e.x-r.x,e.y-r.y)<1e-5&&t.pop(),t.length<3)return[];let i=0;for(let h=0;h<t.length;h++){let p=(h+1)%t.length;i+=t[h].x*t[p].y-t[p].x*t[h].y}i<0&&t.reverse();let n=(h,p,f,d)=>{let m=(f.x-p.x)*(h.y-p.y)-(f.y-p.y)*(h.x-p.x),y=(d.x-f.x)*(h.y-f.y)-(d.y-f.y)*(h.x-f.x),x=(p.x-d.x)*(h.y-d.y)-(p.y-d.y)*(h.x-d.x);return m>=-1e-6&&y>=-1e-6&&x>=-1e-6},s=(h,p,f,d)=>{if((p.x-h.x)*(f.y-h.y)-(p.y-h.y)*(f.x-h.x)<=1e-7)return!1;for(let y of d)if(!(y===h||y===p||y===f)&&n(y,h,p,f))return!1;return!0},a=[],o=[...t],c=0,l=o.length*o.length*2;for(;o.length>3&&c<l;){c++;let h=!1;for(let p=0;p<o.length;p++){let f=o[(p-1+o.length)%o.length],d=o[p],m=o[(p+1)%o.length];if(s(f,d,m,o)){a.push(f,d,m),o.splice(p,1),h=!0;break}}h||(a.push(o[0],o[1],o[2]),o.splice(1,1))}return o.length===3&&a.push(o[0],o[1],o[2]),a}function Dt(u){let{shapeType:t,width:e,height:r}=u;if(t==="rect"){let i=u.cornerRadius??0;if(i<=0)return new Float32Array([0,0,e,0,e,r,0,0,e,r,0,r]);let n=Bt(e,r,i,i,i,i),a=V(n).map(l=>l.p0),o=Mt(a),c=new Float32Array(o.length*2);for(let l=0;l<o.length;l++)c[l*2]=o[l].x,c[l*2+1]=o[l].y;return c}if(t==="circle"||t==="ellipse"){let i=e/2,n=r/2,s=t==="circle"?Math.min(e,r)/2:e/2,a=t==="circle"?s:r/2,o=48,c=new Float32Array(o*3*2),l=0;for(let h=0;h<o;h++){let p=h*2*Math.PI/o,f=(h+1)*2*Math.PI/o;c[l++]=i,c[l++]=n,c[l++]=i+s*Math.cos(p),c[l++]=n+a*Math.sin(p),c[l++]=i+s*Math.cos(f),c[l++]=n+a*Math.sin(f)}return c}if(t==="polygon"){let i=Math.max(3,u.polygonSides??5),n=Math.min(e,r)/2,s=e/2,a=r/2,o=new Float32Array(i*3*2),c=0;for(let l=0;l<i;l++){let h=-Math.PI/2+l*2*Math.PI/i,p=-Math.PI/2+(l+1)*2*Math.PI/i;o[c++]=s,o[c++]=a,o[c++]=s+n*Math.cos(h),o[c++]=a+n*Math.sin(h),o[c++]=s+n*Math.cos(p),o[c++]=a+n*Math.sin(p)}return o}if(t==="star"){let i=Math.max(3,u.starPoints??5),n=Math.min(e,r)/2,s=n*Math.max(.01,Math.min(.99,u.starInnerRadiusRatio??.5)),a=e/2,o=r/2,c=i*2,l=new Float32Array(c*3*2),h=0;for(let p=0;p<c;p++){let f=-Math.PI/2+p*Math.PI/i,d=-Math.PI/2+(p+1)*Math.PI/i,m=p%2===0?n:s,y=(p+1)%2===0?n:s;l[h++]=a,l[h++]=o,l[h++]=a+m*Math.cos(f),l[h++]=o+m*Math.sin(f),l[h++]=a+y*Math.cos(d),l[h++]=o+y*Math.sin(d)}return l}if(t==="arrow"){let i=Math.min(u.arrowHeadWidth??40,r),n=Math.min(u.arrowHeadLength??40,e),s=Math.min(u.arrowShaftWidth??20,i),a=r/2,o=0,c=e-n,l=e,h=a-s/2,p=a+s/2,f=a-i/2,d=a+i/2;return new Float32Array([o,h,c,h,c,p,o,h,c,p,o,p,c,f,l,a,c,d])}if(t==="path"&&u.path){let i=V(u.path);if(i.length===0)return new Float32Array(0);let n=i.map(o=>o.p0),s=Mt(n),a=new Float32Array(s.length*2);for(let o=0;o<s.length;o++)a[o*2]=s[o].x,a[o*2+1]=s[o].y;return a}return new Float32Array(0)}g();g();var Ct=`
187
+ struct Uniforms {
188
+ transformCol0 : vec4<f32>,
189
+ transformCol1 : vec4<f32>,
190
+ transformCol2 : vec4<f32>,
191
+ params : vec4<f32>, // x = opacity, y = surfaceWidth, z = surfaceHeight, w = strokeWidth
192
+ color : vec4<f32>,
193
+ style : vec4<f32>, // x = capType (0 = round, 1 = butt, 2 = square)
194
+ p0 : vec2<f32>,
195
+ p1 : vec2<f32>,
196
+ };
197
+
198
+ @group(0) @binding(0) var<uniform> u : Uniforms;
199
+
200
+ struct VSOut {
201
+ @builtin(position) pos : vec4<f32>,
202
+ @location(0) localPos : vec2<f32>,
203
+ };
204
+
205
+ @vertex fn vs(@location(0) xy : vec2<f32>) -> VSOut {
206
+ let transform = mat3x3<f32>(u.transformCol0.xyz, u.transformCol1.xyz, u.transformCol2.xyz);
207
+ let p = transform * vec3<f32>(xy, 1.0);
208
+
209
+ let surfaceSize = u.params.yz;
210
+ let clipX = (p.x / surfaceSize.x) * 2.0 - 1.0;
211
+ let clipY = 1.0 - (p.y / surfaceSize.y) * 2.0;
212
+
213
+ return VSOut(vec4<f32>(clipX, clipY, 0.0, 1.0), xy);
214
+ }
215
+
216
+ fn sdSegmentWithCap(p: vec2<f32>, a: vec2<f32>, b: vec2<f32>, radius: f32, capType: f32) -> f32 {
217
+ let ba = b - a;
218
+ let len = length(ba);
219
+ if (len < 1e-6) {
220
+ return length(p - a) - radius;
221
+ }
222
+ let dir = ba / len;
223
+ let normal = vec2<f32>(-dir.y, dir.x);
224
+ let pa = p - a;
225
+
226
+ let proj = dot(pa, dir);
227
+ let perp = abs(dot(pa, normal));
228
+
229
+ if (capType > 0.5 && capType < 1.5) {
230
+ // Butt cap: terminates strictly at endpoints a and b
231
+ let dx = max(-proj, proj - len);
232
+ let dy = perp - radius;
233
+ let outside = length(max(vec2<f32>(dx, dy), vec2<f32>(0.0, 0.0)));
234
+ let inside = min(max(dx, dy), 0.0);
235
+ return outside + inside;
236
+ } else if (capType >= 1.5) {
237
+ // Square cap: extends past endpoints a and b by radius
238
+ let dx = max(-proj - radius, proj - (len + radius));
239
+ let dy = perp - radius;
240
+ let outside = length(max(vec2<f32>(dx, dy), vec2<f32>(0.0, 0.0)));
241
+ let inside = min(max(dx, dy), 0.0);
242
+ return outside + inside;
243
+ } else {
244
+ // Round cap (default)
245
+ let h = clamp(proj / len, 0.0, 1.0);
246
+ return length(pa - ba * h) - radius;
247
+ }
248
+ }
249
+
250
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
251
+ let radius = u.params.w * 0.5;
252
+ let d = sdSegmentWithCap(in.localPos, u.p0, u.p1, radius, u.style.x);
253
+
254
+ let fw = max(fwidth(d), 1e-5);
255
+ let edgeAlpha = clamp(0.5 - d / fw, 0.0, 1.0);
256
+ let alpha = u.color.a * u.params.x * edgeAlpha;
257
+ if (alpha <= 0.0) {
258
+ discard;
259
+ }
260
+
261
+ return vec4<f32>(u.color.rgb * alpha, alpha);
262
+ }
263
+ `;var z=class{device;pipeline;maxPipeline;uniformLayout;uniformPool;vertexPool;uniformBindGroupCache=new M;scratchData=new Float32Array(28);constructor(t,e){this.device=t,this.uniformPool=new w(4096,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.vertexPool=new w(4096,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let r=t.createShaderModule({label:"path.wgsl",code:Ct});this.uniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.pipeline=t.createRenderPipeline({label:"PathPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.uniformLayout]}),vertex:{module:r,entryPoint:"vs",buffers:[{arrayStride:8,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]}]},fragment:{module:r,entryPoint:"fs",targets:[{format:e,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}}),this.maxPipeline=t.createRenderPipeline({label:"PathPipeline.max",layout:t.createPipelineLayout({bindGroupLayouts:[this.uniformLayout]}),vertex:{module:r,entryPoint:"vs",buffers:[{arrayStride:8,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]}]},fragment:{module:r,entryPoint:"fs",targets:[{format:e,blend:{color:{srcFactor:"one",dstFactor:"one",operation:"max"},alpha:{srcFactor:"one",dstFactor:"one",operation:"max"}}}]},primitive:{topology:"triangle-strip"}})}resetPools(){this.uniformPool.reset(),this.vertexPool.reset()}drawPath(t,e,r,i,n,s,a,o){let c=V(r);if(c.length===0||((o?.trimStart!==void 0||o?.trimEnd!==void 0||o?.trimOffset!==void 0)&&(c=W(c,o.trimStart??0,o.trimEnd??1,o.trimOffset??0)),o?.strokeDashArray&&o.strokeDashArray.length>0&&(c=at(c,o.strokeDashArray,o.strokeDashOffset??0)),c.length===0))return;let l=D(i),h=o?.opacity??1,p=0;o?.strokeLineCap==="butt"?p=1:o?.strokeLineCap==="square"&&(p=2);for(let f of c)this.drawSegment(t,e,f.p0,f.p1,l,n,p,s,a,h,o)}drawSegments(t,e,r,i,n,s,a,o){let c=r;if((o?.trimStart!==void 0||o?.trimEnd!==void 0||o?.trimOffset!==void 0)&&(c=W(c,o.trimStart??0,o.trimEnd??1,o.trimOffset??0)),o?.strokeDashArray&&o.strokeDashArray.length>0&&(c=at(c,o.strokeDashArray,o.strokeDashOffset??0)),c.length===0)return;let l=D(i),h=o?.opacity??1,p=0;o?.strokeLineCap==="butt"?p=1:o?.strokeLineCap==="square"&&(p=2);for(let f of c)this.drawSegment(t,e,f.p0,f.p1,l,n,p,s,a,h,o)}drawSegment(t,e,r,i,n,s,a,o,c,l,h){let p=this.scratchData;e.packIntoBuffer(p,l,o,c,h?.transform),p[15]=s,p[16]=n.r,p[17]=n.g,p[18]=n.b,p[19]=n.a,p[20]=a,p[21]=0,p[22]=0,p[23]=0,p[24]=r.x,p[25]=r.y,p[26]=i.x,p[27]=i.y;let f=this.uniformPool.getBuffer(this.device,p),d=i.x-r.x,m=i.y-r.y,y=Math.sqrt(d*d+m*m);if(y<1e-6)return;let x=s*.5+2,P=d/y*x,v=m/y*x,b=-v,S=P,U=new Float32Array([r.x-P-b,r.y-v-S,r.x-P+b,r.y-v+S,i.x+P-b,i.y+v-S,i.x+P+b,i.y+v+S]),k=this.vertexPool.getBuffer(this.device,U),J=h?.blendMode==="max"?this.maxPipeline:this.pipeline;t.setPipeline(J);let B=this.uniformBindGroupCache.getBindGroup(this.device,this.uniformLayout,f);t.setBindGroup(0,B),t.setVertexBuffer(0,k),t.draw(4)}destroy(){this.uniformPool.destroy(),this.vertexPool.destroy(),this.uniformBindGroupCache.destroy()}};g();g();var kt=`
264
+ struct Uniforms {
265
+ transformCol0 : vec4<f32>,
266
+ transformCol1 : vec4<f32>,
267
+ transformCol2 : vec4<f32>,
268
+ params : vec4<f32>, // x = opacity, y = surfaceWidth, z = surfaceHeight, w = blurAmount
269
+ };
270
+
271
+ @group(0) @binding(0) var<uniform> u : Uniforms;
272
+ @group(1) @binding(0) var tex : texture_2d<f32>;
273
+ @group(1) @binding(1) var samp : sampler;
274
+
275
+ struct VSOut {
276
+ @builtin(position) pos : vec4<f32>,
277
+ @location(0) uv : vec2<f32>,
278
+ };
279
+
280
+ @vertex fn vs(@location(0) xy : vec2<f32>, @location(1) uv : vec2<f32>) -> VSOut {
281
+ let transform = mat3x3<f32>(u.transformCol0.xyz, u.transformCol1.xyz, u.transformCol2.xyz);
282
+ let p = transform * vec3<f32>(xy, 1.0);
283
+
284
+ let surfaceSize = u.params.yz;
285
+ let clipX = (p.x / surfaceSize.x) * 2.0 - 1.0;
286
+ let clipY = 1.0 - (p.y / surfaceSize.y) * 2.0;
287
+
288
+ return VSOut(vec4<f32>(clipX, clipY, 0.0, 1.0), uv);
289
+ }
290
+
291
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
292
+ let opacity = u.params.x;
293
+ let blurAmount = u.params.w;
294
+
295
+ if (blurAmount > 0.01) {
296
+ let fdx = dpdx(in.uv);
297
+ let fdy = dpdy(in.uv);
298
+ let fw = max(max(abs(fdx), abs(fdy)), vec2<f32>(0.000001));
299
+ let step = fw * blurAmount * 0.3;
300
+
301
+ var color = vec4<f32>(0.0);
302
+ var totalWeight = 0.0;
303
+ for (var y_offset = -1.0; y_offset <= 1.0; y_offset = y_offset + 1.0) {
304
+ for (var x_offset = -1.0; x_offset <= 1.0; x_offset = x_offset + 1.0) {
305
+ let offset = vec2<f32>(x_offset, y_offset) * step;
306
+ let sampleColor = textureSample(tex, samp, in.uv + offset);
307
+ color = color + sampleColor;
308
+ totalWeight = totalWeight + 1.0;
309
+ }
310
+ }
311
+ return (color / totalWeight) * opacity;
312
+ } else {
313
+ let color = textureSample(tex, samp, in.uv);
314
+ return color * opacity;
315
+ }
316
+ }
317
+ `;var N=class{buffers=[];index=0;size;usage;constructor(t,e){this.size=t,this.usage=e}getBuffer(t,e){if(this.index>=this.buffers.length){let i=t.createBuffer({size:this.size,usage:this.usage});this.buffers.push(i)}let r=this.buffers[this.index++];return t.queue.writeBuffer(r,0,e),r}reset(){this.index=0}destroy(){for(let t of this.buffers)t.destroy();this.buffers=[]}},j=class{device;pipeline;uniformLayout;textureLayout;uniformPool;vertexPool;uniformBindGroupCache=new M;uniformData=new Float32Array(16);vertexData=new Float32Array(16);constructor(t,e){this.device=t,this.uniformPool=new N(64,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.vertexPool=new N(64,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let r=t.createShaderModule({label:"quad.wgsl",code:kt});this.uniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.textureLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]});let i=t.createPipelineLayout({bindGroupLayouts:[this.uniformLayout,this.textureLayout]});this.pipeline=t.createRenderPipeline({label:"QuadPipeline",layout:i,vertex:{module:r,entryPoint:"vs",buffers:[{arrayStride:16,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,offset:8,format:"float32x2"}]}]},fragment:{module:r,entryPoint:"fs",targets:[{format:e,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}})}resetPools(){this.uniformPool.reset(),this.vertexPool.reset()}draw(t,e,r,i,n,s,a,o,c,l){let h=l?.opacity??1;r.packIntoBuffer(this.uniformData,h,o,c,l?.transform);let p=this.uniformPool.getBuffer(this.device,this.uniformData),f=s.x/i.width,d=s.y/i.height,m=(s.x+s.width)/i.width,y=(s.y+s.height)/i.height;this.vertexData[0]=a.x,this.vertexData[1]=a.y,this.vertexData[2]=f,this.vertexData[3]=d,this.vertexData[4]=a.x+a.width,this.vertexData[5]=a.y,this.vertexData[6]=m,this.vertexData[7]=d,this.vertexData[8]=a.x,this.vertexData[9]=a.y+a.height,this.vertexData[10]=f,this.vertexData[11]=y,this.vertexData[12]=a.x+a.width,this.vertexData[13]=a.y+a.height,this.vertexData[14]=m,this.vertexData[15]=y;let x=this.vertexPool.getBuffer(this.device,this.vertexData),P=this.uniformBindGroupCache.getBindGroup(this.device,this.uniformLayout,p),v=e.getBindGroup(this.device,this.textureLayout,i,n);t.setPipeline(this.pipeline),t.setBindGroup(0,P),t.setBindGroup(1,v),t.setVertexBuffer(0,x),t.draw(4)}destroy(){this.uniformPool.destroy(),this.vertexPool.destroy(),this.uniformBindGroupCache.destroy()}};g();g();var H=`
318
+ struct GradientUniforms {
319
+ info : vec4<f32>, // x = type (0 none, 1 linear, 2 radial, 3 conic), y = stop count
320
+ geom : vec4<f32>, // linear: cx, cy, dir.x / len, dir.y / len; radial: cx, cy, rx, ry; conic: cx, cy, from (rad)
321
+ offsets : array<vec4<f32>, 2>,
322
+ stops : array<vec4<f32>, 8>, // OKLab + alpha
323
+ };
324
+
325
+ fn gradientOklabToSrgb(lab: vec3<f32>) -> vec3<f32> {
326
+ let l = pow(lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z, 3.0);
327
+ let m = pow(lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z, 3.0);
328
+ let s = pow(lab.x - 0.0894841775 * lab.y - 1.291485548 * lab.z, 3.0);
329
+ let lin = clamp(vec3<f32>(
330
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
331
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
332
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
333
+ ), vec3<f32>(0.0), vec3<f32>(1.0));
334
+ let lo = lin * 12.92;
335
+ let hi = 1.055 * pow(lin, vec3<f32>(1.0 / 2.4)) - 0.055;
336
+ return select(hi, lo, lin <= vec3<f32>(0.0031308));
337
+ }
338
+
339
+ /// Position along the gradient (0..1, unclamped for linear/radial) at local point p.
340
+ fn gradientT(g: GradientUniforms, p: vec2<f32>) -> f32 {
341
+ let d = p - g.geom.xy;
342
+ let kind = g.info.x;
343
+ if (kind < 1.5) {
344
+ return dot(d, g.geom.zw) + 0.5;
345
+ }
346
+ if (kind < 2.5) {
347
+ return length(d / max(g.geom.zw, vec2<f32>(1e-4)));
348
+ }
349
+ let a = atan2(d.x, -d.y) - g.geom.z;
350
+ return fract(a / 6.28318530718);
351
+ }
352
+
353
+ /// Straight sRGB color + alpha of the gradient at local point p.
354
+ fn evalGradient(g: GradientUniforms, p: vec2<f32>) -> vec4<f32> {
355
+ var offs = g.offsets;
356
+ var stops = g.stops;
357
+ let n = i32(g.info.y);
358
+ let t = gradientT(g, p);
359
+ var lab = stops[0];
360
+ if (t > offs[0].x) {
361
+ lab = stops[n - 1];
362
+ for (var i = 1; i < 8; i++) {
363
+ if (i >= n) {
364
+ break;
365
+ }
366
+ let b = offs[i / 4][i % 4];
367
+ if (t <= b) {
368
+ let a = offs[(i - 1) / 4][(i - 1) % 4];
369
+ let f = select(1.0, (t - a) / (b - a), b - a > 1e-5);
370
+ lab = mix(stops[i - 1], stops[i], clamp(f, 0.0, 1.0));
371
+ break;
372
+ }
373
+ }
374
+ }
375
+ return vec4<f32>(gradientOklabToSrgb(lab.xyz), lab.w);
376
+ }
377
+ `;g();var Tt=`
378
+ ${H}
379
+
380
+ struct Uniforms {
381
+ transformCol0 : vec4<f32>,
382
+ transformCol1 : vec4<f32>,
383
+ transformCol2 : vec4<f32>,
384
+ params : vec4<f32>, // x = opacity, y = surfaceWidth, z = surfaceHeight, w = unused
385
+ color : vec4<f32>, // solid color (gradient.info.x = 0)
386
+ gradient : GradientUniforms,
387
+ };
388
+
389
+ @group(0) @binding(0) var<uniform> u : Uniforms;
390
+
391
+ struct VSOut {
392
+ @builtin(position) pos : vec4<f32>,
393
+ @location(0) localPos : vec2<f32>,
394
+ };
395
+
396
+ @vertex fn vs(@location(0) xy : vec2<f32>) -> VSOut {
397
+ let transform = mat3x3<f32>(u.transformCol0.xyz, u.transformCol1.xyz, u.transformCol2.xyz);
398
+ let p = transform * vec3<f32>(xy, 1.0);
399
+
400
+ let surfaceSize = u.params.yz;
401
+ let clipX = (p.x / surfaceSize.x) * 2.0 - 1.0;
402
+ let clipY = 1.0 - (p.y / surfaceSize.y) * 2.0;
403
+
404
+ return VSOut(vec4<f32>(clipX, clipY, 0.0, 1.0), xy);
405
+ }
406
+
407
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
408
+ var outColor = u.color;
409
+ if (u.gradient.info.x > 0.5) {
410
+ outColor = evalGradient(u.gradient, in.localPos);
411
+ }
412
+
413
+ let alpha = outColor.a * u.params.x;
414
+ if (alpha <= 0.0) {
415
+ discard;
416
+ }
417
+
418
+ return vec4<f32>(outColor.rgb * alpha, alpha);
419
+ }
420
+ `;g();var Nt={linear:1,radial:2,conic:3};function q(u){return typeof u=="string"&&u.includes("gradient(")?ft(u):null}function Q(u,t,e,r){if(e.fill(0,r,r+48),!u)return;let i=mt(u.stops),n=Math.max(t.width,.001),s=Math.max(t.height,.001),a=t.x+u.center[0]*n,o=t.y+u.center[1]*s;if(e[r]=Nt[u.type],e[r+1]=i.length,e[r+4]=u.type==="linear"?t.x+n/2:a,e[r+5]=u.type==="linear"?t.y+s/2:o,u.type==="linear"){let c=u.angle*Math.PI/180,l=Math.sin(c),h=-Math.cos(c),p=Math.abs(n*l)+Math.abs(s*h);e[r+6]=l/p,e[r+7]=h/p}else if(u.type==="radial"){let c,l;if(u.radius)[c,l]=u.radius;else{let h=Math.max(a-t.x,t.x+n-a),p=Math.max(o-t.y,t.y+s-o);u.shape==="circle"?c=l=Math.hypot(h,p):(c=h*Math.SQRT2,l=p*Math.SQRT2)}e[r+6]=c,e[r+7]=l}else e[r+6]=u.from*Math.PI/180;i.forEach((c,l)=>{e[r+8+l]=c.offset}),L(i).forEach((c,l)=>{e.set(c,r+16+l*4)})}var Y=class{device;pipeline;uniformLayout;uniformPool;vertexPool;uniformData=new Float32Array(68);constructor(t,e){this.device=t,this.uniformPool=new w(2048,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.vertexPool=new w(8192,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let r=t.createShaderModule({label:"shape-fill.wgsl",code:Tt});this.uniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.pipeline=t.createRenderPipeline({label:"ShapeFillPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.uniformLayout]}),vertex:{module:r,entryPoint:"vs",buffers:[{arrayStride:8,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]}]},fragment:{module:r,entryPoint:"fs",targets:[{format:e,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-list"}})}resetPools(){this.uniformPool.reset(),this.vertexPool.reset()}draw(t,e,r,i,n,s,a,o){if(r.length<6||i.type==="none")return;let c=o?.opacity??1;e.packIntoBuffer(this.uniformData,c,s,a,o?.transform),this.uniformData[15]=0;let l=q(i.color);if(l)this.uniformData.fill(0,16,20),Q(l,n,this.uniformData,20);else{let f=D(i.color??"#ffffff");this.uniformData[16]=f.r,this.uniformData[17]=f.g,this.uniformData[18]=f.b,this.uniformData[19]=f.a,this.packTwoColorGradient(i,n,f)}let h=this.uniformPool.getBuffer(this.device,this.uniformData),p=this.vertexPool.getBuffer(this.device,r);t.setPipeline(this.pipeline),t.setBindGroup(0,this.device.createBindGroup({layout:this.uniformLayout,entries:[{binding:0,resource:{buffer:h}}]})),t.setVertexBuffer(0,p),t.draw(r.length/2)}packTwoColorGradient(t,e,r){if(this.uniformData.fill(0,20,68),t.type!=="linear"&&t.type!=="radial")return;let n=D(t.color2??t.color??"#ffffff"),s=this.uniformData;if(t.type==="linear"){let o=t.startX??e.x,c=t.startY??e.y,l=t.endX??e.x+e.width,h=t.endY??e.y+e.height,p=l-o,f=h-c,d=Math.max(p*p+f*f,1e-6);s.set([1,2,0,0,(o+l)/2,(c+h)/2,p/d,f/d],20)}else{let o=t.radius??Math.max(e.width,e.height)/2;s.set([2,2,0,0,t.cx??e.x+e.width/2,t.cy??e.y+e.height/2,o,o],20)}s[28]=0,s[29]=1;let a=L([{offset:0,color:[r.r,r.g,r.b,r.a]},{offset:1,color:[n.r,n.g,n.b,n.a]}]);s.set(a[0],36),s.set(a[1],40)}destroy(){this.uniformPool.destroy(),this.vertexPool.destroy()}};g();g();var Ft=`
421
+ ${H}
422
+
423
+ struct Uniforms {
424
+ transformCol0 : vec4<f32>,
425
+ transformCol1 : vec4<f32>,
426
+ transformCol2 : vec4<f32>,
427
+ params : vec4<f32>, // x = opacity, y = surfaceWidth, z = surfaceHeight, w = cornerRadius
428
+ color : vec4<f32>,
429
+ rect : vec4<f32>, // x, y, width, height
430
+ gradient : GradientUniforms, // info.x = 0: solid \`color\`
431
+ };
432
+
433
+ @group(0) @binding(0) var<uniform> u : Uniforms;
434
+
435
+ struct VSOut {
436
+ @builtin(position) pos : vec4<f32>,
437
+ @location(0) localPos : vec2<f32>,
438
+ };
439
+
440
+ @vertex fn vs(@location(0) xy : vec2<f32>) -> VSOut {
441
+ let transform = mat3x3<f32>(u.transformCol0.xyz, u.transformCol1.xyz, u.transformCol2.xyz);
442
+ let p = transform * vec3<f32>(xy, 1.0);
443
+
444
+ let surfaceSize = u.params.yz;
445
+ let clipX = (p.x / surfaceSize.x) * 2.0 - 1.0;
446
+ let clipY = 1.0 - (p.y / surfaceSize.y) * 2.0;
447
+
448
+ return VSOut(vec4<f32>(clipX, clipY, 0.0, 1.0), xy);
449
+ }
450
+
451
+ fn sdRoundedRect(p: vec2<f32>, b: vec2<f32>, r: f32) -> f32 {
452
+ let q = abs(p) - b + r;
453
+ return min(max(q.x, q.y), 0.0) + length(max(q, vec2<f32>(0.0))) - r;
454
+ }
455
+
456
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
457
+ let center = u.rect.xy + u.rect.zw * 0.5;
458
+ let halfSize = u.rect.zw * 0.5;
459
+ let radius = u.params.w;
460
+
461
+ let d = sdRoundedRect(in.localPos - center, halfSize, radius);
462
+ let edgeAlpha = 1.0 - smoothstep(0.0, 1.0, d);
463
+ var fill = u.color;
464
+ if (u.gradient.info.x > 0.5) {
465
+ fill = evalGradient(u.gradient, in.localPos);
466
+ }
467
+ let alpha = fill.a * u.params.x * edgeAlpha;
468
+ if (alpha <= 0.0) {
469
+ discard;
470
+ }
471
+
472
+ return vec4<f32>(fill.rgb * alpha, alpha);
473
+ }
474
+ `;var X=class{device;pipeline;uniformLayout;uniformPool;vertexPool;uniformBindGroupCache=new M;uniformData=new Float32Array(72);vertexData=new Float32Array(8);constructor(t,e){this.device=t,this.uniformPool=new w(1024,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.vertexPool=new w(256,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let r=t.createShaderModule({label:"solid.wgsl",code:Ft});this.uniformLayout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.pipeline=t.createRenderPipeline({label:"SolidPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.uniformLayout]}),vertex:{module:r,entryPoint:"vs",buffers:[{arrayStride:8,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]}]},fragment:{module:r,entryPoint:"fs",targets:[{format:e,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}})}resetPools(){this.uniformPool.reset(),this.vertexPool.reset()}draw(t,e,r,i,n,s,a=0,o){let c=q(i),l=c?{r:0,g:0,b:0,a:1}:D(i),h=o?.opacity??1;e.packIntoBuffer(this.uniformData,h,n,s,o?.transform),this.uniformData[15]=a,this.uniformData[16]=l.r,this.uniformData[17]=l.g,this.uniformData[18]=l.b,this.uniformData[19]=l.a,this.uniformData[20]=r.x,this.uniformData[21]=r.y,this.uniformData[22]=r.width,this.uniformData[23]=r.height,Q(c,r,this.uniformData,24);let p=this.uniformPool.getBuffer(this.device,this.uniformData);this.vertexData[0]=r.x,this.vertexData[1]=r.y,this.vertexData[2]=r.x+r.width,this.vertexData[3]=r.y,this.vertexData[4]=r.x,this.vertexData[5]=r.y+r.height,this.vertexData[6]=r.x+r.width,this.vertexData[7]=r.y+r.height;let f=this.vertexPool.getBuffer(this.device,this.vertexData);t.setPipeline(this.pipeline);let d=this.uniformBindGroupCache.getBindGroup(this.device,this.uniformLayout,p);t.setBindGroup(0,d),t.setVertexBuffer(0,f),t.draw(4)}destroy(){this.uniformPool.destroy(),this.vertexPool.destroy(),this.uniformBindGroupCache.destroy()}};g();var K=class{stack=[new DOMMatrix];push(t){let r=this.stack[this.stack.length-1].multiply(t);this.stack.push(r)}pop(){this.stack.length>1&&this.stack.pop()}getCurrent(){return this.stack[this.stack.length-1]}packIntoBuffer(t,e,r,i,n,s){let a=this.getCurrent();n&&(a=a.multiply(n)),t[0]=a.a,t[1]=a.b,t[2]=0,t[3]=0,t[4]=a.c,t[5]=a.d,t[6]=0,t[7]=0,t[8]=a.e,t[9]=a.f,t[10]=1,t[11]=0,t[12]=e,t[13]=r,t[14]=i,t[15]=s??0}destroy(){this.stack=[new DOMMatrix]}};function jt(u){if(Array.isArray(u)){let r=u[3]??1;return[u[0]*r,u[1]*r,u[2]*r,r]}if("r"in u){let r=u.a??1;return{r:u.r*r,g:u.g*r,b:u.b*r,a:r}}let t=Array.from(u),e=t[3]??1;return[t[0]*e,t[1]*e,t[2]*e,e]}var Rt=new WeakMap;function hr(u,t){let e=Rt.get(u);return(!e||e.format!==t||e.isDestroyed)&&(e=new ct(u,t),Rt.set(u,e)),e.resetPools(),e}var ct=class{device;transformStack=new K;clipStack=new I;quadPipeline;solidPipeline;shapeFillPipeline;pathPipeline;effectPipeline;slugPipeline;bindGroupCache=new E;samplerCache=new St;format;isDestroyed=!1;rasterDrawCount=0;surfaceWidth=0;surfaceHeight=0;lastEncoder=null;constructor(t,e){this.device=t,this.format=e,this.quadPipeline=new j(t,e),this.solidPipeline=new X(t,e),this.shapeFillPipeline=new Y(t,e),this.pathPipeline=new z(t,e),this.effectPipeline=new A(t,e),this.slugPipeline=new bt(t,e)}beginFrame(t,e,r={r:0,g:0,b:0,a:0},i,n,s="clear"){this.surfaceWidth=i,this.surfaceHeight=n,t!==this.lastEncoder&&(this.lastEncoder=t,this.resetPools());let a=t.beginRenderPass({colorAttachments:[{view:e,clearValue:jt(r),loadOp:s,storeOp:"store"}]});return this.clipStack.applyScissorToPass(a,i,n),a}endFrame(t){}resetPools(){this.quadPipeline.resetPools(),this.solidPipeline.resetPools(),this.shapeFillPipeline.resetPools(),this.pathPipeline.resetPools(),this.effectPipeline&&this.effectPipeline.resetPools(),this.slugPipeline.resetPools(),rt.flushRetired(this.device),rt.prune(this.device)}drawTexture(t,e,r,i){let n=this.samplerCache.getSampler(this.device),s={x:0,y:0,width:e.width,height:e.height};this.rasterDrawCount++,this.quadPipeline.draw(t,this.bindGroupCache,this.transformStack,e,n,s,r,this.surfaceWidth,this.surfaceHeight,i)}drawTextureRegion(t,e,r,i,n){let s=this.samplerCache.getSampler(this.device);this.rasterDrawCount++,this.quadPipeline.draw(t,this.bindGroupCache,this.transformStack,e,s,r,i,this.surfaceWidth,this.surfaceHeight,n)}drawRect(t,e,r,i=0,n){let s=0,a=n;typeof i=="object"&&i!==null?(a=i,s=0):typeof i=="number"&&(s=i),this.rasterDrawCount++,this.solidPipeline.draw(t,this.transformStack,e,r,this.surfaceWidth,this.surfaceHeight,s,a)}drawPath(t,e,r,i,n){this.rasterDrawCount++,this.pathPipeline.drawPath(t,this.transformStack,e,r,i,this.surfaceWidth,this.surfaceHeight,n)}drawShapeFill(t,e,r,i,n){this.rasterDrawCount++,this.shapeFillPipeline.draw(t,this.transformStack,e,r,i,this.surfaceWidth,this.surfaceHeight,n)}drawShape(t,e,r,i,n){let s={x:0,y:0,width:e.width,height:e.height};if(r&&r.type!=="none"){let a=Dt(e);if(a.length>0&&(this.drawShapeFill(t,a,r,s,n),(!i||!i.width||i.width<=0)&&(r.type??"solid")==="solid"&&r.color)){let o=ut(e);o&&this.drawPath(t,o,r.color,1,{...n,strokeLineCap:"round"})}}if(i&&i.width&&i.width>0&&i.color){let a=ut(e);a&&this.drawPath(t,a,i.color,i.width,{...n,strokeLineCap:i.cap,trimStart:i.trimStart,trimEnd:i.trimEnd,trimOffset:i.trimOffset,strokeDashArray:i.dashArray,strokeDashOffset:i.dashOffset})}}drawRRect(t,e,r,i){this.drawRect(t,e.rect,r,e.rx,i)}getTemporaryTexture(t,e,r){return this.effectPipeline.getTexture(this.device,t,e,this.format,r)}getTemporaryBuffer(t){return this.effectPipeline.getBuffer(this.device,t)}composite(t,e,r,i,n){return this.effectPipeline.composite(t,this.bindGroupCache,this.samplerCache,e,r,i,this.format,n)}applyMotionBlur(t,e,r,i,n=180,s=16,a){return this.effectPipeline.applyMotionBlur(t,this.bindGroupCache,this.samplerCache,e,r,i,n,s,this.format,a)}getCurrentTransform(){return this.transformStack.getCurrent()}getTransformStack(){return this.transformStack}getSurfaceWidth(){return this.surfaceWidth}getSurfaceHeight(){return this.surfaceHeight}pushIdentity(){let t=this.transformStack.getCurrent();this.pushTransform(t.inverse())}pushTransform(t){this.transformStack.push(t)}popTransform(){this.transformStack.pop()}pushScissor(t){this.clipStack.pushScissor(t,this.surfaceWidth,this.surfaceHeight)}pushScissorLocal(t){let e=this.transformStack.getCurrent(),r=[e.transformPoint(new DOMPoint(t.x,t.y)),e.transformPoint(new DOMPoint(t.x+t.width,t.y)),e.transformPoint(new DOMPoint(t.x,t.y+t.height)),e.transformPoint(new DOMPoint(t.x+t.width,t.y+t.height))],i=r.map(h=>h.x),n=r.map(h=>h.y),s=Math.min(...i),a=Math.min(...n),o=Math.max(...i)-s,c=Math.max(...n)-a,l=this.clipStack.getCurrentScissor(this.surfaceWidth,this.surfaceHeight);if(l){let h=Math.max(s,l.x),p=Math.max(a,l.y),f=Math.min(s+o,l.x+l.width),d=Math.min(a+c,l.y+l.height);s=h,a=p,o=Math.max(0,f-h),c=Math.max(0,d-p)}this.clipStack.pushScissor({x:s,y:a,width:o,height:c},this.surfaceWidth,this.surfaceHeight)}popScissor(){this.clipStack.popScissor()}suspendScissors(){let t=this.clipStack.saveScissors();return this.clipStack.clearScissors(),t}resumeScissors(t){this.clipStack.restoreScissors(t)}pushStencilClip(t){this.clipStack.pushStencilClip(t)}popStencilClip(){this.clipStack.popStencilClip()}destroy(){this.isDestroyed=!0,this.transformStack.destroy(),this.clipStack.destroy(),this.bindGroupCache.destroy(),this.samplerCache.destroy(),this.quadPipeline.destroy(),this.solidPipeline.destroy(),this.shapeFillPipeline.destroy(),this.pathPipeline.destroy(),this.effectPipeline.destroy(),this.slugPipeline.destroy(),this.lastEncoder=null}};g();async function _t(u,t){if(typeof window<"u"&&typeof FontFace<"u")try{let r=await new FontFace(u,`url(${t})`).load();document.fonts.add(r),await document.fonts.ready}catch(e){console.warn(`[preloadFont] Failed to load font "${u}" from ${t}:`,e)}else await gt(u,t)}g();var Ht=/\p{Extended_Pictographic}/gu,Lt=!1;async function Sr(u,t,e=(r,i)=>console.warn(`[framefields] ${i}`,r)){let r=new Set,i=new Map;(function s(a){let o=a.operation;if(o){let c=o.op==="text"||o.kind==="text"||o.op==="caption"||o.kind==="caption"||typeof o.text=="string",l=o.fontFamily||(c?"Inter":"");if(l&&r.add(l),o.op==="text"&&typeof o.text=="string"){let h=o.fontSize??48;for(let p of o.text.match(Ht)??[])i.set(`${p}-${h}`,h)}}for(let c of a.children??[])s(c)})(u);let n=[];for(let s of r){let a=xt(s)??yt(s);n.push(_t(s,a).catch(o=>e(o,`font "${s}" from ${a}`))),t&&n.push(_.preloadSlugFont(t,s,a).catch(o=>e(o,`Slug font "${s}" from ${a}`)))}if(t&&i.size>0){!_.hasEmojiFont()&&!Lt&&(Lt=!0,console.warn("[framefields] Text uses emoji but no emoji font is registered, so exports draw nothing for them. Register a color emoji font (e.g. Noto Color Emoji) with FontManager.registerEmojiFont(path)."));for(let[s,a]of i){let o=s.slice(0,s.lastIndexOf("-"));n.push(_.preloadEmoji(t,o,a).catch(c=>{_.hasEmojiFont()&&e(c,`emoji "${o}"`)}))}}await Promise.all(n)}export{Yt as a,A as b,hr as c,ct as d,_t as e,Sr as f};
@@ -0,0 +1,3 @@
1
+ import{a as P}from"./chunk-AEK5BO3J.mjs";import{b as v,d as w,e as E}from"./chunk-MJM3NFEC.mjs";import{m as T}from"./chunk-4GEWSUX5.mjs";import{o as g}from"./chunk-YAQFFQPG.mjs";import{d as y,e as b}from"./chunk-BVF64D6H.mjs";b();b();var M=65536,$=1953658213,I=1954115633,N=1330926671,S=1953784678;function R(n,t){if(n.length<12)throw new Error(`Invalid font binary for "${t}": File size (${n.length} bytes) is too small to be a valid TrueType or OpenType font.`);let e=(n[0]??0)<<24|(n[1]??0)<<16|(n[2]??0)<<8|(n[3]??0);if(e===M||e===$||e===I||e===S)return"truetype";if(e===N)return"opentype";let r=(e>>>0).toString(16).padStart(8,"0");throw new Error(`Invalid font format for "${t}": Expected a valid TrueType (.ttf) or OpenType (.otf) font binary. Found header tag: 0x${r}.`)}async function A(n){if(n instanceof Uint8Array)return{buffer:n};if(typeof n!="string")throw new TypeError(`Font source must be a file path string or Uint8Array, received: ${typeof n}`);let t=n;if(t.startsWith("http://")||t.startsWith("https://")){let i=await fetch(t);if(!i.ok)throw new Error(`Failed to download font from "${t}": HTTP ${i.status} ${i.statusText}`);let c=await i.arrayBuffer();return{buffer:new Uint8Array(c),filePath:t}}if(t.startsWith("file://"))try{t=new URL(t).pathname}catch{t=t.replace(/^file:\/\//,"")}let e=[t,g.resolve(y.cwd(),t),g.resolve(y.cwd(),"assets/fonts",t),g.resolve(y.cwd(),"assets/fonts",g.basename(t))],r=y.cwd();for(let i=0;i<5;i++){e.push(g.resolve(r,t)),e.push(g.resolve(r,"assets/fonts",g.basename(t)));let c=g.dirname(r);if(c===r)break;r=c}let s=null,l=null;for(let i of e)try{if((await T.stat(i)).isFile()){s=i,l=await T.readFile(i);break}}catch{}if(!s||!l)throw new Error(`Font file not found: "${n}". Checked candidate locations:
2
+ - ${e.join(`
3
+ - `)}`);return{buffer:new Uint8Array(l.buffer,l.byteOffset,l.byteLength),filePath:s}}var x=class n{static instance=null;fonts=new Map;constructor(){}static getInstance(){return n.instance||(n.instance=new n),n.instance}static async register(t,e){return n.getInstance().register(t,e)}static async registerEmojiFont(t){let{buffer:e,filePath:r}=await A(t);R(e,r??(typeof t=="string"?t:"Uint8Array")),w.setEmojiFont(e,r)}static measure(t,e){let r=e.fontSize??48,s=w.getFont(e.fontFamily,e.fontWeight,null);if(!s)throw new Error(`FontManager.measure: font "${e.fontFamily}" is not registered. Call \`await FontManager.register(...)\` first.`);let l=e.lineHeight!==void 0&&e.lineHeight<10?e.lineHeight*r:e.lineHeight??r*1.2,i=e.letterSpacing??0,{width:c,height:d,layout:p}=E.measure(t,s,r,i,l,e.width),F=r/s.unitsPerEm,f=[],m=0;for(let a of p.glyphs){let o=t.indexOf(a.char,m),u=o>=0?o:m;m=u+a.char.length,f.push({char:a.char,index:u,x:a.x,y:a.y,width:a.cp.advanceWidth*(a.fontScale??F)+i,line:a.lineIndex})}let h=a=>{if(a<=0||f.length===0)return f[0]?.x??0;let o=f.filter(U=>U.index<a),u=o[o.length-1];return u?u.x+u.width-i:0};return{width:c,height:d,lines:p.linesCount,lineHeight:l,glyphs:f,caretX:h,widthOf:a=>h(a)-(f[0]?.x??0)}}static get(t){return n.getInstance().get(t)}static has(t){return n.getInstance().has(t)}static getAll(){return n.getInstance().getAll()}static getRegisteredFontPaths(){return n.getInstance().getRegisteredFontPaths()}static clear(){n.getInstance().clear()}async register(t,e){let r,s,l,i;if(typeof t=="object"&&t!==null)r=t.family,s=t.source,l=t.weight,i=t.style;else if(typeof t=="string"&&e!==void 0)r=t,s=e;else if(typeof t=="string")r=void 0,s=t;else throw new TypeError("Invalid arguments passed to FontManager.register");let{buffer:c,filePath:d}=await A(s),p=d??(typeof s=="string"?s:"Uint8Array"),F=R(c,p),f;try{let o=v(c);o&&"fonts"in o&&Array.isArray(o.fonts)&&o.fonts.length>0?f=o.fonts[0]:f=o}catch(o){let u=o instanceof Error?o.message:String(o);throw new Error(`Failed to parse TrueType/OpenType font binary for "${p}": ${u}`)}let m=f.familyName||f.postscriptName||g.parse(p).name,h=r?.trim()||m,a={family:h,source:s,filePath:d,format:F,postscriptName:f.postscriptName,unitsPerEm:f.unitsPerEm,weight:l,style:i};return this.fonts.set(h,a),d&&await P(h,d),w.setParsed(h,f),a}get(t){return this.fonts.get(t)}has(t){return this.fonts.has(t)}getAll(){return Array.from(this.fonts.values())}getRegisteredFontPaths(){let t=[];for(let e of this.fonts.values())e.filePath?t.push(e.filePath):typeof e.source=="string"&&t.push(e.source);return t}clear(){this.fonts.clear()}};export{x as a};