framefields 2.0.3 → 2.0.5

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 (193) hide show
  1. package/README.md +4 -26
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-DbxiKp5p.mjs → audio-COkiXyDb.mjs} +3 -3
  5. package/dist/{audio-DbxiKp5p.mjs.map → audio-COkiXyDb.mjs.map} +1 -1
  6. package/dist/{audio-Dvwwz8xU.d.mts → audio-nmU-BWxI.d.mts} +3 -3
  7. package/dist/{audio-Dvwwz8xU.d.mts.map → audio-nmU-BWxI.d.mts.map} +1 -1
  8. package/dist/{dist-CGIme1vZ.mjs → dist-55MP0aN4.mjs} +59 -16
  9. package/dist/dist-55MP0aN4.mjs.map +1 -0
  10. package/dist/{dist-DuIv211_.mjs → dist-DgIKXWZ1.mjs} +60 -15
  11. package/dist/dist-DgIKXWZ1.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +22 -22
  14. package/dist/{effects-B_APkGJJ.mjs → effects-m3FuatqZ.mjs} +2 -2
  15. package/dist/{effects-B_APkGJJ.mjs.map → effects-m3FuatqZ.mjs.map} +1 -1
  16. package/dist/fonts/index.d.mts +1 -1
  17. package/dist/fonts/index.mjs +1 -1
  18. package/dist/{fonts-CwwIhe1o.mjs → fonts-C_AWIMdb.mjs} +13 -2
  19. package/dist/fonts-C_AWIMdb.mjs.map +1 -0
  20. package/dist/{index-CnAk1hTw.d.mts → index-Bx7JBFT6.d.mts} +2 -2
  21. package/dist/index-Bx7JBFT6.d.mts.map +1 -0
  22. package/dist/{index-D7llSs-m.d.mts → index-C8rstr3Y.d.mts} +4 -4
  23. package/dist/{index-D7llSs-m.d.mts.map → index-C8rstr3Y.d.mts.map} +1 -1
  24. package/dist/{index-D2wJqSl5.d.mts → index-CAGDH7l6.d.mts} +3 -3
  25. package/dist/{index-D2wJqSl5.d.mts.map → index-CAGDH7l6.d.mts.map} +1 -1
  26. package/dist/{index-DiSKzDGR.d.mts → index-CbzEM_o6.d.mts} +8 -1
  27. package/dist/index-CbzEM_o6.d.mts.map +1 -0
  28. package/dist/{index-BMVVmc4G.d.mts → index-DY3mLoPO.d.mts} +2 -2
  29. package/dist/{index-BMVVmc4G.d.mts.map → index-DY3mLoPO.d.mts.map} +1 -1
  30. package/dist/{index-D1ZsMpke.d.mts → index-i0xPY4Fe.d.mts} +3 -3
  31. package/dist/{index-D1ZsMpke.d.mts.map → index-i0xPY4Fe.d.mts.map} +1 -1
  32. package/dist/{index-D2jDC7O5.d.mts → index-ogL8Y-Ng.d.mts} +9 -1
  33. package/dist/{index-D2jDC7O5.d.mts.map → index-ogL8Y-Ng.d.mts.map} +1 -1
  34. package/dist/index.d.mts +22 -11
  35. package/dist/index.d.mts.map +1 -1
  36. package/dist/index.mjs +43 -38
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/preview/index.d.mts +3 -3
  39. package/dist/preview/index.mjs +10 -10
  40. package/dist/{preview-D7TqF9i_.mjs → preview-BM0Zzcn1.mjs} +74 -66
  41. package/dist/preview-BM0Zzcn1.mjs.map +1 -0
  42. package/dist/preview-engine/{chunk-HAXK42HG.mjs → chunk-2RMSCL6V.mjs} +1 -1
  43. package/dist/preview-engine/chunk-45JOFIHE.mjs +8 -0
  44. package/dist/preview-engine/chunk-7S6ZFYLI.mjs +418 -0
  45. package/dist/preview-engine/chunk-KNZU3Z2F.mjs +3 -0
  46. package/dist/preview-engine/{chunk-GYG2IIBR.mjs → chunk-RJJRPL42.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-4BEJJKEU.mjs → chunk-YK4XHUP4.mjs} +7 -7
  48. package/dist/preview-engine/fonts.mjs +1 -1
  49. package/dist/preview-engine/framefields.mjs +84 -76
  50. package/dist/preview-engine/player.mjs +5 -5
  51. package/dist/preview-engine/{renderers-R3XEYD5V.mjs → renderers-LFA5NW4V.mjs} +1 -1
  52. package/dist/{program-Cjva0Nw2.mjs → program-DGqyGGvj.mjs} +2 -2
  53. package/dist/{program-Cjva0Nw2.mjs.map → program-DGqyGGvj.mjs.map} +1 -1
  54. package/dist/renderer/index.d.mts +2 -2
  55. package/dist/renderer/index.mjs +2 -2
  56. package/dist/renderer--fkO4O8d.mjs +3 -0
  57. package/dist/{renderer-DVSagfD4.mjs → renderer-0gJC-sc8.mjs} +2 -2
  58. package/dist/{renderer-DVSagfD4.mjs.map → renderer-0gJC-sc8.mjs.map} +1 -1
  59. package/dist/{renderer-B8ugHLDi.mjs → renderer-2r4EgfdZ.mjs} +2 -2
  60. package/dist/{renderer-B8ugHLDi.mjs.map → renderer-2r4EgfdZ.mjs.map} +1 -1
  61. package/dist/{renderer-D9lcIxrz.mjs → renderer-5OiVjQan.mjs} +4 -4
  62. package/dist/{renderer-D9lcIxrz.mjs.map → renderer-5OiVjQan.mjs.map} +1 -1
  63. package/dist/renderer-6x7CgHhJ.mjs +3 -0
  64. package/dist/renderer-B0RDWv1C.mjs +3 -0
  65. package/dist/{renderer-CeF66MG3.mjs → renderer-B9l641o-.mjs} +2 -2
  66. package/dist/{renderer-CeF66MG3.mjs.map → renderer-B9l641o-.mjs.map} +1 -1
  67. package/dist/renderer-BFOkGS0N.mjs +3 -0
  68. package/dist/{renderer-DjYRCzzV.mjs → renderer-BJiL-BQY.mjs} +2 -2
  69. package/dist/{renderer-DjYRCzzV.mjs.map → renderer-BJiL-BQY.mjs.map} +1 -1
  70. package/dist/{renderer-B5Tq5MWB.mjs → renderer-BMrm2Zbz.mjs} +2 -2
  71. package/dist/{renderer-B5Tq5MWB.mjs.map → renderer-BMrm2Zbz.mjs.map} +1 -1
  72. package/dist/{renderer-Dm0r9IBd.mjs → renderer-BUHMkkLU.mjs} +2 -2
  73. package/dist/{renderer-Dm0r9IBd.mjs.map → renderer-BUHMkkLU.mjs.map} +1 -1
  74. package/dist/{renderer-B0DTz9Fr.mjs → renderer-BYsmLk63.mjs} +2 -2
  75. package/dist/{renderer-B0DTz9Fr.mjs.map → renderer-BYsmLk63.mjs.map} +1 -1
  76. package/dist/renderer-BaoJiMJO.mjs +3 -0
  77. package/dist/{renderer-NYcVjCOi.mjs → renderer-BtkU0BT-.mjs} +2 -2
  78. package/dist/{renderer-NYcVjCOi.mjs.map → renderer-BtkU0BT-.mjs.map} +1 -1
  79. package/dist/{renderer-CuppzplW.mjs → renderer-Bwsh5TUv.mjs} +2 -2
  80. package/dist/{renderer-CuppzplW.mjs.map → renderer-Bwsh5TUv.mjs.map} +1 -1
  81. package/dist/{renderer-B6YiOv7l.mjs → renderer-C28Bab-M.mjs} +2 -2
  82. package/dist/{renderer-B6YiOv7l.mjs.map → renderer-C28Bab-M.mjs.map} +1 -1
  83. package/dist/{renderer-BusX07ZE.mjs → renderer-C3L9SNRO.mjs} +2 -2
  84. package/dist/{renderer-BusX07ZE.mjs.map → renderer-C3L9SNRO.mjs.map} +1 -1
  85. package/dist/renderer-C4O-L73n.mjs +3 -0
  86. package/dist/{renderer-CxE-8m71.mjs → renderer-C9BKcHZb.mjs} +1 -1
  87. package/dist/renderer-CGVuhBbA.mjs +3 -0
  88. package/dist/renderer-CHKB-Or4.mjs +3 -0
  89. package/dist/renderer-CL9gPcfZ.mjs +3 -0
  90. package/dist/{renderer-CXO4wWOT.mjs → renderer-CMM4DZ1i.mjs} +2 -2
  91. package/dist/{renderer-CXO4wWOT.mjs.map → renderer-CMM4DZ1i.mjs.map} +1 -1
  92. package/dist/{renderer-DWvg6ZKK.mjs → renderer-COkFM1KL.mjs} +2 -2
  93. package/dist/{renderer-DWvg6ZKK.mjs.map → renderer-COkFM1KL.mjs.map} +1 -1
  94. package/dist/renderer-CSkFF-qe.mjs +3 -0
  95. package/dist/renderer-CU2c6zWc.mjs +3 -0
  96. package/dist/{renderer-DG3VnR50.mjs → renderer-CXUohIJ9.mjs} +2 -2
  97. package/dist/{renderer-DG3VnR50.mjs.map → renderer-CXUohIJ9.mjs.map} +1 -1
  98. package/dist/{renderer-BXDrwZNT.mjs → renderer-CeADvUU_.mjs} +2 -2
  99. package/dist/{renderer-BXDrwZNT.mjs.map → renderer-CeADvUU_.mjs.map} +1 -1
  100. package/dist/{renderer-s_HENMCc.mjs → renderer-CgVdRbc-.mjs} +2 -2
  101. package/dist/{renderer-s_HENMCc.mjs.map → renderer-CgVdRbc-.mjs.map} +1 -1
  102. package/dist/renderer-CiLiH6w_.mjs +3 -0
  103. package/dist/{renderer-Daa-Af8y.mjs → renderer-CnRoblJF.mjs} +2 -2
  104. package/dist/{renderer-Daa-Af8y.mjs.map → renderer-CnRoblJF.mjs.map} +1 -1
  105. package/dist/{renderer-Y7-Us00q.mjs → renderer-CsQ7nY0z.mjs} +1 -1
  106. package/dist/{renderer-CBdqOoTN.mjs → renderer-CwAjqb2o.mjs} +1 -1
  107. package/dist/{renderer-Bmt3fpzg.mjs → renderer-Cx5H41JR.mjs} +1 -1
  108. package/dist/{renderer-vnHsTpQf.mjs → renderer-D1Zs78PQ.mjs} +54 -84
  109. package/dist/{renderer-vnHsTpQf.mjs.map → renderer-D1Zs78PQ.mjs.map} +1 -1
  110. package/dist/{renderer-DFA0KBdj.mjs → renderer-D1ib-wB3.mjs} +2 -2
  111. package/dist/{renderer-DFA0KBdj.mjs.map → renderer-D1ib-wB3.mjs.map} +1 -1
  112. package/dist/{renderer-Bh1pfpzz.mjs → renderer-D54yO_M_.mjs} +2 -2
  113. package/dist/{renderer-Bh1pfpzz.mjs.map → renderer-D54yO_M_.mjs.map} +1 -1
  114. package/dist/{renderer-aH8p3zLE.mjs → renderer-D5N2JO7g.mjs} +2 -2
  115. package/dist/{renderer-aH8p3zLE.mjs.map → renderer-D5N2JO7g.mjs.map} +1 -1
  116. package/dist/{renderer-BgAzIw8w.mjs → renderer-DBp6A7tR.mjs} +2 -2
  117. package/dist/{renderer-BgAzIw8w.mjs.map → renderer-DBp6A7tR.mjs.map} +1 -1
  118. package/dist/{renderer-CcDfRa1o.mjs → renderer-DI2RcpKU.mjs} +2 -2
  119. package/dist/{renderer-CcDfRa1o.mjs.map → renderer-DI2RcpKU.mjs.map} +1 -1
  120. package/dist/renderer-DMaYsSM4.mjs +3 -0
  121. package/dist/renderer-DZ7t_l1d.mjs +3 -0
  122. package/dist/{renderer-CkLD7Lp7.mjs → renderer-D_QS6p1q.mjs} +2 -2
  123. package/dist/{renderer-CkLD7Lp7.mjs.map → renderer-D_QS6p1q.mjs.map} +1 -1
  124. package/dist/{renderer-DDp7_TUi.d.mts → renderer-DcPOsAVu.d.mts} +2 -2
  125. package/dist/{renderer-DDp7_TUi.d.mts.map → renderer-DcPOsAVu.d.mts.map} +1 -1
  126. package/dist/{renderer-BBweieq9.mjs → renderer-Dcd-Pkzd.mjs} +2 -2
  127. package/dist/{renderer-BBweieq9.mjs.map → renderer-Dcd-Pkzd.mjs.map} +1 -1
  128. package/dist/{renderer-VHpQTPbr.mjs → renderer-DjiUZ0Vs.mjs} +2 -2
  129. package/dist/{renderer-VHpQTPbr.mjs.map → renderer-DjiUZ0Vs.mjs.map} +1 -1
  130. package/dist/renderer-DkJEnKQu.mjs +3 -0
  131. package/dist/renderer-DlkrKqQj.mjs +3 -0
  132. package/dist/renderer-DxOQ5S8T.mjs +3 -0
  133. package/dist/renderer-Ibvw1tE_.mjs +3 -0
  134. package/dist/{renderer-BcckaXum.mjs → renderer-JjMO41Cv.mjs} +2 -2
  135. package/dist/{renderer-BcckaXum.mjs.map → renderer-JjMO41Cv.mjs.map} +1 -1
  136. package/dist/renderer-M0jeFo6S.mjs +4 -0
  137. package/dist/renderer-NhSzqWsQ.mjs +3 -0
  138. package/dist/renderer-OrhgkzVu.mjs +3 -0
  139. package/dist/{renderer-9ZcinEHr.mjs → renderer-Q7_DUcnu.mjs} +2 -2
  140. package/dist/{renderer-9ZcinEHr.mjs.map → renderer-Q7_DUcnu.mjs.map} +1 -1
  141. package/dist/{renderer-8dDNjgzG.mjs → renderer-QfSB-cRU.mjs} +2 -2
  142. package/dist/{renderer-8dDNjgzG.mjs.map → renderer-QfSB-cRU.mjs.map} +1 -1
  143. package/dist/{renderer-BQgAn_oc.mjs → renderer-WXylxlu2.mjs} +2 -2
  144. package/dist/{renderer-BQgAn_oc.mjs.map → renderer-WXylxlu2.mjs.map} +1 -1
  145. package/dist/renderer-WrFAaLxW.mjs +3 -0
  146. package/dist/renderer-bbOALT4F.mjs +3 -0
  147. package/dist/{renderer-DQQnEcSA.mjs → renderer-bebAt6Dz.mjs} +2 -2
  148. package/dist/{renderer-DQQnEcSA.mjs.map → renderer-bebAt6Dz.mjs.map} +1 -1
  149. package/dist/{renderer-1ccLpvz3.mjs → renderer-eC1gRPRo.mjs} +2 -2
  150. package/dist/{renderer-1ccLpvz3.mjs.map → renderer-eC1gRPRo.mjs.map} +1 -1
  151. package/dist/renderer-lXmyzdcx.mjs +3 -0
  152. package/dist/renderer-ospMsCzr.mjs +3 -0
  153. package/dist/{renderer-BwE5dnyL.mjs → renderer-vUjNMbLq.mjs} +2 -2
  154. package/dist/{renderer-BwE5dnyL.mjs.map → renderer-vUjNMbLq.mjs.map} +1 -1
  155. package/dist/{renderers-BWg16W-V-FofeEqQL.mjs → renderers-BWg16W-V-jhdCp6Vd.mjs} +2 -2
  156. package/dist/{renderers-BWg16W-V-FofeEqQL.mjs.map → renderers-BWg16W-V-jhdCp6Vd.mjs.map} +1 -1
  157. package/dist/signals/index.d.mts +5 -5
  158. package/dist/signals/index.mjs +4 -4
  159. package/package.json +55 -55
  160. package/dist/dist-CGIme1vZ.mjs.map +0 -1
  161. package/dist/dist-DuIv211_.mjs.map +0 -1
  162. package/dist/fonts-CwwIhe1o.mjs.map +0 -1
  163. package/dist/index-CnAk1hTw.d.mts.map +0 -1
  164. package/dist/index-DiSKzDGR.d.mts.map +0 -1
  165. package/dist/preview-D7TqF9i_.mjs.map +0 -1
  166. package/dist/preview-engine/chunk-47VT677S.mjs +0 -8
  167. package/dist/preview-engine/chunk-QARN3FLA.mjs +0 -418
  168. package/dist/preview-engine/chunk-SZ7YRPKO.mjs +0 -3
  169. package/dist/renderer-0kXgErRZ.mjs +0 -3
  170. package/dist/renderer-B9e4XyZy.mjs +0 -3
  171. package/dist/renderer-BBhCaxS2.mjs +0 -3
  172. package/dist/renderer-BC0iMueW.mjs +0 -3
  173. package/dist/renderer-BGd1VV9J.mjs +0 -3
  174. package/dist/renderer-BJKbasW6.mjs +0 -3
  175. package/dist/renderer-BV3mlZMX.mjs +0 -3
  176. package/dist/renderer-BgO4XWZz.mjs +0 -3
  177. package/dist/renderer-Bk842iGl.mjs +0 -4
  178. package/dist/renderer-Bn7jX6n3.mjs +0 -3
  179. package/dist/renderer-CPKOjnkT.mjs +0 -3
  180. package/dist/renderer-CSgVUPHu.mjs +0 -3
  181. package/dist/renderer-CUr66blo.mjs +0 -3
  182. package/dist/renderer-CYC-j_8W.mjs +0 -3
  183. package/dist/renderer-Cy7k7eN9.mjs +0 -3
  184. package/dist/renderer-D3poaM-T.mjs +0 -3
  185. package/dist/renderer-D69vFGNB.mjs +0 -3
  186. package/dist/renderer-DiXzb5FQ.mjs +0 -3
  187. package/dist/renderer-DkKjy-Q0.mjs +0 -3
  188. package/dist/renderer-DlxCfGuA.mjs +0 -3
  189. package/dist/renderer-DnUe5mD1.mjs +0 -3
  190. package/dist/renderer-DwtLqidh.mjs +0 -3
  191. package/dist/renderer-WaLyCr37.mjs +0 -3
  192. package/dist/renderer-rrz9Fhwo.mjs +0 -3
  193. package/dist/renderer-ssnm_dWv.mjs +0 -3
@@ -1,5 +1,5 @@
1
- import "../index-D2jDC7O5.mjs";
2
- import "../index-BMVVmc4G.mjs";
3
- import { $ as Blur, $t as _default$24, A as MotionBlur, B as SelectiveColorProps, C as HighPass, Cn as _default$1, D as LevelsProps, E as Levels, F as Relight3DProps, G as TileOffsetEdgeMode, H as ShadowsHighlightsProps, I as SSAO, J as UnsharpMaskProps, Jt as _default$29, K as TileOffsetProps, Kt as EffectProp, L as SSAOProps, M as PBRGlass, N as PBRGlassProps, O as Modulate, P as Relight3D, Q as effectMeta, Qt as _default$25, R as SelectiveColor, S as HalftoneScreenProps, Sn as _default$2, T as LevelChannel, U as TemporalDeflicker, V as ShadowsHighlights, W as TileOffset, X as VisionProps, Xt as _default$27, Y as Vision, Yt as _default$28, Z as effectFactories, Zt as _default$26, _ as GradientMapProps, _n as _default$6, a as Crop, an as _default$17, at as TonalShift, b as HalftoneMode, bn as _default$4, c as CurvesChannelPoint, cn as _default$15, d as DeflickerProps, dn as _default$12, en as _default$23, et as BlurProps, f as DepthOfField, fn as _default$11, g as GradientMap, gn as _default$7, h as FilmGrainProps, hn as _default$8, i as AudioSignalExtractorProps, in as _default$18, it as ColorKeyProps, j as MotionBlurProps, k as ModulateProps, l as CurvesProps, ln as _default$14, m as FilmGrain, mn as _default$9, n as ApplyLUTProps, nn as _default$21, nt as ColorBalanceProps, o as CropProps, on as _default, ot as Vignette, p as DepthOfFieldProps, pn as _default$10, q as UnsharpMask, qt as _default$30, r as AudioSignalExtractor, rn as _default$20, rt as ColorKey, s as Curves, sn as _default$16, st as VignetteProps, t as ApplyLUT, tn as _default$22, tt as ColorBalance, u as CustomEffect, un as _default$13, v as GradientMapStop, vn as rendererNode, w as HighPassProps, x as HalftoneScreen, xn as _default$3, y as HalftoneDotShape, yn as _default$5, z as SelectiveColorAdjustment } from "../index-D7llSs-m.mjs";
4
- import { i as _default$19 } from "../audio-Dvwwz8xU.mjs";
1
+ import "../index-ogL8Y-Ng.mjs";
2
+ import "../index-DY3mLoPO.mjs";
3
+ import { $ as Blur, $t as _default$24, A as MotionBlur, B as SelectiveColorProps, C as HighPass, Cn as _default$1, D as LevelsProps, E as Levels, F as Relight3DProps, G as TileOffsetEdgeMode, H as ShadowsHighlightsProps, I as SSAO, J as UnsharpMaskProps, Jt as _default$29, K as TileOffsetProps, Kt as EffectProp, L as SSAOProps, M as PBRGlass, N as PBRGlassProps, O as Modulate, P as Relight3D, Q as effectMeta, Qt as _default$25, R as SelectiveColor, S as HalftoneScreenProps, Sn as _default$2, T as LevelChannel, U as TemporalDeflicker, V as ShadowsHighlights, W as TileOffset, X as VisionProps, Xt as _default$27, Y as Vision, Yt as _default$28, Z as effectFactories, Zt as _default$26, _ as GradientMapProps, _n as _default$6, a as Crop, an as _default$17, at as TonalShift, b as HalftoneMode, bn as _default$4, c as CurvesChannelPoint, cn as _default$15, d as DeflickerProps, dn as _default$12, en as _default$23, et as BlurProps, f as DepthOfField, fn as _default$11, g as GradientMap, gn as _default$7, h as FilmGrainProps, hn as _default$8, i as AudioSignalExtractorProps, in as _default$18, it as ColorKeyProps, j as MotionBlurProps, k as ModulateProps, l as CurvesProps, ln as _default$14, m as FilmGrain, mn as _default$9, n as ApplyLUTProps, nn as _default$21, nt as ColorBalanceProps, o as CropProps, on as _default, ot as Vignette, p as DepthOfFieldProps, pn as _default$10, q as UnsharpMask, qt as _default$30, r as AudioSignalExtractor, rn as _default$20, rt as ColorKey, s as Curves, sn as _default$16, st as VignetteProps, t as ApplyLUT, tn as _default$22, tt as ColorBalance, u as CustomEffect, un as _default$13, v as GradientMapStop, vn as rendererNode, w as HighPassProps, x as HalftoneScreen, xn as _default$3, y as HalftoneDotShape, yn as _default$5, z as SelectiveColorAdjustment } from "../index-C8rstr3Y.mjs";
4
+ import { i as _default$19 } from "../audio-nmU-BWxI.mjs";
5
5
  export { ApplyLUT, ApplyLUTProps, AudioSignalExtractor, AudioSignalExtractorProps, Blur, BlurProps, ColorBalance, ColorBalanceProps, ColorKey, ColorKeyProps, Crop, CropProps, Curves, CurvesChannelPoint, CurvesProps, CustomEffect, DeflickerProps, DepthOfField, DepthOfFieldProps, EffectProp, FilmGrain, FilmGrainProps, GradientMap, GradientMapProps, GradientMapStop, HalftoneDotShape, HalftoneMode, HalftoneScreen, HalftoneScreenProps, HighPass, HighPassProps, LevelChannel, Levels, LevelsProps, Modulate, ModulateProps, MotionBlur, MotionBlurProps, PBRGlass, PBRGlassProps, Relight3D, Relight3DProps, SSAO, SSAOProps, SelectiveColor, SelectiveColorAdjustment, SelectiveColorProps, ShadowsHighlights, ShadowsHighlightsProps, TemporalDeflicker, TileOffset, TileOffsetEdgeMode, TileOffsetProps, TonalShift, UnsharpMask, UnsharpMaskProps, Vignette, VignetteProps, Vision, VisionProps, _default as applyLutRenderer, _default$1 as blurRenderer, _default$2 as colorBalanceRenderer, _default$3 as colorkeyRenderer, _default$4 as cornerPinRenderer, _default$5 as cropRenderer, rendererNode as curvesRenderer, _default$6 as deflickerRenderer, _default$7 as displacementMapRenderer, effectFactories, effectMeta, _default$8 as filmGrainRenderer, _default$9 as flipRenderer, _default$10 as gradientMapRenderer, _default$11 as halftoneScreenRenderer, _default$12 as highPassRenderer, _default$13 as kenBurnsRenderer, _default$14 as layerStyleRenderer, _default$15 as levelsRenderer, _default$16 as liquifyRenderer, _default$17 as maskMathRenderer, _default$18 as meshWarpRenderer, _default$19 as modulateRenderer, _default$20 as paintRenderer, _default$21 as patchHealRenderer, _default$22 as refineEdgeRenderer, _default$23 as refractionCausticsRenderer, _default$24 as relight3dRenderer, _default$25 as selectiveColorRenderer, _default$26 as shadowsHighlightsRenderer, _default$27 as tileOffsetRenderer, _default$28 as unsharpMaskRenderer, _default$29 as vignetteRenderer, _default$30 as visionRenderer };
