framefields 2.0.2

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 (408) hide show
  1. package/LICENCE +202 -0
  2. package/README.md +740 -0
  3. package/dist/audio/index.d.mts +5 -0
  4. package/dist/audio/index.mjs +14 -0
  5. package/dist/audio-Dvwwz8xU.d.mts +37 -0
  6. package/dist/audio-Dvwwz8xU.d.mts.map +1 -0
  7. package/dist/audio-TAvPwzLR.mjs +214 -0
  8. package/dist/audio-TAvPwzLR.mjs.map +1 -0
  9. package/dist/audio-x28ZgQBP.mjs +85 -0
  10. package/dist/audio-x28ZgQBP.mjs.map +1 -0
  11. package/dist/chunk-GMkBE123.mjs +47 -0
  12. package/dist/client-C74hb7fy.mjs +66 -0
  13. package/dist/client-C74hb7fy.mjs.map +1 -0
  14. package/dist/dist-1iUYuPct.mjs +1859 -0
  15. package/dist/dist-1iUYuPct.mjs.map +1 -0
  16. package/dist/dist-Bx6J0VcM.mjs +1859 -0
  17. package/dist/dist-Bx6J0VcM.mjs.map +1 -0
  18. package/dist/dist-C_hjvkdN.mjs +2220 -0
  19. package/dist/dist-C_hjvkdN.mjs.map +1 -0
  20. package/dist/dist-DKm2IyEJ.mjs +94 -0
  21. package/dist/dist-DKm2IyEJ.mjs.map +1 -0
  22. package/dist/dist-cjs-B5EVqDFp.mjs +85 -0
  23. package/dist/dist-cjs-B5EVqDFp.mjs.map +1 -0
  24. package/dist/dist-cjs-BGJkdexX.mjs +437 -0
  25. package/dist/dist-cjs-BGJkdexX.mjs.map +1 -0
  26. package/dist/dist-cjs-BKmGCgtm.mjs +9069 -0
  27. package/dist/dist-cjs-BKmGCgtm.mjs.map +1 -0
  28. package/dist/dist-cjs-BUc0_kg-.mjs +1091 -0
  29. package/dist/dist-cjs-BUc0_kg-.mjs.map +1 -0
  30. package/dist/dist-cjs-BUwe2XhR.mjs +153 -0
  31. package/dist/dist-cjs-BUwe2XhR.mjs.map +1 -0
  32. package/dist/dist-cjs-BWgoUCXJ.mjs +137 -0
  33. package/dist/dist-cjs-BWgoUCXJ.mjs.map +1 -0
  34. package/dist/dist-cjs-CmZEMtO6.mjs +6 -0
  35. package/dist/dist-cjs-D7kEM-Mj.mjs +181 -0
  36. package/dist/dist-cjs-D7kEM-Mj.mjs.map +1 -0
  37. package/dist/dist-cjs-DFUmy89O.mjs +48 -0
  38. package/dist/dist-cjs-DFUmy89O.mjs.map +1 -0
  39. package/dist/dist-cjs-Df7144zM.mjs +209 -0
  40. package/dist/dist-cjs-Df7144zM.mjs.map +1 -0
  41. package/dist/dist-cjs-DgxjcvBN.mjs +98 -0
  42. package/dist/dist-cjs-DgxjcvBN.mjs.map +1 -0
  43. package/dist/dist-cjs-DsMdld8l.mjs +5015 -0
  44. package/dist/dist-cjs-DsMdld8l.mjs.map +1 -0
  45. package/dist/dist-cjs-Dzs5P3K0.mjs +51 -0
  46. package/dist/dist-cjs-Dzs5P3K0.mjs.map +1 -0
  47. package/dist/dist-cjs-ECMuIF57.mjs +323 -0
  48. package/dist/dist-cjs-ECMuIF57.mjs.map +1 -0
  49. package/dist/dist-cjs-lYvO8aDo.mjs +64 -0
  50. package/dist/dist-cjs-lYvO8aDo.mjs.map +1 -0
  51. package/dist/dist-cjs-qEJrwjGk.mjs +66 -0
  52. package/dist/dist-cjs-qEJrwjGk.mjs.map +1 -0
  53. package/dist/dist-cjs-x5cwlqA5.mjs +43 -0
  54. package/dist/dist-cjs-x5cwlqA5.mjs.map +1 -0
  55. package/dist/dist-gjHmorxL.mjs +27479 -0
  56. package/dist/dist-gjHmorxL.mjs.map +1 -0
  57. package/dist/effects/index.d.mts +5 -0
  58. package/dist/effects/index.mjs +35 -0
  59. package/dist/effects-CHWORCYd.mjs +811 -0
  60. package/dist/effects-CHWORCYd.mjs.map +1 -0
  61. package/dist/event-streams-D-APZ7Ke.mjs +204 -0
  62. package/dist/event-streams-D-APZ7Ke.mjs.map +1 -0
  63. package/dist/fonts/index.d.mts +2 -0
  64. package/dist/fonts/index.mjs +3 -0
  65. package/dist/fonts-DrGTBJJk.mjs +188 -0
  66. package/dist/fonts-DrGTBJJk.mjs.map +1 -0
  67. package/dist/index-B0BNPEoH.d.mts +2117 -0
  68. package/dist/index-B0BNPEoH.d.mts.map +1 -0
  69. package/dist/index-BMVVmc4G.d.mts +72 -0
  70. package/dist/index-BMVVmc4G.d.mts.map +1 -0
  71. package/dist/index-D1ZsMpke.d.mts +264 -0
  72. package/dist/index-D1ZsMpke.d.mts.map +1 -0
  73. package/dist/index-D2jDC7O5.d.mts +3643 -0
  74. package/dist/index-D2jDC7O5.d.mts.map +1 -0
  75. package/dist/index-D2wJqSl5.d.mts +114 -0
  76. package/dist/index-D2wJqSl5.d.mts.map +1 -0
  77. package/dist/index-DKFGNyMB.d.mts +309 -0
  78. package/dist/index-DKFGNyMB.d.mts.map +1 -0
  79. package/dist/index-DiSKzDGR.d.mts +65 -0
  80. package/dist/index-DiSKzDGR.d.mts.map +1 -0
  81. package/dist/index.d.mts +4425 -0
  82. package/dist/index.d.mts.map +1 -0
  83. package/dist/index.mjs +2623 -0
  84. package/dist/index.mjs.map +1 -0
  85. package/dist/package-C58KmGKw.mjs +6 -0
  86. package/dist/package-C58KmGKw.mjs.map +1 -0
  87. package/dist/preview/index.d.mts +90 -0
  88. package/dist/preview/index.d.mts.map +1 -0
  89. package/dist/preview/index.mjs +15 -0
  90. package/dist/preview-engine/audio.mjs +1 -0
  91. package/dist/preview-engine/child_process-AIL2NBWS.mjs +1 -0
  92. package/dist/preview-engine/chunk-24P6DAB3.mjs +1 -0
  93. package/dist/preview-engine/chunk-37EFVZWT.mjs +1 -0
  94. package/dist/preview-engine/chunk-3O5OKR6D.mjs +223 -0
  95. package/dist/preview-engine/chunk-47VT677S.mjs +8 -0
  96. package/dist/preview-engine/chunk-4BEJJKEU.mjs +315 -0
  97. package/dist/preview-engine/chunk-4GEWSUX5.mjs +1 -0
  98. package/dist/preview-engine/chunk-55CCFPUX.mjs +237 -0
  99. package/dist/preview-engine/chunk-5JD65JSJ.mjs +110 -0
  100. package/dist/preview-engine/chunk-5UP7FSGT.mjs +294 -0
  101. package/dist/preview-engine/chunk-5XDHHOF2.mjs +367 -0
  102. package/dist/preview-engine/chunk-6YJP57MZ.mjs +729 -0
  103. package/dist/preview-engine/chunk-6ZOXGAYA.mjs +112 -0
  104. package/dist/preview-engine/chunk-AOLAHYVV.mjs +529 -0
  105. package/dist/preview-engine/chunk-B6PLCMBM.mjs +1 -0
  106. package/dist/preview-engine/chunk-BJKH76OM.mjs +264 -0
  107. package/dist/preview-engine/chunk-BUIQ5TUH.mjs +104 -0
  108. package/dist/preview-engine/chunk-BVF64D6H.mjs +1 -0
  109. package/dist/preview-engine/chunk-CA5N7JRZ.mjs +138 -0
  110. package/dist/preview-engine/chunk-CNSHAFEA.mjs +1 -0
  111. package/dist/preview-engine/chunk-CURR5X7D.mjs +1 -0
  112. package/dist/preview-engine/chunk-CVGM2U4J.mjs +47 -0
  113. package/dist/preview-engine/chunk-CYY366IE.mjs +1 -0
  114. package/dist/preview-engine/chunk-D5PHI6ET.mjs +109 -0
  115. package/dist/preview-engine/chunk-D7MZHP2Y.mjs +275 -0
  116. package/dist/preview-engine/chunk-DPPH3NK2.mjs +182 -0
  117. package/dist/preview-engine/chunk-DPST2XLC.mjs +418 -0
  118. package/dist/preview-engine/chunk-DRLEOHN5.mjs +1 -0
  119. package/dist/preview-engine/chunk-EDIZNO3P.mjs +1 -0
  120. package/dist/preview-engine/chunk-EHIIT4ZR.mjs +52 -0
  121. package/dist/preview-engine/chunk-FKZ4XXPE.mjs +1 -0
  122. package/dist/preview-engine/chunk-G3HW4VER.mjs +60 -0
  123. package/dist/preview-engine/chunk-G76HSKOS.mjs +184 -0
  124. package/dist/preview-engine/chunk-GYG2IIBR.mjs +1 -0
  125. package/dist/preview-engine/chunk-H2F5NVQ6.mjs +63 -0
  126. package/dist/preview-engine/chunk-H5BPCY7N.mjs +188 -0
  127. package/dist/preview-engine/chunk-HAXK42HG.mjs +997 -0
  128. package/dist/preview-engine/chunk-HXMDPMLB.mjs +1 -0
  129. package/dist/preview-engine/chunk-HYBAPT6I.mjs +1 -0
  130. package/dist/preview-engine/chunk-I4FH6HYU.mjs +73 -0
  131. package/dist/preview-engine/chunk-IYVN2QEL.mjs +1 -0
  132. package/dist/preview-engine/chunk-JPXQPP6J.mjs +1 -0
  133. package/dist/preview-engine/chunk-JWNHTRED.mjs +164 -0
  134. package/dist/preview-engine/chunk-KZOLCZIV.mjs +103 -0
  135. package/dist/preview-engine/chunk-L62MRHGZ.mjs +89 -0
  136. package/dist/preview-engine/chunk-LEEZXHQO.mjs +117 -0
  137. package/dist/preview-engine/chunk-LKYN3BM2.mjs +1 -0
  138. package/dist/preview-engine/chunk-LP3EP33S.mjs +610 -0
  139. package/dist/preview-engine/chunk-M2GRYRLM.mjs +111 -0
  140. package/dist/preview-engine/chunk-MC7TZZLD.mjs +134 -0
  141. package/dist/preview-engine/chunk-MT2DZQHO.mjs +1 -0
  142. package/dist/preview-engine/chunk-MTJHQATU.mjs +1 -0
  143. package/dist/preview-engine/chunk-N4LHIPHZ.mjs +340 -0
  144. package/dist/preview-engine/chunk-N4PWLBZ7.mjs +5 -0
  145. package/dist/preview-engine/chunk-NQZKBFC6.mjs +40 -0
  146. package/dist/preview-engine/chunk-NWRSVVTF.mjs +186 -0
  147. package/dist/preview-engine/chunk-P3HBP725.mjs +1 -0
  148. package/dist/preview-engine/chunk-PIAJWALT.mjs +1 -0
  149. package/dist/preview-engine/chunk-PJ3DVG45.mjs +1 -0
  150. package/dist/preview-engine/chunk-QP2NI4XD.mjs +82 -0
  151. package/dist/preview-engine/chunk-SA3JUR6D.mjs +52 -0
  152. package/dist/preview-engine/chunk-SRT2OCQW.mjs +1 -0
  153. package/dist/preview-engine/chunk-SWD76532.mjs +98 -0
  154. package/dist/preview-engine/chunk-SXX7HX34.mjs +191 -0
  155. package/dist/preview-engine/chunk-SZ7YRPKO.mjs +3 -0
  156. package/dist/preview-engine/chunk-TMRLZV5X.mjs +1 -0
  157. package/dist/preview-engine/chunk-U446SQP3.mjs +292 -0
  158. package/dist/preview-engine/chunk-UDNCEHUI.mjs +141 -0
  159. package/dist/preview-engine/chunk-V3H7WWOT.mjs +271 -0
  160. package/dist/preview-engine/chunk-V7ZVVUQU.mjs +108 -0
  161. package/dist/preview-engine/chunk-VJGK7MLJ.mjs +3 -0
  162. package/dist/preview-engine/chunk-VSSB73UU.mjs +58 -0
  163. package/dist/preview-engine/chunk-VXUJWPIK.mjs +1 -0
  164. package/dist/preview-engine/chunk-XD4GKD6H.mjs +5 -0
  165. package/dist/preview-engine/chunk-XKO4RYKN.mjs +3 -0
  166. package/dist/preview-engine/chunk-XOEEGC4Z.mjs +1 -0
  167. package/dist/preview-engine/chunk-YAQFFQPG.mjs +1 -0
  168. package/dist/preview-engine/chunk-YKMBRUAE.mjs +1 -0
  169. package/dist/preview-engine/chunk-YSTLMWCG.mjs +1 -0
  170. package/dist/preview-engine/chunk-Z4ERCLNF.mjs +1 -0
  171. package/dist/preview-engine/chunk-ZEYUXJIV.mjs +1 -0
  172. package/dist/preview-engine/chunk-ZX6APG6E.mjs +117 -0
  173. package/dist/preview-engine/effects.mjs +1 -0
  174. package/dist/preview-engine/esbuild-GWV7CM7D.mjs +1 -0
  175. package/dist/preview-engine/fonts.mjs +1 -0
  176. package/dist/preview-engine/framefields.mjs +1959 -0
  177. package/dist/preview-engine/onnxruntime-node-56GSZEH3.mjs +1 -0
  178. package/dist/preview-engine/player.mjs +155 -0
  179. package/dist/preview-engine/renderers-2AUSIYZN.mjs +1 -0
  180. package/dist/preview-engine/renderers-2QN6KZJP.mjs +1 -0
  181. package/dist/preview-engine/renderers-32SKW7ML.mjs +1 -0
  182. package/dist/preview-engine/renderers-5QYK6766.mjs +1 -0
  183. package/dist/preview-engine/renderers-6BJA6MSU.mjs +251 -0
  184. package/dist/preview-engine/renderers-6QAF3LQ2.mjs +1 -0
  185. package/dist/preview-engine/renderers-7AO5746S.mjs +296 -0
  186. package/dist/preview-engine/renderers-AFYKNM6N.mjs +1 -0
  187. package/dist/preview-engine/renderers-AGMH5CRH.mjs +1 -0
  188. package/dist/preview-engine/renderers-AHSGP6LY.mjs +126 -0
  189. package/dist/preview-engine/renderers-ASTBICLA.mjs +1 -0
  190. package/dist/preview-engine/renderers-BHVPLYNN.mjs +1 -0
  191. package/dist/preview-engine/renderers-D7PVQFVU.mjs +1 -0
  192. package/dist/preview-engine/renderers-DB4ABTNA.mjs +1 -0
  193. package/dist/preview-engine/renderers-F2NFJI5L.mjs +1 -0
  194. package/dist/preview-engine/renderers-FI7YHNLY.mjs +1 -0
  195. package/dist/preview-engine/renderers-GBHULMPH.mjs +1 -0
  196. package/dist/preview-engine/renderers-GUKQUMGG.mjs +55 -0
  197. package/dist/preview-engine/renderers-HGT7QDY3.mjs +1 -0
  198. package/dist/preview-engine/renderers-HOYLA7ZK.mjs +1 -0
  199. package/dist/preview-engine/renderers-KKI2D3MZ.mjs +1 -0
  200. package/dist/preview-engine/renderers-KRAJNV4E.mjs +1 -0
  201. package/dist/preview-engine/renderers-KUGZKSVE.mjs +1 -0
  202. package/dist/preview-engine/renderers-L2EQQIOC.mjs +1 -0
  203. package/dist/preview-engine/renderers-LK3NRMGR.mjs +1 -0
  204. package/dist/preview-engine/renderers-LX654SZ3.mjs +1 -0
  205. package/dist/preview-engine/renderers-MCFQFYEL.mjs +1 -0
  206. package/dist/preview-engine/renderers-O6HOYIPS.mjs +1 -0
  207. package/dist/preview-engine/renderers-OEVXCGE2.mjs +1 -0
  208. package/dist/preview-engine/renderers-QVD6C4CS.mjs +1 -0
  209. package/dist/preview-engine/renderers-R3XEYD5V.mjs +248 -0
  210. package/dist/preview-engine/renderers-RBFWJWVM.mjs +1 -0
  211. package/dist/preview-engine/renderers-RX3VLVLO.mjs +1 -0
  212. package/dist/preview-engine/renderers-SM6JP64K.mjs +1 -0
  213. package/dist/preview-engine/renderers-TKMAATVS.mjs +1 -0
  214. package/dist/preview-engine/renderers-UGZUPONY.mjs +1 -0
  215. package/dist/preview-engine/renderers-UTFXZE3G.mjs +1 -0
  216. package/dist/preview-engine/renderers-UWPH7HBH.mjs +1 -0
  217. package/dist/preview-engine/renderers-UZGECFVO.mjs +1 -0
  218. package/dist/preview-engine/renderers-VGU3LNLT.mjs +1 -0
  219. package/dist/preview-engine/renderers-W3VVM5HB.mjs +1 -0
  220. package/dist/preview-engine/renderers-WJUTT5BB.mjs +1 -0
  221. package/dist/preview-engine/renderers-XA2M4YXK.mjs +1 -0
  222. package/dist/preview-engine/renderers-XIHRFEFQ.mjs +1 -0
  223. package/dist/preview-engine/renderers-XJTA5MFG.mjs +1 -0
  224. package/dist/preview-engine/renderers-XLTY5APF.mjs +1 -0
  225. package/dist/preview-engine/renderers-XZ3VXFGZ.mjs +1 -0
  226. package/dist/preview-engine/renderers-YKUQUCTO.mjs +124 -0
  227. package/dist/preview-engine/renderers-YVN3EIOP.mjs +1 -0
  228. package/dist/preview-engine/renderers-YWRP23SZ.mjs +125 -0
  229. package/dist/preview-engine/renderers-ZPWOUWZJ.mjs +120 -0
  230. package/dist/preview-engine/resvg-js-VMU4A77S.mjs +1 -0
  231. package/dist/preview-engine/server-utils-2FAIV45N.mjs +1 -0
  232. package/dist/preview-engine/sharp-V6ZTBNDW.mjs +1 -0
  233. package/dist/preview-engine/shims/fs-promises.mjs +1 -0
  234. package/dist/preview-engine/shims/fs.mjs +1 -0
  235. package/dist/preview-engine/shims/module.mjs +1 -0
  236. package/dist/preview-engine/shims/os.mjs +1 -0
  237. package/dist/preview-engine/shims/path.mjs +1 -0
  238. package/dist/preview-engine/shims/url.mjs +1 -0
  239. package/dist/preview-engine/signals.mjs +1 -0
  240. package/dist/preview-engine/webgpu-NSSANM4F.mjs +1 -0
  241. package/dist/preview-uQM210iy.mjs +2149 -0
  242. package/dist/preview-uQM210iy.mjs.map +1 -0
  243. package/dist/program-Dl510wmI.mjs +5183 -0
  244. package/dist/program-Dl510wmI.mjs.map +1 -0
  245. package/dist/renderer/index.d.mts +3 -0
  246. package/dist/renderer/index.mjs +6 -0
  247. package/dist/renderer-3BNskNuJ.mjs +3 -0
  248. package/dist/renderer-7DOcIxFG.mjs +288 -0
  249. package/dist/renderer-7DOcIxFG.mjs.map +1 -0
  250. package/dist/renderer-9dHlMQGX.mjs +3 -0
  251. package/dist/renderer-B1CvhW4p.mjs +677 -0
  252. package/dist/renderer-B1CvhW4p.mjs.map +1 -0
  253. package/dist/renderer-B2XzjK0z.mjs +3 -0
  254. package/dist/renderer-B80s47yo.mjs +166 -0
  255. package/dist/renderer-B80s47yo.mjs.map +1 -0
  256. package/dist/renderer-B9-QSJcG.mjs +479 -0
  257. package/dist/renderer-B9-QSJcG.mjs.map +1 -0
  258. package/dist/renderer-BAQmR0Zo.mjs +3 -0
  259. package/dist/renderer-BDLnExoP.mjs +127 -0
  260. package/dist/renderer-BDLnExoP.mjs.map +1 -0
  261. package/dist/renderer-BGXU6vcW.mjs +270 -0
  262. package/dist/renderer-BGXU6vcW.mjs.map +1 -0
  263. package/dist/renderer-BGvORwkQ.mjs +3 -0
  264. package/dist/renderer-BLikd6BK.mjs +3 -0
  265. package/dist/renderer-BMovYRoR.mjs +3 -0
  266. package/dist/renderer-BQHbp-Sp.mjs +243 -0
  267. package/dist/renderer-BQHbp-Sp.mjs.map +1 -0
  268. package/dist/renderer-BREIjsUU.mjs +252 -0
  269. package/dist/renderer-BREIjsUU.mjs.map +1 -0
  270. package/dist/renderer-BSbTJBWc.mjs +3 -0
  271. package/dist/renderer-BTu2EVhF.mjs +3 -0
  272. package/dist/renderer-BU1rwNRT.mjs +3 -0
  273. package/dist/renderer-BXMmISWG.mjs +499 -0
  274. package/dist/renderer-BXMmISWG.mjs.map +1 -0
  275. package/dist/renderer-BZJm3m4f.mjs +3 -0
  276. package/dist/renderer-B_NuVaIP.mjs +744 -0
  277. package/dist/renderer-B_NuVaIP.mjs.map +1 -0
  278. package/dist/renderer-BfJSUjPN.mjs +3 -0
  279. package/dist/renderer-BqyAgNt3.mjs +3 -0
  280. package/dist/renderer-BryTM2g7.mjs +3 -0
  281. package/dist/renderer-BsgIcBKH.mjs +391 -0
  282. package/dist/renderer-BsgIcBKH.mjs.map +1 -0
  283. package/dist/renderer-ByDhfrPE.mjs +422 -0
  284. package/dist/renderer-ByDhfrPE.mjs.map +1 -0
  285. package/dist/renderer-C-H680_l.mjs +3 -0
  286. package/dist/renderer-C17wL9QX.mjs +181 -0
  287. package/dist/renderer-C17wL9QX.mjs.map +1 -0
  288. package/dist/renderer-C2n-EHxg.mjs +1 -0
  289. package/dist/renderer-CB5aWAaf.mjs +343 -0
  290. package/dist/renderer-CB5aWAaf.mjs.map +1 -0
  291. package/dist/renderer-CB7lH5K8.mjs +3 -0
  292. package/dist/renderer-CDLrNgfo.mjs +3 -0
  293. package/dist/renderer-CDOUAN7X.mjs +454 -0
  294. package/dist/renderer-CDOUAN7X.mjs.map +1 -0
  295. package/dist/renderer-CH8sdfYX.mjs +387 -0
  296. package/dist/renderer-CH8sdfYX.mjs.map +1 -0
  297. package/dist/renderer-CIvaRnP_.mjs +261 -0
  298. package/dist/renderer-CIvaRnP_.mjs.map +1 -0
  299. package/dist/renderer-CMzEjdzi.mjs +369 -0
  300. package/dist/renderer-CMzEjdzi.mjs.map +1 -0
  301. package/dist/renderer-COkcU3db.mjs +3302 -0
  302. package/dist/renderer-COkcU3db.mjs.map +1 -0
  303. package/dist/renderer-CQCoggIa.mjs +3 -0
  304. package/dist/renderer-CQdVj2JS.mjs +3 -0
  305. package/dist/renderer-CQiTodg9.mjs +337 -0
  306. package/dist/renderer-CQiTodg9.mjs.map +1 -0
  307. package/dist/renderer-CV2m6k1V.mjs +3 -0
  308. package/dist/renderer-CYY-poLe.mjs +3 -0
  309. package/dist/renderer-CZgB5st8.mjs +3 -0
  310. package/dist/renderer-C_Ki91kc.mjs +3 -0
  311. package/dist/renderer-CclIvsLO.mjs +3 -0
  312. package/dist/renderer-Cj-whdVr.mjs +655 -0
  313. package/dist/renderer-Cj-whdVr.mjs.map +1 -0
  314. package/dist/renderer-CkykdR_D.mjs +3 -0
  315. package/dist/renderer-Cl1oUXMi.mjs +1143 -0
  316. package/dist/renderer-Cl1oUXMi.mjs.map +1 -0
  317. package/dist/renderer-CmApuKjS.mjs +3 -0
  318. package/dist/renderer-CpkiHRhh.mjs +269 -0
  319. package/dist/renderer-CpkiHRhh.mjs.map +1 -0
  320. package/dist/renderer-CszOjcRW.mjs +3 -0
  321. package/dist/renderer-CtVkU_GA.mjs +44 -0
  322. package/dist/renderer-CtVkU_GA.mjs.map +1 -0
  323. package/dist/renderer-Cu074POw.mjs +3 -0
  324. package/dist/renderer-CwQhzcUn.mjs +644 -0
  325. package/dist/renderer-CwQhzcUn.mjs.map +1 -0
  326. package/dist/renderer-CzPWB0Ss.mjs +273 -0
  327. package/dist/renderer-CzPWB0Ss.mjs.map +1 -0
  328. package/dist/renderer-D4qLmox-.mjs +3 -0
  329. package/dist/renderer-D6bWQtr-.mjs +3 -0
  330. package/dist/renderer-D6cJ6MSq.mjs +3 -0
  331. package/dist/renderer-D7EX8IjU.mjs +240 -0
  332. package/dist/renderer-D7EX8IjU.mjs.map +1 -0
  333. package/dist/renderer-DDp7_TUi.d.mts +10 -0
  334. package/dist/renderer-DDp7_TUi.d.mts.map +1 -0
  335. package/dist/renderer-DFKsLrUs.mjs +256 -0
  336. package/dist/renderer-DFKsLrUs.mjs.map +1 -0
  337. package/dist/renderer-DPSsf8-t.mjs +3 -0
  338. package/dist/renderer-DQLGnEFc.mjs +3 -0
  339. package/dist/renderer-DY2SVYUW.mjs +3 -0
  340. package/dist/renderer-DZGtBUCx.mjs +792 -0
  341. package/dist/renderer-DZGtBUCx.mjs.map +1 -0
  342. package/dist/renderer-DabG62XS.mjs +406 -0
  343. package/dist/renderer-DabG62XS.mjs.map +1 -0
  344. package/dist/renderer-DbaQLI4z.mjs +771 -0
  345. package/dist/renderer-DbaQLI4z.mjs.map +1 -0
  346. package/dist/renderer-DjI45OYC.mjs +71 -0
  347. package/dist/renderer-DjI45OYC.mjs.map +1 -0
  348. package/dist/renderer-Dm08-hAU.mjs +323 -0
  349. package/dist/renderer-Dm08-hAU.mjs.map +1 -0
  350. package/dist/renderer-DoAY5JbB.mjs +4 -0
  351. package/dist/renderer-Dp_FfvF-.mjs +401 -0
  352. package/dist/renderer-Dp_FfvF-.mjs.map +1 -0
  353. package/dist/renderer-Dt6fzgX5.mjs +756 -0
  354. package/dist/renderer-Dt6fzgX5.mjs.map +1 -0
  355. package/dist/renderer-DuplLRbp.mjs +3 -0
  356. package/dist/renderer-DvfUbZ31.mjs +3 -0
  357. package/dist/renderer-DxjVQV6f.mjs +311 -0
  358. package/dist/renderer-DxjVQV6f.mjs.map +1 -0
  359. package/dist/renderer-Fco4EmAu.mjs +23868 -0
  360. package/dist/renderer-Fco4EmAu.mjs.map +1 -0
  361. package/dist/renderer-HFfcJlmR.mjs +981 -0
  362. package/dist/renderer-HFfcJlmR.mjs.map +1 -0
  363. package/dist/renderer-I-Sw3JBB.mjs +145 -0
  364. package/dist/renderer-I-Sw3JBB.mjs.map +1 -0
  365. package/dist/renderer-OWQmmg4Z.mjs +697 -0
  366. package/dist/renderer-OWQmmg4Z.mjs.map +1 -0
  367. package/dist/renderer-Q_uUQipO.mjs +3 -0
  368. package/dist/renderer-Ryo2CEFD.mjs +586 -0
  369. package/dist/renderer-Ryo2CEFD.mjs.map +1 -0
  370. package/dist/renderer-Tp6OXWNZ.mjs +257 -0
  371. package/dist/renderer-Tp6OXWNZ.mjs.map +1 -0
  372. package/dist/renderer-UQFCgeNx.mjs +3 -0
  373. package/dist/renderer-WkVrkCVA.mjs +83 -0
  374. package/dist/renderer-WkVrkCVA.mjs.map +1 -0
  375. package/dist/renderer-XcmYTd6P.mjs +3818 -0
  376. package/dist/renderer-XcmYTd6P.mjs.map +1 -0
  377. package/dist/renderer-_uvdg48N.mjs +333 -0
  378. package/dist/renderer-_uvdg48N.mjs.map +1 -0
  379. package/dist/renderer-bZU_ndxf.mjs +8 -0
  380. package/dist/renderer-bZU_ndxf.mjs.map +1 -0
  381. package/dist/renderer-eMsnzJg9.mjs +3 -0
  382. package/dist/renderer-ho_jXJ0H.mjs +254 -0
  383. package/dist/renderer-ho_jXJ0H.mjs.map +1 -0
  384. package/dist/renderer-k2JL79kM.mjs +306 -0
  385. package/dist/renderer-k2JL79kM.mjs.map +1 -0
  386. package/dist/renderer-pHiz78e0.mjs +3 -0
  387. package/dist/renderer-pxXf9dvk.mjs +394 -0
  388. package/dist/renderer-pxXf9dvk.mjs.map +1 -0
  389. package/dist/renderer-vCFTm0oe.mjs +226 -0
  390. package/dist/renderer-vCFTm0oe.mjs.map +1 -0
  391. package/dist/renderer-vvpdx1vk.mjs +379 -0
  392. package/dist/renderer-vvpdx1vk.mjs.map +1 -0
  393. package/dist/renderer-x2s9LmVL.mjs +1121 -0
  394. package/dist/renderer-x2s9LmVL.mjs.map +1 -0
  395. package/dist/renderers-BWg16W-V-BXG_cjhM.mjs +49 -0
  396. package/dist/renderers-BWg16W-V-BXG_cjhM.mjs.map +1 -0
  397. package/dist/signals/index.d.mts +7 -0
  398. package/dist/signals/index.mjs +10 -0
  399. package/dist/signals-BwbdO3AN.mjs +224 -0
  400. package/dist/signals-BwbdO3AN.mjs.map +1 -0
  401. package/dist/signin-CZj4Oc5s.mjs +865 -0
  402. package/dist/signin-CZj4Oc5s.mjs.map +1 -0
  403. package/dist/sso-oidc-C0_31ThY.mjs +1051 -0
  404. package/dist/sso-oidc-C0_31ThY.mjs.map +1 -0
  405. package/dist/sts-DD4ggEXC.mjs +6 -0
  406. package/dist/sts-nXw8RDJI.mjs +1395 -0
  407. package/dist/sts-nXw8RDJI.mjs.map +1 -0
  408. package/package.json +173 -0