@@ -1,35 +1,35 @@
1
- import { t as renderers_default$20 } from "../renderer-CXO4wWOT.mjs";
1
+ import { t as renderers_default$20 } from "../renderer-CMM4DZ1i.mjs";
2
2
  import { t as renderers_default$31 } from "../renderer-z6Qb5Z-W.mjs";
3
- import { t as renderers_default$1 } from "../renderer-aH8p3zLE.mjs";
4
- import { n as renderers_default$2 } from "../renderer-DG3VnR50.mjs";
5
- import { t as renderers_default$3 } from "../renderer-DjYRCzzV.mjs";
3
+ import { t as renderers_default$1 } from "../renderer-D5N2JO7g.mjs";
4
+ import { n as renderers_default$2 } from "../renderer-CXUohIJ9.mjs";
5
+ import { t as renderers_default$3 } from "../renderer-BJiL-BQY.mjs";
6
6
  import { t as renderers_default$4 } from "../renderer-CQiTodg9.mjs";
7
7
  import { t as renderers_default$5 } from "../renderer-CzPWB0Ss.mjs";
8
8
  import { n as renderers_default$6 } from "../renderer-DZGtBUCx.mjs";
9
9
  import { t as renderers_default$7 } from "../renderer-BDLnExoP.mjs";
10
- import { t as renderers_default$8 } from "../renderer-s_HENMCc.mjs";
11
- import { t as renderers_default$9 } from "../renderer-B0DTz9Fr.mjs";
10
+ import { t as renderers_default$8 } from "../renderer-CgVdRbc-.mjs";
11
+ import { t as renderers_default$9 } from "../renderer-BYsmLk63.mjs";
12
12
  import { t as renderers_default$10 } from "../renderer-ho_jXJ0H.mjs";
13
- import { n as renderers_default$11 } from "../renderer-9ZcinEHr.mjs";
14
- import { t as renderers_default$12 } from "../renderer-CkLD7Lp7.mjs";
15
- import { t as renderers_default$13 } from "../renderer-BgAzIw8w.mjs";
13
+ import { n as renderers_default$11 } from "../renderer-Q7_DUcnu.mjs";
14
+ import { t as renderers_default$12 } from "../renderer-D_QS6p1q.mjs";
15
+ import { t as renderers_default$13 } from "../renderer-DBp6A7tR.mjs";
16
16
  import { t as renderers_default$14 } from "../renderer-_uvdg48N.mjs";
17
17
  import { t as renderers_default$15 } from "../renderer-x2s9LmVL.mjs";
18
- import { t as renderers_default$16 } from "../renderer-DFA0KBdj.mjs";
18
+ import { t as renderers_default$16 } from "../renderer-D1ib-wB3.mjs";
19
19
  import { n as renderers_default$17 } from "../renderer-CpkiHRhh.mjs";
20
- import { t as renderers_default } from "../renderer-CeF66MG3.mjs";
21
- import { n as renderers_default$18 } from "../renderer-NYcVjCOi.mjs";
20
+ import { t as renderers_default } from "../renderer-B9l641o-.mjs";
21
+ import { n as renderers_default$18 } from "../renderer-BtkU0BT-.mjs";
22
22
  import { t as renderers_default$19 } from "../renderer-BREIjsUU.mjs";
23
- import { t as renderers_default$21 } from "../renderer-8dDNjgzG.mjs";
24
- import { n as renderers_default$22 } from "../renderer-BQgAn_oc.mjs";
25
- import { n as renderers_default$23 } from "../renderer-CuppzplW.mjs";
26
- import { n as renderers_default$24 } from "../renderer-BBweieq9.mjs";
27
- import { t as renderers_default$25 } from "../renderer-BcckaXum.mjs";
23
+ import { t as renderers_default$21 } from "../renderer-QfSB-cRU.mjs";
24
+ import { n as renderers_default$22 } from "../renderer-WXylxlu2.mjs";
25
+ import { n as renderers_default$23 } from "../renderer-Bwsh5TUv.mjs";
26
+ import { n as renderers_default$24 } from "../renderer-Dcd-Pkzd.mjs";
27
+ import { t as renderers_default$25 } from "../renderer-JjMO41Cv.mjs";
28
28
  import { t as renderers_default$26 } from "../renderer-DFKsLrUs.mjs";