@@ -0,0 +1,1859 @@
1
+ import { nanoid } from "nanoid";
2
+ import z$1, { z } from "zod";
3
+
4
+ //#region ../core/dist/index.mjs
5
+ var ProgrammaticSignal = class ProgrammaticSignal$1 {
6
+ gpuBinding;
7
+ label;
8
+ _evaluator;
9
+ _samples;
10
+ _fps;
11
+ _durationFrames;
12
+ _cachedFrame = -1;
13
+ _cachedValue = 0;
14
+ _seekedFrame = -1;
15
+ _subscribers = /* @__PURE__ */ new Set();
16
+ _children = /* @__PURE__ */ new Set();
17
+ get fps() {
18
+ return this._fps;
19
+ }
20
+ constructor(source, options = {}) {
21
+ this._fps = options.fps ?? 24;
22
+ this._durationFrames = options.durationFrames;
23
+ this.gpuBinding = options.gpuBinding;
24
+ this.label = options.label;
25
+ if (typeof source === "number") {
26
+ const constVal = source;
27
+ this._evaluator = () => constVal;
28
+ this._cachedValue = constVal;
29
+ } else if (typeof source === "function") this._evaluator = source;
30
+ else if (isSignal(source)) this._evaluator = (ctx) => Number(source.get(ctx)) || 0;
31
+ else {
32
+ const arr = source;
33
+ this._samples = arr instanceof Float32Array ? arr : new Float32Array(Array.from(arr));
34
+ this._durationFrames = this._samples.length;
35
+ this._cachedValue = this._samples.length > 0 ? this._samples[0] : 0;
36
+ this._evaluator = (ctx) => {
37
+ if (!this._samples || this._samples.length === 0) return 0;
38
+ const compFps = ctx.fps ?? this._fps;
39
+ const targetFrame = compFps !== this._fps && compFps > 0 ? ctx.frame / compFps * this._fps : ctx.frame;
40
+ const idx = Math.max(0, Math.min(this._samples.length - 1, Math.round(targetFrame)));
41
+ return this._samples[idx];
42
+ };
43
+ }
44
+ }
45
+ get value() {
46
+ return this.get();
47
+ }
48
+ get(ctx) {
49
+ registerSignalDependency(this._subscribers);
50
+ frameSignal.get();
51
+ const currentFrame = ctx?.frame ?? (this._seekedFrame >= 0 ? this._seekedFrame : frameSignal.value);
52
+ if (this._cachedFrame === currentFrame) return this._cachedValue;
53
+ const fps = ctx?.fps ?? this._fps;
54
+ const time = ctx?.time ?? (fps > 0 ? currentFrame / fps : 0);
55
+ const duration = ctx?.duration ?? this._durationFrames ?? 100;
56
+ const resolvedCtx = {
57
+ frame: currentFrame,
58
+ fps,
59
+ time,
60
+ duration,
61
+ durationMs: ctx?.durationMs ?? duration / fps * 1e3,
62
+ progress: duration > 0 ? currentFrame / duration : 0,
63
+ deltaTime: ctx?.deltaTime ?? (fps > 0 ? 1 / fps : .0416)
64
+ };
65
+ this._cachedFrame = currentFrame;
66
+ this._cachedValue = this._evaluator(resolvedCtx);
67
+ return this._cachedValue;
68
+ }
69
+ peek() {
70
+ return this._cachedValue;
71
+ }
72
+ registerChild(child) {
73
+ this._children.add(child);
74
+ }
75
+ _derive(evaluator, options, other) {
76
+ const child = new ProgrammaticSignal$1(evaluator, {
77
+ fps: this._fps,
78
+ durationFrames: this._durationFrames,
79
+ ...options
80
+ });
81
+ this._children.add(child);
82
+ if (other instanceof ProgrammaticSignal$1) other.registerChild(child);
83
+ return child;
84
+ }
85
+ seekFrame(frame) {
86
+ this._seekedFrame = frame;
87
+ this._cachedFrame = -1;
88
+ for (const sub of this._subscribers) sub.markDirty();
89
+ for (const child of this._children) child.seekFrame(frame);
90
+ }
91
+ invalidate() {
92
+ this._cachedFrame = -1;
93
+ for (const sub of this._subscribers) sub.markDirty();
94
+ for (const child of this._children) child.invalidate();
95
+ }
96
+ valueOf() {
97
+ return this.get();
98
+ }
99
+ [Symbol.toPrimitive](hint) {
100
+ if (hint === "number") return Number(this.get());
101
+ if (hint === "string") return String(this.get());
102
+ return this.get();
103
+ }
104
+ smooth(windowFrames) {
105
+ const window = Math.max(1, Math.round(windowFrames));
106
+ if (window <= 1) return this;
107
+ return this._derive((ctx) => {
108
+ let sum = 0;
109
+ let count = 0;
110
+ const startF = Math.max(0, ctx.frame - window + 1);
111
+ for (let f = startF; f <= ctx.frame; f++) {
112
+ sum += this.get({
113
+ ...ctx,
114
+ frame: f,
115
+ time: f / ctx.fps
116
+ });
117
+ count++;
118
+ }
119
+ return count > 0 ? sum / count : 0;
120
+ }, { label: `${this.label ?? "sig"}_smoothed(${window})` });
121
+ }
122
+ remap(inMin, inMax, outMin, outMax, clamp = false) {
123
+ const inRange = inMax - inMin;
124
+ const outRange = outMax - outMin;
125
+ return this._derive((ctx) => {
126
+ const val = this.get(ctx);
127
+ const remapped = outMin + (inRange !== 0 ? (val - inMin) / inRange : 0) * outRange;
128
+ if (clamp) {
129
+ const lo = Math.min(outMin, outMax);
130
+ const hi = Math.max(outMin, outMax);
131
+ return Math.max(lo, Math.min(hi, remapped));
132
+ }
133
+ return remapped;
134
+ }, { label: `${this.label ?? "sig"}_remap` });
135
+ }
136
+ clamp(min, max) {
137
+ const lo = Math.min(min, max);
138
+ const hi = Math.max(min, max);
139
+ return this._derive((ctx) => Math.max(lo, Math.min(hi, this.get(ctx))), { label: `${this.label ?? "sig"}_clamped` });
140
+ }
141
+ gate(threshold, options = {}) {
142
+ const mode = options.mode ?? "gate";
143
+ const debounce = Math.max(1, options.debounceFrames ?? 2);
144
+ const hold = Math.max(1, options.holdFrames ?? 4);
145
+ const invert = Boolean(options.invert);
146
+ return this._derive((ctx) => {
147
+ const currentF = ctx.frame;
148
+ let out = 0;
149
+ if (mode === "gate") out = this.get(ctx) >= threshold ? 1 : 0;
150
+ else if (mode === "trigger") {
151
+ let lastTrigger = -Infinity;
152
+ const startF = Math.max(0, currentF - 120);
153
+ for (let f = startF; f <= currentF; f++) {
154
+ const v = this.get({
155
+ ...ctx,
156
+ frame: f,
157
+ time: f / ctx.fps
158
+ });
159
+ const prev = f > 0 ? this.get({
160
+ ...ctx,
161
+ frame: f - 1,
162
+ time: (f - 1) / ctx.fps
163
+ }) : 0;
164
+ if (v >= threshold && prev < threshold && f - lastTrigger >= debounce) lastTrigger = f;
165
+ }
166
+ out = currentF >= lastTrigger && currentF < lastTrigger + hold ? 1 : 0;
167
+ } else if (mode === "toggle") {
168
+ let toggleCount = 0;
169
+ let lastTrigger = -Infinity;
170
+ for (let f = 0; f <= currentF; f++) {
171
+ const v = this.get({
172
+ ...ctx,
173
+ frame: f,
174
+ time: f / ctx.fps
175
+ });
176
+ const prev = f > 0 ? this.get({
177
+ ...ctx,
178
+ frame: f - 1,
179
+ time: (f - 1) / ctx.fps
180
+ }) : 0;
181
+ if (v >= threshold && prev < threshold && f - lastTrigger >= debounce) {
182
+ toggleCount++;
183
+ lastTrigger = f;
184
+ }
185
+ }
186
+ out = toggleCount % 2 === 1 ? 1 : 0;
187
+ }
188
+ return invert ? 1 - out : out;
189
+ }, { label: `${this.label ?? "sig"}_gate(${threshold})` });
190
+ }
191
+ velocity(dt = 1) {
192
+ const step = Math.max(1, Math.round(dt));
193
+ return this._derive((ctx) => {
194
+ const curr = this.get(ctx);
195
+ const prevF = Math.max(0, ctx.frame - step);
196
+ const prev = this.get({
197
+ ...ctx,
198
+ frame: prevF,
199
+ time: prevF / ctx.fps
200
+ });
201
+ const deltaSec = step / ctx.fps;
202
+ return deltaSec > 0 ? (curr - prev) / deltaSec : curr - prev;
203
+ }, { label: `${this.label ?? "sig"}_velocity` });
204
+ }
205
+ delay(frames) {
206
+ const shift = Math.max(0, Math.round(frames));
207
+ return this._derive((ctx) => {
208
+ const delayedF = Math.max(0, ctx.frame - shift);
209
+ return this.get({
210
+ ...ctx,
211
+ frame: delayedF,
212
+ time: delayedF / ctx.fps
213
+ });
214
+ }, { label: `${this.label ?? "sig"}_delay(${shift})` });
215
+ }
216
+ spring(stiffness = 150, damping = 12) {
217
+ return this._derive((ctx) => {
218
+ const targetFrame = ctx.frame;
219
+ if (targetFrame <= 0) return this.get(ctx);
220
+ let pos = this.get({
221
+ ...ctx,
222
+ frame: 0,
223
+ time: 0
224
+ });
225
+ let vel = 0;
226
+ const dt = 1 / Math.max(1, ctx.fps);
227
+ for (let f = 1; f <= targetFrame; f++) {
228
+ const targetVal = this.get({
229
+ ...ctx,
230
+ frame: f,
231
+ time: f / ctx.fps
232
+ });
233
+ const displacement = pos - targetVal;
234
+ const force = -stiffness * displacement - damping * vel;
235
+ vel += force * dt;
236
+ pos += vel * dt;
237
+ }
238
+ return pos;
239
+ }, { label: `${this.label ?? "sig"}_spring` });
240
+ }
241
+ add(other) {
242
+ if (typeof other === "number") return this._derive((ctx) => this.get(ctx) + other);
243
+ return this._derive((ctx) => this.get(ctx) + (Number(other.get(ctx)) || 0), void 0, other);
244
+ }
245
+ subtract(other) {
246
+ if (typeof other === "number") return this._derive((ctx) => this.get(ctx) - other);
247
+ return this._derive((ctx) => this.get(ctx) - (Number(other.get(ctx)) || 0), void 0, other);
248
+ }
249
+ multiply(factor) {
250
+ if (typeof factor === "number") return this._derive((ctx) => this.get(ctx) * factor);
251
+ return this._derive((ctx) => this.get(ctx) * (Number(factor.get(ctx)) || 0), void 0, factor);
252
+ }
253
+ invert() {
254
+ return this._derive((ctx) => 1 - this.get(ctx), { label: `${this.label ?? "sig"}_inverted` });
255
+ }
256
+ pow(exponent) {
257
+ return this._derive((ctx) => this.get(ctx) ** exponent);
258
+ }
259
+ map(fn) {
260
+ return this._derive((ctx) => fn(this.get(ctx), ctx));
261
+ }
262
+ toFrameArray(totalFrames, fps) {
263
+ const count = Math.max(1, totalFrames);
264
+ const f = fps ?? this._fps;
265
+ const out = new Float32Array(count);
266
+ for (let i = 0; i < count; i++) out[i] = this.get({
267
+ frame: i,
268
+ fps: f,
269
+ time: i / f,
270
+ duration: count,
271
+ durationMs: count / f * 1e3,
272
+ progress: i / count,
273
+ deltaTime: 1 / f
274
+ });
275
+ return out;
276
+ }
277
+ };
278
+ function programmaticSignal(source, options) {
279
+ return new ProgrammaticSignal(source, options);
280
+ }
281
+ let activeComputed = null;
282
+ function registerSignalDependency(subscribers) {
283
+ if (activeComputed !== null) {
284
+ subscribers.add(activeComputed);
285
+ activeComputed.deps.add(subscribers);
286
+ }
287
+ }
288
+ function isSignal(val) {
289
+ return val !== null && typeof val === "object" && "get" in val && typeof val.get === "function" && "value" in val;
290
+ }
291
+ var StateSignalImpl = class {
292
+ _value;
293
+ _subscribers = /* @__PURE__ */ new Set();
294
+ constructor(initialValue) {
295
+ this._value = initialValue;
296
+ }
297
+ get value() {
298
+ return this.get();
299
+ }
300
+ set value(nextValue) {
301
+ this.set(nextValue);
302
+ }
303
+ get() {
304
+ if (activeComputed !== null) {
305
+ this._subscribers.add(activeComputed);
306
+ activeComputed.deps.add(this._subscribers);
307
+ }
308
+ return this._value;
309
+ }
310
+ peek() {
311
+ return this._value;
312
+ }
313
+ set(nextValue) {
314
+ if (Object.is(this._value, nextValue)) return;
315
+ this._value = nextValue;
316
+ this.notifySubscribers();
317
+ }
318
+ update(fn) {
319
+ this.set(fn(this._value));
320
+ }
321
+ notifySubscribers() {
322
+ if (this._subscribers.size === 0) return;
323
+ const toNotify = Array.from(this._subscribers);
324
+ for (const sub of toNotify) sub.markDirty();
325
+ }
326
+ valueOf() {
327
+ return this.get();
328
+ }
329
+ [Symbol.toPrimitive](hint) {
330
+ if (hint === "number") return Number(this.get());
331
+ if (hint === "string") return String(this.get());
332
+ return this.get();
333
+ }
334
+ };
335
+ var ComputedImpl = class {
336
+ _fn;
337
+ _value;
338
+ _dirty = true;
339
+ _evaluating = false;
340
+ deps = /* @__PURE__ */ new Set();
341
+ _subscribers = /* @__PURE__ */ new Set();
342
+ constructor(fn) {
343
+ this._fn = fn;
344
+ }
345
+ get value() {
346
+ return this.get();
347
+ }
348
+ get() {
349
+ if (activeComputed !== null && activeComputed !== this) {
350
+ this._subscribers.add(activeComputed);
351
+ activeComputed.deps.add(this._subscribers);
352
+ }
353
+ if (this._dirty) this.compute();
354
+ return this._value;
355
+ }
356
+ peek() {
357
+ if (this._dirty) this.compute();
358
+ return this._value;
359
+ }
360
+ markDirty() {
361
+ if (this._dirty) return;
362
+ this._dirty = true;
363
+ const toNotify = Array.from(this._subscribers);
364
+ for (const sub of toNotify) sub.markDirty();
365
+ }
366
+ compute() {
367
+ if (this._evaluating) throw new Error("Cyclic dependency detected in computed signal");
368
+ for (const depSubSet of this.deps) depSubSet.delete(this);
369
+ this.deps.clear();
370
+ const prevActive = activeComputed;
371
+ activeComputed = this;
372
+ this._evaluating = true;
373
+ try {
374
+ this._value = this._fn();
375
+ this._dirty = false;
376
+ } finally {
377
+ this._evaluating = false;
378
+ activeComputed = prevActive;
379
+ }
380
+ }
381
+ valueOf() {
382
+ return this.get();
383
+ }
384
+ [Symbol.toPrimitive](hint) {
385
+ if (hint === "number") return Number(this.get());
386
+ if (hint === "string") return String(this.get());
387
+ return this.get();
388
+ }
389
+ };
390
+ var FrameArraySignalImpl = class {
391
+ gpuBinding;
392
+ fps;
393
+ _samples;
394
+ _cachedFrame = -1;
395
+ _cachedValue = 0;
396
+ _seekedFrame = -1;
397
+ _subscribers = /* @__PURE__ */ new Set();
398
+ constructor(samples, fps = 24, gpuBinding) {
399
+ this._samples = samples;
400
+ this.fps = fps;
401
+ this.gpuBinding = gpuBinding;
402
+ if (samples.length > 0) this._cachedValue = samples[0];
403
+ }
404
+ get value() {
405
+ return this.get();
406
+ }
407
+ get(ctx) {
408
+ if (activeComputed !== null) {
409
+ this._subscribers.add(activeComputed);
410
+ activeComputed.deps.add(this._subscribers);
411
+ }
412
+ frameSignal.get();
413
+ const currentFrame = ctx?.frame ?? (this._seekedFrame >= 0 ? this._seekedFrame : frameSignal.value);
414
+ if (this._cachedFrame === currentFrame) return this._cachedValue;
415
+ this._cachedFrame = currentFrame;
416
+ if (!this._samples || this._samples.length === 0) {
417
+ this._cachedValue = 0;
418
+ return 0;
419
+ }
420
+ const compFps = ctx?.fps ?? this.fps;
421
+ const targetFrame = compFps !== this.fps && compFps > 0 ? currentFrame / compFps * this.fps : currentFrame;
422
+ const idx = Math.max(0, Math.min(this._samples.length - 1, Math.round(targetFrame)));
423
+ this._cachedValue = Number(this._samples[idx]) || 0;
424
+ return this._cachedValue;
425
+ }
426
+ peek() {
427
+ return this._cachedValue;
428
+ }
429
+ seekFrame(frame) {
430
+ this._seekedFrame = frame;
431
+ this._cachedFrame = frame;
432
+ if (!this._samples || this._samples.length === 0) this._cachedValue = 0;
433
+ else {
434
+ const idx = Math.max(0, Math.min(this._samples.length - 1, Math.round(frame)));
435
+ this._cachedValue = Number(this._samples[idx]) || 0;
436
+ }
437
+ for (const sub of this._subscribers) sub.markDirty();
438
+ }
439
+ valueOf() {
440
+ return this.get();
441
+ }
442
+ [Symbol.toPrimitive](hint) {
443
+ if (hint === "number") return Number(this.get());
444
+ if (hint === "string") return String(this.get());
445
+ return this.get();
446
+ }
447
+ };
448
+ function signal(initialValue) {
449
+ return new StateSignalImpl(initialValue);
450
+ }
451
+ function computed(fn) {
452
+ return new ComputedImpl(fn);
453
+ }
454
+ function frameArraySignal(samples, fps = 24, gpuBinding) {
455
+ return new FrameArraySignalImpl(samples, fps, gpuBinding);
456
+ }
457
+ const frameSignal = signal(0);
458
+ const timeSignal = signal(0);
459
+ const progressSignal = signal(0);
460
+ function updateClockSignals(frame, fps = 24, durationMs) {
461
+ frameSignal.set(frame);
462
+ const timeSec = fps > 0 ? frame / fps : 0;
463
+ timeSignal.set(timeSec);
464
+ if (durationMs && durationMs > 0) {
465
+ const durSec = durationMs / 1e3;
466
+ progressSignal.set(Math.max(0, Math.min(1, timeSec / durSec)));
467
+ } else progressSignal.set(0);
468
+ }
469
+ var ProceduralSignalImpl = class {
470
+ gpuBinding;
471
+ _config;
472
+ constructor(config) {
473
+ this._config = {
474
+ type: "sine",
475
+ frequency: 1,
476
+ amplitude: 1,
477
+ offset: 0,
478
+ phase: 0,
479
+ ...config
480
+ };
481
+ this.gpuBinding = config.gpuBinding;
482
+ }
483
+ get value() {
484
+ return this.get();
485
+ }
486
+ get(ctx) {
487
+ frameSignal.get();
488
+ const frame = ctx?.frame ?? frameSignal.value;
489
+ const fps = ctx?.fps ?? 24;
490
+ const time = ctx?.time ?? (fps > 0 ? frame / fps : 0);
491
+ if (this._config.fn) return this._config.fn(ctx ?? {
492
+ frame,
493
+ fps,
494
+ time,
495
+ duration: 0,
496
+ durationMs: 0,
497
+ progress: 0,
498
+ deltaTime: fps > 0 ? 1 / fps : 0
499
+ });
500
+ const freq = this._config.frequency ?? 1;
501
+ const amp = this._config.amplitude ?? 1;
502
+ const off = this._config.offset ?? 0;
503
+ const phase = this._config.phase ?? 0;
504
+ switch (this._config.type ?? "sine") {
505
+ case "sine": return off + amp * Math.sin(2 * Math.PI * freq * time + phase);
506
+ case "triangle": return off + amp * (2 * Math.abs(2 * (time * freq + phase / (2 * Math.PI) - Math.floor(time * freq + phase / (2 * Math.PI) + .5))) - 1);
507
+ case "sawtooth": return off + amp * (2 * (time * freq + phase / (2 * Math.PI) - Math.floor(time * freq + phase / (2 * Math.PI) + .5)));
508
+ case "square": return off + (Math.sin(2 * Math.PI * freq * time + phase) >= 0 ? amp : -amp);
509
+ case "bounce": {
510
+ const cycle = time * freq % 1;
511
+ return off + amp * Math.abs(Math.sin(Math.PI * cycle));
512
+ }
513
+ default: return off + amp * Math.sin(2 * Math.PI * freq * time + phase);
514
+ }
515
+ }
516
+ peek() {
517
+ return this.get();
518
+ }
519
+ valueOf() {
520
+ return this.get();
521
+ }
522
+ [Symbol.toPrimitive](hint) {
523
+ if (hint === "number") return Number(this.get());
524
+ if (hint === "string") return String(this.get());
525
+ return this.get();
526
+ }
527
+ };
528
+ function signalBuilder(config) {
529
+ return new ProceduralSignalImpl(config);
530
+ }
531
+ function sineSignal(options = {}) {
532
+ const min = options.min;
533
+ const max = options.max;
534
+ let amplitude = options.amplitude ?? 1;
535
+ let offset = options.offset ?? 0;
536
+ if (min !== void 0 && max !== void 0) {
537
+ offset = (min + max) / 2;
538
+ amplitude = (max - min) / 2;
539
+ } else if (min !== void 0) offset = min + amplitude;
540
+ else if (max !== void 0) offset = max - amplitude;
541
+ const period = options.period;
542
+ const frequency = options.frequency;
543
+ const phase = options.phase ?? 0;
544
+ return signalBuilder({
545
+ type: "custom",
546
+ fn: (ctx) => {
547
+ let angle;
548
+ if (period !== void 0 && period > 0) angle = 2 * Math.PI * ctx.frame / period + phase;
549
+ else {
550
+ const freq = frequency ?? 1;
551
+ angle = 2 * Math.PI * freq * ctx.time + phase;
552
+ }
553
+ return offset + amplitude * Math.sin(angle);
554
+ }
555
+ });
556
+ }
557
+ function cosineSignal(options = {}) {
558
+ const min = options.min;
559
+ const max = options.max;
560
+ let amplitude = options.amplitude ?? 1;
561
+ let offset = options.offset ?? 0;
562
+ if (min !== void 0 && max !== void 0) {
563
+ offset = (min + max) / 2;
564
+ amplitude = (max - min) / 2;
565
+ } else if (min !== void 0) offset = min + amplitude;
566
+ else if (max !== void 0) offset = max - amplitude;
567
+ const period = options.period;
568
+ const frequency = options.frequency;
569
+ const phase = options.phase ?? 0;
570
+ return signalBuilder({
571
+ type: "custom",
572
+ fn: (ctx) => {
573
+ let angle;
574
+ if (period !== void 0 && period > 0) angle = 2 * Math.PI * ctx.frame / period + phase;
575
+ else {
576
+ const freq = frequency ?? 1;
577
+ angle = 2 * Math.PI * freq * ctx.time + phase;
578
+ }
579
+ return offset + amplitude * Math.cos(angle);
580
+ }
581
+ });
582
+ }
583
+ const Signal = {
584
+ state: signal,
585
+ computed,
586
+ builder: signalBuilder,
587
+ fromArray: frameArraySignal,
588
+ programmatic: programmaticSignal,
589
+ frame: frameSignal,
590
+ time: timeSignal,
591
+ progress: progressSignal,
592
+ sine: sineSignal,
593
+ cosine: cosineSignal
594
+ };
595
+ var Effect = class {
596
+ signals;
597
+ config;
598
+ _frameHooks = [];
599
+ constructor(initialConfig) {
600
+ this.config = { ...initialConfig };
601
+ this.signals = {};
602
+ for (const [key, val] of Object.entries(initialConfig)) if (isSignal(val)) this.signals[key] = val;
603
+ else this.signals[key] = signal(val);
604
+ return new Proxy(this, {
605
+ get(target, prop, receiver) {
606
+ if (typeof prop === "string" && prop in target.signals) {
607
+ const sig = target.signals[prop];
608
+ return sig ? sig.value : void 0;
609
+ }
610
+ return Reflect.get(target, prop, receiver);
611
+ },
612
+ set(target, prop, val, receiver) {
613
+ if (typeof prop === "string" && prop in target.signals) {
614
+ const currentSig = target.signals[prop];
615
+ if (isSignal(val)) {
616
+ target.signals[prop] = val;
617
+ target.config[prop] = val;
618
+ } else if (currentSig && typeof currentSig.set === "function") {
619
+ currentSig.set(val);
620
+ target.config[prop] = val;
621
+ } else {
622
+ target.signals[prop] = signal(val);
623
+ target.config[prop] = val;
624
+ }
625
+ return true;
626
+ }
627
+ return Reflect.set(target, prop, val, receiver);
628
+ }
629
+ });
630
+ }
631
+ /**
632
+ * Game-engine per-frame lifecycle hook.
633
+ * Invoked before rendering each frame so scripts or agents can mutate properties.
634
+ */
635
+ onRequestFrame(callback) {
636
+ this._frameHooks.push(callback);
637
+ return this;
638
+ }
639
+ notifyFrame(ctx) {
640
+ for (const hook of this._frameHooks) hook(ctx);
641
+ }
642
+ /**
643
+ * Samples concrete scalar / config values for the current frame.
644
+ */
645
+ resolveUniforms(ctx) {
646
+ const out = {};
647
+ for (const [k, sig] of Object.entries(this.signals)) out[k] = sig.get(ctx);
648
+ return out;
649
+ }
650
+ /**
651
+ * Returns WebGPU texture bindings attached to any property signal.
652
+ */
653
+ resolveTextures() {
654
+ const out = {};
655
+ for (const [k, sig] of Object.entries(this.signals)) {
656
+ const gpu = sig.gpuBinding;
657
+ if (gpu?.textureView) out[`${k}TextureView`] = gpu.textureView;
658
+ if (gpu?.texture) out[`${k}Texture`] = gpu.texture;
659
+ }
660
+ return out;
661
+ }
662
+ /**
663
+ * Converts the effect into an operation node for the VirtualMediaData AST.
664
+ */
665
+ toOperation() {
666
+ const opPayload = {
667
+ op: this.op,
668
+ effect: this,
669
+ onRequestFrame: (ctx) => this.notifyFrame(ctx),
670
+ signals: this.signals,
671
+ ...this.config
672
+ };
673
+ for (const [k, sig] of Object.entries(this.signals)) {
674
+ const orig = this.config[k];
675
+ if (!isSignal(orig) && (typeof orig === "string" || typeof orig === "boolean")) opPayload[k] = sig.value;
676
+ else opPayload[k] = sig;
677
+ }
678
+ return opPayload;
679
+ }
680
+ };
681
+ var ModerationError = class extends Error {
682
+ constructor(message) {
683
+ super(message);
684
+ this.name = "ModerationError";
685
+ }
686
+ };
687
+ var ModerationUnrefundableError = class extends Error {
688
+ constructor(message) {
689
+ super(message);
690
+ this.name = "ModerationUnrefundableError";
691
+ }
692
+ };
693
+ /**
694
+ * Generates a unique ID using nanoid.
695
+ * This function is cross-platform compatible (Node.js and Browser).
696
+ *
697
+ * @param size - Optional size of the ID (default is 21)
698
+ * @returns A unique string ID
699
+ */
700
+ const generateId = (size) => {
701
+ return nanoid(size);
702
+ };
703
+ const HandleDefinitionSchema = z$1.object({
704
+ dataTypes: z$1.custom(),
705
+ label: z$1.string(),
706
+ required: z$1.boolean().optional(),
707
+ order: z$1.number(),
708
+ description: z$1.string().optional()
709
+ });
710
+ const ConfigHandleSchema = z$1.object({
711
+ configKey: z$1.string(),
712
+ dataTypes: z$1.custom(),
713
+ label: z$1.string(),
714
+ description: z$1.string().optional()
715
+ });
716
+ /**
717
+ * Metadata defining the interface and identity of a node.
718
+ * This is safe to import in any environment.
719
+ */
720
+ const NodeMetadataSchema = z$1.object({
721
+ type: z$1.string().min(1),
722
+ version: z$1.number().int().positive().optional(),
723
+ baseType: z$1.string().optional(),
724
+ displayName: z$1.string().min(1),
725
+ description: z$1.string().optional(),
726
+ showInQuickAccess: z$1.boolean().optional(),
727
+ showInSidebar: z$1.boolean().optional(),
728
+ advanced: z$1.boolean().optional(),
729
+ category: z$1.string().min(1),
730
+ subcategory: z$1.string().optional(),
731
+ defaultDimensions: z$1.object({
732
+ width: z$1.number().positive().optional(),
733
+ height: z$1.number().positive().optional()
734
+ }).optional(),
735
+ handles: z$1.object({
736
+ inputs: z$1.array(HandleDefinitionSchema),
737
+ outputs: z$1.array(HandleDefinitionSchema)
738
+ }),
739
+ variableInputs: z$1.discriminatedUnion("enabled", [z$1.object({
740
+ enabled: z$1.literal(true),
741
+ dataTypes: z$1.custom()
742
+ }), z$1.object({
743
+ enabled: z$1.literal(false),
744
+ dataTypes: z$1.custom().optional()
745
+ })]).optional(),
746
+ variableOutputs: z$1.discriminatedUnion("enabled", [z$1.object({
747
+ enabled: z$1.literal(true),
748
+ dataTypes: z$1.custom()
749
+ }), z$1.object({
750
+ enabled: z$1.literal(false),
751
+ dataTypes: z$1.custom().optional()
752
+ })]).optional(),
753
+ isTerminal: z$1.boolean().optional(),
754
+ isTransient: z$1.boolean().optional(),
755
+ configSchema: z$1.custom().optional(),
756
+ defaultConfig: z$1.record(z$1.string(), z$1.unknown()).optional(),
757
+ validation: z$1.any().optional(),
758
+ resultSchema: z$1.custom().optional(),
759
+ configHandles: z$1.array(ConfigHandleSchema).optional()
760
+ });
761
+ const STORE_KEY = Symbol.for("framefields.renderDiagnostics");
762
+ const diagnosticsByRender = globalThis[STORE_KEY] ?? (globalThis[STORE_KEY] = /* @__PURE__ */ new Map());
763
+ const MAX_TRACKED_RENDERS = 256;
764
+ /** Record a diagnostic for a render; repeats (same code, layer and message) are kept once. */
765
+ function reportRenderDiagnostic(renderId, diagnostic) {
766
+ let forRender = diagnosticsByRender.get(renderId);
767
+ if (!forRender) {
768
+ if (diagnosticsByRender.size >= MAX_TRACKED_RENDERS) {
769
+ const oldest = diagnosticsByRender.keys().next().value;
770
+ if (oldest !== void 0) diagnosticsByRender.delete(oldest);
771
+ }
772
+ forRender = /* @__PURE__ */ new Map();
773
+ diagnosticsByRender.set(renderId, forRender);
774
+ }
775
+ const key = `${diagnostic.code}|${diagnostic.layerId ?? ""}|${diagnostic.message}`;
776
+ if (!forRender.has(key)) forRender.set(key, diagnostic);
777
+ }
778
+ /**
779
+ * Everything reported for a render, including its nested compositions (they
780
+ * render under derived ids, `${renderId}-…`), removing it from the store.
781
+ */
782
+ function takeRenderDiagnostics(renderId) {
783
+ const collected = /* @__PURE__ */ new Map();
784
+ for (const [id, forRender] of diagnosticsByRender) {
785
+ if (id !== renderId && !id.startsWith(`${renderId}-`)) continue;
786
+ for (const [key, diagnostic] of forRender) collected.set(key, diagnostic);
787
+ diagnosticsByRender.delete(id);
788
+ }
789
+ return [...collected.values()];
790
+ }
791
+ const DataTypeVal = {
792
+ Text: "Text",
793
+ Number: "Number",
794
+ Boolean: "Boolean",
795
+ Image: "Image",
796
+ Video: "Video",
797
+ Audio: "Audio",
798
+ SVG: "SVG",
799
+ Caption: "Caption",
800
+ Lottie: "Lottie",
801
+ ThreeD: "ThreeD",
802
+ GIF: "GIF",
803
+ Signal: "Signal",
804
+ LUT: "LUT"
805
+ };
806
+ const DataType = DataTypeVal;
807
+ const DataTypes = Object.values(DataTypeVal);
808
+ const HandleTypeVal = {
809
+ Input: "Input",
810
+ Output: "Output"
811
+ };
812
+ const JsonValueSchema = z$1.lazy(() => z$1.union([
813
+ z$1.string(),
814
+ z$1.number(),
815
+ z$1.boolean(),
816
+ z$1.null(),
817
+ z$1.array(JsonValueSchema),
818
+ z$1.record(z$1.string(), JsonValueSchema.optional())
819
+ ]));
820
+ /**
821
+ * Zod schema for the FileAsset model
822
+ * Matches the Prisma schema definitions for types and nullability.
823
+ */
824
+ const FileAssetSchema = z$1.object({
825
+ id: z$1.cuid2(),
826
+ name: z$1.string(),
827
+ createdAt: z$1.coerce.date(),
828
+ updatedAt: z$1.coerce.date(),
829
+ userId: z$1.cuid2().nullable(),
830
+ width: z$1.number().int().nullable(),
831
+ height: z$1.number().int().nullable(),
832
+ bucket: z$1.string(),
833
+ size: z$1.number().int(),
834
+ mimeType: z$1.string(),
835
+ key: z$1.string(),
836
+ isUploaded: z$1.boolean().default(true),
837
+ duration: z$1.number().int().nullable(),
838
+ sampleRate: z$1.number().int().nullable().optional(),
839
+ channels: z$1.number().int().nullable().optional(),
840
+ bitDepth: z$1.number().int().nullable().optional(),
841
+ audioCodec: z$1.string().nullable().optional(),
842
+ audioBitrate: z$1.number().int().nullable().optional(),
843
+ fps: z$1.number().int().nullable(),
844
+ fingerprint: z$1.string().nullable()
845
+ });
846
+ const NodeVisualConfigSchema = z$1.object({
847
+ position: z$1.object({
848
+ x: z$1.number(),
849
+ y: z$1.number()
850
+ }).optional(),
851
+ width: z$1.number().nullish(),
852
+ height: z$1.number().nullish(),
853
+ locked: z$1.boolean().optional().default(false),
854
+ collapsed: z$1.boolean().optional().default(false)
855
+ }).passthrough();
856
+ const dataTypeColors = {
857
+ Text: {
858
+ bg: "bg-blue-500",
859
+ stroke: "stroke-blue-500",
860
+ hex: "#3b82f6",
861
+ text: "text-blue-500",
862
+ border: "border-blue-500"
863
+ },
864
+ Image: {
865
+ bg: "bg-purple-500",
866
+ stroke: "stroke-purple-500",
867
+ hex: "#a855f7",
868
+ text: "text-purple-500",
869
+ border: "border-purple-500"
870
+ },
871
+ Video: {
872
+ bg: "bg-teal-500",
873
+ stroke: "stroke-teal-500",
874
+ hex: "oklch(60% 0.118 184.704)",
875
+ text: "text-teal-500",
876
+ border: "border-teal-500"
877
+ },
878
+ Audio: {
879
+ bg: "bg-orange-500",
880
+ stroke: "stroke-orange-500",
881
+ hex: "#f97316",
882
+ text: "text-orange-500",
883
+ border: "border-orange-500"
884
+ },
885
+ Number: {
886
+ bg: "bg-green-600",
887
+ stroke: "stroke-green-600",
888
+ hex: "#16a34a",
889
+ text: "text-green-600",
890
+ border: "border-green-600"
891
+ },
892
+ Boolean: {
893
+ bg: "bg-amber-600",
894
+ stroke: "stroke-amber-600",
895
+ hex: "#d97706",
896
+ text: "text-amber-600",
897
+ border: "border-amber-600"
898
+ },
899
+ SVG: {
900
+ bg: "bg-lime-600",
901
+ stroke: "stroke-lime-600",
902
+ hex: "#65a30d",
903
+ text: "text-lime-600",
904
+ border: "border-lime-600"
905
+ },
906
+ Caption: {
907
+ bg: "bg-rose-500",
908
+ stroke: "stroke-rose-500",
909
+ hex: "#f43f5e",
910
+ text: "text-rose-500",
911
+ border: "border-rose-500"
912
+ },
913
+ GIF: {
914
+ bg: "bg-pink-500",
915
+ stroke: "stroke-pink-500",
916
+ hex: "#ec4899",
917
+ text: "text-pink-500",
918
+ border: "border-pink-500"
919
+ },
920
+ Lottie: {
921
+ bg: "bg-indigo-500",
922
+ stroke: "stroke-indigo-500",
923
+ hex: "#6366f1",
924
+ text: "text-indigo-500",
925
+ border: "border-indigo-500"
926
+ },
927
+ Signal: {
928
+ bg: "bg-fuchsia-500",
929
+ stroke: "stroke-fuchsia-500",
930
+ hex: "#d946ef",
931
+ text: "text-fuchsia-500",
932
+ border: "border-fuchsia-500"
933
+ },
934
+ LUT: {
935
+ bg: "bg-cyan-600",
936
+ stroke: "stroke-cyan-600",
937
+ hex: "#0891b2",
938
+ text: "text-cyan-600",
939
+ border: "border-cyan-600"
940
+ }
941
+ };
942
+ const DATA_TYPE_EXTENSIONS = {
943
+ Image: "png",
944
+ Video: "mp4",
945
+ Audio: "mp3",
946
+ Text: "txt",
947
+ Number: "txt",
948
+ Boolean: "txt",
949
+ SVG: "svg",
950
+ Caption: "srt",
951
+ Lottie: "json",
952
+ ThreeD: "glb",
953
+ GIF: "gif",
954
+ Signal: "txt",
955
+ LUT: "cube"
956
+ };
957
+ const MIME_TYPES = {
958
+ png: "image/png",
959
+ jpg: "image/jpeg",
960
+ jpeg: "image/jpeg",
961
+ gif: "image/gif",
962
+ webp: "image/webp",
963
+ svg: "image/svg+xml",
964
+ mp4: "video/mp4",
965
+ webm: "video/webm",
966
+ mov: "video/quicktime",
967
+ mp3: "audio/mpeg",
968
+ wav: "audio/wav",
969
+ ogg: "audio/ogg",
970
+ pdf: "application/pdf",
971
+ json: "application/json",
972
+ txt: "text/plain",
973
+ srt: "text/srt",
974
+ aac: "audio/aac",
975
+ flac: "audio/flac"
976
+ };
977
+ const COMPOSITE_OPERATIONS = [
978
+ "source-over",
979
+ "source-in",
980
+ "source-out",
981
+ "source-atop",
982
+ "destination-over",
983
+ "destination-in",
984
+ "destination-out",
985
+ "destination-atop",
986
+ "lighter",
987
+ "copy",
988
+ "xor",
989
+ "multiply",
990
+ "screen",
991
+ "overlay",
992
+ "darken",
993
+ "lighten",
994
+ "color-dodge",
995
+ "color-burn",
996
+ "hard-light",
997
+ "soft-light",
998
+ "difference",
999
+ "exclusion",
1000
+ "hue",
1001
+ "saturation",
1002
+ "color",
1003
+ "luminosity"
1004
+ ];
1005
+ const GlobalCompositeOperation = z.enum(COMPOSITE_OPERATIONS);
1006
+ var ConfigSchemaRegistry = class ConfigSchemaRegistry$1 {
1007
+ static schemas = /* @__PURE__ */ new Map();
1008
+ static register(type, schema) {
1009
+ ConfigSchemaRegistry$1.schemas.set(type, schema);
1010
+ }
1011
+ static get(type) {
1012
+ return ConfigSchemaRegistry$1.schemas.get(type);
1013
+ }
1014
+ static clear() {
1015
+ ConfigSchemaRegistry$1.schemas.clear();
1016
+ }
1017
+ };
1018
+ const COMPOSITOR_DEFAULTS = {
1019
+ FONT_FAMILY: "Inter",
1020
+ FONT_SIZE: 64,
1021
+ FILL: "#ffffff",
1022
+ LINE_HEIGHT: 1.1,
1023
+ ALIGN: "left",
1024
+ VERTICAL_ALIGN: "top",
1025
+ LETTER_SPACING: 0,
1026
+ STROKE_WIDTH: 0,
1027
+ STROKE: "#000000",
1028
+ CORNER_RADIUS: 0,
1029
+ PADDING: 0
1030
+ };
1031
+ const FileDataSchema = z$1.object({ entity: z$1.custom().optional() });
1032
+ const SignalStatsSchema = z$1.object({
1033
+ min: z$1.number().optional(),
1034
+ max: z$1.number().optional(),
1035
+ mean: z$1.number().optional(),
1036
+ rms: z$1.number().optional(),
1037
+ peak: z$1.number().optional(),
1038
+ beats: z$1.array(z$1.number()).optional(),
1039
+ tempo: z$1.number().optional()
1040
+ });
1041
+ const SignalChannelMetaSchema = z$1.object({
1042
+ id: z$1.string(),
1043
+ name: z$1.string(),
1044
+ index: z$1.number(),
1045
+ stats: SignalStatsSchema.optional()
1046
+ });
1047
+ const GeneratorSignalDataSchema = z$1.object({
1048
+ v: z$1.literal(2).optional(),
1049
+ type: z$1.literal("generator"),
1050
+ nodeId: z$1.string().optional(),
1051
+ baseType: z$1.string().optional(),
1052
+ func: z$1.enum([
1053
+ "sine",
1054
+ "triangle",
1055
+ "sawtooth",
1056
+ "square",
1057
+ "custom"
1058
+ ]).or(z$1.string()).default("sine"),
1059
+ frequency: z$1.number().default(1),
1060
+ amplitude: z$1.number().default(1),
1061
+ phase: z$1.number().default(0),
1062
+ offset: z$1.number().default(0),
1063
+ waveform: z$1.string().optional(),
1064
+ bpm: z$1.number().optional(),
1065
+ syncToBpm: z$1.boolean().optional(),
1066
+ fmFrequency: z$1.number().optional(),
1067
+ fmDepth: z$1.number().optional(),
1068
+ envelope: z$1.string().optional(),
1069
+ fnBody: z$1.string().optional(),
1070
+ fnParams: z$1.array(z$1.record(z$1.string(), z$1.unknown())).optional(),
1071
+ customWGSL: z$1.string().optional(),
1072
+ signalFnName: z$1.string().optional(),
1073
+ outputType: z$1.string().optional(),
1074
+ fps: z$1.number().optional(),
1075
+ durationMs: z$1.number().optional(),
1076
+ stats: SignalStatsSchema.optional()
1077
+ }).passthrough();
1078
+ const AudioExtractorSignalDataSchema = z$1.object({
1079
+ v: z$1.literal(2).optional(),
1080
+ type: z$1.literal("audio_extractor"),
1081
+ nodeId: z$1.string().optional(),
1082
+ sourceUrl: z$1.string().optional(),
1083
+ channel: z$1.enum([
1084
+ "primary",
1085
+ "beat",
1086
+ "bass",
1087
+ "energy",
1088
+ "spectral_flux"
1089
+ ]).or(z$1.string()).optional(),
1090
+ channelIndex: z$1.number().optional(),
1091
+ channels: z$1.array(SignalChannelMetaSchema).optional(),
1092
+ extractionMode: z$1.string().optional(),
1093
+ attackMs: z$1.number().optional(),
1094
+ releaseMs: z$1.number().optional(),
1095
+ sensitivity: z$1.number().optional(),
1096
+ noiseFloorDb: z$1.number().optional(),
1097
+ dynamicRangeDb: z$1.number().optional(),
1098
+ autoRange: z$1.boolean().optional(),
1099
+ smoothing: z$1.number().optional(),
1100
+ curve: z$1.string().optional(),
1101
+ beatThreshold: z$1.number().optional(),
1102
+ beatDecayMs: z$1.number().optional(),
1103
+ previewMode: z$1.string().optional(),
1104
+ samples: z$1.union([z$1.array(z$1.number()), z$1.instanceof(Float32Array)]).optional(),
1105
+ fps: z$1.number().optional(),
1106
+ durationMs: z$1.number().optional(),
1107
+ stats: SignalStatsSchema.optional(),
1108
+ state: z$1.enum([
1109
+ "pending",
1110
+ "ready",
1111
+ "failed"
1112
+ ]).optional(),
1113
+ error: z$1.string().optional(),
1114
+ virtualMedia: z$1.record(z$1.string(), z$1.unknown()).optional(),
1115
+ signalFnName: z$1.string().optional(),
1116
+ customWGSL: z$1.string().optional()
1117
+ }).passthrough();
1118
+ const SignalMathDataSchema = z$1.object({
1119
+ v: z$1.literal(2).optional(),
1120
+ type: z$1.literal("signal_math"),
1121
+ nodeId: z$1.string().optional(),
1122
+ op: z$1.string().optional(),
1123
+ operation: z$1.string().optional(),
1124
+ signalA: z$1.unknown().optional(),
1125
+ signalB: z$1.unknown().optional(),
1126
+ bValue: z$1.number().optional(),
1127
+ inMin: z$1.number().optional(),
1128
+ inMax: z$1.number().optional(),
1129
+ outMin: z$1.number().optional(),
1130
+ outMax: z$1.number().optional(),
1131
+ clampMin: z$1.number().optional(),
1132
+ clampMax: z$1.number().optional(),
1133
+ exponent: z$1.number().optional(),
1134
+ edge0: z$1.number().optional(),
1135
+ edge1: z$1.number().optional(),
1136
+ customWGSL: z$1.string().optional(),
1137
+ stats: SignalStatsSchema.optional()
1138
+ }).passthrough();
1139
+ const SignalGateDataSchema = z$1.object({
1140
+ v: z$1.literal(2).optional(),
1141
+ type: z$1.literal("gate"),
1142
+ nodeId: z$1.string().optional(),
1143
+ sourceSignal: z$1.unknown().optional(),
1144
+ threshold: z$1.number().optional(),
1145
+ debounceMs: z$1.number().optional(),
1146
+ mode: z$1.enum([
1147
+ "gate",
1148
+ "trigger",
1149
+ "toggle"
1150
+ ]).optional(),
1151
+ holdFrames: z$1.number().optional(),
1152
+ invert: z$1.boolean().optional(),
1153
+ stats: SignalStatsSchema.optional()
1154
+ }).passthrough();
1155
+ const SignalDataSchema = z$1.union([
1156
+ GeneratorSignalDataSchema,
1157
+ AudioExtractorSignalDataSchema,
1158
+ SignalMathDataSchema,
1159
+ SignalGateDataSchema,
1160
+ z$1.object({ type: z$1.string() }).passthrough()
1161
+ ]);
1162
+ function serializeSignalData(data) {
1163
+ return JSON.stringify(data, (_key, value) => {
1164
+ if (value instanceof Float32Array) return Array.from(value);
1165
+ return value;
1166
+ });
1167
+ }
1168
+ function deserializeSignalData(raw) {
1169
+ if (typeof raw === "string") try {
1170
+ return SignalDataSchema.parse(JSON.parse(raw));
1171
+ } catch {
1172
+ return { type: "unknown" };
1173
+ }
1174
+ return SignalDataSchema.parse(raw);
1175
+ }
1176
+ const OutputItemSchema = z$1.object({
1177
+ type: z$1.custom(),
1178
+ data: z$1.any(),
1179
+ outputHandleId: z$1.string().optional()
1180
+ });
1181
+ const createOutputItemSchema = (type, dataSchema) => {
1182
+ return z$1.object({
1183
+ type,
1184
+ data: dataSchema,
1185
+ outputHandleId: z$1.string().optional()
1186
+ });
1187
+ };
1188
+ const SingleOutputGenericSchema = (outputItemSchema) => z$1.object({
1189
+ selectedOutputIndex: z$1.literal(0),
1190
+ outputs: z$1.tuple([z$1.object({ items: z$1.tuple([outputItemSchema]) })])
1191
+ });
1192
+ const MultiOutputGenericSchema = (outputItemSchema) => z$1.object({
1193
+ selectedOutputIndex: z$1.number(),
1194
+ outputs: z$1.array(z$1.object({ items: z$1.array(outputItemSchema) })),
1195
+ sourceFingerprint: z$1.string().optional()
1196
+ });
1197
+ const AnyOutputUnionSchema = z$1.object({
1198
+ type: z$1.custom(),
1199
+ data: z$1.any(),
1200
+ outputHandleId: z$1.string().optional()
1201
+ });
1202
+ const NodeResultSchema = z$1.object({
1203
+ selectedOutputIndex: z$1.number(),
1204
+ outputs: z$1.array(z$1.object({ items: z$1.array(AnyOutputUnionSchema) }))
1205
+ });
1206
+ const ExportResultSchema = MultiOutputGenericSchema(AnyOutputUnionSchema);
1207
+ const AnimationTypeSchema = z.enum([
1208
+ "fade-in",
1209
+ "fade-out",
1210
+ "slide-in-left",
1211
+ "slide-in-right",
1212
+ "slide-in-top",
1213
+ "slide-in-bottom",
1214
+ "zoom-in",
1215
+ "zoom-out",
1216
+ "rotate-cw",
1217
+ "rotate-ccw",
1218
+ "bounce",
1219
+ "shake"
1220
+ ]);
1221
+ const VideoAnimationSchema = z.object({
1222
+ id: z.string(),
1223
+ type: AnimationTypeSchema,
1224
+ value: z.number()
1225
+ });
1226
+ const VideoSpatialPropsSchema = z.object({
1227
+ x: z.number().default(0),
1228
+ y: z.number().default(0),
1229
+ width: z.number().optional(),
1230
+ height: z.number().optional(),
1231
+ rotation: z.number().default(0),
1232
+ scale: z.number().min(0).default(1),
1233
+ opacity: z.number().min(0).max(1).default(1),
1234
+ zIndex: z.number().int().optional(),
1235
+ blendMode: GlobalCompositeOperation.optional()
1236
+ });
1237
+ const VideoTimingPropsSchema = z.object({
1238
+ startFrame: z.number().int().min(0).default(0),
1239
+ durationInMS: z.number().int().min(1).optional(),
1240
+ trimStart: z.number().int().min(0).optional(),
1241
+ trimEnd: z.number().int().min(0).optional(),
1242
+ speed: z.number().min(.25).max(4).optional()
1243
+ });
1244
+ const VideoTextPropsSchema = z.object({
1245
+ text: z.string().optional(),
1246
+ fontSize: z.number().optional(),
1247
+ fontFamily: z.string().optional(),
1248
+ fontStyle: z.string().optional(),
1249
+ fontWeight: z.union([z.number(), z.string()]).optional(),
1250
+ fill: z.string().optional(),
1251
+ align: z.string().optional(),
1252
+ verticalAlign: z.string().optional(),
1253
+ letterSpacing: z.number().optional(),
1254
+ lineHeight: z.number().optional(),
1255
+ padding: z.number().optional(),
1256
+ stroke: z.string().optional(),
1257
+ strokeWidth: z.number().optional(),
1258
+ strokeAlign: z.enum([
1259
+ "inside",
1260
+ "center",
1261
+ "outside"
1262
+ ]).optional(),
1263
+ textShadow: z.string().optional(),
1264
+ textBackgroundColor: z.string().optional(),
1265
+ shadows: z.array(z.object({
1266
+ color: z.string(),
1267
+ offset: z.object({
1268
+ x: z.number(),
1269
+ y: z.number()
1270
+ }).optional(),
1271
+ blurRadius: z.number().optional()
1272
+ })).optional(),
1273
+ textAnimation: z.any().optional(),
1274
+ bottomPadding: z.number().optional(),
1275
+ maxWidth: z.number().optional()
1276
+ });
1277
+ const VideoStylePropsSchema = z.object({
1278
+ backgroundColor: z.string().optional(),
1279
+ borderColor: z.string().optional(),
1280
+ borderWidth: z.number().optional(),
1281
+ strokeRadius: z.number().optional(),
1282
+ autoDimensions: z.boolean().optional()
1283
+ });
1284
+ const VideoLayerTypeSchema = z.enum([
1285
+ "Video",
1286
+ "Image",
1287
+ "Audio",
1288
+ "Text",
1289
+ "Caption",
1290
+ "SVG",
1291
+ "GIF",
1292
+ "Lottie"
1293
+ ]);
1294
+ const BaseVideoLayerPropsSchema = VideoSpatialPropsSchema.merge(VideoTimingPropsSchema).merge(VideoTextPropsSchema).merge(VideoStylePropsSchema).extend({
1295
+ type: VideoLayerTypeSchema.optional(),
1296
+ animations: z.array(VideoAnimationSchema).optional()
1297
+ });
1298
+ const TransitionTypeSchema = z.enum([
1299
+ "none",
1300
+ "crossfade",
1301
+ "wipe-left",
1302
+ "wipe-right",
1303
+ "slide-up",
1304
+ "slide-down"
1305
+ ]);
1306
+ const TransitionSchema = z.object({
1307
+ type: TransitionTypeSchema,
1308
+ durationFrames: z.number().min(1)
1309
+ });
1310
+ const MediaSourceSchema = z.object({ entity: FileAssetSchema.optional() });
1311
+ const MediaMetadataSchema = z.object({
1312
+ width: z.number().optional().nullable(),
1313
+ height: z.number().optional().nullable(),
1314
+ fps: z.number().optional().nullable(),
1315
+ durationMs: z.number().optional().nullable(),
1316
+ sampleRate: z.number().optional().nullable(),
1317
+ channels: z.number().optional().nullable(),
1318
+ bitDepth: z.number().optional().nullable(),
1319
+ audioCodec: z.string().optional().nullable(),
1320
+ audioBitrate: z.number().optional().nullable()
1321
+ });
1322
+ const TimelineSegmentSchema = z.object({
1323
+ startSec: z.number(),
1324
+ endSec: z.number().optional()
1325
+ });
1326
+ const TimelineTransformSchema = z.object({
1327
+ startFrame: z.number().optional(),
1328
+ segments: z.array(TimelineSegmentSchema).optional()
1329
+ });
1330
+ const BaseMediaOperationPropsSchema = z.object({
1331
+ volume: z.number().optional(),
1332
+ opacity: z.number().optional(),
1333
+ startFrame: z.number().optional(),
1334
+ timeline: TimelineTransformSchema.optional()
1335
+ });
1336
+ /** Original source file (leaf node) */
1337
+ const SourceOperationSchema = BaseMediaOperationPropsSchema.extend({
1338
+ op: z.literal("source"),
1339
+ source: MediaSourceSchema,
1340
+ sourceMeta: MediaMetadataSchema,
1341
+ dataType: z.enum(Object.values(DataTypeVal))
1342
+ });
1343
+ /** Text content (leaf node) */
1344
+ const TextOperationSchema = BaseMediaOperationPropsSchema.extend({
1345
+ op: z.literal("text"),
1346
+ text: z.string(),
1347
+ metadata: MediaMetadataSchema.optional(),
1348
+ dataType: z.enum(Object.values(DataTypeVal))
1349
+ }).passthrough();
1350
+ const MediaOperationSchema = z.union([
1351
+ SourceOperationSchema,
1352
+ TextOperationSchema,
1353
+ BaseMediaOperationPropsSchema.extend({
1354
+ op: z.string(),
1355
+ metadata: MediaMetadataSchema.optional(),
1356
+ dataType: z.enum(Object.values(DataTypeVal))
1357
+ }).passthrough()
1358
+ ]);
1359
+ const VirtualMediaDataSchema = z.lazy(() => z.object({
1360
+ metadata: MediaMetadataSchema,
1361
+ operation: MediaOperationSchema,
1362
+ children: z.array(VirtualMediaDataSchema).default([])
1363
+ }));
1364
+ const ExtendedLayerSchema = BaseVideoLayerPropsSchema.extend({
1365
+ id: z.string(),
1366
+ name: z.string().optional(),
1367
+ type: VideoLayerTypeSchema,
1368
+ virtualMedia: VirtualMediaDataSchema.optional(),
1369
+ transitionIn: TransitionSchema.optional(),
1370
+ transitionOut: TransitionSchema.optional(),
1371
+ durationInMS: z.number(),
1372
+ maxDurationInMS: z.number().optional(),
1373
+ src: z.string().optional(),
1374
+ volume: z.number().default(1),
1375
+ inputHandleId: z.string().optional(),
1376
+ isPlaceholder: z.boolean().optional(),
1377
+ lockAspect: z.boolean().optional(),
1378
+ lockRatio: z.boolean().optional(),
1379
+ zIndex: z.number().optional()
1380
+ }).strict();
1381
+ const DEFAULT_FPS = 60;
1382
+ const DEFAULT_DURATION_MS = 3e3;
1383
+ const DEFAULT_MEDIA_DIMENSION = 1080;
1384
+ /** Default styling applied to new Text layers. */
1385
+ const TEXT_LAYER_DEFAULTS = {
1386
+ fontSize: 60,
1387
+ fontFamily: "Inter",
1388
+ fill: "#ffffff",
1389
+ fontStyle: "normal",
1390
+ align: "start",
1391
+ padding: 0
1392
+ };
1393
+ /** Default styling applied to new Caption layers. */
1394
+ const CAPTION_LAYER_DEFAULTS = {
1395
+ fontSize: 48,
1396
+ fontFamily: "Inter",
1397
+ fill: "#ffffff",
1398
+ align: "center",
1399
+ verticalAlign: "bottom",
1400
+ padding: 0,
1401
+ lineHeight: 1.1,
1402
+ textAnimation: {
1403
+ in: "none",
1404
+ out: "none",
1405
+ entranceMs: 0,
1406
+ exitMs: 0,
1407
+ kinetic: "none",
1408
+ applyBy: "word",
1409
+ smoothing: true
1410
+ },
1411
+ bottomPadding: 60
1412
+ };
1413
+ /**
1414
+ * Identify the actual leaf media type (Video, Image, etc) by walking down the tree.
1415
+ * This can differ from getMediaType() if an operation (like Ken Burns) upgrades
1416
+ * an Image to a Video.
1417
+ */
1418
+ function getLeafMediaType(vv) {
1419
+ if (!vv) return void 0;
1420
+ if (vv.operation?.op === "source") return vv.operation.dataType;
1421
+ if (vv.children && vv.children.length > 0) return getLeafMediaType(vv.children[0]);
1422
+ return vv.operation.dataType;
1423
+ }
1424
+ /**
1425
+ * Resolve the MIME type of the leaf source media.
1426
+ */
1427
+ function resolveMediaMimeType(vv) {
1428
+ if (!vv) return void 0;
1429
+ if (vv.operation?.op === "source") {
1430
+ const op = vv.operation;
1431
+ if (op.mimeType) return op.mimeType;
1432
+ if (op.sourceMeta?.mimeType) return op.sourceMeta.mimeType;
1433
+ if (op.source?.entity?.mimeType) return op.source.entity.mimeType;
1434
+ const url = typeof op.source === "string" ? op.source : op.url ?? op.source?.url;
1435
+ if (typeof url === "string") {
1436
+ const ext = url.split(".").pop()?.toLowerCase();
1437
+ if (ext === "mp4") return "video/mp4";
1438
+ if (ext === "webm") return "video/webm";
1439
+ if (ext === "mov") return "video/quicktime";
1440
+ if (ext === "png") return "image/png";
1441
+ if (ext === "jpg" || ext === "jpeg") return "image/jpeg";
1442
+ if (ext === "webp") return "image/webp";
1443
+ if (ext === "svg") return "image/svg+xml";
1444
+ if (ext === "mp3") return "audio/mpeg";
1445
+ if (ext === "wav") return "audio/wav";
1446
+ if (ext === "aac") return "audio/aac";
1447
+ }
1448
+ }
1449
+ if (vv.children && vv.children.length > 0) return resolveMediaMimeType(vv.children[0]);
1450
+ }
1451
+ /**
1452
+ * Create a VirtualMediaData from a FileData source or Text.
1453
+ * Used by Import, VideoGen, and Text nodes to wrap concrete content.
1454
+ */
1455
+ function createVirtualMedia(source, type = "Video") {
1456
+ if (source && typeof source === "object" && "operation" in source && "metadata" in source) return source;
1457
+ if (typeof source === "string") {
1458
+ const url = source;
1459
+ const sourceMeta$1 = {
1460
+ width: void 0,
1461
+ height: void 0,
1462
+ durationMs: type === "Image" || /\.(png|jpg|jpeg|webp|gif|svg)$/i.test(url) ? DEFAULT_DURATION_MS : void 0,
1463
+ fps: void 0
1464
+ };
1465
+ return {
1466
+ metadata: sourceMeta$1,
1467
+ operation: {
1468
+ op: "source",
1469
+ url,
1470
+ source: url,
1471
+ sourceMeta: sourceMeta$1,
1472
+ dataType: type
1473
+ },
1474
+ children: []
1475
+ };
1476
+ }
1477
+ if (typeof source === "object" && source !== null && ("url" in source || "path" in source)) {
1478
+ const desc = source;
1479
+ const url = desc.url ?? desc.path;
1480
+ const isImage = type === "Image" || /\.(png|jpg|jpeg|webp|gif|svg)$/i.test(url);
1481
+ const durationMs = desc.durationMs ?? (isImage ? DEFAULT_DURATION_MS : void 0);
1482
+ const sourceMeta$1 = {
1483
+ width: desc.width,
1484
+ height: desc.height,
1485
+ durationMs,
1486
+ fps: desc.fps,
1487
+ sampleRate: desc.sampleRate,
1488
+ channels: desc.channels,
1489
+ bitDepth: desc.bitDepth,
1490
+ audioCodec: desc.audioCodec,
1491
+ audioBitrate: desc.audioBitrate
1492
+ };
1493
+ return {
1494
+ metadata: sourceMeta$1,
1495
+ operation: {
1496
+ op: "source",
1497
+ url,
1498
+ source: url,
1499
+ sourceMeta: sourceMeta$1,
1500
+ dataType: type
1501
+ },
1502
+ children: []
1503
+ };
1504
+ }
1505
+ const sourceMeta = getFileDataMetadata(source) || {
1506
+ width: void 0,
1507
+ height: void 0,
1508
+ durationMs: void 0,
1509
+ fps: void 0
1510
+ };
1511
+ return {
1512
+ metadata: sourceMeta,
1513
+ operation: {
1514
+ op: "source",
1515
+ source: { entity: source?.entity },
1516
+ sourceMeta,
1517
+ dataType: type
1518
+ },
1519
+ children: []
1520
+ };
1521
+ }
1522
+ /**
1523
+ * Identify if a VirtualMediaData node is intended to be Video, Audio, Image, or Text.
1524
+ */
1525
+ function getMediaType(vv) {
1526
+ if (!vv) throw new Error("No media data provided");
1527
+ return vv.operation.dataType;
1528
+ }
1529
+ /**
1530
+ * Append an operation to an existing VirtualMediaData (recursive).
1531
+ * This creates a new parent node wrapping the current one as a child.
1532
+ */
1533
+ function appendOperation(vv, operation) {
1534
+ return {
1535
+ metadata: computeNextMetadata(getActiveMediaMetadata(vv) ?? {}, operation),
1536
+ operation,
1537
+ children: [vv]
1538
+ };
1539
+ }
1540
+ /**
1541
+ * Helper to compute the metadata of the NEXT node in the operator tree.
1542
+ */
1543
+ function computeNextMetadata(baseMeta, op) {
1544
+ let { width, height, durationMs, fps, sampleRate, channels, bitDepth, audioCodec, audioBitrate } = baseMeta;
1545
+ if ("metadata" in op && op.metadata) {
1546
+ width = op.metadata.width ?? width;
1547
+ height = op.metadata.height ?? height;
1548
+ durationMs = op.metadata.durationMs ?? durationMs;
1549
+ fps = op.metadata.fps ?? fps;
1550
+ sampleRate = op.metadata.sampleRate ?? sampleRate;
1551
+ channels = op.metadata.channels ?? channels;
1552
+ bitDepth = op.metadata.bitDepth ?? bitDepth;
1553
+ audioCodec = op.metadata.audioCodec ?? audioCodec;
1554
+ audioBitrate = op.metadata.audioBitrate ?? audioBitrate;
1555
+ }
1556
+ if (op.dataType === "Audio" || op.dataType === "Text" || op.dataType === "Caption") {
1557
+ width = void 0;
1558
+ height = void 0;
1559
+ fps = void 0;
1560
+ }
1561
+ return {
1562
+ width,
1563
+ height,
1564
+ durationMs,
1565
+ fps,
1566
+ sampleRate,
1567
+ channels,
1568
+ bitDepth,
1569
+ audioCodec,
1570
+ audioBitrate
1571
+ };
1572
+ }
1573
+ function getFileDataMetadata(filedata) {
1574
+ if (!filedata) return null;
1575
+ const { entity } = filedata;
1576
+ const width = entity?.width;
1577
+ const height = entity?.height;
1578
+ let durationMs = entity?.duration;
1579
+ const fps = entity?.fps;
1580
+ const sampleRate = entity?.sampleRate;
1581
+ const channels = entity?.channels;
1582
+ const bitDepth = entity?.bitDepth;
1583
+ const audioCodec = entity?.audioCodec;
1584
+ const audioBitrate = entity?.audioBitrate;
1585
+ if (durationMs === void 0 || durationMs === null) {
1586
+ const mimeType = entity?.mimeType ?? "";
1587
+ if (mimeType.startsWith("image/") || mimeType === "image/svg+xml") durationMs = DEFAULT_DURATION_MS;
1588
+ }
1589
+ if (width === void 0 && height === void 0 && durationMs === void 0 && sampleRate === void 0 && channels === void 0) return null;
1590
+ return {
1591
+ width,
1592
+ height,
1593
+ durationMs: durationMs === 0 ? void 0 : durationMs,
1594
+ fps,
1595
+ sampleRate,
1596
+ channels,
1597
+ bitDepth,
1598
+ audioCodec,
1599
+ audioBitrate
1600
+ };
1601
+ }
1602
+ /**
1603
+ * Get the active metadata from the VirtualMediaData node.
1604
+ * Simply returns the metadata property of the node.
1605
+ * Supports legacy formats (sourceMeta) and extracts from source if needed.
1606
+ */
1607
+ function getActiveMediaMetadata(vv) {
1608
+ if (!vv) return null;
1609
+ let width = vv.metadata?.width;
1610
+ let height = vv.metadata?.height;
1611
+ let durationMs = vv.metadata?.durationMs;
1612
+ let fps = vv.metadata?.fps;
1613
+ let sampleRate = vv.metadata?.sampleRate;
1614
+ let channels = vv.metadata?.channels;
1615
+ let bitDepth = vv.metadata?.bitDepth;
1616
+ let audioCodec = vv.metadata?.audioCodec;
1617
+ let audioBitrate = vv.metadata?.audioBitrate;
1618
+ const op = vv.operation;
1619
+ if (op?.op === "source") {
1620
+ const sm = op.sourceMeta || {};
1621
+ const fdm = op.source ? getFileDataMetadata(op.source) : null;
1622
+ width = width ?? sm.width ?? fdm?.width;
1623
+ height = height ?? sm.height ?? fdm?.height;
1624
+ durationMs = durationMs ?? sm.durationMs ?? fdm?.durationMs;
1625
+ fps = fps ?? sm.fps ?? fdm?.fps;
1626
+ sampleRate = sampleRate ?? sm.sampleRate ?? fdm?.sampleRate;
1627
+ channels = channels ?? sm.channels ?? fdm?.channels;
1628
+ bitDepth = bitDepth ?? sm.bitDepth ?? fdm?.bitDepth;
1629
+ audioCodec = audioCodec ?? sm.audioCodec ?? fdm?.audioCodec;
1630
+ audioBitrate = audioBitrate ?? sm.audioBitrate ?? fdm?.audioBitrate;
1631
+ }
1632
+ if (width === void 0 && height === void 0 && durationMs === void 0 && sampleRate === void 0 && channels === void 0) return null;
1633
+ return {
1634
+ width,
1635
+ height,
1636
+ durationMs: durationMs === 0 ? void 0 : durationMs,
1637
+ fps,
1638
+ sampleRate,
1639
+ channels,
1640
+ bitDepth,
1641
+ audioCodec,
1642
+ audioBitrate
1643
+ };
1644
+ }
1645
+ /**
1646
+ * Compute the dimensions and offsets for rendering a cropped video.
1647
+ * Traverses the VirtualMediaData tree to find nested crops and source dimensions.
1648
+ */
1649
+ function computeVideoCropRenderProps(virtualMedia) {
1650
+ let totalOffsetX = 0;
1651
+ let totalOffsetY = 0;
1652
+ let hasCrop = false;
1653
+ let sourceMetaFound = null;
1654
+ let currentNode = virtualMedia;
1655
+ while (currentNode) {
1656
+ const op = currentNode.operation;
1657
+ if (op.op === "Crop") {
1658
+ hasCrop = true;
1659
+ const anyOp = op;
1660
+ const inputMeta = currentNode.children[0]?.metadata;
1661
+ const inputW = inputMeta?.width ?? 0;
1662
+ const inputH = inputMeta?.height ?? 0;
1663
+ if (inputW > 0 && inputH > 0) {
1664
+ const cropLeftPx = anyOp.leftPercentage / 100 * inputW;
1665
+ const cropTopPx = anyOp.topPercentage / 100 * inputH;
1666
+ totalOffsetX += cropLeftPx;
1667
+ totalOffsetY += cropTopPx;
1668
+ }
1669
+ }
1670
+ if (op.op === "source") sourceMetaFound = op.sourceMeta ?? currentNode.metadata;
1671
+ currentNode = currentNode.children[0];
1672
+ }
1673
+ if (!hasCrop || !sourceMetaFound) return null;
1674
+ const sourceW = sourceMetaFound.width ?? 1;
1675
+ const sourceH = sourceMetaFound.height ?? 1;
1676
+ return {
1677
+ videoNaturalWidth: sourceW,
1678
+ videoNaturalHeight: sourceH,
1679
+ cropTranslatePercentageX: -(totalOffsetX / sourceW) * 100,
1680
+ cropTranslatePercentageY: -(totalOffsetY / sourceH) * 100
1681
+ };
1682
+ }
1683
+ /**
1684
+ * Performs a deep comparison between two values to determine if they are equivalent.
1685
+ * Handles primitives, objects, arrays, Dates, and NaNs.
1686
+ */
1687
+ function isEqual(a, b) {
1688
+ if (a === b) return true;
1689
+ if (typeof a === "number" && typeof b === "number" && Number.isNaN(a) && Number.isNaN(b)) return true;
1690
+ if (a && b && typeof a === "object" && typeof b === "object") {
1691
+ if (a.constructor !== b.constructor) return false;
1692
+ if (Array.isArray(a)) {
1693
+ if (a.length !== b.length) return false;
1694
+ for (let i = 0; i < a.length; i++) if (!isEqual(a[i], b[i])) return false;
1695
+ return true;
1696
+ }
1697
+ if (a instanceof Date) return a.getTime() === b.getTime();
1698
+ if (a instanceof RegExp) return a.toString() === b.toString();
1699
+ const keys = Object.keys(a);
1700
+ if (keys.length !== Object.keys(b).length) return false;
1701
+ for (const key of keys) {
1702
+ if (!Object.hasOwn(b, key)) return false;
1703
+ if (!isEqual(a[key], b[key])) return false;
1704
+ }
1705
+ return true;
1706
+ }
1707
+ return false;
1708
+ }
1709
+ /**
1710
+ * Gets a stable object for hashing/fingerprinting by sorting keys and skipping volatile fields.
1711
+ */
1712
+ function getStableData(data) {
1713
+ if (typeof data !== "object" || data === null) return data;
1714
+ if (Array.isArray(data)) return data.map(getStableData);
1715
+ const result = {};
1716
+ const keys = Object.keys(data).sort();
1717
+ for (const key of keys) {
1718
+ const val = data[key];
1719
+ if (key === "createdAt" || key === "updatedAt" || key === "dataUrl" || key === "filePath") continue;
1720
+ if (typeof val === "string" && val.startsWith("blob:")) continue;
1721
+ if (key === "entity" && val && typeof val === "object" && val.id) {
1722
+ result.entity = { id: val.id };
1723
+ continue;
1724
+ }
1725
+ result[key] = getStableData(val);
1726
+ }
1727
+ return result;
1728
+ }
1729
+ /**
1730
+ * Generates a fingerprint for the given data.
1731
+ */
1732
+ function getFingerprint(data) {
1733
+ const stableData = getStableData(data);
1734
+ const str = JSON.stringify(stableData);
1735
+ if (str.length === 0) return "0";
1736
+ const getHash = (seed) => {
1737
+ let h1 = 3735928559 ^ seed;
1738
+ let h2 = 1103547991 ^ seed;
1739
+ for (let i = 0; i < str.length; i++) {
1740
+ const ch = str.charCodeAt(i);
1741
+ h1 = Math.imul(h1 ^ ch, 2654435761);
1742
+ h2 = Math.imul(h2 ^ ch, 1597334677);
1743
+ }
1744
+ h1 = Math.imul(h1 ^ h1 >>> 16, 2246822519);
1745
+ h1 = Math.imul(h1 ^ h1 >>> 13, 3266489917);
1746
+ h1 = h1 ^ h1 >>> 16;
1747
+ h2 = Math.imul(h2 ^ h2 >>> 16, 2246822519);
1748
+ h2 = Math.imul(h2 ^ h2 >>> 13, 3266489917);
1749
+ h2 = h2 ^ h2 >>> 16;
1750
+ return (h1 >>> 0).toString(36).padStart(7, "0") + (h2 >>> 0).toString(36).padStart(7, "0");
1751
+ };
1752
+ return getHash(0) + getHash(1);
1753
+ }
1754
+ /**
1755
+ * Generates a version-aware fingerprint for render caching.
1756
+ * Includes app version so cached renders are invalidated on version bumps.
1757
+ */
1758
+ function getRenderFingerprint(data, appVersion, extra) {
1759
+ return getFingerprint({
1760
+ __v: appVersion,
1761
+ data,
1762
+ ...extra
1763
+ });
1764
+ }
1765
+ /**
1766
+ * Checks if data is VirtualMediaData.
1767
+ */
1768
+ function isVirtualMediaData(data) {
1769
+ return typeof data === "object" && data !== null && "metadata" in data && "operation" in data && "children" in data;
1770
+ }
1771
+ /**
1772
+ * Checks if the virtual media is just a raw source without any significant operations
1773
+ * that would require a rendering step (like transformations, trimming, or effects).
1774
+ */
1775
+ function hasOnlySingleSource(data) {
1776
+ if (!isVirtualMediaData(data)) return false;
1777
+ if (data.operation.op === "source") {
1778
+ if (data.children && data.children.length > 0) return false;
1779
+ const op = data.operation;
1780
+ return !(op.volume !== void 0 && op.volume !== 1 || op.opacity !== void 0 && op.opacity !== 1 || op.startFrame !== void 0 && op.startFrame !== 0 || op.timeline && (op.timeline.startFrame !== void 0 && op.timeline.startFrame !== 0 || op.timeline.segments && op.timeline.segments.length > 0));
1781
+ }
1782
+ if (data.operation.op === "compose") return false;
1783
+ if (data.operation.op === "layer" && data.children.length === 1) {
1784
+ const op = data.operation;
1785
+ if (!(op.x !== void 0 && op.x !== 0 || op.y !== void 0 && op.y !== 0 || op.rotation !== void 0 && op.rotation !== 0 || op.scale !== void 0 && op.scale !== 1 || op.opacity !== void 0 && op.opacity !== 1 || op.volume !== void 0 && op.volume !== 1 || op.zIndex !== void 0 || op.blendMode !== void 0 || op.filters !== void 0 || op.transitionIn !== void 0 || op.transitionOut !== void 0 || op.animations && op.animations.length > 0 || op.trimStart !== void 0 || op.trimEnd !== void 0 || op.speed !== void 0 || op.backgroundColor !== void 0 || op.borderColor !== void 0 || op.borderWidth !== void 0 || op.strokeRadius !== void 0)) return hasOnlySingleSource(data.children[0]);
1786
+ }
1787
+ return false;
1788
+ }
1789
+ /**
1790
+ * Finds the source asset in a virtual media tree.
1791
+ */
1792
+ function findSourceAsset(vm) {
1793
+ if (vm.operation.op === "source") return vm.operation.source;
1794
+ if (vm.children && vm.children.length > 0) return findSourceAsset(vm.children[0]);
1795
+ return null;
1796
+ }
1797
+ /**
1798
+ * Checks if a cached node result can be reused based on source fingerprint.
1799
+ * Returns the valid cached result, or null if the cache is stale.
1800
+ */
1801
+ function checkNodeResultCache(currentResult, input) {
1802
+ if (!currentResult?.sourceFingerprint) return null;
1803
+ const inputFingerprint = getFingerprint(input);
1804
+ if (currentResult.sourceFingerprint !== inputFingerprint) return null;
1805
+ return currentResult;
1806
+ }
1807
+ /**
1808
+ * Creates a fresh result with a source fingerprint stamp.
1809
+ */
1810
+ function stampResult(result, input) {
1811
+ return {
1812
+ ...result,
1813
+ sourceFingerprint: getFingerprint(input)
1814
+ };
1815
+ }
1816
+ /**
1817
+ * Attempts to parse the width and height of an SVG from its buffer.
1818
+ * Falls back to viewBox ratios if explicitly defined sizes are missing.
1819
+ */
1820
+ function extractSvgDimensions(buffer) {
1821
+ try {
1822
+ const match = buffer.toString("utf-8").match(/<svg[^>]*>/i);
1823
+ if (!match) return null;
1824
+ const svgTag = match[0];
1825
+ const getAttr = (name) => {
1826
+ const attrMatch = svgTag.match(new RegExp(`${name}=["']([^"']+)["']`, "i"));
1827
+ if (!attrMatch) return null;
1828
+ const val = parseFloat(attrMatch[1].replace(/[a-z%]/gi, ""));
1829
+ return isNaN(val) ? null : val;
1830
+ };
1831
+ let w = getAttr("width");
1832
+ let h = getAttr("height");
1833
+ const viewBoxMatch = svgTag.match(/viewBox=["']([^"']+)["']/i);
1834
+ if (viewBoxMatch) {
1835
+ const parts = viewBoxMatch[1].split(/[\s,]+/).map(parseFloat);
1836
+ if (parts.length >= 4 && !isNaN(parts[2]) && !isNaN(parts[3])) {
1837
+ const vbW = parts[2];
1838
+ const vbH = parts[3];
1839
+ if (w == null && h == null) {
1840
+ w = vbW;
1841
+ h = vbH;
1842
+ } else if (w != null && h == null) h = w * (vbH / vbW);
1843
+ else if (h != null && w == null) w = h * (vbW / vbH);
1844
+ }
1845
+ }
1846
+ if (w != null && h != null && w > 0 && h > 0) return {
1847
+ w,
1848
+ h
1849
+ };
1850
+ return null;
1851
+ } catch (error) {
1852
+ console.error("Error parsing SVG dimensions", error);
1853
+ return null;
1854
+ }
1855
+ }
1856
+
1857
+ //#endregion
1858
+ export { VideoAnimationSchema as $, MediaSourceSchema as A, programmaticSignal as At, SignalChannelMetaSchema as B, takeRenderDiagnostics as Bt, GeneratorSignalDataSchema as C, getLeafMediaType as Ct, MIME_TYPES as D, isEqual as Dt, JsonValueSchema as E, hasOnlySingleSource as Et, NodeResultSchema as F, serializeSignalData as Ft, SingleOutputGenericSchema as G, SignalGateDataSchema as H, updateClockSignals as Ht, NodeVisualConfigSchema as I, signal as It, TextOperationSchema as J, SourceOperationSchema as K, OutputItemSchema as L, signalBuilder as Lt, ModerationUnrefundableError as M, registerSignalDependency as Mt, MultiOutputGenericSchema as N, reportRenderDiagnostic as Nt, MediaMetadataSchema as O, isSignal as Ot, NodeMetadataSchema as P, resolveMediaMimeType as Pt, TransitionTypeSchema as Q, ProgrammaticSignal as R, sineSignal as Rt, FileDataSchema as S, getFingerprint as St, HandleTypeVal as T, getRenderFingerprint as Tt, SignalMathDataSchema as U, SignalDataSchema as V, timeSignal as Vt, SignalStatsSchema as W, TimelineTransformSchema as X, TimelineSegmentSchema as Y, TransitionSchema as Z, DataTypes as _, frameArraySignal as _t, BaseVideoLayerPropsSchema as a, VirtualMediaDataSchema as at, ExtendedLayerSchema as b, getActiveMediaMetadata as bt, COMPOSITOR_DEFAULTS as c, computeVideoCropRenderProps as ct, DATA_TYPE_EXTENSIONS as d, createOutputItemSchema as dt, VideoLayerTypeSchema as et, DEFAULT_DURATION_MS as f, createVirtualMedia as ft, DataTypeVal as g, findSourceAsset as gt, DataType as h, extractSvgDimensions as ht, BaseMediaOperationPropsSchema as i, VideoTimingPropsSchema as it, ModerationError as j, progressSignal as jt, MediaOperationSchema as k, isVirtualMediaData as kt, ConfigHandleSchema as l, computed as lt, DEFAULT_MEDIA_DIMENSION as m, deserializeSignalData as mt, AnyOutputUnionSchema as n, VideoStylePropsSchema as nt, CAPTION_LAYER_DEFAULTS as o, appendOperation as ot, DEFAULT_FPS as p, dataTypeColors as pt, TEXT_LAYER_DEFAULTS as q, AudioExtractorSignalDataSchema as r, VideoTextPropsSchema as rt, COMPOSITE_OPERATIONS as s, checkNodeResultCache as st, AnimationTypeSchema as t, VideoSpatialPropsSchema as tt, ConfigSchemaRegistry as u, cosineSignal as ut, Effect as v, frameSignal as vt, GlobalCompositeOperation as w, getMediaType as wt, FileAssetSchema as x, getFileDataMetadata as xt, ExportResultSchema as y, generateId as yt, Signal as z, stampResult as zt };
1859
+ //# sourceMappingURL=dist-Bx6J0VcM.mjs.map