29
- import { n as renderers_default$27 } from "../renderer-B5Tq5MWB.mjs";
30
- import { t as renderers_default$28 } from "../renderer-BwE5dnyL.mjs";
31
- import { t as renderers_default$29 } from "../renderer-BXDrwZNT.mjs";
32
- import { t as renderers_default$30 } from "../renderer-Daa-Af8y.mjs";
33
- import { C as effectFactories, D as Vignette, E as ColorKey, O as effectMeta, S as Vision, T as ColorBalance, _ as SelectiveColor, a as CustomEffect, b as TileOffset, c as GradientMap, d as Levels, f as Modulate, g as SSAO, h as Relight3D, i as Curves, l as HalftoneScreen, m as PBRGlass, n as AudioSignalExtractor, o as DepthOfField, p as MotionBlur, r as Crop, s as FilmGrain, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "../effects-B_APkGJJ.mjs";
29
+ import { n as renderers_default$27 } from "../renderer-BMrm2Zbz.mjs";
30
+ import { t as renderers_default$28 } from "../renderer-vUjNMbLq.mjs";
31
+ import { t as renderers_default$29 } from "../renderer-CeADvUU_.mjs";
32
+ import { t as renderers_default$30 } from "../renderer-CnRoblJF.mjs";
33
+ import { C as effectFactories, D as Vignette, E as ColorKey, O as effectMeta, S as Vision, T as ColorBalance, _ as SelectiveColor, a as CustomEffect, b as TileOffset, c as GradientMap, d as Levels, f as Modulate, g as SSAO, h as Relight3D, i as Curves, l as HalftoneScreen, m as PBRGlass, n as AudioSignalExtractor, o as DepthOfField, p as MotionBlur, r as Crop, s as FilmGrain, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "../effects-m3FuatqZ.mjs";
34
34
 
35
35
  export { ApplyLUT, AudioSignalExtractor, Blur, ColorBalance, ColorKey, Crop, Curves, CustomEffect, DepthOfField, FilmGrain, GradientMap, HalftoneScreen, HighPass, Levels, Modulate, MotionBlur, PBRGlass, Relight3D, SSAO, SelectiveColor, ShadowsHighlights, TemporalDeflicker, TileOffset, UnsharpMask, Vignette, Vision, renderers_default as applyLutRenderer, renderers_default$1 as blurRenderer, renderers_default$2 as colorBalanceRenderer, renderers_default$3 as colorkeyRenderer, renderers_default$4 as cornerPinRenderer, renderers_default$5 as cropRenderer, renderers_default$6 as curvesRenderer, renderers_default$7 as deflickerRenderer, renderers_default$8 as displacementMapRenderer, effectFactories, effectMeta, renderers_default$9 as filmGrainRenderer, renderers_default$10 as flipRenderer, renderers_default$11 as gradientMapRenderer, renderers_default$12 as halftoneScreenRenderer, renderers_default$13 as highPassRenderer, renderers_default$14 as kenBurnsRenderer, renderers_default$15 as layerStyleRenderer, renderers_default$16 as levelsRenderer, renderers_default$17 as liquifyRenderer, renderers_default$18 as maskMathRenderer, renderers_default$19 as meshWarpRenderer, renderers_default$20 as modulateRenderer, renderers_default$21 as paintRenderer, renderers_default$22 as patchHealRenderer, renderers_default$23 as refineEdgeRenderer, renderers_default$24 as refractionCausticsRenderer, renderers_default$25 as relight3dRenderer, renderers_default$26 as selectiveColorRenderer, renderers_default$27 as shadowsHighlightsRenderer, renderers_default$28 as tileOffsetRenderer, renderers_default$29 as unsharpMaskRenderer, renderers_default$30 as vignetteRenderer, renderers_default$31 as visionRenderer };
@@ -1,5 +1,5 @@
1
1
  import { Ot as isSignal, v as Effect } from "./dist-Bx6J0VcM.mjs";
2
- import { t as AudioSignal } from "./audio-DbxiKp5p.mjs";
2
+ import { t as AudioSignal } from "./audio-COkiXyDb.mjs";
3
3
 
4
4
  //#region src/effects/with-defaults.ts
5
5
  function env(name) {
@@ -808,4 +808,4 @@ var Modulate = class extends Effect {
808
808
 
809
809
  //#endregion
810
810
  export { effectFactories as C, Vignette as D, ColorKey as E, effectMeta as O, Vision as S, ColorBalance as T, SelectiveColor as _, CustomEffect as a, TileOffset as b, GradientMap as c, Levels as d, Modulate as f, SSAO as g, Relight3D as h, Curves as i, HalftoneScreen as l, PBRGlass as m, AudioSignalExtractor as n, DepthOfField as o, MotionBlur as p, Crop as r, FilmGrain as s, ApplyLUT as t, HighPass as u, ShadowsHighlights as v, Blur as w, UnsharpMask as x, TemporalDeflicker as y };
811
- //# sourceMappingURL=effects-B_APkGJJ.mjs.map
811
+ //# sourceMappingURL=effects-m3FuatqZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"effects-B_APkGJJ.mjs","names":[],"sources":["../src/effects/with-defaults.ts","../src/effects/generated/meta.ts","../src/effects/generated/classes.ts","../src/effects/custom/blur.ts","../src/effects/generated/registry.ts","../src/effects/classes.ts"],"sourcesContent":["import { isSignal } from \"@framefields/core\";\n\n/** Literal metadata for one prop, emitted into `generated/meta.ts`. */\nexport interface PropMeta {\n\treadonly min?: number;\n\treadonly max?: number;\n\treadonly enum?: readonly (string | number | boolean)[];\n\t/** Members of a nested object prop. */\n\treadonly props?: EffectMeta;\n}\n\nexport type EffectMeta = Readonly<Record<string, PropMeta>>;\n\nfunction env(name: string): string | undefined {\n\treturn typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\n/** Throw instead of warn. Recommended for agent harnesses and CI. */\nfunction isStrict(): boolean {\n\tconst flag = env(\"FRAMEFIELDS_STRICT_PROPS\");\n\treturn flag === \"1\" || flag === \"true\";\n}\n\nfunction checksEnabled(): boolean {\n\treturn isStrict() || env(\"NODE_ENV\") !== \"production\";\n}\n\nconst reported = new Set<string>();\n\nfunction report(message: string): void {\n\tif (isStrict()) throw new Error(message);\n\tif (reported.has(message)) return;\n\treported.add(message);\n\tconsole.warn(`[framefields] ${message}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value) || isSignal(value)) return false;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n\n/** Levenshtein distance, for \"did you mean\" suggestions on small key sets. */\nfunction distance(a: string, b: string): number {\n\tconst row = Array.from({ length: b.length + 1 }, (_, i) => i);\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tlet prev = row[0];\n\t\trow[0] = i;\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst current = row[j];\n\t\t\trow[j] = Math.min(\n\t\t\t\trow[j] + 1,\n\t\t\t\trow[j - 1] + 1,\n\t\t\t\tprev + (a[i - 1] === b[j - 1] ? 0 : 1),\n\t\t\t);\n\t\t\tprev = current;\n\t\t}\n\t}\n\treturn row[b.length];\n}\n\nfunction suggest(key: string, known: readonly string[]): string {\n\tlet best: string | undefined;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\tconst lower = key.toLowerCase();\n\tfor (const candidate of known) {\n\t\tconst candidateLower = candidate.toLowerCase();\n\t\tconst score =\n\t\t\tcandidateLower.includes(lower) || lower.includes(candidateLower)\n\t\t\t\t? 1\n\t\t\t\t: distance(lower, candidateLower);\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbest = candidate;\n\t\t}\n\t}\n\tconst close = best && bestScore <= Math.max(2, Math.ceil(key.length / 2));\n\treturn close\n\t\t? ` Did you mean \"${best}\"?`\n\t\t: ` Known props: ${known.join(\", \")}.`;\n}\n\nfunction checkValue(path: string, value: unknown, meta: PropMeta): void {\n\tif (typeof value === \"number\") {\n\t\tconst { min, max } = meta;\n\t\tconst below = min !== undefined && value < min;\n\t\tconst above = max !== undefined && value > max;\n\t\tif (below || above || Number.isNaN(value)) {\n\t\t\tconst range =\n\t\t\t\tmin !== undefined && max !== undefined\n\t\t\t\t\t? `${min} to ${max}`\n\t\t\t\t\t: min !== undefined\n\t\t\t\t\t\t? `≥ ${min}`\n\t\t\t\t\t\t: `≤ ${max}`;\n\t\t\treport(\n\t\t\t\tNumber.isNaN(value)\n\t\t\t\t\t? `${path} is NaN`\n\t\t\t\t\t: `${path} = ${value} is outside ${range}`,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\tmeta.enum &&\n\t\t(typeof value === \"string\" || typeof value === \"boolean\") &&\n\t\t!meta.enum.includes(value)\n\t) {\n\t\treport(\n\t\t\t`${path} = ${JSON.stringify(value)} is not one of ${meta.enum\n\t\t\t\t.map((v) => JSON.stringify(v))\n\t\t\t\t.join(\", \")}`,\n\t\t);\n\t}\n}\n\nfunction checkProps(\n\tpath: string,\n\tconfig: Record<string, unknown>,\n\tmeta: EffectMeta,\n): void {\n\tconst known = Object.keys(meta);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value === undefined) continue;\n\t\tconst propMeta = meta[key];\n\t\tif (!propMeta) {\n\t\t\treport(`${path}: unknown prop \"${key}\".${suggest(key, known)}`);\n\t\t\tcontinue;\n\t\t}\n\t\t// Signals and frame functions are sampled per frame; only static values\n\t\t// can be checked here.\n\t\tif (isSignal(value) || typeof value === \"function\") continue;\n\t\tif (propMeta.props && isPlainObject(value)) {\n\t\t\tcheckProps(`${path}.${key}`, value, propMeta.props);\n\t\t} else {\n\t\t\tcheckValue(`${path}.${key}`, value, propMeta);\n\t\t}\n\t}\n}\n\nfunction cloneDefault<T>(value: T): T {\n\treturn typeof value === \"object\" && value !== null\n\t\t? structuredClone(value)\n\t\t: value;\n}\n\n/**\n * Builds the initial config of a generated effect class.\n *\n * - `undefined` entries in `config` keep the default instead of overwriting it.\n * - When both the default and the supplied value are plain objects, they are\n * merged one level deep, so `new ColorBalance({ shadows: { cyanRed: 10 } })`\n * keeps the other two channels at their defaults.\n * - Object defaults are cloned per instance.\n * - Outside production, unknown props and out-of-range static values are\n * reported: a `console.warn` once per message, or a thrown `Error` when\n * `FRAMEFIELDS_STRICT_PROPS=1`. Unknown props are still passed through.\n */\nexport function withDefaults<T extends object>(\n\top: string,\n\tdefaults: Readonly<Partial<T>>,\n\tconfig: T,\n\tmeta: EffectMeta,\n): T {\n\tconst supplied = config as Record<string, unknown>;\n\tif (checksEnabled()) checkProps(op, supplied, meta);\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(defaults)) {\n\t\tresult[key] = cloneDefault(value);\n\t}\n\tfor (const [key, value] of Object.entries(supplied)) {\n\t\tif (value === undefined) continue;\n\t\tconst base = result[key];\n\t\tresult[key] =\n\t\t\tisPlainObject(base) && isPlainObject(value)\n\t\t\t\t? {\n\t\t\t\t\t\t...base,\n\t\t\t\t\t\t...Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t}\n\t\t\t\t: value;\n\t}\n\treturn result as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport type { EffectMeta } from \"../with-defaults.js\";\n\n/** Ranges and allowed values per effect prop, used by `withDefaults()` checks. */\nexport const effectMeta = {\n\tBlur: {\n\t\tblurType: {\n\t\t\tenum: [\n\t\t\t\t\"Gaussian\",\n\t\t\t\t\"Box\",\n\t\t\t\t\"Median\",\n\t\t\t\t\"Motion\",\n\t\t\t\t\"Bilateral\",\n\t\t\t\t\"Edge-preserving\",\n\t\t\t\t\"Radial\",\n\t\t\t\t\"Zoom\",\n\t\t\t],\n\t\t},\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tangle: {\n\t\t\tmin: 0,\n\t\t\tmax: 360,\n\t\t},\n\t\tsigmaColor: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tpartialBlur: {},\n\t\tradius: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tradiusY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tshape: {\n\t\t\tenum: [\"ellipse\", \"circle\", \"rect\"],\n\t\t},\n\t},\n\tColorBalance: {\n\t\tshadows: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmidtones: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\thighlights: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tpreserveLuminosity: {},\n\t},\n\tColorKey: {\n\t\tkeyColor: {},\n\t\tsimilarity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tsmoothness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tspillSuppression: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcolorSpace: {\n\t\t\tenum: [\"YUV\", \"RGB\"],\n\t\t},\n\t\tspillSuppressionType: {\n\t\t\tenum: [\"Desaturate\", \"Neutralize\", \"None\"],\n\t\t},\n\t},\n\tVignette: {\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tradius: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 2,\n\t\t},\n\t\tsoftness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\troundness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t},\n} as const satisfies Record<string, EffectMeta>;\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Effect } from \"@framefields/core\";\nimport type { EffectProp } from \"../types.js\";\nimport { withDefaults } from \"../with-defaults.js\";\nimport { effectMeta } from \"./meta.js\";\n\nexport interface TonalShift {\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tcyanRed: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tmagentaGreen: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tyellowBlue: number;\n}\n\nexport interface BlurBaseProps {\n\t/**\n\t * Blur Type\n\t * @default \"Gaussian\"\n\t */\n\tblurType?:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\t/**\n\t * The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 5\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * Direction of a Motion blur, in degrees.\n\t * Range 0 to 360. Accepts a signal.\n\t * @default 0\n\t */\n\tangle?: EffectProp<number>;\n\t/**\n\t * Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsigmaColor?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n\t/**\n\t * Blurs only a specific circular area around center point.\n\t * Accepts a signal.\n\t * @default false\n\t */\n\tpartialBlur?: EffectProp<boolean>;\n\t/**\n\t * Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tradiusY?: EffectProp<number>;\n\t/**\n\t * Shape of the partial blur region.\n\t * @default \"circle\"\n\t */\n\tshape?: \"ellipse\" | \"circle\" | \"rect\";\n}\n\nconst blurDefaults: BlurBaseProps = {\n\tblurType: \"Gaussian\",\n\tstrength: 5,\n\tangle: 0,\n\tsigmaColor: 0.1,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n\tpartialBlur: false,\n\tradius: 0.3,\n\tradiusY: 0,\n\tshape: \"circle\",\n};\n\n/** @internal Extended by `effects/custom/blur.ts`, which exports `Blur`. */\nexport class BlurBase extends Effect<BlurBaseProps> {\n\tpublic readonly op = \"Blur\";\n\n\tpublic declare blurType:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\tpublic declare strength: number;\n\tpublic declare angle: number;\n\tpublic declare sigmaColor: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\tpublic declare partialBlur: boolean;\n\tpublic declare radius: number;\n\tpublic declare radiusY: number;\n\tpublic declare shape: \"ellipse\" | \"circle\" | \"rect\";\n\n\tconstructor(config: BlurBaseProps = {}) {\n\t\tsuper(withDefaults(\"Blur\", blurDefaults, config, effectMeta.Blur));\n\t}\n}\n\nexport interface ColorBalanceProps {\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tshadows?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tmidtones?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\thighlights?: Partial<TonalShift>;\n\t/**\n\t * @default true\n\t */\n\tpreserveLuminosity?: boolean;\n}\n\nconst colorBalanceDefaults: ColorBalanceProps = {\n\tshadows: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tmidtones: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\thighlights: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tpreserveLuminosity: true,\n};\n\nexport class ColorBalance extends Effect<ColorBalanceProps> {\n\tpublic readonly op = \"ColorBalance\";\n\n\tpublic declare shadows: Partial<TonalShift>;\n\tpublic declare midtones: Partial<TonalShift>;\n\tpublic declare highlights: Partial<TonalShift>;\n\tpublic declare preserveLuminosity: boolean;\n\n\tconstructor(config: ColorBalanceProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ColorBalance\",\n\t\t\t\tcolorBalanceDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ColorBalance,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ColorKeyProps {\n\t/**\n\t * Key Color\n\t * @default \"#00ff00\"\n\t */\n\tkeyColor?: string;\n\t/**\n\t * How close the color must be to the Key Color to be removed.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.4\n\t */\n\tsimilarity?: EffectProp<number>;\n\t/**\n\t * The softness of the transparency edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsmoothness?: EffectProp<number>;\n\t/**\n\t * Amount of key color spill to remove from foreground edges.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.2\n\t */\n\tspillSuppression?: EffectProp<number>;\n\t/**\n\t * Color space used to calculate similarity distance.\n\t * @default \"YUV\"\n\t */\n\tcolorSpace?: \"YUV\" | \"RGB\";\n\t/**\n\t * How key color spill is suppressed on foreground edges.\n\t * @default \"Desaturate\"\n\t */\n\tspillSuppressionType?: \"Desaturate\" | \"Neutralize\" | \"None\";\n}\n\nconst colorKeyDefaults: ColorKeyProps = {\n\tkeyColor: \"#00ff00\",\n\tsimilarity: 0.4,\n\tsmoothness: 0.1,\n\tspillSuppression: 0.2,\n\tcolorSpace: \"YUV\",\n\tspillSuppressionType: \"Desaturate\",\n};\n\nexport class ColorKey extends Effect<ColorKeyProps> {\n\tpublic readonly op = \"ColorKey\";\n\n\tpublic declare keyColor: string;\n\tpublic declare similarity: number;\n\tpublic declare smoothness: number;\n\tpublic declare spillSuppression: number;\n\tpublic declare colorSpace: \"YUV\" | \"RGB\";\n\tpublic declare spillSuppressionType: \"Desaturate\" | \"Neutralize\" | \"None\";\n\n\tconstructor(config: ColorKeyProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"ColorKey\", colorKeyDefaults, config, effectMeta.ColorKey),\n\t\t);\n\t}\n}\n\nexport interface VignetteProps {\n\t/**\n\t * The intensity of the vignette darkening effect. 0 = no vignette.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 50\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * The extent/size of the vignette.\n\t * Range 0.1 to 2. Accepts a signal.\n\t * @default 1\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * The softness of the vignette transition edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tsoftness?: EffectProp<number>;\n\t/**\n\t * 0.0 matches the image aspect ratio, 1.0 is a perfect circle.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\troundness?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n}\n\nconst vignetteDefaults: VignetteProps = {\n\tstrength: 50,\n\tradius: 1,\n\tsoftness: 0.5,\n\troundness: 0.5,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n};\n\nexport class Vignette extends Effect<VignetteProps> {\n\tpublic readonly op = \"Vignette\";\n\n\tpublic declare strength: number;\n\tpublic declare radius: number;\n\tpublic declare softness: number;\n\tpublic declare roundness: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\n\tconstructor(config: VignetteProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"Vignette\", vignetteDefaults, config, effectMeta.Vignette),\n\t\t);\n\t}\n}\n","import type { ObjectTrackSignals } from \"@framefields/vision\";\nimport { BlurBase, type BlurBaseProps } from \"../generated/classes.js\";\n\nexport interface BlurProps extends BlurBaseProps {\n\t/**\n\t * Follow a tracked object. Turns on `partialBlur` and derives the region\n\t * (`centerX`, `centerY`, `radius`, `radiusY`, `shape`) and `strength` from\n\t * the track. Any of those passed explicitly wins over the track.\n\t */\n\ttrack?: ObjectTrackSignals;\n}\n\n/** Props the track supplies when the caller does not. */\nfunction trackDefaults(track: ObjectTrackSignals): BlurBaseProps {\n\treturn {\n\t\tpartialBlur: true,\n\t\tcenterX: track.center.x,\n\t\tcenterY: track.center.y,\n\t\tradius: track.bounds.width.multiply(0.55),\n\t\tradiusY: track.bounds.height.multiply(0.55),\n\t\tshape: \"ellipse\",\n\t\t// Fades the blur out while the object is not being tracked.\n\t\tstrength: track.active.multiply(25),\n\t};\n}\n\n/**\n * Blur effect. Props, defaults and ranges are generated from `node-blur`'s\n * schema ({@link BlurBase}); this subclass only adds `track`.\n */\nexport class Blur extends BlurBase {\n\tconstructor(config: BlurProps = {}) {\n\t\tconst { track, ...rest } = config;\n\t\tsuper(track ? { ...trackDefaults(track), ...definedOnly(rest) } : rest);\n\t}\n}\n\nfunction definedOnly<T extends object>(value: T): T {\n\treturn Object.fromEntries(\n\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t) as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Blur, type BlurProps } from \"../custom/blur.js\";\nimport {\n\tColorBalance,\n\ttype ColorBalanceProps,\n\tColorKey,\n\ttype ColorKeyProps,\n\tVignette,\n\ttype VignetteProps,\n} from \"./classes.js\";\n\n/** `Effect.<factory>(config)` helpers, one per generated effect class. */\nexport const effectFactories = {\n\tblur: (config?: BlurProps) => new Blur(config),\n\tcolorBalance: (config?: ColorBalanceProps) => new ColorBalance(config),\n\tcolorKey: (config?: ColorKeyProps) => new ColorKey(config),\n\tvignette: (config?: VignetteProps) => new Vignette(config),\n} as const;\n","import { Effect } from \"@framefields/core\";\nimport {\n\tAudioSignal,\n\ttype AudioSignalOptions,\n\ttype ExtractedAudioSignalsBundle,\n} from \"../signals/audio.js\";\nimport type { EffectProp } from \"./types.js\";\n\n// Vignette, Blur and ColorBalance are generated from their node packages\n// (./generated, written by scripts/generate-effects.mts). The classes below\n// are still hand-written and move there in later phases of spec/sync-node.md.\nexport * from \"./generated/index.js\";\nexport type { EffectProp } from \"./types.js\";\n\nexport interface LevelChannel {\n\tinBlack?: number;\n\tinWhite?: number;\n\toutBlack?: number;\n\toutWhite?: number;\n}\n\nexport interface LevelsProps {\n\tmaster?: LevelChannel;\n\tred?: LevelChannel;\n\tgreen?: LevelChannel;\n\tblue?: LevelChannel;\n}\n\nexport class Levels extends Effect<LevelsProps> {\n\tpublic readonly op = \"Levels\";\n\n\tpublic declare master: LevelChannel;\n\tpublic declare red: LevelChannel;\n\tpublic declare green: LevelChannel;\n\tpublic declare blue: LevelChannel;\n\n\tconstructor(config: LevelsProps = {}) {\n\t\tconst defaultChannel: LevelChannel = {\n\t\t\tinBlack: 0,\n\t\t\tinWhite: 1,\n\t\t\toutBlack: 0,\n\t\t\toutWhite: 1,\n\t\t};\n\t\tsuper({\n\t\t\tmaster: config.master ?? { ...defaultChannel },\n\t\t\tred: config.red ?? { ...defaultChannel },\n\t\t\tgreen: config.green ?? { ...defaultChannel },\n\t\t\tblue: config.blue ?? { ...defaultChannel },\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface FilmGrainProps {\n\tstrength?: EffectProp<number>;\n\tsize?: EffectProp<number>;\n\tmonochrome?: boolean;\n\tanimated?: boolean;\n\tspeed?: EffectProp<number>;\n\tshadows?: EffectProp<number>;\n\tmidtones?: EffectProp<number>;\n\thighlights?: EffectProp<number>;\n}\n\nexport class FilmGrain extends Effect<FilmGrainProps> {\n\tpublic readonly op = \"FilmGrain\";\n\n\tpublic declare strength: number;\n\tpublic declare size: number;\n\tpublic declare monochrome: boolean;\n\tpublic declare animated: boolean;\n\tpublic declare speed: number;\n\tpublic declare shadows: number;\n\tpublic declare midtones: number;\n\tpublic declare highlights: number;\n\n\tconstructor(config: FilmGrainProps = {}) {\n\t\tsuper({\n\t\t\tstrength: config.strength ?? 15,\n\t\t\tsize: config.size ?? 1.5,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t\tanimated: config.animated ?? true,\n\t\t\tspeed: config.speed ?? 50,\n\t\t\tshadows: config.shadows ?? 0.2,\n\t\t\tmidtones: config.midtones ?? 1.0,\n\t\t\thighlights: config.highlights ?? 0.2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport class CustomEffect extends Effect<Record<string, unknown>> {\n\tpublic readonly op: string;\n\n\tconstructor(opName: string, config: Record<string, unknown> = {}) {\n\t\tsuper(config);\n\t\tthis.op = opName;\n\t}\n}\n\nexport interface AudioSignalExtractorProps {\n\textractionMode?:\n\t\t| \"rms_envelope\"\n\t\t| \"transient_beat\"\n\t\t| \"sub_bass\"\n\t\t| \"bass\"\n\t\t| \"mid\"\n\t\t| \"high\"\n\t\t| \"spectral_flux\";\n\tattackMs?: number;\n\treleaseMs?: number;\n\tsensitivity?: number;\n\tnoiseFloorDb?: number;\n\tdynamicRangeDb?: number;\n\tautoRange?: boolean;\n\tsmoothing?: number;\n\tcurve?: \"linear\" | \"exponential\" | \"logarithmic\" | \"square\" | \"smoothstep\";\n\tbeatThreshold?: number;\n\tbeatDecayMs?: number;\n\tpreviewMode?: \"waveform\" | \"envelope\" | \"beat_markers\" | \"spectrum\";\n\tnodeId?: string;\n}\n\nexport class AudioSignalExtractor extends Effect<AudioSignalExtractorProps> {\n\tpublic readonly op = \"AudioSignalExtractor\";\n\n\tpublic declare extractionMode: AudioSignalExtractorProps[\"extractionMode\"];\n\tpublic declare attackMs: number;\n\tpublic declare releaseMs: number;\n\tpublic declare sensitivity: number;\n\tpublic declare noiseFloorDb: number;\n\tpublic declare dynamicRangeDb: number;\n\tpublic declare autoRange: boolean;\n\tpublic declare smoothing: number;\n\tpublic declare curve: AudioSignalExtractorProps[\"curve\"];\n\tpublic declare beatThreshold: number;\n\tpublic declare beatDecayMs: number;\n\tpublic declare previewMode: AudioSignalExtractorProps[\"previewMode\"];\n\tpublic declare nodeId: string;\n\n\tconstructor(config: AudioSignalExtractorProps = {}) {\n\t\tsuper({\n\t\t\textractionMode: config.extractionMode ?? \"rms_envelope\",\n\t\t\tattackMs: config.attackMs ?? 10,\n\t\t\treleaseMs: config.releaseMs ?? 120,\n\t\t\tsensitivity: config.sensitivity ?? 1.0,\n\t\t\tnoiseFloorDb: config.noiseFloorDb ?? -48,\n\t\t\tdynamicRangeDb: config.dynamicRangeDb ?? 48,\n\t\t\tautoRange: config.autoRange ?? true,\n\t\t\tsmoothing: config.smoothing ?? 0.15,\n\t\t\tcurve: config.curve ?? \"linear\",\n\t\t\tbeatThreshold: config.beatThreshold ?? 0.08,\n\t\t\tbeatDecayMs: config.beatDecayMs ?? 80,\n\t\t\tpreviewMode: config.previewMode ?? \"envelope\",\n\t\t\tnodeId: config.nodeId ?? \"audio_extractor\",\n\t\t\t...config,\n\t\t});\n\t}\n\n\tpublic async extract(\n\t\tsource: string,\n\t\toptions: Partial<AudioSignalOptions> = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\treturn AudioSignal.extract(source, {\n\t\t\textractionMode: this.extractionMode,\n\t\t\tattackMs: this.attackMs,\n\t\t\treleaseMs: this.releaseMs,\n\t\t\tsensitivity: this.sensitivity,\n\t\t\tnoiseFloorDb: this.noiseFloorDb,\n\t\t\tdynamicRangeDb: this.dynamicRangeDb,\n\t\t\tsmoothing: this.smoothing,\n\t\t\tcurve: this.curve,\n\t\t\tbeatThreshold: this.beatThreshold,\n\t\t\tbeatDecayMs: this.beatDecayMs,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\t...options,\n\t\t});\n\t}\n}\n\n// ─── Batch 1: Core Tonal, Color & Filter Effects ────────────────────────────\n\nexport interface CurvesChannelPoint {\n\tx: number;\n\ty: number;\n}\n\nexport interface CurvesProps {\n\tcurveType?: \"rgb\" | \"hue-vs-hue\" | \"hue-vs-sat\" | \"lum-vs-sat\" | \"sat-vs-sat\";\n\tmaster?: CurvesChannelPoint[];\n\tred?: CurvesChannelPoint[];\n\tgreen?: CurvesChannelPoint[];\n\tblue?: CurvesChannelPoint[];\n\thueVsHue?: CurvesChannelPoint[];\n\thueVsSat?: CurvesChannelPoint[];\n\tlumVsSat?: CurvesChannelPoint[];\n\tsatVsSat?: CurvesChannelPoint[];\n}\n\nexport class Curves extends Effect<CurvesProps> {\n\tpublic readonly op = \"Curves\";\n\n\tpublic declare curveType: CurvesProps[\"curveType\"];\n\tpublic declare master: CurvesChannelPoint[];\n\tpublic declare red: CurvesChannelPoint[];\n\tpublic declare green: CurvesChannelPoint[];\n\tpublic declare blue: CurvesChannelPoint[];\n\tpublic declare hueVsHue: CurvesChannelPoint[];\n\tpublic declare hueVsSat: CurvesChannelPoint[];\n\tpublic declare lumVsSat: CurvesChannelPoint[];\n\tpublic declare satVsSat: CurvesChannelPoint[];\n\n\tconstructor(config: CurvesProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tcurveType: config.curveType ?? \"rgb\",\n\t\t\tmaster: config.master ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tred: config.red ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tgreen: config.green ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tblue: config.blue ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\thueVsHue: config.hueVsHue ?? [\n\t\t\t\t{ x: 0, y: 0.5 },\n\t\t\t\t{ x: 1, y: 0.5 },\n\t\t\t],\n\t\t\thueVsSat: config.hueVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tlumVsSat: config.lumVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tsatVsSat: config.satVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t});\n\t}\n}\n\nexport interface SelectiveColorAdjustment {\n\tcyan: number;\n\tmagenta: number;\n\tyellow: number;\n\tblack: number;\n}\n\nexport interface SelectiveColorProps {\n\tmethod?: \"Relative\" | \"Absolute\";\n\treds?: Partial<SelectiveColorAdjustment>;\n\tyellows?: Partial<SelectiveColorAdjustment>;\n\tgreens?: Partial<SelectiveColorAdjustment>;\n\tcyans?: Partial<SelectiveColorAdjustment>;\n\tblues?: Partial<SelectiveColorAdjustment>;\n\tmagentas?: Partial<SelectiveColorAdjustment>;\n\twhites?: Partial<SelectiveColorAdjustment>;\n\tneutrals?: Partial<SelectiveColorAdjustment>;\n\tblacks?: Partial<SelectiveColorAdjustment>;\n}\n\nexport class SelectiveColor extends Effect<SelectiveColorProps> {\n\tpublic readonly op = \"SelectiveColor\";\n\n\tpublic declare method: \"Relative\" | \"Absolute\";\n\tpublic declare reds: SelectiveColorAdjustment;\n\tpublic declare yellows: SelectiveColorAdjustment;\n\tpublic declare greens: SelectiveColorAdjustment;\n\tpublic declare cyans: SelectiveColorAdjustment;\n\tpublic declare blues: SelectiveColorAdjustment;\n\tpublic declare magentas: SelectiveColorAdjustment;\n\tpublic declare whites: SelectiveColorAdjustment;\n\tpublic declare neutrals: SelectiveColorAdjustment;\n\tpublic declare blacks: SelectiveColorAdjustment;\n\n\tconstructor(config: SelectiveColorProps = {}) {\n\t\tconst defaultAdj: SelectiveColorAdjustment = {\n\t\t\tcyan: 0,\n\t\t\tmagenta: 0,\n\t\t\tyellow: 0,\n\t\t\tblack: 0,\n\t\t};\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmethod: config.method ?? \"Relative\",\n\t\t\treds: { ...defaultAdj, ...config.reds },\n\t\t\tyellows: { ...defaultAdj, ...config.yellows },\n\t\t\tgreens: { ...defaultAdj, ...config.greens },\n\t\t\tcyans: { ...defaultAdj, ...config.cyans },\n\t\t\tblues: { ...defaultAdj, ...config.blues },\n\t\t\tmagentas: { ...defaultAdj, ...config.magentas },\n\t\t\twhites: { ...defaultAdj, ...config.whites },\n\t\t\tneutrals: { ...defaultAdj, ...config.neutrals },\n\t\t\tblacks: { ...defaultAdj, ...config.blacks },\n\t\t});\n\t}\n}\n\nexport interface GradientMapStop {\n\tposition: number;\n\tcolor: string;\n}\n\nexport interface GradientMapProps {\n\tstops?: GradientMapStop[];\n\tsmooth?: boolean;\n\tdither?: boolean;\n\topacity?: EffectProp<number>;\n}\n\nexport class GradientMap extends Effect<GradientMapProps> {\n\tpublic readonly op = \"GradientMap\";\n\n\tpublic declare stops: GradientMapStop[];\n\tpublic declare smooth: boolean;\n\tpublic declare dither: boolean;\n\tpublic declare opacity: number;\n\n\tconstructor(config: GradientMapProps = {}) {\n\t\tconst defaultStops: GradientMapStop[] = [\n\t\t\t{ position: 0.0, color: \"#000000\" },\n\t\t\t{ position: 1.0, color: \"#ffffff\" },\n\t\t];\n\t\tsuper({\n\t\t\t...config,\n\t\t\tstops: config.stops ?? defaultStops,\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tdither: config.dither ?? true,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface ShadowsHighlightsProps {\n\tshadowAmount?: EffectProp<number>;\n\tshadowTonalWidth?: EffectProp<number>;\n\tshadowRadius?: EffectProp<number>;\n\thighlightAmount?: EffectProp<number>;\n\thighlightTonalWidth?: EffectProp<number>;\n\thighlightRadius?: EffectProp<number>;\n\tcolorCorrection?: EffectProp<number>;\n\tmidtoneContrast?: EffectProp<number>;\n}\n\nexport class ShadowsHighlights extends Effect<ShadowsHighlightsProps> {\n\tpublic readonly op = \"ShadowsHighlights\";\n\n\tpublic declare shadowAmount: number;\n\tpublic declare shadowTonalWidth: number;\n\tpublic declare shadowRadius: number;\n\tpublic declare highlightAmount: number;\n\tpublic declare highlightTonalWidth: number;\n\tpublic declare highlightRadius: number;\n\tpublic declare colorCorrection: number;\n\tpublic declare midtoneContrast: number;\n\n\tconstructor(config: ShadowsHighlightsProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshadowAmount: config.shadowAmount ?? 0,\n\t\t\tshadowTonalWidth: config.shadowTonalWidth ?? 50,\n\t\t\tshadowRadius: config.shadowRadius ?? 30,\n\t\t\thighlightAmount: config.highlightAmount ?? 0,\n\t\t\thighlightTonalWidth: config.highlightTonalWidth ?? 50,\n\t\t\thighlightRadius: config.highlightRadius ?? 30,\n\t\t\tcolorCorrection: config.colorCorrection ?? 0,\n\t\t\tmidtoneContrast: config.midtoneContrast ?? 0,\n\t\t});\n\t}\n}\n\nexport interface ApplyLUTProps {\n\tlutUrl?: string;\n\tintensity?: EffectProp<number>;\n}\n\nexport class ApplyLUT extends Effect<ApplyLUTProps> {\n\tpublic readonly op = \"ApplyLUT\";\n\n\tpublic declare lutUrl: string;\n\tpublic declare intensity: number;\n\n\tconstructor(config: ApplyLUTProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tlutUrl: config.lutUrl ?? \"\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface UnsharpMaskProps {\n\tamount?: EffectProp<number>;\n\tradius?: EffectProp<number>;\n\tthreshold?: EffectProp<number>;\n}\n\nexport class UnsharpMask extends Effect<UnsharpMaskProps> {\n\tpublic readonly op = \"UnsharpMask\";\n\n\tpublic declare amount: number;\n\tpublic declare radius: number;\n\tpublic declare threshold: number;\n\n\tconstructor(config: UnsharpMaskProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tamount: config.amount ?? 100,\n\t\t\tradius: config.radius ?? 1.5,\n\t\t\tthreshold: config.threshold ?? 3,\n\t\t});\n\t}\n}\n\nexport interface HighPassProps {\n\tradius?: EffectProp<number>;\n\tcontrastBoost?: EffectProp<number>;\n\tmonochrome?: boolean;\n}\n\nexport class HighPass extends Effect<HighPassProps> {\n\tpublic readonly op = \"HighPass\";\n\n\tpublic declare radius: number;\n\tpublic declare contrastBoost: number;\n\tpublic declare monochrome: boolean;\n\n\tconstructor(config: HighPassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 3.0,\n\t\t\tcontrastBoost: config.contrastBoost ?? 1.0,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t});\n\t}\n}\n\nexport type HalftoneDotShape = \"Circle\" | \"Diamond\" | \"Line\" | \"Square\";\nexport type HalftoneMode = \"Monochrome\" | \"CMYK\";\n\nexport interface HalftoneScreenProps {\n\tmode?: HalftoneMode;\n\tdotShape?: HalftoneDotShape;\n\tfrequency?: EffectProp<number>;\n\tangle?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\tdotColor?: string;\n\tpaperColor?: string;\n\tsmooth?: boolean;\n\tinvert?: boolean;\n\tcyanAngle?: EffectProp<number>;\n\tmagentaAngle?: EffectProp<number>;\n\tyellowAngle?: EffectProp<number>;\n\tblackAngle?: EffectProp<number>;\n\topacity?: EffectProp<number>;\n}\n\nexport class HalftoneScreen extends Effect<HalftoneScreenProps> {\n\tpublic readonly op = \"HalftoneScreen\";\n\n\tpublic declare mode: HalftoneMode;\n\tpublic declare dotShape: HalftoneDotShape;\n\tpublic declare frequency: number;\n\tpublic declare angle: number;\n\tpublic declare contrast: number;\n\tpublic declare dotColor: string;\n\tpublic declare paperColor: string;\n\tpublic declare smooth: boolean;\n\tpublic declare invert: boolean;\n\tpublic declare cyanAngle: number;\n\tpublic declare magentaAngle: number;\n\tpublic declare yellowAngle: number;\n\tpublic declare blackAngle: number;\n\tpublic declare opacity: number;\n\n\tconstructor(config: HalftoneScreenProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmode: config.mode ?? \"Monochrome\",\n\t\t\tdotShape: config.dotShape ?? \"Circle\",\n\t\t\tfrequency: config.frequency ?? 30,\n\t\t\tangle: config.angle ?? 45,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\tdotColor: config.dotColor ?? \"#000000\",\n\t\t\tpaperColor: config.paperColor ?? \"#ffffff\",\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tinvert: config.invert ?? false,\n\t\t\tcyanAngle: config.cyanAngle ?? 15,\n\t\t\tmagentaAngle: config.magentaAngle ?? 75,\n\t\t\tyellowAngle: config.yellowAngle ?? 0,\n\t\t\tblackAngle: config.blackAngle ?? 45,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport type TileOffsetEdgeMode = \"wrap\" | \"clamp\" | \"transparent\" | \"mirror\";\n\nexport interface TileOffsetProps {\n\toffsetX?: EffectProp<number>;\n\toffsetY?: EffectProp<number>;\n\twrap?: boolean;\n\tedgeMode?: TileOffsetEdgeMode;\n}\n\nexport class TileOffset extends Effect<TileOffsetProps> {\n\tpublic readonly op = \"TileOffset\";\n\n\tpublic declare offsetX: number;\n\tpublic declare offsetY: number;\n\tpublic declare wrap: boolean;\n\tpublic declare edgeMode: TileOffsetEdgeMode;\n\n\tconstructor(config: TileOffsetProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\toffsetX: config.offsetX ?? 0,\n\t\t\toffsetY: config.offsetY ?? 0,\n\t\t\twrap: config.wrap ?? true,\n\t\t\tedgeMode: config.edgeMode ?? \"wrap\",\n\t\t});\n\t}\n}\n\nexport interface MotionBlurProps {\n\tshutterAngle?: EffectProp<number>;\n\tsamples?: EffectProp<number>;\n\tmaxVelocity?: EffectProp<number>;\n\tshutterCurve?: \"box\" | \"gaussian\" | \"triangle\";\n\tdepthAware?: boolean;\n}\n\nexport class MotionBlur extends Effect<MotionBlurProps> {\n\tpublic readonly op = \"MotionBlur\";\n\n\tpublic declare shutterAngle: number;\n\tpublic declare samples: number;\n\tpublic declare maxVelocity: number;\n\tpublic declare shutterCurve: \"box\" | \"gaussian\" | \"triangle\";\n\tpublic declare depthAware: boolean;\n\n\tconstructor(config: MotionBlurProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshutterAngle: config.shutterAngle ?? 180,\n\t\t\tsamples: config.samples ?? 16,\n\t\t\tmaxVelocity: config.maxVelocity ?? 64,\n\t\t\tshutterCurve: config.shutterCurve ?? \"gaussian\",\n\t\t\tdepthAware: config.depthAware ?? true,\n\t\t});\n\t}\n}\n\nexport interface SSAOProps {\n\tradius?: EffectProp<number>;\n\tbias?: EffectProp<number>;\n\tintensity?: EffectProp<number>;\n\tkernelSamples?: EffectProp<number>;\n\tblurRadius?: EffectProp<number>;\n}\n\nexport class SSAO extends Effect<SSAOProps> {\n\tpublic readonly op = \"SSAO\";\n\n\tpublic declare radius: number;\n\tpublic declare bias: number;\n\tpublic declare intensity: number;\n\tpublic declare kernelSamples: number;\n\tpublic declare blurRadius: number;\n\n\tconstructor(config: SSAOProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 45,\n\t\t\tbias: config.bias ?? 0.025,\n\t\t\tintensity: config.intensity ?? 1.5,\n\t\t\tkernelSamples: config.kernelSamples ?? 16,\n\t\t\tblurRadius: config.blurRadius ?? 4,\n\t\t});\n\t}\n}\n\nexport interface PBRGlassProps {\n\tior?: EffectProp<number>;\n\troughness?: EffectProp<number>;\n\ttransmission?: EffectProp<number>;\n\tdispersion?: EffectProp<number>;\n\tfresnelPower?: EffectProp<number>;\n\ttintColor?: EffectProp<string>;\n}\n\nexport class PBRGlass extends Effect<PBRGlassProps> {\n\tpublic readonly op = \"PBRGlass\";\n\n\tpublic declare ior: number;\n\tpublic declare roughness: number;\n\tpublic declare transmission: number;\n\tpublic declare dispersion: number;\n\tpublic declare fresnelPower: number;\n\tpublic declare tintColor: string;\n\n\tconstructor(config: PBRGlassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tior: config.ior ?? 1.49,\n\t\t\troughness: config.roughness ?? 0.15,\n\t\t\ttransmission: config.transmission ?? 0.92,\n\t\t\tdispersion: config.dispersion ?? 0.015,\n\t\t\tfresnelPower: config.fresnelPower ?? 5.0,\n\t\t\ttintColor: config.tintColor ?? \"#ffffff\",\n\t\t});\n\t}\n}\n\nexport interface DepthOfFieldProps {\n\tfocusDistance?: EffectProp<number>;\n\tfocalLength?: EffectProp<number>;\n\taperture?: EffectProp<number>;\n\tmaxBlur?: EffectProp<number>;\n\tquality?: \"low\" | \"medium\" | \"high\" | \"ultra\";\n}\n\nexport class DepthOfField extends Effect<DepthOfFieldProps> {\n\tpublic readonly op = \"DepthOfField\";\n\n\tpublic declare focusDistance: number;\n\tpublic declare focalLength: number;\n\tpublic declare aperture: number;\n\tpublic declare maxBlur: number;\n\tpublic declare quality: string;\n\n\tconstructor(config: DepthOfFieldProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tfocusDistance: config.focusDistance ?? 500,\n\t\t\tfocalLength: config.focalLength ?? 50,\n\t\t\taperture: config.aperture ?? 2.8,\n\t\t\tmaxBlur: config.maxBlur ?? 16,\n\t\t\tquality: config.quality ?? \"high\",\n\t\t});\n\t}\n}\n\nexport interface CropProps {\n\tcropType?: \"rect\" | \"path\";\n\tleftPercentage?: EffectProp<number>;\n\ttopPercentage?: EffectProp<number>;\n\twidthPercentage?: EffectProp<number>;\n\theightPercentage?: EffectProp<number>;\n\troundness?: EffectProp<number>;\n\tpathPoints?: { x: number; y: number }[];\n\tmode?: \"cropped\" | \"rest\";\n}\n\nexport class Crop extends Effect<CropProps> {\n\tpublic readonly op = \"Crop\";\n\n\tpublic declare cropType: \"rect\" | \"path\";\n\tpublic declare leftPercentage: number;\n\tpublic declare topPercentage: number;\n\tpublic declare widthPercentage: number;\n\tpublic declare heightPercentage: number;\n\tpublic declare roundness: number;\n\tpublic declare pathPoints?: { x: number; y: number }[];\n\tpublic declare mode?: \"cropped\" | \"rest\";\n\n\tconstructor(config: CropProps = {}) {\n\t\tsuper({\n\t\t\tcropType: config.cropType ?? \"rect\",\n\t\t\tleftPercentage: config.leftPercentage ?? 0,\n\t\t\ttopPercentage: config.topPercentage ?? 0,\n\t\t\twidthPercentage: config.widthPercentage ?? 100,\n\t\t\theightPercentage: config.heightPercentage ?? 100,\n\t\t\troundness: config.roundness ?? 0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface VisionProps {\n\t/** Track COCO-80 objects (RTMDet-Ins boxes). Default true. */\n\tenableDetection?: boolean;\n\t/** Per-instance masks (RTMDet-Ins). Shares the detection pass. */\n\tenableSegmentation?: boolean;\n\t/** COCO-17 keypoints per person (RTMO). */\n\tenablePose?: boolean;\n\t/** Fast person-vs-background alpha (Selfie Segmenter). */\n\tenableMatte?: boolean;\n\t/** COCO class-name filter (all classes when omitted). */\n\tclasses?: readonly string[];\n\t/** Minimum detection score, 0..1. Default 0.3. */\n\tconfidence?: number;\n\t/** Model size: `t` fastest · `s` default · `m` most accurate. */\n\tvariant?: \"t\" | \"s\" | \"m\";\n\tmode?:\n\t\t| \"passthrough\"\n\t\t| \"mask\"\n\t\t| \"matte\"\n\t\t| \"crop\"\n\t\t| \"skeleton\"\n\t\t| \"boxes\"\n\t\t| \"tracking\";\n\t/**\n\t * Subject alpha for mask/matte/crop: instance masks (default; any COCO class) or the\n\t * selfie matte (fastest, but only reliable when a person fills much of the frame).\n\t */\n\tmatteSource?: \"instance\" | \"selfie\";\n\t/** Frames a track may go unseen before it is dropped. Default 15. */\n\tmaxMissedFrames?: number;\n\tmodelsDir?: string;\n\tbaseUrl?: string;\n\tmaskThreshold?: number;\n\tfeatherRadius?: number;\n\t/** Grow the subject into connected pixels that stand out from the backdrop. */\n\tkeyBackground?: boolean;\n\t/** Colour-distance threshold for the background key (lower → more growth). Default 70. */\n\tbackgroundKeyThreshold?: number;\n\tvisionBundle?: unknown;\n}\n\n/**\n * On-device vision: tracks objects, segments instances, estimates pose and mattes people on\n * the rendered frame, feeding reactive signals. Models download lazily on first use.\n */\nexport class Vision extends Effect<VisionProps> {\n\tpublic readonly op = \"Vision\";\n\n\tpublic declare enableDetection?: boolean;\n\tpublic declare enableSegmentation?: boolean;\n\tpublic declare enablePose?: boolean;\n\tpublic declare enableMatte?: boolean;\n\tpublic declare classes?: readonly string[];\n\tpublic declare confidence?: number;\n\tpublic declare variant?: VisionProps[\"variant\"];\n\tpublic declare mode?: VisionProps[\"mode\"];\n\tpublic declare matteSource?: VisionProps[\"matteSource\"];\n\tpublic declare maxMissedFrames?: number;\n\tpublic declare modelsDir?: string;\n\tpublic declare baseUrl?: string;\n\tpublic declare maskThreshold?: number;\n\tpublic declare featherRadius?: number;\n\tpublic declare keyBackground?: boolean;\n\tpublic declare backgroundKeyThreshold?: number;\n\tpublic declare visionBundle?: unknown;\n\n\tconstructor(config: VisionProps = {}) {\n\t\tsuper({\n\t\t\tenableDetection: config.enableDetection !== false,\n\t\t\tenableSegmentation: config.enableSegmentation === true,\n\t\t\tenablePose: config.enablePose === true,\n\t\t\tenableMatte: config.enableMatte === true,\n\t\t\tconfidence: config.confidence ?? 0.3,\n\t\t\tvariant: config.variant ?? \"s\",\n\t\t\tmode: config.mode ?? \"passthrough\",\n\t\t\tmatteSource: config.matteSource ?? \"instance\",\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface Relight3DProps {\n\tlightType?: \"Point\" | \"Spot\" | \"Directional\" | \"Rim\";\n\tintensity?: EffectProp<number>;\n\tlightPosX?: EffectProp<number>;\n\tlightPosY?: EffectProp<number>;\n\tlightPosZ?: EffectProp<number>;\n\tlightRadius?: EffectProp<number>;\n\tspotConeAngle?: EffectProp<number>;\n\tspecularRoughness?: EffectProp<number>;\n\tspecularStrength?: EffectProp<number>;\n\tmetallic?: EffectProp<number>;\n\tambientIntensity?: EffectProp<number>;\n\tvolumetricDensity?: EffectProp<number>;\n\tdepthScale?: EffectProp<number>;\n\tdepthInvert?: boolean;\n\tlightColor?: string;\n\tambientColor?: string;\n\tnormalMap?: unknown;\n}\n\nexport class Relight3D extends Effect<Relight3DProps> {\n\tpublic readonly op = \"Relight3D\";\n\n\tpublic declare lightType: Relight3DProps[\"lightType\"];\n\tpublic declare intensity: number;\n\tpublic declare lightPosX: number;\n\tpublic declare lightPosY: number;\n\tpublic declare lightPosZ: number;\n\tpublic declare lightRadius: number;\n\tpublic declare spotConeAngle: number;\n\tpublic declare specularRoughness: number;\n\tpublic declare specularStrength: number;\n\tpublic declare metallic: number;\n\tpublic declare ambientIntensity: number;\n\tpublic declare volumetricDensity: number;\n\tpublic declare depthScale: number;\n\tpublic declare depthInvert: boolean;\n\tpublic declare lightColor: string;\n\tpublic declare ambientColor: string;\n\tpublic declare normalMap: unknown;\n\n\tconstructor(config: Relight3DProps = {}) {\n\t\tsuper({\n\t\t\tlightType: config.lightType ?? \"Point\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t\tlightPosX: config.lightPosX ?? 0.5,\n\t\t\tlightPosY: config.lightPosY ?? 0.5,\n\t\t\tlightPosZ: config.lightPosZ ?? 0.3,\n\t\t\tlightRadius: config.lightRadius ?? 0.8,\n\t\t\tspotConeAngle: config.spotConeAngle ?? 45,\n\t\t\tspecularRoughness: config.specularRoughness ?? 0.35,\n\t\t\tspecularStrength: config.specularStrength ?? 0.7,\n\t\t\tmetallic: config.metallic ?? 0.0,\n\t\t\tambientIntensity: config.ambientIntensity ?? 0.4,\n\t\t\tvolumetricDensity: config.volumetricDensity ?? 0.2,\n\t\t\tdepthScale: config.depthScale ?? 1.0,\n\t\t\tdepthInvert: config.depthInvert ?? false,\n\t\t\tlightColor: config.lightColor ?? \"#ffffff\",\n\t\t\tambientColor: config.ambientColor ?? \"#ffffff\",\n\t\t\tnormalMap: config.normalMap,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface DeflickerProps {\n\tblendWeight?: EffectProp<number>;\n\tdisocclusionThreshold?: EffectProp<number>;\n\tmaxMotionPixels?: EffectProp<number>;\n\tscale?: number;\n\twindowSize?: number;\n}\n\nexport class TemporalDeflicker extends Effect<DeflickerProps> {\n\tpublic readonly op = \"TemporalDeflicker\";\n\n\tpublic declare blendWeight: number;\n\tpublic declare disocclusionThreshold: number;\n\tpublic declare maxMotionPixels: number;\n\tpublic declare scale: number;\n\tpublic declare windowSize: number;\n\n\tconstructor(config: DeflickerProps = {}) {\n\t\tsuper({\n\t\t\tblendWeight: config.blendWeight ?? 0.35,\n\t\t\tdisocclusionThreshold: config.disocclusionThreshold ?? 0.15,\n\t\t\tmaxMotionPixels: config.maxMotionPixels ?? 64.0,\n\t\t\tscale: config.scale ?? 0.5,\n\t\t\twindowSize: config.windowSize ?? 2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface ModulateProps {\n\thue?: EffectProp<number>;\n\tbrightness?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\texposure?: EffectProp<number>;\n\tsaturation?: EffectProp<number>;\n\tsepia?: EffectProp<number>;\n}\n\nexport class Modulate extends Effect<ModulateProps> {\n\tpublic readonly op = \"Modulate\";\n\n\tpublic declare hue: number;\n\tpublic declare brightness: number;\n\tpublic declare contrast: number;\n\tpublic declare exposure: number;\n\tpublic declare saturation: number;\n\tpublic declare sepia: number;\n\n\tconstructor(config: ModulateProps = {}) {\n\t\tsuper({\n\t\t\thue: config.hue ?? 0,\n\t\t\tbrightness: config.brightness ?? 1.0,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\texposure: config.exposure ?? 0.0,\n\t\t\tsaturation: config.saturation ?? 1.0,\n\t\t\tsepia: config.sepia ?? 0.0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n"],"mappings":";;;;AAaA,SAAS,IAAI,MAAkC;AAC9C,QAAO,OAAO,YAAY,cAAc,QAAQ,MAAM,QAAQ;;;AAI/D,SAAS,WAAoB;CAC5B,MAAM,OAAO,IAAI,2BAA2B;AAC5C,QAAO,SAAS,OAAO,SAAS;;AAGjC,SAAS,gBAAyB;AACjC,QAAO,UAAU,IAAI,IAAI,WAAW,KAAK;;AAG1C,MAAM,2BAAW,IAAI,KAAa;AAElC,SAAS,OAAO,SAAuB;AACtC,KAAI,UAAU,CAAE,OAAM,IAAI,MAAM,QAAQ;AACxC,KAAI,SAAS,IAAI,QAAQ,CAAE;AAC3B,UAAS,IAAI,QAAQ;AACrB,SAAQ,KAAK,iBAAiB,UAAU;;AAGzC,SAAS,cAAc,OAAkD;AACxE,KAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,KAAI,MAAM,QAAQ,MAAM,IAAI,SAAS,MAAM,CAAE,QAAO;CACpD,MAAM,QAAQ,OAAO,eAAe,MAAM;AAC1C,QAAO,UAAU,OAAO,aAAa,UAAU;;;AAIhD,SAAS,SAAS,GAAW,GAAmB;CAC/C,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,EAAE;AAC7D,MAAK,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;EACnC,IAAI,OAAO,IAAI;AACf,MAAI,KAAK;AACT,OAAK,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;GACnC,MAAM,UAAU,IAAI;AACpB,OAAI,KAAK,KAAK,IACb,IAAI,KAAK,GACT,IAAI,IAAI,KAAK,GACb,QAAQ,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,GACpC;AACD,UAAO;;;AAGT,QAAO,IAAI,EAAE;;AAGd,SAAS,QAAQ,KAAa,OAAkC;CAC/D,IAAI;CACJ,IAAI,YAAY,OAAO;CACvB,MAAM,QAAQ,IAAI,aAAa;AAC/B,MAAK,MAAM,aAAa,OAAO;EAC9B,MAAM,iBAAiB,UAAU,aAAa;EAC9C,MAAM,QACL,eAAe,SAAS,MAAM,IAAI,MAAM,SAAS,eAAe,GAC7D,IACA,SAAS,OAAO,eAAe;AACnC,MAAI,QAAQ,WAAW;AACtB,eAAY;AACZ,UAAO;;;AAIT,QADc,QAAQ,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,SAAS,EAAE,CAAC,GAEtE,kBAAkB,KAAK,MACvB,iBAAiB,MAAM,KAAK,KAAK,CAAC;;AAGtC,SAAS,WAAW,MAAc,OAAgB,MAAsB;AACvE,KAAI,OAAO,UAAU,UAAU;EAC9B,MAAM,EAAE,KAAK,QAAQ;AAGrB,MAFc,QAAQ,UAAa,QAAQ,OAC7B,QAAQ,UAAa,QAAQ,OACrB,OAAO,MAAM,MAAM,EAAE;GAC1C,MAAM,QACL,QAAQ,UAAa,QAAQ,SAC1B,GAAG,IAAI,MAAM,QACb,QAAQ,SACP,KAAK,QACL,KAAK;AACV,UACC,OAAO,MAAM,MAAM,GAChB,GAAG,KAAK,WACR,GAAG,KAAK,KAAK,MAAM,cAAc,QACpC;;AAEF;;AAED,KACC,KAAK,SACJ,OAAO,UAAU,YAAY,OAAO,UAAU,cAC/C,CAAC,KAAK,KAAK,SAAS,MAAM,CAE1B,QACC,GAAG,KAAK,KAAK,KAAK,UAAU,MAAM,CAAC,iBAAiB,KAAK,KACvD,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAC7B,KAAK,KAAK,GACZ;;AAIH,SAAS,WACR,MACA,QACA,MACO;CACP,MAAM,QAAQ,OAAO,KAAK,KAAK;AAC/B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;AAClD,MAAI,UAAU,OAAW;EACzB,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,UAAU;AACd,UAAO,GAAG,KAAK,kBAAkB,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG;AAC/D;;AAID,MAAI,SAAS,MAAM,IAAI,OAAO,UAAU,WAAY;AACpD,MAAI,SAAS,SAAS,cAAc,MAAM,CACzC,YAAW,GAAG,KAAK,GAAG,OAAO,OAAO,SAAS,MAAM;MAEnD,YAAW,GAAG,KAAK,GAAG,OAAO,OAAO,SAAS;;;AAKhD,SAAS,aAAgB,OAAa;AACrC,QAAO,OAAO,UAAU,YAAY,UAAU,OAC3C,gBAAgB,MAAM,GACtB;;;;;;;;;;;;;;AAeJ,SAAgB,aACf,IACA,UACA,QACA,MACI;CACJ,MAAM,WAAW;AACjB,KAAI,eAAe,CAAE,YAAW,IAAI,UAAU,KAAK;CAEnD,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,CAClD,QAAO,OAAO,aAAa,MAAM;AAElC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,MAAI,UAAU,OAAW;EACzB,MAAM,OAAO,OAAO;AACpB,SAAO,OACN,cAAc,KAAK,IAAI,cAAc,MAAM,GACxC;GACA,GAAG;GACH,GAAG,OAAO,YACT,OAAO,QAAQ,MAAM,CAAC,QAAQ,GAAG,OAAO,MAAM,OAAU,CACxD;GACD,GACA;;AAEL,QAAO;;;;;;ACjLR,MAAa,aAAa;CACzB,MAAM;EACL,UAAU,EACT,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EACD;EACD,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,OAAO;GACN,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,aAAa,EAAE;EACf,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,OAAO,EACN,MAAM;GAAC;GAAW;GAAU;GAAO,EACnC;EACD;CACD,cAAc;EACb,SAAS,EACR,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,UAAU,EACT,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,YAAY,EACX,OAAO;GACN,SAAS;IACR,KAAK;IACL,KAAK;IACL;GACD,cAAc;IACb,KAAK;IACL,KAAK;IACL;GACD,YAAY;IACX,KAAK;IACL,KAAK;IACL;GACD,EACD;EACD,oBAAoB,EAAE;EACtB;CACD,UAAU;EACT,UAAU,EAAE;EACZ,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,YAAY;GACX,KAAK;GACL,KAAK;GACL;EACD,kBAAkB;GACjB,KAAK;GACL,KAAK;GACL;EACD,YAAY,EACX,MAAM,CAAC,OAAO,MAAM,EACpB;EACD,sBAAsB,EACrB,MAAM;GAAC;GAAc;GAAc;GAAO,EAC1C;EACD;CACD,UAAU;EACT,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,QAAQ;GACP,KAAK;GACL,KAAK;GACL;EACD,UAAU;GACT,KAAK;GACL,KAAK;GACL;EACD,WAAW;GACV,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD,SAAS;GACR,KAAK;GACL,KAAK;GACL;EACD;CACD;;;;ACxDD,MAAM,eAA8B;CACnC,UAAU;CACV,UAAU;CACV,OAAO;CACP,YAAY;CACZ,SAAS;CACT,SAAS;CACT,aAAa;CACb,QAAQ;CACR,SAAS;CACT,OAAO;CACP;;AAGD,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CAqBrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QAAM,aAAa,QAAQ,cAAc,QAAQ,WAAW,KAAK,CAAC;;;AAuBpE,MAAM,uBAA0C;CAC/C,SAAS;EAAE,SAAS;EAAG,cAAc;EAAG,YAAY;EAAG;CACvD,UAAU;EAAE,SAAS;EAAG,cAAc;EAAG,YAAY;EAAG;CACxD,YAAY;EAAE,SAAS;EAAG,cAAc;EAAG,YAAY;EAAG;CAC1D,oBAAoB;CACpB;AAED,IAAa,eAAb,cAAkC,OAA0B;CAC3D,AAAgB,KAAK;CAOrB,YAAY,SAA4B,EAAE,EAAE;AAC3C,QACC,aACC,gBACA,sBACA,QACA,WAAW,aACX,CACD;;;AAwCH,MAAM,mBAAkC;CACvC,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,kBAAkB;CAClB,YAAY;CACZ,sBAAsB;CACtB;AAED,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CASrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QACC,aAAa,YAAY,kBAAkB,QAAQ,WAAW,SAAS,CACvE;;;AA2CH,MAAM,mBAAkC;CACvC,UAAU;CACV,QAAQ;CACR,UAAU;CACV,WAAW;CACX,SAAS;CACT,SAAS;CACT;AAED,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CASrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QACC,aAAa,YAAY,kBAAkB,QAAQ,WAAW,SAAS,CACvE;;;;;;;ACrSH,SAAS,cAAc,OAA0C;AAChE,QAAO;EACN,aAAa;EACb,SAAS,MAAM,OAAO;EACtB,SAAS,MAAM,OAAO;EACtB,QAAQ,MAAM,OAAO,MAAM,SAAS,IAAK;EACzC,SAAS,MAAM,OAAO,OAAO,SAAS,IAAK;EAC3C,OAAO;EAEP,UAAU,MAAM,OAAO,SAAS,GAAG;EACnC;;;;;;AAOF,IAAa,OAAb,cAA0B,SAAS;CAClC,YAAY,SAAoB,EAAE,EAAE;EACnC,MAAM,EAAE,OAAO,GAAG,SAAS;AAC3B,QAAM,QAAQ;GAAE,GAAG,cAAc,MAAM;GAAE,GAAG,YAAY,KAAK;GAAE,GAAG,KAAK;;;AAIzE,SAAS,YAA8B,OAAa;AACnD,QAAO,OAAO,YACb,OAAO,QAAQ,MAAM,CAAC,QAAQ,GAAG,OAAO,MAAM,OAAU,CACxD;;;;;;ACzBF,MAAa,kBAAkB;CAC9B,OAAO,WAAuB,IAAI,KAAK,OAAO;CAC9C,eAAe,WAA+B,IAAI,aAAa,OAAO;CACtE,WAAW,WAA2B,IAAI,SAAS,OAAO;CAC1D,WAAW,WAA2B,IAAI,SAAS,OAAO;CAC1D;;;;ACQD,IAAa,SAAb,cAA4B,OAAoB;CAC/C,AAAgB,KAAK;CAOrB,YAAY,SAAsB,EAAE,EAAE;EACrC,MAAM,iBAA+B;GACpC,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV;AACD,QAAM;GACL,QAAQ,OAAO,UAAU,EAAE,GAAG,gBAAgB;GAC9C,KAAK,OAAO,OAAO,EAAE,GAAG,gBAAgB;GACxC,OAAO,OAAO,SAAS,EAAE,GAAG,gBAAgB;GAC5C,MAAM,OAAO,QAAQ,EAAE,GAAG,gBAAgB;GAC1C,GAAG;GACH,CAAC;;;AAeJ,IAAa,YAAb,cAA+B,OAAuB;CACrD,AAAgB,KAAK;CAWrB,YAAY,SAAyB,EAAE,EAAE;AACxC,QAAM;GACL,UAAU,OAAO,YAAY;GAC7B,MAAM,OAAO,QAAQ;GACrB,YAAY,OAAO,cAAc;GACjC,UAAU,OAAO,YAAY;GAC7B,OAAO,OAAO,SAAS;GACvB,SAAS,OAAO,WAAW;GAC3B,UAAU,OAAO,YAAY;GAC7B,YAAY,OAAO,cAAc;GACjC,GAAG;GACH,CAAC;;;AAIJ,IAAa,eAAb,cAAkC,OAAgC;CACjE,AAAgB;CAEhB,YAAY,QAAgB,SAAkC,EAAE,EAAE;AACjE,QAAM,OAAO;AACb,OAAK,KAAK;;;AA2BZ,IAAa,uBAAb,cAA0C,OAAkC;CAC3E,AAAgB,KAAK;CAgBrB,YAAY,SAAoC,EAAE,EAAE;AACnD,QAAM;GACL,gBAAgB,OAAO,kBAAkB;GACzC,UAAU,OAAO,YAAY;GAC7B,WAAW,OAAO,aAAa;GAC/B,aAAa,OAAO,eAAe;GACnC,cAAc,OAAO,gBAAgB;GACrC,gBAAgB,OAAO,kBAAkB;GACzC,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,OAAO,OAAO,SAAS;GACvB,eAAe,OAAO,iBAAiB;GACvC,aAAa,OAAO,eAAe;GACnC,aAAa,OAAO,eAAe;GACnC,QAAQ,OAAO,UAAU;GACzB,GAAG;GACH,CAAC;;CAGH,MAAa,QACZ,QACA,UAAuC,EAAE,EACF;AACvC,SAAO,YAAY,QAAQ,QAAQ;GAClC,gBAAgB,KAAK;GACrB,UAAU,KAAK;GACf,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,gBAAgB,KAAK;GACrB,WAAW,KAAK;GAChB,OAAO,KAAK;GACZ,eAAe,KAAK;GACpB,aAAa,KAAK;GAClB,aAAa,KAAK;GAClB,GAAG;GACH,CAAC;;;AAuBJ,IAAa,SAAb,cAA4B,OAAoB;CAC/C,AAAgB,KAAK;CAYrB,YAAY,SAAsB,EAAE,EAAE;AACrC,QAAM;GACL,GAAG;GACH,WAAW,OAAO,aAAa;GAC/B,QAAQ,OAAO,UAAU,CACxB;IAAE,GAAG;IAAG,GAAG;IAAG,EACd;IAAE,GAAG;IAAG,GAAG;IAAG,CACd;GACD,KAAK,OAAO,OAAO,CAClB;IAAE,GAAG;IAAG,GAAG;IAAG,EACd;IAAE,GAAG;IAAG,GAAG;IAAG,CACd;GACD,OAAO,OAAO,SAAS,CACtB;IAAE,GAAG;IAAG,GAAG;IAAG,EACd;IAAE,GAAG;IAAG,GAAG;IAAG,CACd;GACD,MAAM,OAAO,QAAQ,CACpB;IAAE,GAAG;IAAG,GAAG;IAAG,EACd;IAAE,GAAG;IAAG,GAAG;IAAG,CACd;GACD,UAAU,OAAO,YAAY,CAC5B;IAAE,GAAG;IAAG,GAAG;IAAK,EAChB;IAAE,GAAG;IAAG,GAAG;IAAK,CAChB;GACD,UAAU,OAAO,YAAY,CAC5B;IAAE,GAAG;IAAG,GAAG;IAAK,EAChB;IAAE,GAAG;IAAG,GAAG;IAAK,CAChB;GACD,UAAU,OAAO,YAAY,CAC5B;IAAE,GAAG;IAAG,GAAG;IAAK,EAChB;IAAE,GAAG;IAAG,GAAG;IAAK,CAChB;GACD,UAAU,OAAO,YAAY,CAC5B;IAAE,GAAG;IAAG,GAAG;IAAK,EAChB;IAAE,GAAG;IAAG,GAAG;IAAK,CAChB;GACD,CAAC;;;AAwBJ,IAAa,iBAAb,cAAoC,OAA4B;CAC/D,AAAgB,KAAK;CAarB,YAAY,SAA8B,EAAE,EAAE;EAC7C,MAAM,aAAuC;GAC5C,MAAM;GACN,SAAS;GACT,QAAQ;GACR,OAAO;GACP;AACD,QAAM;GACL,GAAG;GACH,QAAQ,OAAO,UAAU;GACzB,MAAM;IAAE,GAAG;IAAY,GAAG,OAAO;IAAM;GACvC,SAAS;IAAE,GAAG;IAAY,GAAG,OAAO;IAAS;GAC7C,QAAQ;IAAE,GAAG;IAAY,GAAG,OAAO;IAAQ;GAC3C,OAAO;IAAE,GAAG;IAAY,GAAG,OAAO;IAAO;GACzC,OAAO;IAAE,GAAG;IAAY,GAAG,OAAO;IAAO;GACzC,UAAU;IAAE,GAAG;IAAY,GAAG,OAAO;IAAU;GAC/C,QAAQ;IAAE,GAAG;IAAY,GAAG,OAAO;IAAQ;GAC3C,UAAU;IAAE,GAAG;IAAY,GAAG,OAAO;IAAU;GAC/C,QAAQ;IAAE,GAAG;IAAY,GAAG,OAAO;IAAQ;GAC3C,CAAC;;;AAgBJ,IAAa,cAAb,cAAiC,OAAyB;CACzD,AAAgB,KAAK;CAOrB,YAAY,SAA2B,EAAE,EAAE;EAC1C,MAAM,eAAkC,CACvC;GAAE,UAAU;GAAK,OAAO;GAAW,EACnC;GAAE,UAAU;GAAK,OAAO;GAAW,CACnC;AACD,QAAM;GACL,GAAG;GACH,OAAO,OAAO,SAAS;GACvB,QAAQ,OAAO,UAAU;GACzB,QAAQ,OAAO,UAAU;GACzB,SAAS,OAAO,WAAW;GAC3B,CAAC;;;AAeJ,IAAa,oBAAb,cAAuC,OAA+B;CACrE,AAAgB,KAAK;CAWrB,YAAY,SAAiC,EAAE,EAAE;AAChD,QAAM;GACL,GAAG;GACH,cAAc,OAAO,gBAAgB;GACrC,kBAAkB,OAAO,oBAAoB;GAC7C,cAAc,OAAO,gBAAgB;GACrC,iBAAiB,OAAO,mBAAmB;GAC3C,qBAAqB,OAAO,uBAAuB;GACnD,iBAAiB,OAAO,mBAAmB;GAC3C,iBAAiB,OAAO,mBAAmB;GAC3C,iBAAiB,OAAO,mBAAmB;GAC3C,CAAC;;;AASJ,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CAKrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QAAM;GACL,GAAG;GACH,QAAQ,OAAO,UAAU;GACzB,WAAW,OAAO,aAAa;GAC/B,CAAC;;;AAUJ,IAAa,cAAb,cAAiC,OAAyB;CACzD,AAAgB,KAAK;CAMrB,YAAY,SAA2B,EAAE,EAAE;AAC1C,QAAM;GACL,GAAG;GACH,QAAQ,OAAO,UAAU;GACzB,QAAQ,OAAO,UAAU;GACzB,WAAW,OAAO,aAAa;GAC/B,CAAC;;;AAUJ,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CAMrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QAAM;GACL,GAAG;GACH,QAAQ,OAAO,UAAU;GACzB,eAAe,OAAO,iBAAiB;GACvC,YAAY,OAAO,cAAc;GACjC,CAAC;;;AAwBJ,IAAa,iBAAb,cAAoC,OAA4B;CAC/D,AAAgB,KAAK;CAiBrB,YAAY,SAA8B,EAAE,EAAE;AAC7C,QAAM;GACL,GAAG;GACH,MAAM,OAAO,QAAQ;GACrB,UAAU,OAAO,YAAY;GAC7B,WAAW,OAAO,aAAa;GAC/B,OAAO,OAAO,SAAS;GACvB,UAAU,OAAO,YAAY;GAC7B,UAAU,OAAO,YAAY;GAC7B,YAAY,OAAO,cAAc;GACjC,QAAQ,OAAO,UAAU;GACzB,QAAQ,OAAO,UAAU;GACzB,WAAW,OAAO,aAAa;GAC/B,cAAc,OAAO,gBAAgB;GACrC,aAAa,OAAO,eAAe;GACnC,YAAY,OAAO,cAAc;GACjC,SAAS,OAAO,WAAW;GAC3B,CAAC;;;AAaJ,IAAa,aAAb,cAAgC,OAAwB;CACvD,AAAgB,KAAK;CAOrB,YAAY,SAA0B,EAAE,EAAE;AACzC,QAAM;GACL,GAAG;GACH,SAAS,OAAO,WAAW;GAC3B,SAAS,OAAO,WAAW;GAC3B,MAAM,OAAO,QAAQ;GACrB,UAAU,OAAO,YAAY;GAC7B,CAAC;;;AAYJ,IAAa,aAAb,cAAgC,OAAwB;CACvD,AAAgB,KAAK;CAQrB,YAAY,SAA0B,EAAE,EAAE;AACzC,QAAM;GACL,GAAG;GACH,cAAc,OAAO,gBAAgB;GACrC,SAAS,OAAO,WAAW;GAC3B,aAAa,OAAO,eAAe;GACnC,cAAc,OAAO,gBAAgB;GACrC,YAAY,OAAO,cAAc;GACjC,CAAC;;;AAYJ,IAAa,OAAb,cAA0B,OAAkB;CAC3C,AAAgB,KAAK;CAQrB,YAAY,SAAoB,EAAE,EAAE;AACnC,QAAM;GACL,GAAG;GACH,QAAQ,OAAO,UAAU;GACzB,MAAM,OAAO,QAAQ;GACrB,WAAW,OAAO,aAAa;GAC/B,eAAe,OAAO,iBAAiB;GACvC,YAAY,OAAO,cAAc;GACjC,CAAC;;;AAaJ,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CASrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QAAM;GACL,GAAG;GACH,KAAK,OAAO,OAAO;GACnB,WAAW,OAAO,aAAa;GAC/B,cAAc,OAAO,gBAAgB;GACrC,YAAY,OAAO,cAAc;GACjC,cAAc,OAAO,gBAAgB;GACrC,WAAW,OAAO,aAAa;GAC/B,CAAC;;;AAYJ,IAAa,eAAb,cAAkC,OAA0B;CAC3D,AAAgB,KAAK;CAQrB,YAAY,SAA4B,EAAE,EAAE;AAC3C,QAAM;GACL,GAAG;GACH,eAAe,OAAO,iBAAiB;GACvC,aAAa,OAAO,eAAe;GACnC,UAAU,OAAO,YAAY;GAC7B,SAAS,OAAO,WAAW;GAC3B,SAAS,OAAO,WAAW;GAC3B,CAAC;;;AAeJ,IAAa,OAAb,cAA0B,OAAkB;CAC3C,AAAgB,KAAK;CAWrB,YAAY,SAAoB,EAAE,EAAE;AACnC,QAAM;GACL,UAAU,OAAO,YAAY;GAC7B,gBAAgB,OAAO,kBAAkB;GACzC,eAAe,OAAO,iBAAiB;GACvC,iBAAiB,OAAO,mBAAmB;GAC3C,kBAAkB,OAAO,oBAAoB;GAC7C,WAAW,OAAO,aAAa;GAC/B,GAAG;GACH,CAAC;;;;;;;AAiDJ,IAAa,SAAb,cAA4B,OAAoB;CAC/C,AAAgB,KAAK;CAoBrB,YAAY,SAAsB,EAAE,EAAE;AACrC,QAAM;GACL,iBAAiB,OAAO,oBAAoB;GAC5C,oBAAoB,OAAO,uBAAuB;GAClD,YAAY,OAAO,eAAe;GAClC,aAAa,OAAO,gBAAgB;GACpC,YAAY,OAAO,cAAc;GACjC,SAAS,OAAO,WAAW;GAC3B,MAAM,OAAO,QAAQ;GACrB,aAAa,OAAO,eAAe;GACnC,GAAG;GACH,CAAC;;;AAwBJ,IAAa,YAAb,cAA+B,OAAuB;CACrD,AAAgB,KAAK;CAoBrB,YAAY,SAAyB,EAAE,EAAE;AACxC,QAAM;GACL,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,aAAa,OAAO,eAAe;GACnC,eAAe,OAAO,iBAAiB;GACvC,mBAAmB,OAAO,qBAAqB;GAC/C,kBAAkB,OAAO,oBAAoB;GAC7C,UAAU,OAAO,YAAY;GAC7B,kBAAkB,OAAO,oBAAoB;GAC7C,mBAAmB,OAAO,qBAAqB;GAC/C,YAAY,OAAO,cAAc;GACjC,aAAa,OAAO,eAAe;GACnC,YAAY,OAAO,cAAc;GACjC,cAAc,OAAO,gBAAgB;GACrC,WAAW,OAAO;GAClB,GAAG;GACH,CAAC;;;AAYJ,IAAa,oBAAb,cAAuC,OAAuB;CAC7D,AAAgB,KAAK;CAQrB,YAAY,SAAyB,EAAE,EAAE;AACxC,QAAM;GACL,aAAa,OAAO,eAAe;GACnC,uBAAuB,OAAO,yBAAyB;GACvD,iBAAiB,OAAO,mBAAmB;GAC3C,OAAO,OAAO,SAAS;GACvB,YAAY,OAAO,cAAc;GACjC,GAAG;GACH,CAAC;;;AAaJ,IAAa,WAAb,cAA8B,OAAsB;CACnD,AAAgB,KAAK;CASrB,YAAY,SAAwB,EAAE,EAAE;AACvC,QAAM;GACL,KAAK,OAAO,OAAO;GACnB,YAAY,OAAO,cAAc;GACjC,UAAU,OAAO,YAAY;GAC7B,UAAU,OAAO,YAAY;GAC7B,YAAY,OAAO,cAAc;GACjC,OAAO,OAAO,SAAS;GACvB,GAAG;GACH,CAAC"}
1
+ {"version":3,"file":"effects-m3FuatqZ.mjs","names":[],"sources":["../src/effects/with-defaults.ts","../src/effects/generated/meta.ts","../src/effects/generated/classes.ts","../src/effects/custom/blur.ts","../src/effects/generated/registry.ts","../src/effects/classes.ts"],"sourcesContent":["import { isSignal } from \"@framefields/core\";\n\n/** Literal metadata for one prop, emitted into `generated/meta.ts`. */\nexport interface PropMeta {\n\treadonly min?: number;\n\treadonly max?: number;\n\treadonly enum?: readonly (string | number | boolean)[];\n\t/** Members of a nested object prop. */\n\treadonly props?: EffectMeta;\n}\n\nexport type EffectMeta = Readonly<Record<string, PropMeta>>;\n\nfunction env(name: string): string | undefined {\n\treturn typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\n/** Throw instead of warn. Recommended for agent harnesses and CI. */\nfunction isStrict(): boolean {\n\tconst flag = env(\"FRAMEFIELDS_STRICT_PROPS\");\n\treturn flag === \"1\" || flag === \"true\";\n}\n\nfunction checksEnabled(): boolean {\n\treturn isStrict() || env(\"NODE_ENV\") !== \"production\";\n}\n\nconst reported = new Set<string>();\n\nfunction report(message: string): void {\n\tif (isStrict()) throw new Error(message);\n\tif (reported.has(message)) return;\n\treported.add(message);\n\tconsole.warn(`[framefields] ${message}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value) || isSignal(value)) return false;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n\n/** Levenshtein distance, for \"did you mean\" suggestions on small key sets. */\nfunction distance(a: string, b: string): number {\n\tconst row = Array.from({ length: b.length + 1 }, (_, i) => i);\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tlet prev = row[0];\n\t\trow[0] = i;\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst current = row[j];\n\t\t\trow[j] = Math.min(\n\t\t\t\trow[j] + 1,\n\t\t\t\trow[j - 1] + 1,\n\t\t\t\tprev + (a[i - 1] === b[j - 1] ? 0 : 1),\n\t\t\t);\n\t\t\tprev = current;\n\t\t}\n\t}\n\treturn row[b.length];\n}\n\nfunction suggest(key: string, known: readonly string[]): string {\n\tlet best: string | undefined;\n\tlet bestScore = Number.POSITIVE_INFINITY;\n\tconst lower = key.toLowerCase();\n\tfor (const candidate of known) {\n\t\tconst candidateLower = candidate.toLowerCase();\n\t\tconst score =\n\t\t\tcandidateLower.includes(lower) || lower.includes(candidateLower)\n\t\t\t\t? 1\n\t\t\t\t: distance(lower, candidateLower);\n\t\tif (score < bestScore) {\n\t\t\tbestScore = score;\n\t\t\tbest = candidate;\n\t\t}\n\t}\n\tconst close = best && bestScore <= Math.max(2, Math.ceil(key.length / 2));\n\treturn close\n\t\t? ` Did you mean \"${best}\"?`\n\t\t: ` Known props: ${known.join(\", \")}.`;\n}\n\nfunction checkValue(path: string, value: unknown, meta: PropMeta): void {\n\tif (typeof value === \"number\") {\n\t\tconst { min, max } = meta;\n\t\tconst below = min !== undefined && value < min;\n\t\tconst above = max !== undefined && value > max;\n\t\tif (below || above || Number.isNaN(value)) {\n\t\t\tconst range =\n\t\t\t\tmin !== undefined && max !== undefined\n\t\t\t\t\t? `${min} to ${max}`\n\t\t\t\t\t: min !== undefined\n\t\t\t\t\t\t? `≥ ${min}`\n\t\t\t\t\t\t: `≤ ${max}`;\n\t\t\treport(\n\t\t\t\tNumber.isNaN(value)\n\t\t\t\t\t? `${path} is NaN`\n\t\t\t\t\t: `${path} = ${value} is outside ${range}`,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\tmeta.enum &&\n\t\t(typeof value === \"string\" || typeof value === \"boolean\") &&\n\t\t!meta.enum.includes(value)\n\t) {\n\t\treport(\n\t\t\t`${path} = ${JSON.stringify(value)} is not one of ${meta.enum\n\t\t\t\t.map((v) => JSON.stringify(v))\n\t\t\t\t.join(\", \")}`,\n\t\t);\n\t}\n}\n\nfunction checkProps(\n\tpath: string,\n\tconfig: Record<string, unknown>,\n\tmeta: EffectMeta,\n): void {\n\tconst known = Object.keys(meta);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value === undefined) continue;\n\t\tconst propMeta = meta[key];\n\t\tif (!propMeta) {\n\t\t\treport(`${path}: unknown prop \"${key}\".${suggest(key, known)}`);\n\t\t\tcontinue;\n\t\t}\n\t\t// Signals and frame functions are sampled per frame; only static values\n\t\t// can be checked here.\n\t\tif (isSignal(value) || typeof value === \"function\") continue;\n\t\tif (propMeta.props && isPlainObject(value)) {\n\t\t\tcheckProps(`${path}.${key}`, value, propMeta.props);\n\t\t} else {\n\t\t\tcheckValue(`${path}.${key}`, value, propMeta);\n\t\t}\n\t}\n}\n\nfunction cloneDefault<T>(value: T): T {\n\treturn typeof value === \"object\" && value !== null\n\t\t? structuredClone(value)\n\t\t: value;\n}\n\n/**\n * Builds the initial config of a generated effect class.\n *\n * - `undefined` entries in `config` keep the default instead of overwriting it.\n * - When both the default and the supplied value are plain objects, they are\n * merged one level deep, so `new ColorBalance({ shadows: { cyanRed: 10 } })`\n * keeps the other two channels at their defaults.\n * - Object defaults are cloned per instance.\n * - Outside production, unknown props and out-of-range static values are\n * reported: a `console.warn` once per message, or a thrown `Error` when\n * `FRAMEFIELDS_STRICT_PROPS=1`. Unknown props are still passed through.\n */\nexport function withDefaults<T extends object>(\n\top: string,\n\tdefaults: Readonly<Partial<T>>,\n\tconfig: T,\n\tmeta: EffectMeta,\n): T {\n\tconst supplied = config as Record<string, unknown>;\n\tif (checksEnabled()) checkProps(op, supplied, meta);\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(defaults)) {\n\t\tresult[key] = cloneDefault(value);\n\t}\n\tfor (const [key, value] of Object.entries(supplied)) {\n\t\tif (value === undefined) continue;\n\t\tconst base = result[key];\n\t\tresult[key] =\n\t\t\tisPlainObject(base) && isPlainObject(value)\n\t\t\t\t? {\n\t\t\t\t\t\t...base,\n\t\t\t\t\t\t...Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t}\n\t\t\t\t: value;\n\t}\n\treturn result as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport type { EffectMeta } from \"../with-defaults.js\";\n\n/** Ranges and allowed values per effect prop, used by `withDefaults()` checks. */\nexport const effectMeta = {\n\tBlur: {\n\t\tblurType: {\n\t\t\tenum: [\n\t\t\t\t\"Gaussian\",\n\t\t\t\t\"Box\",\n\t\t\t\t\"Median\",\n\t\t\t\t\"Motion\",\n\t\t\t\t\"Bilateral\",\n\t\t\t\t\"Edge-preserving\",\n\t\t\t\t\"Radial\",\n\t\t\t\t\"Zoom\",\n\t\t\t],\n\t\t},\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tangle: {\n\t\t\tmin: 0,\n\t\t\tmax: 360,\n\t\t},\n\t\tsigmaColor: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tpartialBlur: {},\n\t\tradius: {\n\t\t\tmin: 0.01,\n\t\t\tmax: 1,\n\t\t},\n\t\tradiusY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tshape: {\n\t\t\tenum: [\"ellipse\", \"circle\", \"rect\"],\n\t\t},\n\t},\n\tColorBalance: {\n\t\tshadows: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmidtones: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\thighlights: {\n\t\t\tprops: {\n\t\t\t\tcyanRed: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tmagentaGreen: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t\tyellowBlue: {\n\t\t\t\t\tmin: -100,\n\t\t\t\t\tmax: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tpreserveLuminosity: {},\n\t},\n\tColorKey: {\n\t\tkeyColor: {},\n\t\tsimilarity: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tsmoothness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tspillSuppression: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcolorSpace: {\n\t\t\tenum: [\"YUV\", \"RGB\"],\n\t\t},\n\t\tspillSuppressionType: {\n\t\t\tenum: [\"Desaturate\", \"Neutralize\", \"None\"],\n\t\t},\n\t},\n\tVignette: {\n\t\tstrength: {\n\t\t\tmin: 0,\n\t\t\tmax: 100,\n\t\t},\n\t\tradius: {\n\t\t\tmin: 0.1,\n\t\t\tmax: 2,\n\t\t},\n\t\tsoftness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\troundness: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterX: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t\tcenterY: {\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t},\n\t},\n} as const satisfies Record<string, EffectMeta>;\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Effect } from \"@framefields/core\";\nimport type { EffectProp } from \"../types.js\";\nimport { withDefaults } from \"../with-defaults.js\";\nimport { effectMeta } from \"./meta.js\";\n\nexport interface TonalShift {\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tcyanRed: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tmagentaGreen: number;\n\t/**\n\t * Range -100 to 100.\n\t * @default 0\n\t */\n\tyellowBlue: number;\n}\n\nexport interface BlurBaseProps {\n\t/**\n\t * Blur Type\n\t * @default \"Gaussian\"\n\t */\n\tblurType?:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\t/**\n\t * The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 5\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * Direction of a Motion blur, in degrees.\n\t * Range 0 to 360. Accepts a signal.\n\t * @default 0\n\t */\n\tangle?: EffectProp<number>;\n\t/**\n\t * Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsigmaColor?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n\t/**\n\t * Blurs only a specific circular area around center point.\n\t * Accepts a signal.\n\t * @default false\n\t */\n\tpartialBlur?: EffectProp<boolean>;\n\t/**\n\t * Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\n\t * Range 0.01 to 1. Accepts a signal.\n\t * @default 0.3\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0\n\t */\n\tradiusY?: EffectProp<number>;\n\t/**\n\t * Shape of the partial blur region.\n\t * @default \"circle\"\n\t */\n\tshape?: \"ellipse\" | \"circle\" | \"rect\";\n}\n\nconst blurDefaults: BlurBaseProps = {\n\tblurType: \"Gaussian\",\n\tstrength: 5,\n\tangle: 0,\n\tsigmaColor: 0.1,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n\tpartialBlur: false,\n\tradius: 0.3,\n\tradiusY: 0,\n\tshape: \"circle\",\n};\n\n/** @internal Extended by `effects/custom/blur.ts`, which exports `Blur`. */\nexport class BlurBase extends Effect<BlurBaseProps> {\n\tpublic readonly op = \"Blur\";\n\n\tpublic declare blurType:\n\t\t| \"Gaussian\"\n\t\t| \"Box\"\n\t\t| \"Median\"\n\t\t| \"Motion\"\n\t\t| \"Bilateral\"\n\t\t| \"Edge-preserving\"\n\t\t| \"Radial\"\n\t\t| \"Zoom\";\n\tpublic declare strength: number;\n\tpublic declare angle: number;\n\tpublic declare sigmaColor: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\tpublic declare partialBlur: boolean;\n\tpublic declare radius: number;\n\tpublic declare radiusY: number;\n\tpublic declare shape: \"ellipse\" | \"circle\" | \"rect\";\n\n\tconstructor(config: BlurBaseProps = {}) {\n\t\tsuper(withDefaults(\"Blur\", blurDefaults, config, effectMeta.Blur));\n\t}\n}\n\nexport interface ColorBalanceProps {\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tshadows?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\tmidtones?: Partial<TonalShift>;\n\t/**\n\t * @default {\"cyanRed\":0,\"magentaGreen\":0,\"yellowBlue\":0}\n\t */\n\thighlights?: Partial<TonalShift>;\n\t/**\n\t * @default true\n\t */\n\tpreserveLuminosity?: boolean;\n}\n\nconst colorBalanceDefaults: ColorBalanceProps = {\n\tshadows: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tmidtones: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\thighlights: { cyanRed: 0, magentaGreen: 0, yellowBlue: 0 },\n\tpreserveLuminosity: true,\n};\n\nexport class ColorBalance extends Effect<ColorBalanceProps> {\n\tpublic readonly op = \"ColorBalance\";\n\n\tpublic declare shadows: Partial<TonalShift>;\n\tpublic declare midtones: Partial<TonalShift>;\n\tpublic declare highlights: Partial<TonalShift>;\n\tpublic declare preserveLuminosity: boolean;\n\n\tconstructor(config: ColorBalanceProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\n\t\t\t\t\"ColorBalance\",\n\t\t\t\tcolorBalanceDefaults,\n\t\t\t\tconfig,\n\t\t\t\teffectMeta.ColorBalance,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport interface ColorKeyProps {\n\t/**\n\t * Key Color\n\t * @default \"#00ff00\"\n\t */\n\tkeyColor?: string;\n\t/**\n\t * How close the color must be to the Key Color to be removed.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.4\n\t */\n\tsimilarity?: EffectProp<number>;\n\t/**\n\t * The softness of the transparency edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.1\n\t */\n\tsmoothness?: EffectProp<number>;\n\t/**\n\t * Amount of key color spill to remove from foreground edges.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.2\n\t */\n\tspillSuppression?: EffectProp<number>;\n\t/**\n\t * Color space used to calculate similarity distance.\n\t * @default \"YUV\"\n\t */\n\tcolorSpace?: \"YUV\" | \"RGB\";\n\t/**\n\t * How key color spill is suppressed on foreground edges.\n\t * @default \"Desaturate\"\n\t */\n\tspillSuppressionType?: \"Desaturate\" | \"Neutralize\" | \"None\";\n}\n\nconst colorKeyDefaults: ColorKeyProps = {\n\tkeyColor: \"#00ff00\",\n\tsimilarity: 0.4,\n\tsmoothness: 0.1,\n\tspillSuppression: 0.2,\n\tcolorSpace: \"YUV\",\n\tspillSuppressionType: \"Desaturate\",\n};\n\nexport class ColorKey extends Effect<ColorKeyProps> {\n\tpublic readonly op = \"ColorKey\";\n\n\tpublic declare keyColor: string;\n\tpublic declare similarity: number;\n\tpublic declare smoothness: number;\n\tpublic declare spillSuppression: number;\n\tpublic declare colorSpace: \"YUV\" | \"RGB\";\n\tpublic declare spillSuppressionType: \"Desaturate\" | \"Neutralize\" | \"None\";\n\n\tconstructor(config: ColorKeyProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"ColorKey\", colorKeyDefaults, config, effectMeta.ColorKey),\n\t\t);\n\t}\n}\n\nexport interface VignetteProps {\n\t/**\n\t * The intensity of the vignette darkening effect. 0 = no vignette.\n\t * Range 0 to 100. Accepts a signal.\n\t * @default 50\n\t */\n\tstrength?: EffectProp<number>;\n\t/**\n\t * The extent/size of the vignette.\n\t * Range 0.1 to 2. Accepts a signal.\n\t * @default 1\n\t */\n\tradius?: EffectProp<number>;\n\t/**\n\t * The softness of the vignette transition edge.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tsoftness?: EffectProp<number>;\n\t/**\n\t * 0.0 matches the image aspect ratio, 1.0 is a perfect circle.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\troundness?: EffectProp<number>;\n\t/**\n\t * The X coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterX?: EffectProp<number>;\n\t/**\n\t * The Y coordinate of the vignette center.\n\t * Range 0 to 1. Accepts a signal.\n\t * @default 0.5\n\t */\n\tcenterY?: EffectProp<number>;\n}\n\nconst vignetteDefaults: VignetteProps = {\n\tstrength: 50,\n\tradius: 1,\n\tsoftness: 0.5,\n\troundness: 0.5,\n\tcenterX: 0.5,\n\tcenterY: 0.5,\n};\n\nexport class Vignette extends Effect<VignetteProps> {\n\tpublic readonly op = \"Vignette\";\n\n\tpublic declare strength: number;\n\tpublic declare radius: number;\n\tpublic declare softness: number;\n\tpublic declare roundness: number;\n\tpublic declare centerX: number;\n\tpublic declare centerY: number;\n\n\tconstructor(config: VignetteProps = {}) {\n\t\tsuper(\n\t\t\twithDefaults(\"Vignette\", vignetteDefaults, config, effectMeta.Vignette),\n\t\t);\n\t}\n}\n","import type { ObjectTrackSignals } from \"@framefields/vision\";\nimport { BlurBase, type BlurBaseProps } from \"../generated/classes.js\";\n\nexport interface BlurProps extends BlurBaseProps {\n\t/**\n\t * Follow a tracked object. Turns on `partialBlur` and derives the region\n\t * (`centerX`, `centerY`, `radius`, `radiusY`, `shape`) and `strength` from\n\t * the track. Any of those passed explicitly wins over the track.\n\t */\n\ttrack?: ObjectTrackSignals;\n}\n\n/** Props the track supplies when the caller does not. */\nfunction trackDefaults(track: ObjectTrackSignals): BlurBaseProps {\n\treturn {\n\t\tpartialBlur: true,\n\t\tcenterX: track.center.x,\n\t\tcenterY: track.center.y,\n\t\tradius: track.bounds.width.multiply(0.55),\n\t\tradiusY: track.bounds.height.multiply(0.55),\n\t\tshape: \"ellipse\",\n\t\t// Fades the blur out while the object is not being tracked.\n\t\tstrength: track.active.multiply(25),\n\t};\n}\n\n/**\n * Blur effect. Props, defaults and ranges are generated from `node-blur`'s\n * schema ({@link BlurBase}); this subclass only adds `track`.\n */\nexport class Blur extends BlurBase {\n\tconstructor(config: BlurProps = {}) {\n\t\tconst { track, ...rest } = config;\n\t\tsuper(track ? { ...trackDefaults(track), ...definedOnly(rest) } : rest);\n\t}\n}\n\nfunction definedOnly<T extends object>(value: T): T {\n\treturn Object.fromEntries(\n\t\tObject.entries(value).filter(([, v]) => v !== undefined),\n\t) as T;\n}\n","// @generated by scripts/generate-effects.mts — do not edit.\n// Source of truth: nodes/*/package.json (`framefields`) and nodes/*/src/shared/config.ts.\n// Regenerate with `pnpm run generate:effects`.\n\nimport { Blur, type BlurProps } from \"../custom/blur.js\";\nimport {\n\tColorBalance,\n\ttype ColorBalanceProps,\n\tColorKey,\n\ttype ColorKeyProps,\n\tVignette,\n\ttype VignetteProps,\n} from \"./classes.js\";\n\n/** `Effect.<factory>(config)` helpers, one per generated effect class. */\nexport const effectFactories = {\n\tblur: (config?: BlurProps) => new Blur(config),\n\tcolorBalance: (config?: ColorBalanceProps) => new ColorBalance(config),\n\tcolorKey: (config?: ColorKeyProps) => new ColorKey(config),\n\tvignette: (config?: VignetteProps) => new Vignette(config),\n} as const;\n","import { Effect } from \"@framefields/core\";\nimport {\n\tAudioSignal,\n\ttype AudioSignalOptions,\n\ttype ExtractedAudioSignalsBundle,\n} from \"../signals/audio.js\";\nimport type { EffectProp } from \"./types.js\";\n\n// Vignette, Blur and ColorBalance are generated from their node packages\n// (./generated, written by scripts/generate-effects.mts). The classes below\n// are still hand-written and move there in later phases of spec/sync-node.md.\nexport * from \"./generated/index.js\";\nexport type { EffectProp } from \"./types.js\";\n\nexport interface LevelChannel {\n\tinBlack?: number;\n\tinWhite?: number;\n\toutBlack?: number;\n\toutWhite?: number;\n}\n\nexport interface LevelsProps {\n\tmaster?: LevelChannel;\n\tred?: LevelChannel;\n\tgreen?: LevelChannel;\n\tblue?: LevelChannel;\n}\n\nexport class Levels extends Effect<LevelsProps> {\n\tpublic readonly op = \"Levels\";\n\n\tpublic declare master: LevelChannel;\n\tpublic declare red: LevelChannel;\n\tpublic declare green: LevelChannel;\n\tpublic declare blue: LevelChannel;\n\n\tconstructor(config: LevelsProps = {}) {\n\t\tconst defaultChannel: LevelChannel = {\n\t\t\tinBlack: 0,\n\t\t\tinWhite: 1,\n\t\t\toutBlack: 0,\n\t\t\toutWhite: 1,\n\t\t};\n\t\tsuper({\n\t\t\tmaster: config.master ?? { ...defaultChannel },\n\t\t\tred: config.red ?? { ...defaultChannel },\n\t\t\tgreen: config.green ?? { ...defaultChannel },\n\t\t\tblue: config.blue ?? { ...defaultChannel },\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface FilmGrainProps {\n\tstrength?: EffectProp<number>;\n\tsize?: EffectProp<number>;\n\tmonochrome?: boolean;\n\tanimated?: boolean;\n\tspeed?: EffectProp<number>;\n\tshadows?: EffectProp<number>;\n\tmidtones?: EffectProp<number>;\n\thighlights?: EffectProp<number>;\n}\n\nexport class FilmGrain extends Effect<FilmGrainProps> {\n\tpublic readonly op = \"FilmGrain\";\n\n\tpublic declare strength: number;\n\tpublic declare size: number;\n\tpublic declare monochrome: boolean;\n\tpublic declare animated: boolean;\n\tpublic declare speed: number;\n\tpublic declare shadows: number;\n\tpublic declare midtones: number;\n\tpublic declare highlights: number;\n\n\tconstructor(config: FilmGrainProps = {}) {\n\t\tsuper({\n\t\t\tstrength: config.strength ?? 15,\n\t\t\tsize: config.size ?? 1.5,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t\tanimated: config.animated ?? true,\n\t\t\tspeed: config.speed ?? 50,\n\t\t\tshadows: config.shadows ?? 0.2,\n\t\t\tmidtones: config.midtones ?? 1.0,\n\t\t\thighlights: config.highlights ?? 0.2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport class CustomEffect extends Effect<Record<string, unknown>> {\n\tpublic readonly op: string;\n\n\tconstructor(opName: string, config: Record<string, unknown> = {}) {\n\t\tsuper(config);\n\t\tthis.op = opName;\n\t}\n}\n\nexport interface AudioSignalExtractorProps {\n\textractionMode?:\n\t\t| \"rms_envelope\"\n\t\t| \"transient_beat\"\n\t\t| \"sub_bass\"\n\t\t| \"bass\"\n\t\t| \"mid\"\n\t\t| \"high\"\n\t\t| \"spectral_flux\";\n\tattackMs?: number;\n\treleaseMs?: number;\n\tsensitivity?: number;\n\tnoiseFloorDb?: number;\n\tdynamicRangeDb?: number;\n\tautoRange?: boolean;\n\tsmoothing?: number;\n\tcurve?: \"linear\" | \"exponential\" | \"logarithmic\" | \"square\" | \"smoothstep\";\n\tbeatThreshold?: number;\n\tbeatDecayMs?: number;\n\tpreviewMode?: \"waveform\" | \"envelope\" | \"beat_markers\" | \"spectrum\";\n\tnodeId?: string;\n}\n\nexport class AudioSignalExtractor extends Effect<AudioSignalExtractorProps> {\n\tpublic readonly op = \"AudioSignalExtractor\";\n\n\tpublic declare extractionMode: AudioSignalExtractorProps[\"extractionMode\"];\n\tpublic declare attackMs: number;\n\tpublic declare releaseMs: number;\n\tpublic declare sensitivity: number;\n\tpublic declare noiseFloorDb: number;\n\tpublic declare dynamicRangeDb: number;\n\tpublic declare autoRange: boolean;\n\tpublic declare smoothing: number;\n\tpublic declare curve: AudioSignalExtractorProps[\"curve\"];\n\tpublic declare beatThreshold: number;\n\tpublic declare beatDecayMs: number;\n\tpublic declare previewMode: AudioSignalExtractorProps[\"previewMode\"];\n\tpublic declare nodeId: string;\n\n\tconstructor(config: AudioSignalExtractorProps = {}) {\n\t\tsuper({\n\t\t\textractionMode: config.extractionMode ?? \"rms_envelope\",\n\t\t\tattackMs: config.attackMs ?? 10,\n\t\t\treleaseMs: config.releaseMs ?? 120,\n\t\t\tsensitivity: config.sensitivity ?? 1.0,\n\t\t\tnoiseFloorDb: config.noiseFloorDb ?? -48,\n\t\t\tdynamicRangeDb: config.dynamicRangeDb ?? 48,\n\t\t\tautoRange: config.autoRange ?? true,\n\t\t\tsmoothing: config.smoothing ?? 0.15,\n\t\t\tcurve: config.curve ?? \"linear\",\n\t\t\tbeatThreshold: config.beatThreshold ?? 0.08,\n\t\t\tbeatDecayMs: config.beatDecayMs ?? 80,\n\t\t\tpreviewMode: config.previewMode ?? \"envelope\",\n\t\t\tnodeId: config.nodeId ?? \"audio_extractor\",\n\t\t\t...config,\n\t\t});\n\t}\n\n\tpublic async extract(\n\t\tsource: string,\n\t\toptions: Partial<AudioSignalOptions> = {},\n\t): Promise<ExtractedAudioSignalsBundle> {\n\t\treturn AudioSignal.extract(source, {\n\t\t\textractionMode: this.extractionMode,\n\t\t\tattackMs: this.attackMs,\n\t\t\treleaseMs: this.releaseMs,\n\t\t\tsensitivity: this.sensitivity,\n\t\t\tnoiseFloorDb: this.noiseFloorDb,\n\t\t\tdynamicRangeDb: this.dynamicRangeDb,\n\t\t\tsmoothing: this.smoothing,\n\t\t\tcurve: this.curve,\n\t\t\tbeatThreshold: this.beatThreshold,\n\t\t\tbeatDecayMs: this.beatDecayMs,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\t...options,\n\t\t});\n\t}\n}\n\n// ─── Batch 1: Core Tonal, Color & Filter Effects ────────────────────────────\n\nexport interface CurvesChannelPoint {\n\tx: number;\n\ty: number;\n}\n\nexport interface CurvesProps {\n\tcurveType?: \"rgb\" | \"hue-vs-hue\" | \"hue-vs-sat\" | \"lum-vs-sat\" | \"sat-vs-sat\";\n\tmaster?: CurvesChannelPoint[];\n\tred?: CurvesChannelPoint[];\n\tgreen?: CurvesChannelPoint[];\n\tblue?: CurvesChannelPoint[];\n\thueVsHue?: CurvesChannelPoint[];\n\thueVsSat?: CurvesChannelPoint[];\n\tlumVsSat?: CurvesChannelPoint[];\n\tsatVsSat?: CurvesChannelPoint[];\n}\n\nexport class Curves extends Effect<CurvesProps> {\n\tpublic readonly op = \"Curves\";\n\n\tpublic declare curveType: CurvesProps[\"curveType\"];\n\tpublic declare master: CurvesChannelPoint[];\n\tpublic declare red: CurvesChannelPoint[];\n\tpublic declare green: CurvesChannelPoint[];\n\tpublic declare blue: CurvesChannelPoint[];\n\tpublic declare hueVsHue: CurvesChannelPoint[];\n\tpublic declare hueVsSat: CurvesChannelPoint[];\n\tpublic declare lumVsSat: CurvesChannelPoint[];\n\tpublic declare satVsSat: CurvesChannelPoint[];\n\n\tconstructor(config: CurvesProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tcurveType: config.curveType ?? \"rgb\",\n\t\t\tmaster: config.master ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tred: config.red ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tgreen: config.green ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\tblue: config.blue ?? [\n\t\t\t\t{ x: 0, y: 0 },\n\t\t\t\t{ x: 1, y: 1 },\n\t\t\t],\n\t\t\thueVsHue: config.hueVsHue ?? [\n\t\t\t\t{ x: 0, y: 0.5 },\n\t\t\t\t{ x: 1, y: 0.5 },\n\t\t\t],\n\t\t\thueVsSat: config.hueVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tlumVsSat: config.lumVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t\tsatVsSat: config.satVsSat ?? [\n\t\t\t\t{ x: 0, y: 1.0 },\n\t\t\t\t{ x: 1, y: 1.0 },\n\t\t\t],\n\t\t});\n\t}\n}\n\nexport interface SelectiveColorAdjustment {\n\tcyan: number;\n\tmagenta: number;\n\tyellow: number;\n\tblack: number;\n}\n\nexport interface SelectiveColorProps {\n\tmethod?: \"Relative\" | \"Absolute\";\n\treds?: Partial<SelectiveColorAdjustment>;\n\tyellows?: Partial<SelectiveColorAdjustment>;\n\tgreens?: Partial<SelectiveColorAdjustment>;\n\tcyans?: Partial<SelectiveColorAdjustment>;\n\tblues?: Partial<SelectiveColorAdjustment>;\n\tmagentas?: Partial<SelectiveColorAdjustment>;\n\twhites?: Partial<SelectiveColorAdjustment>;\n\tneutrals?: Partial<SelectiveColorAdjustment>;\n\tblacks?: Partial<SelectiveColorAdjustment>;\n}\n\nexport class SelectiveColor extends Effect<SelectiveColorProps> {\n\tpublic readonly op = \"SelectiveColor\";\n\n\tpublic declare method: \"Relative\" | \"Absolute\";\n\tpublic declare reds: SelectiveColorAdjustment;\n\tpublic declare yellows: SelectiveColorAdjustment;\n\tpublic declare greens: SelectiveColorAdjustment;\n\tpublic declare cyans: SelectiveColorAdjustment;\n\tpublic declare blues: SelectiveColorAdjustment;\n\tpublic declare magentas: SelectiveColorAdjustment;\n\tpublic declare whites: SelectiveColorAdjustment;\n\tpublic declare neutrals: SelectiveColorAdjustment;\n\tpublic declare blacks: SelectiveColorAdjustment;\n\n\tconstructor(config: SelectiveColorProps = {}) {\n\t\tconst defaultAdj: SelectiveColorAdjustment = {\n\t\t\tcyan: 0,\n\t\t\tmagenta: 0,\n\t\t\tyellow: 0,\n\t\t\tblack: 0,\n\t\t};\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmethod: config.method ?? \"Relative\",\n\t\t\treds: { ...defaultAdj, ...config.reds },\n\t\t\tyellows: { ...defaultAdj, ...config.yellows },\n\t\t\tgreens: { ...defaultAdj, ...config.greens },\n\t\t\tcyans: { ...defaultAdj, ...config.cyans },\n\t\t\tblues: { ...defaultAdj, ...config.blues },\n\t\t\tmagentas: { ...defaultAdj, ...config.magentas },\n\t\t\twhites: { ...defaultAdj, ...config.whites },\n\t\t\tneutrals: { ...defaultAdj, ...config.neutrals },\n\t\t\tblacks: { ...defaultAdj, ...config.blacks },\n\t\t});\n\t}\n}\n\nexport interface GradientMapStop {\n\tposition: number;\n\tcolor: string;\n}\n\nexport interface GradientMapProps {\n\tstops?: GradientMapStop[];\n\tsmooth?: boolean;\n\tdither?: boolean;\n\topacity?: EffectProp<number>;\n}\n\nexport class GradientMap extends Effect<GradientMapProps> {\n\tpublic readonly op = \"GradientMap\";\n\n\tpublic declare stops: GradientMapStop[];\n\tpublic declare smooth: boolean;\n\tpublic declare dither: boolean;\n\tpublic declare opacity: number;\n\n\tconstructor(config: GradientMapProps = {}) {\n\t\tconst defaultStops: GradientMapStop[] = [\n\t\t\t{ position: 0.0, color: \"#000000\" },\n\t\t\t{ position: 1.0, color: \"#ffffff\" },\n\t\t];\n\t\tsuper({\n\t\t\t...config,\n\t\t\tstops: config.stops ?? defaultStops,\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tdither: config.dither ?? true,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface ShadowsHighlightsProps {\n\tshadowAmount?: EffectProp<number>;\n\tshadowTonalWidth?: EffectProp<number>;\n\tshadowRadius?: EffectProp<number>;\n\thighlightAmount?: EffectProp<number>;\n\thighlightTonalWidth?: EffectProp<number>;\n\thighlightRadius?: EffectProp<number>;\n\tcolorCorrection?: EffectProp<number>;\n\tmidtoneContrast?: EffectProp<number>;\n}\n\nexport class ShadowsHighlights extends Effect<ShadowsHighlightsProps> {\n\tpublic readonly op = \"ShadowsHighlights\";\n\n\tpublic declare shadowAmount: number;\n\tpublic declare shadowTonalWidth: number;\n\tpublic declare shadowRadius: number;\n\tpublic declare highlightAmount: number;\n\tpublic declare highlightTonalWidth: number;\n\tpublic declare highlightRadius: number;\n\tpublic declare colorCorrection: number;\n\tpublic declare midtoneContrast: number;\n\n\tconstructor(config: ShadowsHighlightsProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshadowAmount: config.shadowAmount ?? 0,\n\t\t\tshadowTonalWidth: config.shadowTonalWidth ?? 50,\n\t\t\tshadowRadius: config.shadowRadius ?? 30,\n\t\t\thighlightAmount: config.highlightAmount ?? 0,\n\t\t\thighlightTonalWidth: config.highlightTonalWidth ?? 50,\n\t\t\thighlightRadius: config.highlightRadius ?? 30,\n\t\t\tcolorCorrection: config.colorCorrection ?? 0,\n\t\t\tmidtoneContrast: config.midtoneContrast ?? 0,\n\t\t});\n\t}\n}\n\nexport interface ApplyLUTProps {\n\tlutUrl?: string;\n\tintensity?: EffectProp<number>;\n}\n\nexport class ApplyLUT extends Effect<ApplyLUTProps> {\n\tpublic readonly op = \"ApplyLUT\";\n\n\tpublic declare lutUrl: string;\n\tpublic declare intensity: number;\n\n\tconstructor(config: ApplyLUTProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tlutUrl: config.lutUrl ?? \"\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport interface UnsharpMaskProps {\n\tamount?: EffectProp<number>;\n\tradius?: EffectProp<number>;\n\tthreshold?: EffectProp<number>;\n}\n\nexport class UnsharpMask extends Effect<UnsharpMaskProps> {\n\tpublic readonly op = \"UnsharpMask\";\n\n\tpublic declare amount: number;\n\tpublic declare radius: number;\n\tpublic declare threshold: number;\n\n\tconstructor(config: UnsharpMaskProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tamount: config.amount ?? 100,\n\t\t\tradius: config.radius ?? 1.5,\n\t\t\tthreshold: config.threshold ?? 3,\n\t\t});\n\t}\n}\n\nexport interface HighPassProps {\n\tradius?: EffectProp<number>;\n\tcontrastBoost?: EffectProp<number>;\n\tmonochrome?: boolean;\n}\n\nexport class HighPass extends Effect<HighPassProps> {\n\tpublic readonly op = \"HighPass\";\n\n\tpublic declare radius: number;\n\tpublic declare contrastBoost: number;\n\tpublic declare monochrome: boolean;\n\n\tconstructor(config: HighPassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 3.0,\n\t\t\tcontrastBoost: config.contrastBoost ?? 1.0,\n\t\t\tmonochrome: config.monochrome ?? true,\n\t\t});\n\t}\n}\n\nexport type HalftoneDotShape = \"Circle\" | \"Diamond\" | \"Line\" | \"Square\";\nexport type HalftoneMode = \"Monochrome\" | \"CMYK\";\n\nexport interface HalftoneScreenProps {\n\tmode?: HalftoneMode;\n\tdotShape?: HalftoneDotShape;\n\tfrequency?: EffectProp<number>;\n\tangle?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\tdotColor?: string;\n\tpaperColor?: string;\n\tsmooth?: boolean;\n\tinvert?: boolean;\n\tcyanAngle?: EffectProp<number>;\n\tmagentaAngle?: EffectProp<number>;\n\tyellowAngle?: EffectProp<number>;\n\tblackAngle?: EffectProp<number>;\n\topacity?: EffectProp<number>;\n}\n\nexport class HalftoneScreen extends Effect<HalftoneScreenProps> {\n\tpublic readonly op = \"HalftoneScreen\";\n\n\tpublic declare mode: HalftoneMode;\n\tpublic declare dotShape: HalftoneDotShape;\n\tpublic declare frequency: number;\n\tpublic declare angle: number;\n\tpublic declare contrast: number;\n\tpublic declare dotColor: string;\n\tpublic declare paperColor: string;\n\tpublic declare smooth: boolean;\n\tpublic declare invert: boolean;\n\tpublic declare cyanAngle: number;\n\tpublic declare magentaAngle: number;\n\tpublic declare yellowAngle: number;\n\tpublic declare blackAngle: number;\n\tpublic declare opacity: number;\n\n\tconstructor(config: HalftoneScreenProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tmode: config.mode ?? \"Monochrome\",\n\t\t\tdotShape: config.dotShape ?? \"Circle\",\n\t\t\tfrequency: config.frequency ?? 30,\n\t\t\tangle: config.angle ?? 45,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\tdotColor: config.dotColor ?? \"#000000\",\n\t\t\tpaperColor: config.paperColor ?? \"#ffffff\",\n\t\t\tsmooth: config.smooth ?? true,\n\t\t\tinvert: config.invert ?? false,\n\t\t\tcyanAngle: config.cyanAngle ?? 15,\n\t\t\tmagentaAngle: config.magentaAngle ?? 75,\n\t\t\tyellowAngle: config.yellowAngle ?? 0,\n\t\t\tblackAngle: config.blackAngle ?? 45,\n\t\t\topacity: config.opacity ?? 1.0,\n\t\t});\n\t}\n}\n\nexport type TileOffsetEdgeMode = \"wrap\" | \"clamp\" | \"transparent\" | \"mirror\";\n\nexport interface TileOffsetProps {\n\toffsetX?: EffectProp<number>;\n\toffsetY?: EffectProp<number>;\n\twrap?: boolean;\n\tedgeMode?: TileOffsetEdgeMode;\n}\n\nexport class TileOffset extends Effect<TileOffsetProps> {\n\tpublic readonly op = \"TileOffset\";\n\n\tpublic declare offsetX: number;\n\tpublic declare offsetY: number;\n\tpublic declare wrap: boolean;\n\tpublic declare edgeMode: TileOffsetEdgeMode;\n\n\tconstructor(config: TileOffsetProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\toffsetX: config.offsetX ?? 0,\n\t\t\toffsetY: config.offsetY ?? 0,\n\t\t\twrap: config.wrap ?? true,\n\t\t\tedgeMode: config.edgeMode ?? \"wrap\",\n\t\t});\n\t}\n}\n\nexport interface MotionBlurProps {\n\tshutterAngle?: EffectProp<number>;\n\tsamples?: EffectProp<number>;\n\tmaxVelocity?: EffectProp<number>;\n\tshutterCurve?: \"box\" | \"gaussian\" | \"triangle\";\n\tdepthAware?: boolean;\n}\n\nexport class MotionBlur extends Effect<MotionBlurProps> {\n\tpublic readonly op = \"MotionBlur\";\n\n\tpublic declare shutterAngle: number;\n\tpublic declare samples: number;\n\tpublic declare maxVelocity: number;\n\tpublic declare shutterCurve: \"box\" | \"gaussian\" | \"triangle\";\n\tpublic declare depthAware: boolean;\n\n\tconstructor(config: MotionBlurProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tshutterAngle: config.shutterAngle ?? 180,\n\t\t\tsamples: config.samples ?? 16,\n\t\t\tmaxVelocity: config.maxVelocity ?? 64,\n\t\t\tshutterCurve: config.shutterCurve ?? \"gaussian\",\n\t\t\tdepthAware: config.depthAware ?? true,\n\t\t});\n\t}\n}\n\nexport interface SSAOProps {\n\tradius?: EffectProp<number>;\n\tbias?: EffectProp<number>;\n\tintensity?: EffectProp<number>;\n\tkernelSamples?: EffectProp<number>;\n\tblurRadius?: EffectProp<number>;\n}\n\nexport class SSAO extends Effect<SSAOProps> {\n\tpublic readonly op = \"SSAO\";\n\n\tpublic declare radius: number;\n\tpublic declare bias: number;\n\tpublic declare intensity: number;\n\tpublic declare kernelSamples: number;\n\tpublic declare blurRadius: number;\n\n\tconstructor(config: SSAOProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tradius: config.radius ?? 45,\n\t\t\tbias: config.bias ?? 0.025,\n\t\t\tintensity: config.intensity ?? 1.5,\n\t\t\tkernelSamples: config.kernelSamples ?? 16,\n\t\t\tblurRadius: config.blurRadius ?? 4,\n\t\t});\n\t}\n}\n\nexport interface PBRGlassProps {\n\tior?: EffectProp<number>;\n\troughness?: EffectProp<number>;\n\ttransmission?: EffectProp<number>;\n\tdispersion?: EffectProp<number>;\n\tfresnelPower?: EffectProp<number>;\n\ttintColor?: EffectProp<string>;\n}\n\nexport class PBRGlass extends Effect<PBRGlassProps> {\n\tpublic readonly op = \"PBRGlass\";\n\n\tpublic declare ior: number;\n\tpublic declare roughness: number;\n\tpublic declare transmission: number;\n\tpublic declare dispersion: number;\n\tpublic declare fresnelPower: number;\n\tpublic declare tintColor: string;\n\n\tconstructor(config: PBRGlassProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tior: config.ior ?? 1.49,\n\t\t\troughness: config.roughness ?? 0.15,\n\t\t\ttransmission: config.transmission ?? 0.92,\n\t\t\tdispersion: config.dispersion ?? 0.015,\n\t\t\tfresnelPower: config.fresnelPower ?? 5.0,\n\t\t\ttintColor: config.tintColor ?? \"#ffffff\",\n\t\t});\n\t}\n}\n\nexport interface DepthOfFieldProps {\n\tfocusDistance?: EffectProp<number>;\n\tfocalLength?: EffectProp<number>;\n\taperture?: EffectProp<number>;\n\tmaxBlur?: EffectProp<number>;\n\tquality?: \"low\" | \"medium\" | \"high\" | \"ultra\";\n}\n\nexport class DepthOfField extends Effect<DepthOfFieldProps> {\n\tpublic readonly op = \"DepthOfField\";\n\n\tpublic declare focusDistance: number;\n\tpublic declare focalLength: number;\n\tpublic declare aperture: number;\n\tpublic declare maxBlur: number;\n\tpublic declare quality: string;\n\n\tconstructor(config: DepthOfFieldProps = {}) {\n\t\tsuper({\n\t\t\t...config,\n\t\t\tfocusDistance: config.focusDistance ?? 500,\n\t\t\tfocalLength: config.focalLength ?? 50,\n\t\t\taperture: config.aperture ?? 2.8,\n\t\t\tmaxBlur: config.maxBlur ?? 16,\n\t\t\tquality: config.quality ?? \"high\",\n\t\t});\n\t}\n}\n\nexport interface CropProps {\n\tcropType?: \"rect\" | \"path\";\n\tleftPercentage?: EffectProp<number>;\n\ttopPercentage?: EffectProp<number>;\n\twidthPercentage?: EffectProp<number>;\n\theightPercentage?: EffectProp<number>;\n\troundness?: EffectProp<number>;\n\tpathPoints?: { x: number; y: number }[];\n\tmode?: \"cropped\" | \"rest\";\n}\n\nexport class Crop extends Effect<CropProps> {\n\tpublic readonly op = \"Crop\";\n\n\tpublic declare cropType: \"rect\" | \"path\";\n\tpublic declare leftPercentage: number;\n\tpublic declare topPercentage: number;\n\tpublic declare widthPercentage: number;\n\tpublic declare heightPercentage: number;\n\tpublic declare roundness: number;\n\tpublic declare pathPoints?: { x: number; y: number }[];\n\tpublic declare mode?: \"cropped\" | \"rest\";\n\n\tconstructor(config: CropProps = {}) {\n\t\tsuper({\n\t\t\tcropType: config.cropType ?? \"rect\",\n\t\t\tleftPercentage: config.leftPercentage ?? 0,\n\t\t\ttopPercentage: config.topPercentage ?? 0,\n\t\t\twidthPercentage: config.widthPercentage ?? 100,\n\t\t\theightPercentage: config.heightPercentage ?? 100,\n\t\t\troundness: config.roundness ?? 0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface VisionProps {\n\t/** Track COCO-80 objects (RTMDet-Ins boxes). Default true. */\n\tenableDetection?: boolean;\n\t/** Per-instance masks (RTMDet-Ins). Shares the detection pass. */\n\tenableSegmentation?: boolean;\n\t/** COCO-17 keypoints per person (RTMO). */\n\tenablePose?: boolean;\n\t/** Fast person-vs-background alpha (Selfie Segmenter). */\n\tenableMatte?: boolean;\n\t/** COCO class-name filter (all classes when omitted). */\n\tclasses?: readonly string[];\n\t/** Minimum detection score, 0..1. Default 0.3. */\n\tconfidence?: number;\n\t/** Model size: `t` fastest · `s` default · `m` most accurate. */\n\tvariant?: \"t\" | \"s\" | \"m\";\n\tmode?:\n\t\t| \"passthrough\"\n\t\t| \"mask\"\n\t\t| \"matte\"\n\t\t| \"crop\"\n\t\t| \"skeleton\"\n\t\t| \"boxes\"\n\t\t| \"tracking\";\n\t/**\n\t * Subject alpha for mask/matte/crop: instance masks (default; any COCO class) or the\n\t * selfie matte (fastest, but only reliable when a person fills much of the frame).\n\t */\n\tmatteSource?: \"instance\" | \"selfie\";\n\t/** Frames a track may go unseen before it is dropped. Default 15. */\n\tmaxMissedFrames?: number;\n\tmodelsDir?: string;\n\tbaseUrl?: string;\n\tmaskThreshold?: number;\n\tfeatherRadius?: number;\n\t/** Grow the subject into connected pixels that stand out from the backdrop. */\n\tkeyBackground?: boolean;\n\t/** Colour-distance threshold for the background key (lower → more growth). Default 70. */\n\tbackgroundKeyThreshold?: number;\n\tvisionBundle?: unknown;\n}\n\n/**\n * On-device vision: tracks objects, segments instances, estimates pose and mattes people on\n * the rendered frame, feeding reactive signals. Models download lazily on first use.\n */\nexport class Vision extends Effect<VisionProps> {\n\tpublic readonly op = \"Vision\";\n\n\tpublic declare enableDetection?: boolean;\n\tpublic declare enableSegmentation?: boolean;\n\tpublic declare enablePose?: boolean;\n\tpublic declare enableMatte?: boolean;\n\tpublic declare classes?: readonly string[];\n\tpublic declare confidence?: number;\n\tpublic declare variant?: VisionProps[\"variant\"];\n\tpublic declare mode?: VisionProps[\"mode\"];\n\tpublic declare matteSource?: VisionProps[\"matteSource\"];\n\tpublic declare maxMissedFrames?: number;\n\tpublic declare modelsDir?: string;\n\tpublic declare baseUrl?: string;\n\tpublic declare maskThreshold?: number;\n\tpublic declare featherRadius?: number;\n\tpublic declare keyBackground?: boolean;\n\tpublic declare backgroundKeyThreshold?: number;\n\tpublic declare visionBundle?: unknown;\n\n\tconstructor(config: VisionProps = {}) {\n\t\tsuper({\n\t\t\tenableDetection: config.enableDetection !== false,\n\t\t\tenableSegmentation: config.enableSegmentation === true,\n\t\t\tenablePose: config.enablePose === true,\n\t\t\tenableMatte: config.enableMatte === true,\n\t\t\tconfidence: config.confidence ?? 0.3,\n\t\t\tvariant: config.variant ?? \"s\",\n\t\t\tmode: config.mode ?? \"passthrough\",\n\t\t\tmatteSource: config.matteSource ?? \"instance\",\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface Relight3DProps {\n\tlightType?: \"Point\" | \"Spot\" | \"Directional\" | \"Rim\";\n\tintensity?: EffectProp<number>;\n\tlightPosX?: EffectProp<number>;\n\tlightPosY?: EffectProp<number>;\n\tlightPosZ?: EffectProp<number>;\n\tlightRadius?: EffectProp<number>;\n\tspotConeAngle?: EffectProp<number>;\n\tspecularRoughness?: EffectProp<number>;\n\tspecularStrength?: EffectProp<number>;\n\tmetallic?: EffectProp<number>;\n\tambientIntensity?: EffectProp<number>;\n\tvolumetricDensity?: EffectProp<number>;\n\tdepthScale?: EffectProp<number>;\n\tdepthInvert?: boolean;\n\tlightColor?: string;\n\tambientColor?: string;\n\tnormalMap?: unknown;\n}\n\nexport class Relight3D extends Effect<Relight3DProps> {\n\tpublic readonly op = \"Relight3D\";\n\n\tpublic declare lightType: Relight3DProps[\"lightType\"];\n\tpublic declare intensity: number;\n\tpublic declare lightPosX: number;\n\tpublic declare lightPosY: number;\n\tpublic declare lightPosZ: number;\n\tpublic declare lightRadius: number;\n\tpublic declare spotConeAngle: number;\n\tpublic declare specularRoughness: number;\n\tpublic declare specularStrength: number;\n\tpublic declare metallic: number;\n\tpublic declare ambientIntensity: number;\n\tpublic declare volumetricDensity: number;\n\tpublic declare depthScale: number;\n\tpublic declare depthInvert: boolean;\n\tpublic declare lightColor: string;\n\tpublic declare ambientColor: string;\n\tpublic declare normalMap: unknown;\n\n\tconstructor(config: Relight3DProps = {}) {\n\t\tsuper({\n\t\t\tlightType: config.lightType ?? \"Point\",\n\t\t\tintensity: config.intensity ?? 1.0,\n\t\t\tlightPosX: config.lightPosX ?? 0.5,\n\t\t\tlightPosY: config.lightPosY ?? 0.5,\n\t\t\tlightPosZ: config.lightPosZ ?? 0.3,\n\t\t\tlightRadius: config.lightRadius ?? 0.8,\n\t\t\tspotConeAngle: config.spotConeAngle ?? 45,\n\t\t\tspecularRoughness: config.specularRoughness ?? 0.35,\n\t\t\tspecularStrength: config.specularStrength ?? 0.7,\n\t\t\tmetallic: config.metallic ?? 0.0,\n\t\t\tambientIntensity: config.ambientIntensity ?? 0.4,\n\t\t\tvolumetricDensity: config.volumetricDensity ?? 0.2,\n\t\t\tdepthScale: config.depthScale ?? 1.0,\n\t\t\tdepthInvert: config.depthInvert ?? false,\n\t\t\tlightColor: config.lightColor ?? \"#ffffff\",\n\t\t\tambientColor: config.ambientColor ?? \"#ffffff\",\n\t\t\tnormalMap: config.normalMap,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface DeflickerProps {\n\tblendWeight?: EffectProp<number>;\n\tdisocclusionThreshold?: EffectProp<number>;\n\tmaxMotionPixels?: EffectProp<number>;\n\tscale?: number;\n\twindowSize?: number;\n}\n\nexport class TemporalDeflicker extends Effect<DeflickerProps> {\n\tpublic readonly op = \"TemporalDeflicker\";\n\n\tpublic declare blendWeight: number;\n\tpublic declare disocclusionThreshold: number;\n\tpublic declare maxMotionPixels: number;\n\tpublic declare scale: number;\n\tpublic declare windowSize: number;\n\n\tconstructor(config: DeflickerProps = {}) {\n\t\tsuper({\n\t\t\tblendWeight: config.blendWeight ?? 0.35,\n\t\t\tdisocclusionThreshold: config.disocclusionThreshold ?? 0.15,\n\t\t\tmaxMotionPixels: config.maxMotionPixels ?? 64.0,\n\t\t\tscale: config.scale ?? 0.5,\n\t\t\twindowSize: config.windowSize ?? 2,\n\t\t\t...config,\n\t\t});\n\t}\n}\n\nexport interface ModulateProps {\n\thue?: EffectProp<number>;\n\tbrightness?: EffectProp<number>;\n\tcontrast?: EffectProp<number>;\n\texposure?: EffectProp<number>;\n\tsaturation?: EffectProp<number>;\n\tsepia?: EffectProp<number>;\n}\n\nexport class Modulate extends Effect<ModulateProps> {\n\tpublic readonly op = \"Modulate\";\n\n\tpublic declare hue: number;\n\tpublic declare brightness: number;\n\tpublic declare contrast: number;\n\tpublic declare exposure: number;\n\tpublic declare saturation: number;\n\tpublic declare sepia: number;\n\n\tconstructor(config: ModulateProps = {}) {\n\t\tsuper({\n\t\t\thue: config.hue ?? 0,\n\t\t\tbrightness: config.brightness ?? 1.0,\n\t\t\tcontrast: config.contrast ?? 1.0,\n\t\t\texposure: config.exposure ?? 0.0,\n\t\t\tsaturation: config.saturation ?? 1.0,\n\t\t\tsepia: config.sepia ?? 0.0,\n\t\t\t...config,\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { n as RegisterFontOptions, r as RegisteredFont, t as FontManager } from "../index-DiSKzDGR.mjs";
1
+ import { n as RegisterFontOptions, r as RegisteredFont, t as FontManager } from "../index-CbzEM_o6.mjs";
2
2
  export { FontManager, RegisterFontOptions, RegisteredFont };
@@ -1,3 +1,3 @@
1
- import { t as FontManager } from "../fonts-CwwIhe1o.mjs";
1
+ import { t as FontManager } from "../fonts-C_AWIMdb.mjs";
2
2
 
3
3
  export { FontManager };
@@ -1,4 +1,4 @@
1
- import { $ as registerHeadlessFont, y as SlugFontCache } from "./dist-DuIv211_.mjs";
1
+ import { $ as registerHeadlessFont, y as SlugFontCache } from "./dist-DgIKXWZ1.mjs";
2
2
  import * as fontkit from "fontkit";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs/promises";
@@ -85,6 +85,17 @@ var FontManager = class FontManager {
85
85
  return FontManager.getInstance().register(optionsOrFamilyOrSource, source);
86
86
  }
87
87
  /**
88
+ * Sets the color emoji font text draws emoji with, for the preview and the
89
+ * export alike: a CBDT/CBLC bitmap font such as Noto Color Emoji, as a file
90
+ * path, URL or bytes. framefields ships none; without one, exports draw
91
+ * nothing for emoji.
92
+ */
93
+ static async registerEmojiFont(source) {
94
+ const { buffer, filePath } = await resolveSourceBuffer(source);
95
+ validateFontBinaryHeader(buffer, filePath ?? (typeof source === "string" ? source : "Uint8Array"));
96
+ SlugFontCache.setEmojiFont(buffer, filePath);
97
+ }
98
+ /**
88
99
  * Retrieves registered font metadata by family name.
89
100
  */
90
101
  static get(family) {
@@ -185,4 +196,4 @@ var FontManager = class FontManager {
185
196
 
186
197
  //#endregion
187
198
  export { FontManager as t };
188
- //# sourceMappingURL=fonts-CwwIhe1o.mjs.map
199
+ //# sourceMappingURL=fonts-C_AWIMdb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts-C_AWIMdb.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} from \"@framefields/webgpu-renderers\";\nimport * as fontkit from \"fontkit\";\n\nexport interface RegisterFontOptions {\n\tfamily?: string;\n\tsource: string | Uint8Array;\n\tweight?: number | string;\n\tstyle?: \"normal\" | \"italic\" | \"oblique\";\n}\n\nexport interface RegisteredFont {\n\tfamily: string;\n\tsource: string | Uint8Array;\n\tfilePath?: string;\n\tformat: \"truetype\" | \"opentype\";\n\tpostscriptName?: string;\n\tunitsPerEm?: number;\n\tweight?: number | string;\n\tstyle?: string;\n}\n\ninterface ResolvedSource {\n\tbuffer: Uint8Array;\n\tfilePath?: string;\n}\n\nconst SFNT_TRUETYPE_1 = 0x00010000;\nconst SFNT_TRUETYPE_TRUE = 0x74727565; // 'true'\nconst SFNT_TRUETYPE_TYP1 = 0x74797031; // 'typ1'\nconst SFNT_OPENTYPE_CFF = 0x4f54544f; // 'OTTO'\nconst SFNT_COLLECTION = 0x74746366; // 'ttcf'\n\nfunction validateFontBinaryHeader(\n\tbytes: Uint8Array,\n\tsourceLabel: string,\n): \"truetype\" | \"opentype\" {\n\tif (bytes.length < 12) {\n\t\tthrow new Error(\n\t\t\t`Invalid font binary for \"${sourceLabel}\": File size (${bytes.length} bytes) is too small to be a valid TrueType or OpenType font.`,\n\t\t);\n\t}\n\n\tconst tag =\n\t\t((bytes[0] ?? 0) << 24) |\n\t\t((bytes[1] ?? 0) << 16) |\n\t\t((bytes[2] ?? 0) << 8) |\n\t\t(bytes[3] ?? 0);\n\n\tif (\n\t\ttag === SFNT_TRUETYPE_1 ||\n\t\ttag === SFNT_TRUETYPE_TRUE ||\n\t\ttag === SFNT_TRUETYPE_TYP1 ||\n\t\ttag === SFNT_COLLECTION\n\t) {\n\t\treturn \"truetype\";\n\t}\n\n\tif (tag === SFNT_OPENTYPE_CFF) {\n\t\treturn \"opentype\";\n\t}\n\n\tconst hexTag = (tag >>> 0).toString(16).padStart(8, \"0\");\n\tthrow new Error(\n\t\t`Invalid font format for \"${sourceLabel}\": Expected a valid TrueType (.ttf) or OpenType (.otf) font binary. Found header tag: 0x${hexTag}.`,\n\t);\n}\n\nasync function resolveSourceBuffer(\n\tsource: string | Uint8Array,\n): Promise<ResolvedSource> {\n\tif (source instanceof Uint8Array) {\n\t\treturn { buffer: source };\n\t}\n\n\tif (typeof source !== \"string\") {\n\t\tthrow new TypeError(\n\t\t\t`Font source must be a file path string or Uint8Array, received: ${typeof source}`,\n\t\t);\n\t}\n\n\tlet cleanPath = source;\n\tif (cleanPath.startsWith(\"http://\") || cleanPath.startsWith(\"https://\")) {\n\t\tconst res = await fetch(cleanPath);\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to download font from \"${cleanPath}\": HTTP ${res.status} ${res.statusText}`,\n\t\t\t);\n\t\t}\n\t\tconst arrayBuffer = await res.arrayBuffer();\n\t\treturn {\n\t\t\tbuffer: new Uint8Array(arrayBuffer),\n\t\t\tfilePath: cleanPath,\n\t\t};\n\t}\n\n\tif (cleanPath.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tcleanPath = new URL(cleanPath).pathname;\n\t\t} catch {\n\t\t\tcleanPath = cleanPath.replace(/^file:\\/\\//, \"\");\n\t\t}\n\t}\n\n\tconst candidates: string[] = [\n\t\tcleanPath,\n\t\tpath.resolve(process.cwd(), cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", cleanPath),\n\t\tpath.resolve(process.cwd(), \"assets/fonts\", path.basename(cleanPath)),\n\t];\n\n\t// Upward traversal to locate fonts in parent monorepo roots\n\tlet currentDir = process.cwd();\n\tfor (let i = 0; i < 5; i++) {\n\t\tcandidates.push(path.resolve(currentDir, cleanPath));\n\t\tcandidates.push(\n\t\t\tpath.resolve(currentDir, \"assets/fonts\", path.basename(cleanPath)),\n\t\t);\n\t\tconst parent = path.dirname(currentDir);\n\t\tif (parent === currentDir) break;\n\t\tcurrentDir = parent;\n\t}\n\n\tlet resolvedPath: string | null = null;\n\tlet fileBuffer: Buffer | null = null;\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst stat = await fs.stat(candidate);\n\t\t\tif (stat.isFile()) {\n\t\t\t\tresolvedPath = candidate;\n\t\t\t\tfileBuffer = await fs.readFile(candidate);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Continue searching next candidate\n\t\t}\n\t}\n\n\tif (!resolvedPath || !fileBuffer) {\n\t\tthrow new Error(\n\t\t\t`Font file not found: \"${source}\". Checked candidate locations:\\n - ${candidates.join(\"\\n - \")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tbuffer: new Uint8Array(\n\t\t\tfileBuffer.buffer,\n\t\t\tfileBuffer.byteOffset,\n\t\t\tfileBuffer.byteLength,\n\t\t),\n\t\tfilePath: resolvedPath,\n\t};\n}\n\n/**\n * Central singleton manager for font registration, TTF validation, and compositor typography binding.\n */\nexport class FontManager {\n\tprivate static instance: FontManager | null = null;\n\tprivate readonly fonts = new Map<string, RegisteredFont>();\n\n\tprivate constructor() {}\n\n\t/**\n\t * Returns the singleton FontManager instance.\n\t */\n\tpublic static getInstance(): FontManager {\n\t\tif (!FontManager.instance) {\n\t\t\tFontManager.instance = new FontManager();\n\t\t}\n\t\treturn FontManager.instance;\n\t}\n\n\t/**\n\t * Registers a TrueType/OpenType font into the Framefields engine with validation.\n\t */\n\tpublic static async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\treturn FontManager.getInstance().register(optionsOrFamilyOrSource, source);\n\t}\n\n\t/**\n\t * Sets the color emoji font text draws emoji with, for the preview and the\n\t * export alike: a CBDT/CBLC bitmap font such as Noto Color Emoji, as a file\n\t * path, URL or bytes. framefields ships none; without one, exports draw\n\t * nothing for emoji.\n\t */\n\tpublic static async registerEmojiFont(\n\t\tsource: string | Uint8Array,\n\t): Promise<void> {\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(source);\n\t\tconst label =\n\t\t\tfilePath ?? (typeof source === \"string\" ? source : \"Uint8Array\");\n\t\tvalidateFontBinaryHeader(buffer, label);\n\t\tSlugFontCache.setEmojiFont(buffer, filePath);\n\t}\n\n\t/**\n\t * Retrieves registered font metadata by family name.\n\t */\n\tpublic static get(family: string): RegisteredFont | undefined {\n\t\treturn FontManager.getInstance().get(family);\n\t}\n\n\t/**\n\t * Checks if a font family has been registered.\n\t */\n\tpublic static has(family: string): boolean {\n\t\treturn FontManager.getInstance().has(family);\n\t}\n\n\t/**\n\t * Returns all currently registered fonts.\n\t */\n\tpublic static getAll(): RegisteredFont[] {\n\t\treturn FontManager.getInstance().getAll();\n\t}\n\n\t/**\n\t * Returns relative or absolute file paths of all registered fonts for composition spec serialization.\n\t */\n\tpublic static getRegisteredFontPaths(): string[] {\n\t\treturn FontManager.getInstance().getRegisteredFontPaths();\n\t}\n\n\t/**\n\t * Clears all registered fonts from the manager.\n\t */\n\tpublic static clear(): void {\n\t\tFontManager.getInstance().clear();\n\t}\n\n\t/**\n\t * Instance registration method with format validation and Slug WebGPU cache population.\n\t */\n\tpublic async register(\n\t\toptionsOrFamilyOrSource: RegisterFontOptions | string,\n\t\tsource?: string | Uint8Array,\n\t): Promise<RegisteredFont> {\n\t\tlet family: string | undefined;\n\t\tlet rawSource: string | Uint8Array;\n\t\tlet weight: number | string | undefined;\n\t\tlet style: \"normal\" | \"italic\" | \"oblique\" | undefined;\n\n\t\tif (\n\t\t\ttypeof optionsOrFamilyOrSource === \"object\" &&\n\t\t\toptionsOrFamilyOrSource !== null\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource.family;\n\t\t\trawSource = optionsOrFamilyOrSource.source;\n\t\t\tweight = optionsOrFamilyOrSource.weight;\n\t\t\tstyle = optionsOrFamilyOrSource.style;\n\t\t} else if (\n\t\t\ttypeof optionsOrFamilyOrSource === \"string\" &&\n\t\t\tsource !== undefined\n\t\t) {\n\t\t\tfamily = optionsOrFamilyOrSource;\n\t\t\trawSource = source;\n\t\t} else if (typeof optionsOrFamilyOrSource === \"string\") {\n\t\t\tfamily = undefined;\n\t\t\trawSource = optionsOrFamilyOrSource;\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid arguments passed to FontManager.register\");\n\t\t}\n\n\t\tconst { buffer, filePath } = await resolveSourceBuffer(rawSource);\n\t\tconst sourceLabel =\n\t\t\tfilePath ?? (typeof rawSource === \"string\" ? rawSource : \"Uint8Array\");\n\t\tconst format = validateFontBinaryHeader(buffer, sourceLabel);\n\n\t\tlet parsedFontkit: fontkit.Font;\n\t\ttry {\n\t\t\tconst parsed = fontkit.create(buffer as unknown as Buffer);\n\t\t\tif (\n\t\t\t\tparsed &&\n\t\t\t\t\"fonts\" in parsed &&\n\t\t\t\tArray.isArray(parsed.fonts) &&\n\t\t\t\tparsed.fonts.length > 0\n\t\t\t) {\n\t\t\t\tparsedFontkit = parsed.fonts[0] as fontkit.Font;\n\t\t\t} else {\n\t\t\t\tparsedFontkit = parsed as fontkit.Font;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse TrueType/OpenType font binary for \"${sourceLabel}\": ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tconst detectedFamily =\n\t\t\tparsedFontkit.familyName ||\n\t\t\tparsedFontkit.postscriptName ||\n\t\t\tpath.parse(sourceLabel).name;\n\t\tconst resolvedFamily = family?.trim() || detectedFamily;\n\n\t\tconst registered: RegisteredFont = {\n\t\t\tfamily: resolvedFamily,\n\t\t\tsource: rawSource,\n\t\t\tfilePath,\n\t\t\tformat,\n\t\t\tpostscriptName: parsedFontkit.postscriptName,\n\t\t\tunitsPerEm: parsedFontkit.unitsPerEm,\n\t\t\tweight,\n\t\t\tstyle,\n\t\t};\n\n\t\tthis.fonts.set(resolvedFamily, registered);\n\n\t\t// Populate headless font registries\n\t\tif (filePath) {\n\t\t\tawait registerHeadlessFont(resolvedFamily, filePath);\n\t\t}\n\t\tSlugFontCache.setParsed(resolvedFamily, parsedFontkit);\n\n\t\treturn registered;\n\t}\n\n\tpublic get(family: string): RegisteredFont | undefined {\n\t\treturn this.fonts.get(family);\n\t}\n\n\tpublic has(family: string): boolean {\n\t\treturn this.fonts.has(family);\n\t}\n\n\tpublic getAll(): RegisteredFont[] {\n\t\treturn Array.from(this.fonts.values());\n\t}\n\n\tpublic getRegisteredFontPaths(): string[] {\n\t\tconst paths: string[] = [];\n\t\tfor (const font of this.fonts.values()) {\n\t\t\tif (font.filePath) {\n\t\t\t\tpaths.push(font.filePath);\n\t\t\t} else if (typeof font.source === \"string\") {\n\t\t\t\tpaths.push(font.source);\n\t\t\t}\n\t\t}\n\t\treturn paths;\n\t}\n\n\tpublic clear(): void {\n\t\tthis.fonts.clear();\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { wr as VirtualMediaData } from "./index-D2jDC7O5.mjs";
1
+ import { wr as VirtualMediaData } from "./index-ogL8Y-Ng.mjs";
2
2
  import { VideoSampleSource } from "mediabunny";
3
3
  import { VideoFrame } from "@napi-rs/webcodecs";
4
4
 
@@ -313,4 +313,4 @@ type FrameGridRenderable = {
313
313
  declare function renderFrameGrid(target: FrameGridRenderable, options?: FrameGridOptions): Promise<Buffer>;
314
314
  //#endregion
315
315
  export { renderFrameGrid as a, HeadlessMediaRenderer as c, QaSegment as d, VideoQaOptions as f, renderSemaphore as g, formatQaReport as h, computeGridLayout as i, HeadlessWebGPURenderer as l, VideoQaStats as m, FrameGridRenderable as n, resolveSamplePoints as o, VideoQaReport as p, FrameSamplePoint as r, AudioQaStats as s, FrameGridOptions as t, QaIssue as u };
316
- //# sourceMappingURL=index-CnAk1hTw.d.mts.map
316
+ //# sourceMappingURL=index-Bx7JBFT6.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Bx7JBFT6.d.mts","names":["VideoColorPrimaries","VideoFrame","VideoMatrixCoefficients","VideoTransferCharacteristics","RenderDiagnostic","VirtualMediaData","VideoSampleSource","preloadFonts","GPUDevice","Promise","StagingSlotStatus","VideoColorSpaceConfig","DmaStagingRingOptions","GPUTextureFormat","StagingSlotInfo","DmaStagingRing","GPUCommandEncoder","GPUTexture","Uint8Array","findNodesDir","discoverAndRegisterNodeRenderers","VideoQaOptions","QaSegment","QaIssue","VideoQaStats","AudioQaStats","VideoQaReport","FrameInspector","analyzeAudio","Float32Array","integratedLoudness","buildQaReport","formatQaReport","WorkerInput","WorkerMessage","Array","RenderSemaphore","renderSemaphore","HeadlessWebGPURenderer","Buffer","HeadlessMediaRenderer","NODE_KINDS","NodeKind","NodeRendererExports","NodeManifest","NodeManifestError","Error","parseNodeManifest","loadNodeManifests","ZeroCopyWebCodecsPipelineOptions","WebCodecsPipelineStats","ZeroCopyWebCodecsPipeline"],"sources":["../../renderer/dist/index.d.mts","../src/renderer/framegrid.ts"],"sourcesContent":["import { VideoColorPrimaries, VideoFrame, VideoMatrixCoefficients, VideoTransferCharacteristics } from \"@napi-rs/webcodecs\";\nimport { RenderDiagnostic, VirtualMediaData } from \"@framefields/core\";\nimport { VideoSampleSource } from \"mediabunny\";\n\n//#region src/asset-preloader.d.ts\n\n/**\n * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n * typography renders correctly on Node.js without loading its media. Shared\n * with the browser preview; emoji need a font set with\n * `FontManager.registerEmojiFont()`.\n */\ndeclare function preloadFonts(media: VirtualMediaData, device?: GPUDevice | null): Promise<void>;\n//#endregion\n//#region src/dma-staging-ring.d.ts\ntype StagingSlotStatus = \"idle\" | \"rendering\" | \"mapping\" | \"mapped\";\ninterface VideoColorSpaceConfig {\n readonly primaries?: VideoColorPrimaries;\n readonly transfer?: VideoTransferCharacteristics;\n readonly matrix?: VideoMatrixCoefficients;\n readonly fullRange?: boolean;\n}\ninterface DmaStagingRingOptions {\n readonly width: number;\n readonly height: number;\n readonly capacity?: number;\n readonly format?: GPUTextureFormat;\n}\ninterface StagingSlotInfo {\n readonly index: number;\n readonly status: StagingSlotStatus;\n readonly inFlightFrame: number | null;\n}\n/**\n * Pipelined Asynchronous DMA Staging Ring for WebGPU.\n *\n * Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n * GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n * Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n * is asynchronously mapped and consumed by the hardware video encoder.\n */\ndeclare class DmaStagingRing {\n readonly width: number;\n readonly height: number;\n readonly capacity: number;\n readonly bytesPerRow: number;\n readonly unpaddedBytesPerRow: number;\n readonly bufferSize: number;\n readonly format: GPUTextureFormat;\n readonly device: GPUDevice;\n private readonly slots;\n private isDestroyed;\n constructor(device: GPUDevice, options: DmaStagingRingOptions);\n /**\n * Prepares the staging buffer slot for writing by ensuring any prior mapping\n * from a previous cycle has been completed and unmapped.\n */\n prepareSlot(frameIndex: number): Promise<void>;\n /**\n * Records a GPU-to-buffer DMA copy command into the provided command encoder.\n */\n stageTexture(encoder: GPUCommandEncoder, texture: GPUTexture, frameIndex: number): void;\n /**\n * Initiates asynchronous DMA mapping on the slot for the specified frame.\n * Must be called immediately after submitting the command encoder to the device queue.\n */\n scheduleMap(frameIndex: number): Promise<void>;\n /**\n * Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n * The slot remains in the \"mapped\" state until releaseFrame() is called.\n */\n readFramePixels(frameIndex: number): Promise<Uint8Array>;\n /**\n * Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n * returning the slot to \"idle\" state so it can be reused immediately.\n */\n readAndReleaseFrame(frameIndex: number): Promise<Uint8Array>;\n /**\n * Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n * bypassing redundant intermediate JS allocations when row pitches align,\n * and immediately unmaps the buffer.\n */\n readFrameToVideoFrame(frameIndex: number, timestampUs: number, colorSpace?: VideoColorSpaceConfig, /** Sees the tightly packed RGBA pixels while they are mapped; must not keep them. */\n inspect?: (rgba: Uint8Array) => void): Promise<VideoFrame>;\n /**\n * Unmaps the staging buffer for the specified frame and marks the slot idle.\n */\n releaseFrame(frameIndex: number): void;\n /**\n * Returns current status info for each slot in the ring.\n */\n getSlotInfos(): readonly StagingSlotInfo[];\n /**\n * Destroys all staging buffers and releases resources.\n */\n destroy(): void;\n private checkDestroyed;\n}\n//#endregion\n//#region src/dynamic-node-discovery.d.ts\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\ndeclare function findNodesDir(startDir?: string): string | null;\n/**\n * Registers the built-in node renderers, then any extra nodes found in the\n * directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n * that directory overrides the built-in renderer for the same op.\n */\ndeclare function discoverAndRegisterNodeRenderers(): Promise<void>;\n//#endregion\n//#region src/video-qa.d.ts\n/**\n * Quality checks run on a video while it renders: frames are measured as\n * they are read back for the encoder and audio as it is mixed, so the report\n * describes exactly what was encoded without decoding the file again.\n */\ninterface VideoQaOptions {\n /** Luma (0-1) at or below which a pixel counts as black. Default 0.1. */\n readonly blackPixelThreshold?: number;\n /** Share of black pixels that makes a frame black. Default 0.98. */\n readonly blackFrameRatio?: number;\n /** Shortest run of black frames reported. Default 0.5 s. */\n readonly minBlackSec?: number;\n /** Shortest run of unchanging frames reported. Default 2 s. */\n readonly minFrozenSec?: number;\n /** Level (dBFS, 100 ms windows) below which audio counts as silent. Default -60. */\n readonly silenceDbfs?: number;\n /** Shortest silent stretch reported. Default 2 s. */\n readonly minSilenceSec?: number;\n /** Integrated loudness to hit, e.g. -14 for most streaming platforms. Unchecked when unset. */\n readonly targetLufs?: number;\n /** Allowed distance from `targetLufs`, in LU. Default 1. */\n readonly lufsTolerance?: number;\n}\ninterface QaSegment {\n readonly startSec: number;\n readonly endSec: number;\n}\ninterface QaIssue {\n readonly severity: \"error\" | \"warning\" | \"info\";\n /** Stable machine-readable kind, e.g. \"black_frames\", \"audio_clipping\" */\n readonly code: string;\n readonly message: string;\n readonly startSec?: number;\n readonly endSec?: number;\n readonly layerId?: string;\n}\ninterface VideoQaStats {\n readonly expectedFrames: number;\n readonly encodedFrames: number;\n readonly fps: number;\n readonly width: number;\n readonly height: number;\n /** Average luma over the whole video, 0-1 */\n readonly meanLuma: number;\n readonly blackSegments: readonly QaSegment[];\n readonly frozenSegments: readonly QaSegment[];\n}\ninterface AudioQaStats {\n readonly sampleRate: number;\n readonly channels: number;\n readonly durationSec: number;\n /** Highest sample, dBFS (sample peak, not true peak) */\n readonly peakDbfs: number;\n /** Mean level over the whole track, dBFS */\n readonly rmsDbfs: number;\n /** ITU-R BS.1770 integrated loudness; null when the track is silent */\n readonly integratedLufs: number | null;\n /** Samples at or beyond full scale */\n readonly clippedSamples: number;\n readonly silentSegments: readonly QaSegment[];\n}\ninterface VideoQaReport {\n /** No errors or warnings (info issues do not fail a render) */\n readonly passed: boolean;\n readonly video?: VideoQaStats;\n readonly audio?: AudioQaStats;\n readonly issues: readonly QaIssue[];\n}\n/** Measures frames handed to it in order, as RGBA bytes. */\ndeclare class FrameInspector {\n private readonly blackLuma;\n private readonly blackRatio;\n private readonly black;\n private readonly sameAsPrevious;\n private lumaSum;\n private previous;\n constructor(options?: VideoQaOptions);\n get frameCount(): number;\n inspect(rgba: Uint8Array, width: number, height: number): void;\n stats(expectedFrames: number, encodedFrames: number, fps: number, width: number, height: number, options?: VideoQaOptions): VideoQaStats;\n}\n/** Measures a mixed audio track (one Float32Array per channel). */\ndeclare function analyzeAudio(channels: readonly Float32Array[], sampleRate: number, options?: VideoQaOptions): AudioQaStats;\n/**\n * ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n * 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n * the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n */\ndeclare function integratedLoudness(channels: readonly Float32Array[], sampleRate: number): number | null;\n/** Turn measurements and document diagnostics into a report with issues. */\ndeclare function buildQaReport(parts: {\n video?: VideoQaStats;\n audio?: AudioQaStats;\n diagnostics?: readonly RenderDiagnostic[];\n options?: VideoQaOptions;\n}): VideoQaReport;\n/** A short human- and agent-readable summary of a report. */\ndeclare function formatQaReport(report: VideoQaReport): string;\n//#endregion\n//#region src/headless-webgpu-renderer.d.ts\ninterface WorkerInput {\n virtualMedia: VirtualMediaData;\n width: number;\n height: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n renderId: string;\n outputFormat: \"png\" | \"pixels\";\n workerIndex: number;\n}\ntype WorkerMessage = {\n type: \"frame\";\n renderId: string;\n frameIndex: number;\n pixels: Uint8Array;\n} | {\n type: \"png\";\n renderId: string;\n data: Uint8Array;\n} | {\n type: \"done\";\n renderId: string;\n} | {\n type: \"lut\";\n renderId: string;\n raw: {\n points: Array<[number, number, number]>;\n size: number;\n type: \"1D\" | \"3D\";\n };\n} | {\n type: \"error\";\n renderId?: string;\n error: string;\n};\ndeclare class RenderSemaphore {\n private _running;\n private readonly _max;\n private readonly _queue;\n constructor(max: number);\n acquire(timeoutMs?: number): Promise<void>;\n release(): void;\n get stats(): {\n active: number;\n queued: number;\n max: number;\n };\n}\ndeclare const renderSemaphore: RenderSemaphore;\ndeclare class HeadlessWebGPURenderer {\n private static isInitialized;\n private static initPromise;\n private static initFailureCount;\n private static readonly MAX_INIT_FAILURES;\n private static nextRetryAt;\n static initialize(): Promise<void>;\n renderImage(virtualMedia: VirtualMediaData, frame?: number, fps?: number, options?: {\n renderId?: string;\n /** \"rgba\" skips PNG encoding and returns width*height*4 raw pixels. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n */\n renderFrame(source: VirtualMediaData | {\n toVirtualMedia(): VirtualMediaData;\n }, options?: {\n atMs?: number;\n frame?: number;\n fps?: number;\n /** Reuse compiled state across calls; see `renderImage`. */\n renderId?: string;\n /** \"rgba\" returns raw width*height*4 pixels instead of a PNG. */\n format?: \"png\" | \"rgba\";\n }): Promise<Buffer>;\n /**\n * Mixes the composition's full audio timeline (clips, effects, synthesized\n * tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n */\n renderAudio(virtualMedia: VirtualMediaData, options?: {\n fps?: number;\n sampleRate?: number;\n }): Promise<{\n channels: Float32Array[];\n sampleRate: number;\n }>;\n renderLut(virtualMedia: VirtualMediaData, frame?: number, fps?: number): Promise<Buffer>;\n private resolveMediaDuration;\n renderVideo(virtualMedia: VirtualMediaData, options?: {\n codec?: string;\n audioCodec?: string;\n quality?: string;\n concurrency?: number;\n /**\n * Depth of the DMA staging ring (default 2, clamped 2–8). A deeper\n * ring overlaps more encoder latency at the cost of VRAM\n * (~8.3MB/slot at 1080p RGBA). Also settable via\n * `FRAMEFIELDS_RING_CAPACITY`.\n */\n ringCapacity?: number;\n /**\n * Measure the output while it renders (black and frozen frames,\n * dropped frames, loudness, clipping, silence, document warnings)\n * and return the findings as `qa`. `true` uses default thresholds.\n */\n qa?: boolean | VideoQaOptions;\n }): Promise<{\n filePath: string;\n cleanup: () => Promise<void>;\n qa?: VideoQaReport;\n }>;\n}\ndeclare const HeadlessMediaRenderer: typeof HeadlessWebGPURenderer;\ntype HeadlessMediaRenderer = HeadlessWebGPURenderer;\n//#endregion\n//#region src/node-manifest.d.ts\n/**\n * The `framefields` block of a node package's `package.json`.\n *\n * This is the single declaration of a node's op: renderer discovery, the\n * effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n * read it from here. There is deliberately no fallback that derives an op from\n * the package name. See `spec/sync-node.md` §5.1.\n */\ndeclare const NODE_KINDS: readonly [\"effect\", \"audio\", \"source\", \"signal\", \"utility\"];\ntype NodeKind = (typeof NODE_KINDS)[number];\ninterface NodeRendererExports {\n development?: string;\n import?: string;\n default?: string;\n}\ninterface NodeManifest {\n /** Directory name under `nodes/`, e.g. `node-apply-lut`. */\n dir: string;\n /** Absolute path of the node package. */\n path: string;\n /** npm package name, e.g. `@framefields/node-lut`. */\n packageName: string;\n /** Canonical op literal used in the operation AST and the renderer registry. */\n type: string;\n kind: NodeKind;\n /** Legacy ops that resolve to the same renderer. */\n aliases: readonly string[];\n /** Named zod schema export of `src/shared/config.ts`. */\n schema?: string;\n /** Authoring class name. Defaults to `type`. */\n className?: string;\n /** Key on `Effect.*`. Defaults to `className` with a lower-cased first letter. */\n factory?: string;\n /** A hand-written subclass exists under `effects/custom/`. */\n custom: boolean;\n /** `false` when the package opts out of discovery. */\n enabled: boolean;\n rendererExports?: NodeRendererExports;\n}\ndeclare class NodeManifestError extends Error {\n readonly problems: readonly string[];\n constructor(problems: readonly string[]);\n}\n/**\n * Validates one parsed `package.json`. Returns the manifest, or the list of\n * problems that make it unusable. Never throws.\n */\ndeclare function parseNodeManifest(pkg: unknown, dir: string, nodePath?: string): {\n manifest?: NodeManifest;\n problems: string[];\n};\n/**\n * Reads every `nodes/node-*` package and returns its manifest, sorted by\n * directory name. Throws a single {@link NodeManifestError} listing every\n * problem: a missing or malformed block, or an op/alias claimed twice.\n */\ndeclare function loadNodeManifests(nodesDir: string): NodeManifest[];\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.d.ts\ninterface ZeroCopyWebCodecsPipelineOptions {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly videoSource: VideoSampleSource;\n readonly ringCapacity?: number;\n readonly colorSpace?: VideoColorSpaceConfig;\n readonly directCanvasSource?: unknown;\n /**\n * Called with each frame's RGBA pixels, in frame order, just before it is\n * encoded (staging-ring path only). The buffer is reused: read, don't keep.\n */\n readonly onFrame?: (rgba: Uint8Array, frameIndex: number) => void;\n}\ninterface WebCodecsPipelineStats {\n readonly totalFramesEnqueued: number;\n readonly totalFramesEncoded: number;\n readonly averageGpuSubmitTimeMs: number;\n readonly averageEncodeTimeMs: number;\n readonly averageCycleTimeMs: number;\n readonly maxCycleTimeMs: number;\n readonly minCycleTimeMs: number;\n readonly throughputFps: number;\n readonly ringCapacity: number;\n readonly isDirectZeroCopy: boolean;\n}\n/**\n * High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n *\n * Provides:\n * 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n * 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n * allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n */\ndeclare class ZeroCopyWebCodecsPipeline {\n readonly width: number;\n readonly height: number;\n readonly fps: number;\n readonly ringCapacity: number;\n private readonly device;\n private readonly videoSource;\n private readonly stagingRing;\n private readonly colorSpace?;\n private readonly directCanvasSource?;\n private readonly onFrame?;\n private readonly inFlightFrames;\n private readonly cycleStartTimes;\n private totalFramesEnqueued;\n private totalFramesEncoded;\n private totalGpuSubmitTimeMs;\n private totalEncodeTimeMs;\n private totalCycleTimeMs;\n private maxCycleTimeMs;\n private minCycleTimeMs;\n private pipelineStartTime;\n constructor(device: GPUDevice, options: ZeroCopyWebCodecsPipelineOptions);\n /**\n * Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n */\n canDirectZeroCopy(): boolean;\n /**\n * Enqueues a rendered GPU texture frame into the pipeline.\n *\n * Uses double-buffered DMA staging: if the staging ring has reached capacity,\n * the oldest in-flight frame is asynchronously consumed and added to the video encoder\n * before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n */\n enqueueFrame(frameIndex: number, targetTexture: GPUTexture, encoder: GPUCommandEncoder): Promise<void>;\n /**\n * Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n * frame has been encoded and added to the video sample source.\n */\n drain(): Promise<void>;\n /**\n * Returns runtime throughput, latency, and pipeline statistics.\n */\n getStats(): WebCodecsPipelineStats;\n /**\n * Destroys the pipeline and releases all staging buffers.\n */\n destroy(): void;\n private consumeAndEncode;\n}\n//#endregion\nexport { AudioQaStats, DmaStagingRing, DmaStagingRingOptions, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeKind, NodeManifest, NodeManifestError, NodeRendererExports, QaIssue, QaSegment, StagingSlotInfo, StagingSlotStatus, VideoColorSpaceConfig, VideoQaOptions, VideoQaReport, VideoQaStats, WebCodecsPipelineStats, WorkerInput, WorkerMessage, ZeroCopyWebCodecsPipeline, ZeroCopyWebCodecsPipelineOptions, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;;;;;;;UAmHUqB,cAAAA;;;;;;;;;;;;;;;;;;UAkBAC,SAAAA;;;;UAIAC,OAAAA;;;;;;;;;UASAC,YAAAA;;;;;;;;mCAQyBF;oCACCA;;UAE1BG,YAAAA;;;;;;;;;;;;oCAY0BH;;UAE1BI,aAAAA;;;mBAGSF;mBACAC;4BACSF;;;;;iBA+BXS,cAAAA,SAAuBN;;;;cAuC1BU,eAAAA;;;;;+BAKiB3B;;;;;;;;cAQjB4B,iBAAiBD;cACjBE,sBAAAA;;;;;;uBAMS7B;4BACKJ;;;;MAItBI,QAAQ8B;;;;sBAIQlC;sBACAA;;;;;;;;;MAShBI,QAAQ8B;;;;;4BAKclC;;;MAGtBI;cACQoB;;;0BAGYxB,iDAAiDI,QAAQ8B;;4BAEvDlC;;;;;;;;;;;;;;;;;mBAiBTgB;MACbZ;;mBAEaA;SACViB;;;cAGKc,8BAA8BF;KACvCE,qBAAAA,GAAwBF;;;;;;;;;;;;;UC/TZ,gBAAA;;;ADsG2C;AA0BlDhB,UC3HO,gBAAA,CD2HE;EAITC;AAAO;AAkB4B;EAgBnCG,UAAAA,CAAAA,EAAAA,MAAa;EAGJF;;;EAEgB,QAAA,CAAA,EAAA,MAAA;EA+BlBQ;AA8BA;AAcqB;EASxBM,UAAAA,CAAAA,EAAAA,MAAAA;EAMS7B;;;EAKjBA,MAAAA,CAAAA,EAAAA,MAAAA,EAAAA;EAIgBJ;;;EAUhBI,OAAAA,CAAAA,EAAAA,MAAAA;EAKsBJ;;;EAOFA,KAAAA,CAAAA,EAAAA,MAAAA;EAAyDkC;;;EAmBhElB,MAAAA,CAAAA,EAAAA,MAAAA;EAGAZ;;;EAFN,OAAA,CAAA,EAAA,MAAA,EAAA;EAMC+B;AAAoD;;;;AC9TlE;AAKA;EA0HgB,OAAA,CAAA,EAAA,MAAA;EAsGA;AAiFhB;;;EAOa,SAAA,CAAA,EAAA,MAAA;EAAR;;AAWL;EACS,UAAA,CAAA,EAAA,MAAA;EACC;;;EACA,GAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAlNE;;;;;iBAMI,mBAAA,UACN;WAGI;;;;;;iBAkGE,iBAAA,mDAGN;;;;;;;;;;;KA8EE,mBAAA;oBACO;;;;;eAKN;MACR,QAAQ;;;;;;;;;;iBAWS,eAAA,SACb,+BACC,mBACP,QAAQ"}
@@ -1,6 +1,6 @@
1
- import { An as ProgrammaticSignal, Cn as NormalizedLandmarkList, Ct as DeflickerOptions, Dr as VisionNodeSpec, Er as VisionConfig, Et as Effect, Nn as SegmentationOptions, Nt as FaceLandmarksOptions, Or as VisionTask, Ot as EffectConfigValue, Rt as FrameContext, Tn as OpticalFlowOptions, Tt as DetectedObject, Zt as Landmark3D, ct as CannyOptions, dr as TrackedObject, er as TensorData, ir as TensorPipelineConfig, kn as PoseSkeletonOptions, kr as VisionVariant, pt as ControlNetConditioningOutputs, rr as TensorNode, wn as ObjectBoundingBox, wt as DepthNormalsOptions } from "./index-D2jDC7O5.mjs";
2
- import { n as NodeRendererPlugin, r as WebGPUNodeRenderer } from "./index-BMVVmc4G.mjs";
3
- import { n as AudioSignalOptions, r as ExtractedAudioSignalsBundle } from "./audio-Dvwwz8xU.mjs";
1
+ import { An as ProgrammaticSignal, Cn as NormalizedLandmarkList, Ct as DeflickerOptions, Dr as VisionNodeSpec, Er as VisionConfig, Et as Effect, Nn as SegmentationOptions, Nt as FaceLandmarksOptions, Or as VisionTask, Ot as EffectConfigValue, Rt as FrameContext, Tn as OpticalFlowOptions, Tt as DetectedObject, Zt as Landmark3D, ct as CannyOptions, dr as TrackedObject, er as TensorData, ir as TensorPipelineConfig, kn as PoseSkeletonOptions, kr as VisionVariant, pt as ControlNetConditioningOutputs, rr as TensorNode, wn as ObjectBoundingBox, wt as DepthNormalsOptions } from "./index-ogL8Y-Ng.mjs";
2
+ import { n as NodeRendererPlugin, r as WebGPUNodeRenderer } from "./index-DY3mLoPO.mjs";
3
+ import { n as AudioSignalOptions, r as ExtractedAudioSignalsBundle } from "./audio-nmU-BWxI.mjs";
4
4
 
5
5
  //#region ../../nodes/node-blur/dist/renderer.d.mts
6
6
  //#region src/renderers/index.d.ts
@@ -2114,4 +2114,4 @@ declare class Modulate extends Effect<ModulateProps> {
2114
2114
  }
2115
2115
  //#endregion
2116
2116
  export { Blur as $, _default$6 as $t, MotionBlur as A, TemporalObjectTracker as At, SelectiveColorProps as B, DepthNormalsComputePipeline as Bt, HighPass as C, _default$29 as Cn, PinToObjectOptions as Ct, LevelsProps as D, SegmentationResult as Dt, Levels as E, PoseSkeletonRenderer as Et, Relight3DProps as F, analyzeSequence as Ft, TileOffsetEdgeMode as G, TensorViewExport as Gt, ShadowsHighlightsProps as H, TemporalDeflickerPipeline as Ht, SSAO as I, pinNodeToLandmark as It, UnsharpMaskProps as J, _default$1 as Jt, TileOffsetProps as K, EffectProp as Kt, SSAOProps as L, pinNodeToObject as Lt, PBRGlass as M, VisionBundle as Mt, PBRGlassProps as N, VisionNode as Nt, Modulate as O, SegmentationTexturePool as Ot, Relight3D as P, VisionRunner as Pt, effectMeta as Q, _default$5 as Qt, SelectiveColor as R, CannyComputePipeline as Rt, HalftoneScreenProps as S, _default$28 as Sn, PinToLandmarkOptions as St, LevelChannel as T, PoseResult as Tt, TemporalDeflicker as U, TensorPipeline as Ut, ShadowsHighlights as V, OpticalFlowComputePipeline as Vt, TileOffset as W, TensorSource as Wt, VisionProps as X, _default$3 as Xt, Vision as Y, _default$2 as Yt, effectFactories as Z, _default$4 as Zt, GradientMapProps as _, _default$24 as _n, ObjectBoundingBoxSignals as _t, Crop as a, _default$12 as an, TonalShift as at, HalftoneMode as b, _default$26 as bn, ObjectTrackSignals as bt, CurvesChannelPoint as c, _default$15 as cn, COCO17_BONES as ct, DeflickerProps as d, _default$18 as dn, COCO_CLASSES as dt, _default$7 as en, BlurProps as et, DepthOfField as f, _default$19 as fn, InstanceMask as ft, GradientMap as g, _default$23 as gn, ObjectAnchorsSignals as gt, FilmGrainProps as h, _default$22 as hn, ObjectAnchorName as ht, AudioSignalExtractorProps as i, _default$11 as in, ColorKeyProps as it, MotionBlurProps as j, VisionAnalysisReport as jt, ModulateProps as k, SpatialLandmarkTransformer as kt, CurvesProps as l, _default$16 as ln, COCO17_KEYPOINTS as lt, FilmGrain as m, _default$21 as mn, MaskTrackSignals as mt, ApplyLUTProps as n, _default$9 as nn, ColorBalanceProps as nt, CropProps as o, _default$13 as on, Vignette as ot, DepthOfFieldProps as p, _default$20 as pn, LandmarkCoordinateSignals as pt, UnsharpMask as q, _default as qt, AudioSignalExtractor as r, _default$10 as rn, ColorKey as rt, Curves as s, _default$14 as sn, VignetteProps as st, ApplyLUT as t, _default$8 as tn, ColorBalance as tt, CustomEffect as u, _default$17 as un, COCO17_KEYPOINT_NAMES as ut, GradientMapStop as v, rendererNode as vn, ObjectCollectionSignals as vt, HighPassProps as w, PoseLandmarkSignals as wt, HalftoneScreen as x, _default$27 as xn, PersonMatte as xt, HalftoneDotShape as y, _default$25 as yn, ObjectKinematicsSignals as yt, SelectiveColorAdjustment as z, ControlNetMultiplexer as zt };
2117
- //# sourceMappingURL=index-D7llSs-m.d.mts.map
2117
+ //# sourceMappingURL=index-C8rstr3Y.d.mts.map