framefields 2.0.2 → 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 (206) hide show
  1. package/README.md +10 -32
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-x28ZgQBP.mjs → audio-COkiXyDb.mjs} +3 -3
  5. package/dist/{audio-x28ZgQBP.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-1iUYuPct.mjs → dist-55MP0aN4.mjs} +59 -16
  9. package/dist/dist-55MP0aN4.mjs.map +1 -0
  10. package/dist/{dist-gjHmorxL.mjs → dist-DgIKXWZ1.mjs} +75 -16
  11. package/dist/dist-DgIKXWZ1.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +23 -23
  14. package/dist/{effects-CHWORCYd.mjs → effects-m3FuatqZ.mjs} +2 -2
  15. package/dist/{effects-CHWORCYd.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-DrGTBJJk.mjs → fonts-C_AWIMdb.mjs} +13 -2
  19. package/dist/fonts-C_AWIMdb.mjs.map +1 -0
  20. package/dist/{index-DKFGNyMB.d.mts → index-Bx7JBFT6.d.mts} +9 -2
  21. package/dist/index-Bx7JBFT6.d.mts.map +1 -0
  22. package/dist/{index-B0BNPEoH.d.mts → index-C8rstr3Y.d.mts} +5 -5
  23. package/dist/index-C8rstr3Y.d.mts.map +1 -0
  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-ogL8Y-Ng.d.mts.map +1 -0
  34. package/dist/index.d.mts +88 -70
  35. package/dist/index.d.mts.map +1 -1
  36. package/dist/index.mjs +44 -39
  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-uQM210iy.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-MT2DZQHO.mjs → chunk-4Q7JG6WJ.mjs} +1 -1
  45. package/dist/preview-engine/chunk-7S6ZFYLI.mjs +418 -0
  46. package/dist/preview-engine/chunk-KNZU3Z2F.mjs +3 -0
  47. package/dist/preview-engine/{chunk-SWD76532.mjs → chunk-PCB2VB5K.mjs} +2 -2
  48. package/dist/preview-engine/{chunk-GYG2IIBR.mjs → chunk-RJJRPL42.mjs} +1 -1
  49. package/dist/preview-engine/chunk-UC7CSW2A.mjs +1 -0
  50. package/dist/preview-engine/{chunk-4BEJJKEU.mjs → chunk-YK4XHUP4.mjs} +7 -7
  51. package/dist/preview-engine/effects.mjs +1 -1
  52. package/dist/preview-engine/fonts.mjs +1 -1
  53. package/dist/preview-engine/framefields.mjs +84 -76
  54. package/dist/preview-engine/player.mjs +5 -5
  55. package/dist/preview-engine/{renderers-YVN3EIOP.mjs → renderers-76MPTVZK.mjs} +1 -1
  56. package/dist/preview-engine/{renderers-R3XEYD5V.mjs → renderers-LFA5NW4V.mjs} +1 -1
  57. package/dist/{program-Dl510wmI.mjs → program-DGqyGGvj.mjs} +2 -2
  58. package/dist/{program-Dl510wmI.mjs.map → program-DGqyGGvj.mjs.map} +1 -1
  59. package/dist/renderer/index.d.mts +2 -2
  60. package/dist/renderer/index.mjs +2 -2
  61. package/dist/renderer--fkO4O8d.mjs +3 -0
  62. package/dist/{renderer-D7EX8IjU.mjs → renderer-0gJC-sc8.mjs} +2 -2
  63. package/dist/{renderer-D7EX8IjU.mjs.map → renderer-0gJC-sc8.mjs.map} +1 -1
  64. package/dist/{renderer-7DOcIxFG.mjs → renderer-2r4EgfdZ.mjs} +2 -2
  65. package/dist/{renderer-7DOcIxFG.mjs.map → renderer-2r4EgfdZ.mjs.map} +1 -1
  66. package/dist/{renderer-COkcU3db.mjs → renderer-5OiVjQan.mjs} +4 -4
  67. package/dist/{renderer-COkcU3db.mjs.map → renderer-5OiVjQan.mjs.map} +1 -1
  68. package/dist/renderer-6x7CgHhJ.mjs +3 -0
  69. package/dist/renderer-B0RDWv1C.mjs +3 -0
  70. package/dist/{renderer-CMzEjdzi.mjs → renderer-B9l641o-.mjs} +2 -2
  71. package/dist/{renderer-CMzEjdzi.mjs.map → renderer-B9l641o-.mjs.map} +1 -1
  72. package/dist/renderer-BFOkGS0N.mjs +3 -0
  73. package/dist/{renderer-pxXf9dvk.mjs → renderer-BJiL-BQY.mjs} +2 -2
  74. package/dist/{renderer-pxXf9dvk.mjs.map → renderer-BJiL-BQY.mjs.map} +1 -1
  75. package/dist/{renderer-B1CvhW4p.mjs → renderer-BMrm2Zbz.mjs} +2 -2
  76. package/dist/{renderer-B1CvhW4p.mjs.map → renderer-BMrm2Zbz.mjs.map} +1 -1
  77. package/dist/{renderer-Cj-whdVr.mjs → renderer-BUHMkkLU.mjs} +2 -2
  78. package/dist/{renderer-Cj-whdVr.mjs.map → renderer-BUHMkkLU.mjs.map} +1 -1
  79. package/dist/{renderer-CB5aWAaf.mjs → renderer-BYsmLk63.mjs} +2 -2
  80. package/dist/{renderer-CB5aWAaf.mjs.map → renderer-BYsmLk63.mjs.map} +1 -1
  81. package/dist/renderer-BaoJiMJO.mjs +3 -0
  82. package/dist/{renderer-DbaQLI4z.mjs → renderer-BtkU0BT-.mjs} +2 -2
  83. package/dist/{renderer-DbaQLI4z.mjs.map → renderer-BtkU0BT-.mjs.map} +1 -1
  84. package/dist/{renderer-Dt6fzgX5.mjs → renderer-Bwsh5TUv.mjs} +2 -2
  85. package/dist/{renderer-Dt6fzgX5.mjs.map → renderer-Bwsh5TUv.mjs.map} +1 -1
  86. package/dist/{renderer-vCFTm0oe.mjs → renderer-C28Bab-M.mjs} +2 -2
  87. package/dist/{renderer-vCFTm0oe.mjs.map → renderer-C28Bab-M.mjs.map} +1 -1
  88. package/dist/{renderer-HFfcJlmR.mjs → renderer-C3L9SNRO.mjs} +2 -2
  89. package/dist/{renderer-HFfcJlmR.mjs.map → renderer-C3L9SNRO.mjs.map} +1 -1
  90. package/dist/renderer-C4O-L73n.mjs +3 -0
  91. package/dist/{renderer-CB7lH5K8.mjs → renderer-C9BKcHZb.mjs} +1 -1
  92. package/dist/renderer-CGVuhBbA.mjs +3 -0
  93. package/dist/renderer-CHKB-Or4.mjs +3 -0
  94. package/dist/renderer-CL9gPcfZ.mjs +3 -0
  95. package/dist/{renderer-BXMmISWG.mjs → renderer-CMM4DZ1i.mjs} +2 -2
  96. package/dist/{renderer-BXMmISWG.mjs.map → renderer-CMM4DZ1i.mjs.map} +1 -1
  97. package/dist/{renderer-C17wL9QX.mjs → renderer-COkFM1KL.mjs} +2 -2
  98. package/dist/{renderer-C17wL9QX.mjs.map → renderer-COkFM1KL.mjs.map} +1 -1
  99. package/dist/renderer-CSkFF-qe.mjs +3 -0
  100. package/dist/renderer-CU2c6zWc.mjs +3 -0
  101. package/dist/{renderer-CDOUAN7X.mjs → renderer-CXUohIJ9.mjs} +2 -2
  102. package/dist/{renderer-CDOUAN7X.mjs.map → renderer-CXUohIJ9.mjs.map} +1 -1
  103. package/dist/{renderer-ByDhfrPE.mjs → renderer-CeADvUU_.mjs} +2 -2
  104. package/dist/{renderer-ByDhfrPE.mjs.map → renderer-CeADvUU_.mjs.map} +1 -1
  105. package/dist/{renderer-CH8sdfYX.mjs → renderer-CgVdRbc-.mjs} +2 -2
  106. package/dist/{renderer-CH8sdfYX.mjs.map → renderer-CgVdRbc-.mjs.map} +1 -1
  107. package/dist/renderer-CiLiH6w_.mjs +3 -0
  108. package/dist/{renderer-Dp_FfvF-.mjs → renderer-CnRoblJF.mjs} +2 -2
  109. package/dist/{renderer-Dp_FfvF-.mjs.map → renderer-CnRoblJF.mjs.map} +1 -1
  110. package/dist/{renderer-BAQmR0Zo.mjs → renderer-CsQ7nY0z.mjs} +1 -1
  111. package/dist/{renderer-CclIvsLO.mjs → renderer-CwAjqb2o.mjs} +1 -1
  112. package/dist/{renderer-CszOjcRW.mjs → renderer-Cx5H41JR.mjs} +1 -1
  113. package/dist/{renderer-Fco4EmAu.mjs → renderer-D1Zs78PQ.mjs} +126 -105
  114. package/dist/{renderer-Fco4EmAu.mjs.map → renderer-D1Zs78PQ.mjs.map} +1 -1
  115. package/dist/{renderer-BQHbp-Sp.mjs → renderer-D1ib-wB3.mjs} +2 -2
  116. package/dist/{renderer-BQHbp-Sp.mjs.map → renderer-D1ib-wB3.mjs.map} +1 -1
  117. package/dist/{renderer-Tp6OXWNZ.mjs → renderer-D54yO_M_.mjs} +2 -2
  118. package/dist/{renderer-Tp6OXWNZ.mjs.map → renderer-D54yO_M_.mjs.map} +1 -1
  119. package/dist/{renderer-Cl1oUXMi.mjs → renderer-D5N2JO7g.mjs} +2 -2
  120. package/dist/{renderer-Cl1oUXMi.mjs.map → renderer-D5N2JO7g.mjs.map} +1 -1
  121. package/dist/{renderer-BsgIcBKH.mjs → renderer-DBp6A7tR.mjs} +2 -2
  122. package/dist/{renderer-BsgIcBKH.mjs.map → renderer-DBp6A7tR.mjs.map} +1 -1
  123. package/dist/{renderer-vvpdx1vk.mjs → renderer-DI2RcpKU.mjs} +2 -2
  124. package/dist/{renderer-vvpdx1vk.mjs.map → renderer-DI2RcpKU.mjs.map} +1 -1
  125. package/dist/renderer-DMaYsSM4.mjs +3 -0
  126. package/dist/renderer-DZ7t_l1d.mjs +3 -0
  127. package/dist/{renderer-Ryo2CEFD.mjs → renderer-D_QS6p1q.mjs} +2 -2
  128. package/dist/{renderer-Ryo2CEFD.mjs.map → renderer-D_QS6p1q.mjs.map} +1 -1
  129. package/dist/{renderer-DDp7_TUi.d.mts → renderer-DcPOsAVu.d.mts} +2 -2
  130. package/dist/{renderer-DDp7_TUi.d.mts.map → renderer-DcPOsAVu.d.mts.map} +1 -1
  131. package/dist/{renderer-B_NuVaIP.mjs → renderer-Dcd-Pkzd.mjs} +2 -2
  132. package/dist/{renderer-B_NuVaIP.mjs.map → renderer-Dcd-Pkzd.mjs.map} +1 -1
  133. package/dist/{renderer-WkVrkCVA.mjs → renderer-DjiUZ0Vs.mjs} +2 -2
  134. package/dist/{renderer-WkVrkCVA.mjs.map → renderer-DjiUZ0Vs.mjs.map} +1 -1
  135. package/dist/renderer-DkJEnKQu.mjs +3 -0
  136. package/dist/renderer-DlkrKqQj.mjs +3 -0
  137. package/dist/renderer-DxOQ5S8T.mjs +3 -0
  138. package/dist/renderer-Ibvw1tE_.mjs +3 -0
  139. package/dist/{renderer-CwQhzcUn.mjs → renderer-JjMO41Cv.mjs} +2 -2
  140. package/dist/{renderer-CwQhzcUn.mjs.map → renderer-JjMO41Cv.mjs.map} +1 -1
  141. package/dist/renderer-M0jeFo6S.mjs +4 -0
  142. package/dist/renderer-NhSzqWsQ.mjs +3 -0
  143. package/dist/renderer-OrhgkzVu.mjs +3 -0
  144. package/dist/{renderer-DxjVQV6f.mjs → renderer-Q7_DUcnu.mjs} +2 -2
  145. package/dist/{renderer-DxjVQV6f.mjs.map → renderer-Q7_DUcnu.mjs.map} +1 -1
  146. package/dist/{renderer-I-Sw3JBB.mjs → renderer-QfSB-cRU.mjs} +2 -2
  147. package/dist/{renderer-I-Sw3JBB.mjs.map → renderer-QfSB-cRU.mjs.map} +1 -1
  148. package/dist/{renderer-OWQmmg4Z.mjs → renderer-WXylxlu2.mjs} +2 -2
  149. package/dist/{renderer-OWQmmg4Z.mjs.map → renderer-WXylxlu2.mjs.map} +1 -1
  150. package/dist/renderer-WrFAaLxW.mjs +3 -0
  151. package/dist/renderer-bbOALT4F.mjs +3 -0
  152. package/dist/{renderer-BGXU6vcW.mjs → renderer-bebAt6Dz.mjs} +2 -2
  153. package/dist/{renderer-BGXU6vcW.mjs.map → renderer-bebAt6Dz.mjs.map} +1 -1
  154. package/dist/{renderer-B9-QSJcG.mjs → renderer-eC1gRPRo.mjs} +2 -2
  155. package/dist/{renderer-B9-QSJcG.mjs.map → renderer-eC1gRPRo.mjs.map} +1 -1
  156. package/dist/renderer-lXmyzdcx.mjs +3 -0
  157. package/dist/renderer-ospMsCzr.mjs +3 -0
  158. package/dist/{renderer-k2JL79kM.mjs → renderer-vUjNMbLq.mjs} +2 -2
  159. package/dist/{renderer-k2JL79kM.mjs.map → renderer-vUjNMbLq.mjs.map} +1 -1
  160. package/dist/renderer-xc9wkiC7.mjs +3 -0
  161. package/dist/{renderer-XcmYTd6P.mjs → renderer-z6Qb5Z-W.mjs} +143 -4
  162. package/dist/renderer-z6Qb5Z-W.mjs.map +1 -0
  163. package/dist/{renderers-BWg16W-V-BXG_cjhM.mjs → renderers-BWg16W-V-jhdCp6Vd.mjs} +2 -2
  164. package/dist/{renderers-BWg16W-V-BXG_cjhM.mjs.map → renderers-BWg16W-V-jhdCp6Vd.mjs.map} +1 -1
  165. package/dist/signals/index.d.mts +5 -5
  166. package/dist/signals/index.mjs +4 -4
  167. package/package.json +55 -55
  168. package/dist/dist-1iUYuPct.mjs.map +0 -1
  169. package/dist/dist-gjHmorxL.mjs.map +0 -1
  170. package/dist/fonts-DrGTBJJk.mjs.map +0 -1
  171. package/dist/index-B0BNPEoH.d.mts.map +0 -1
  172. package/dist/index-D2jDC7O5.d.mts.map +0 -1
  173. package/dist/index-DKFGNyMB.d.mts.map +0 -1
  174. package/dist/index-DiSKzDGR.d.mts.map +0 -1
  175. package/dist/preview-engine/chunk-47VT677S.mjs +0 -8
  176. package/dist/preview-engine/chunk-DPST2XLC.mjs +0 -418
  177. package/dist/preview-engine/chunk-DRLEOHN5.mjs +0 -1
  178. package/dist/preview-engine/chunk-SZ7YRPKO.mjs +0 -3
  179. package/dist/preview-uQM210iy.mjs.map +0 -1
  180. package/dist/renderer-3BNskNuJ.mjs +0 -3
  181. package/dist/renderer-9dHlMQGX.mjs +0 -3
  182. package/dist/renderer-BGvORwkQ.mjs +0 -3
  183. package/dist/renderer-BLikd6BK.mjs +0 -3
  184. package/dist/renderer-BSbTJBWc.mjs +0 -3
  185. package/dist/renderer-BU1rwNRT.mjs +0 -3
  186. package/dist/renderer-BZJm3m4f.mjs +0 -3
  187. package/dist/renderer-BqyAgNt3.mjs +0 -3
  188. package/dist/renderer-BryTM2g7.mjs +0 -3
  189. package/dist/renderer-CQCoggIa.mjs +0 -3
  190. package/dist/renderer-CV2m6k1V.mjs +0 -3
  191. package/dist/renderer-CYY-poLe.mjs +0 -3
  192. package/dist/renderer-C_Ki91kc.mjs +0 -3
  193. package/dist/renderer-CmApuKjS.mjs +0 -3
  194. package/dist/renderer-Cu074POw.mjs +0 -3
  195. package/dist/renderer-D4qLmox-.mjs +0 -3
  196. package/dist/renderer-D6cJ6MSq.mjs +0 -3
  197. package/dist/renderer-DQLGnEFc.mjs +0 -3
  198. package/dist/renderer-DY2SVYUW.mjs +0 -3
  199. package/dist/renderer-DoAY5JbB.mjs +0 -4
  200. package/dist/renderer-DuplLRbp.mjs +0 -3
  201. package/dist/renderer-DvfUbZ31.mjs +0 -3
  202. package/dist/renderer-Q_uUQipO.mjs +0 -3
  203. package/dist/renderer-UQFCgeNx.mjs +0 -3
  204. package/dist/renderer-XcmYTd6P.mjs.map +0 -1
  205. package/dist/renderer-eMsnzJg9.mjs +0 -3
  206. package/dist/renderer-pHiz78e0.mjs +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-55MP0aN4.mjs","names":[],"sources":["../../renderers/dist/index.mjs","../../compositions/dist/layer-logic-DBs4NHoi.mjs","../../compositions/dist/index.mjs"],"sourcesContent":["import { GetFontAssetUrl } from \"@framefields/client-utils\";\nimport { SlugFontCache, SlugGeometry, getHeadlessFontPath, registerHeadlessFont } from \"@framefields/webgpu-renderers\";\n\n//#region src/blend.ts\nconst mapBlendModeToSkia = (mode) => {\n\tif (!mode) return \"srcOver\";\n\tswitch (mode) {\n\t\tcase \"source-over\": return \"srcOver\";\n\t\tcase \"source-in\": return \"srcIn\";\n\t\tcase \"source-out\": return \"srcOut\";\n\t\tcase \"source-atop\": return \"srcATop\";\n\t\tcase \"destination-over\": return \"dstOver\";\n\t\tcase \"destination-in\": return \"dstIn\";\n\t\tcase \"destination-out\": return \"dstOut\";\n\t\tcase \"destination-atop\": return \"dstATop\";\n\t\tcase \"copy\": return \"src\";\n\t\tcase \"xor\": return \"xor\";\n\t\tcase \"multiply\": return \"multiply\";\n\t\tcase \"screen\": return \"screen\";\n\t\tcase \"overlay\": return \"overlay\";\n\t\tcase \"darken\": return \"darken\";\n\t\tcase \"lighten\":\n\t\tcase \"lighter\": return \"lighten\";\n\t\tcase \"color-dodge\": return \"colorDodge\";\n\t\tcase \"color-burn\": return \"colorBurn\";\n\t\tcase \"hard-light\": return \"hardLight\";\n\t\tcase \"soft-light\": return \"softLight\";\n\t\tcase \"difference\": return \"difference\";\n\t\tcase \"exclusion\": return \"exclusion\";\n\t\tcase \"hue\": return \"hue\";\n\t\tcase \"saturation\": return \"saturation\";\n\t\tcase \"color\": return \"color\";\n\t\tcase \"luminosity\": return \"luminosity\";\n\t\tdefault: return \"srcOver\";\n\t}\n};\nconst requiresIsolation = (mode) => {\n\treturn mode === \"destination-in\" || mode === \"source-in\";\n};\n\n//#endregion\n//#region src/geometry.ts\nfunction computeStrokeRect(w, h, cornerRadius, strokeWidth, align = \"outside\") {\n\tif (align === \"inside\") {\n\t\tconst half = strokeWidth / 2;\n\t\treturn {\n\t\t\tx: half,\n\t\t\ty: half,\n\t\t\twidth: Math.max(0, w - strokeWidth),\n\t\t\theight: Math.max(0, h - strokeWidth),\n\t\t\tradius: cornerRadius === 0 ? 0 : Math.max(0, cornerRadius - half)\n\t\t};\n\t}\n\tif (align === \"outside\") {\n\t\tconst half = strokeWidth / 2;\n\t\treturn {\n\t\t\tx: -half,\n\t\t\ty: -half,\n\t\t\twidth: w + strokeWidth,\n\t\t\theight: h + strokeWidth,\n\t\t\tradius: cornerRadius === 0 ? 0 : cornerRadius + half\n\t\t};\n\t}\n\treturn {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: w,\n\t\theight: h,\n\t\tradius: cornerRadius\n\t};\n}\n\n//#endregion\n//#region src/interpolate.ts\nconst { cbrt, sqrt, PI: π } = Math;\nconst x2t = (x, a, b, c, d) => {\n\tconst q = a + b * x;\n\tconst s = q ** 2 + c;\n\tif (s > 0) {\n\t\tconst root = sqrt(s);\n\t\treturn cbrt(q + root) + cbrt(q - root) - d;\n\t}\n\tconst l = cbrt(sqrt(q * q - s));\n\tconst angle = q ? Math.atan(sqrt(-s) / q) : -π / 2;\n\tlet φ;\n\tif (b < 0) φ = (q > 0 ? 2 * π : π) - angle;\n\telse if (d < 0) φ = (q > 0 ? 2 * π : -3 * π) + angle;\n\telse φ = (q > 0 ? 0 : π) + angle;\n\treturn 2 * l * Math.cos(φ / 3) - d;\n};\nconst Y = (t, ay, by, cy) => ((ay * t + 3 * by) * t + cy) * t;\nconst linearEasing = (x) => x;\nfunction bezier(mX1, mY1, mX2, mY2) {\n\tif (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error(\"bezier x values must be in [0, 1] range\");\n\tif (mX1 === mY1 && mX2 === mY2) return linearEasing;\n\tconst a = 6 * (3 * mX1 - 3 * mX2 + 1);\n\tconst b = 6 * (mX2 - 2 * mX1);\n\tconst c = 3 * mX1;\n\tconst a2 = a * a;\n\tconst b2 = b * b;\n\tconst d = b / a;\n\tconst e = 3 * b * c / a2 - b2 * b / (a2 * a);\n\tconst w1 = 2 * c / a - b2 / a2;\n\tconst w = w1 * w1 * w1;\n\tconst o = 3 / a;\n\tconst ay = 3 * mY1 - 3 * mY2 + 1;\n\tconst by = mY2 - 2 * mY1;\n\tconst cy = 3 * mY1;\n\tconst X2T = a ? x2t : linearEasing;\n\treturn function BezierEasing(x) {\n\t\tif (x === 0 || x === 1) return x;\n\t\treturn Y(X2T(x, e, o, w, d), ay, by, cy);\n\t};\n}\nconst Easing = {\n\tlinear: linearEasing,\n\tease: bezier(.25, .1, .25, 1),\n\tquad: (t) => t * t,\n\tcubic: (t) => t * t * t,\n\tpoly: (n) => (t) => t ** n,\n\tsin: (t) => 1 - Math.cos(t * Math.PI / 2),\n\tcircle: (t) => 1 - Math.sqrt(1 - t * t),\n\texp: (t) => 2 ** (10 * (t - 1)),\n\telastic: (bounciness = 1) => {\n\t\tconst p = bounciness * Math.PI;\n\t\treturn (t) => 1 - Math.cos(t * Math.PI / 2) ** 3 * Math.cos(t * p);\n\t},\n\tback: (s = 1.70158) => (t) => t * t * ((s + 1) * t - s),\n\tbounce: (t) => {\n\t\tif (t < 1 / 2.75) return 7.5625 * t * t;\n\t\tif (t < 2 / 2.75) {\n\t\t\tconst t2$1 = t - 1.5 / 2.75;\n\t\t\treturn 7.5625 * t2$1 * t2$1 + .75;\n\t\t}\n\t\tif (t < 2.5 / 2.75) {\n\t\t\tconst t2$1 = t - 2.25 / 2.75;\n\t\t\treturn 7.5625 * t2$1 * t2$1 + .9375;\n\t\t}\n\t\tconst t2 = t - 2.625 / 2.75;\n\t\treturn 7.5625 * t2 * t2 + .984375;\n\t},\n\tbezier,\n\tin: (fn) => fn,\n\tout: (fn) => (t) => 1 - fn(1 - t),\n\tinOut: (fn) => (t) => t < .5 ? fn(t * 2) / 2 : 1 - fn((1 - t) * 2) / 2\n};\nfunction interpolate(value, inputRange, outputRange, options) {\n\tconst extrapolateLeft = options?.extrapolateLeft ?? \"extend\";\n\tconst extrapolateRight = options?.extrapolateRight ?? \"extend\";\n\tif (inputRange.length !== outputRange.length) throw new Error(\"inputRange and outputRange must have the same length\");\n\tif (inputRange.length < 2) throw new Error(\"inputRange must have at least 2 elements\");\n\tconst firstInput = inputRange[0];\n\tconst lastInput = inputRange[inputRange.length - 1];\n\tif (value < firstInput) {\n\t\tif (extrapolateLeft === \"clamp\") return outputRange[0];\n\t\tif (extrapolateLeft === \"identity\") return value;\n\t}\n\tif (value > lastInput) {\n\t\tif (extrapolateRight === \"clamp\") return outputRange[outputRange.length - 1];\n\t\tif (extrapolateRight === \"identity\") return value;\n\t}\n\tlet i = 1;\n\tfor (; i < inputRange.length - 1; i++) if (value < inputRange[i]) break;\n\tconst x0 = inputRange[i - 1];\n\tconst x1 = inputRange[i];\n\tconst y0 = outputRange[i - 1];\n\tconst y1 = outputRange[i];\n\tif (x0 === x1) return y0;\n\tlet progress = (value - x0) / (x1 - x0);\n\tif (options?.easing) progress = options.easing(progress);\n\treturn y0 + progress * (y1 - y0);\n}\n\n//#endregion\n//#region src/math3d/vector3.ts\nconst Vector3Math = {\n\tcreate(x = 0, y = 0, z = 0) {\n\t\treturn [\n\t\t\tx,\n\t\t\ty,\n\t\t\tz\n\t\t];\n\t},\n\tcopy(v) {\n\t\treturn [\n\t\t\tv[0],\n\t\t\tv[1],\n\t\t\tv[2]\n\t\t];\n\t},\n\tset(out, x, y, z) {\n\t\tout[0] = x;\n\t\tout[1] = y;\n\t\tout[2] = z;\n\t\treturn out;\n\t},\n\tadd(a, b) {\n\t\treturn [\n\t\t\ta[0] + b[0],\n\t\t\ta[1] + b[1],\n\t\t\ta[2] + b[2]\n\t\t];\n\t},\n\tsubtract(a, b) {\n\t\treturn [\n\t\t\ta[0] - b[0],\n\t\t\ta[1] - b[1],\n\t\t\ta[2] - b[2]\n\t\t];\n\t},\n\tmultiplyScalar(v, s) {\n\t\treturn [\n\t\t\tv[0] * s,\n\t\t\tv[1] * s,\n\t\t\tv[2] * s\n\t\t];\n\t},\n\tdot(a, b) {\n\t\treturn a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\t},\n\tcross(a, b) {\n\t\treturn [\n\t\t\ta[1] * b[2] - a[2] * b[1],\n\t\t\ta[2] * b[0] - a[0] * b[2],\n\t\t\ta[0] * b[1] - a[1] * b[0]\n\t\t];\n\t},\n\tlengthSq(v) {\n\t\treturn v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n\t},\n\tlength(v) {\n\t\treturn Math.hypot(v[0], v[1], v[2]);\n\t},\n\tdistance(a, b) {\n\t\treturn Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);\n\t},\n\tnormalize(v) {\n\t\tconst len = Math.hypot(v[0], v[1], v[2]);\n\t\tif (len === 0) return [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t\tconst inv = 1 / len;\n\t\treturn [\n\t\t\tv[0] * inv,\n\t\t\tv[1] * inv,\n\t\t\tv[2] * inv\n\t\t];\n\t},\n\tlerp(a, b, t) {\n\t\treturn [\n\t\t\ta[0] + (b[0] - a[0]) * t,\n\t\t\ta[1] + (b[1] - a[1]) * t,\n\t\t\ta[2] + (b[2] - a[2]) * t\n\t\t];\n\t},\n\tequals(a, b, epsilon = 1e-6) {\n\t\treturn Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon && Math.abs(a[2] - b[2]) <= epsilon;\n\t}\n};\n\n//#endregion\n//#region src/math3d/matrix4.ts\n/**\n* Column-major 4x4 matrix mathematics for WebGPU 3D rendering and camera projections.\n* Memory layout matches WGSL `mat4x4<f32>`:\n* [ 0, 4, 8, 12 ]\n* [ 1, 5, 9, 13 ]\n* [ 2, 6, 10, 14 ]\n* [ 3, 7, 11, 15 ]\n*/\nconst Matrix4Math = {\n\tidentity() {\n\t\treturn [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\tcopy(m) {\n\t\treturn [...m];\n\t},\n\tmultiply(a, b) {\n\t\tconst out = new Array(16);\n\t\tfor (let row = 0; row < 4; row++) for (let col = 0; col < 4; col++) out[col * 4 + row] = a[0 + row] * b[col * 4 + 0] + a[4 + row] * b[col * 4 + 1] + a[8 + row] * b[col * 4 + 2] + a[12 + row] * b[col * 4 + 3];\n\t\treturn out;\n\t},\n\ttranslate(tx, ty, tz = 0) {\n\t\treturn [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\ttx,\n\t\t\tty,\n\t\t\ttz,\n\t\t\t1\n\t\t];\n\t},\n\tscale(sx, sy, sz = 1) {\n\t\treturn [\n\t\t\tsx,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tsy,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tsz,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\trotateX(rad) {\n\t\tconst c = Math.cos(rad);\n\t\tconst s = Math.sin(rad);\n\t\treturn [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tc,\n\t\t\ts,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-s,\n\t\t\tc,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\trotateY(rad) {\n\t\tconst c = Math.cos(rad);\n\t\tconst s = Math.sin(rad);\n\t\treturn [\n\t\t\tc,\n\t\t\t0,\n\t\t\t-s,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\ts,\n\t\t\t0,\n\t\t\tc,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\trotateZ(rad) {\n\t\tconst c = Math.cos(rad);\n\t\tconst s = Math.sin(rad);\n\t\treturn [\n\t\t\tc,\n\t\t\ts,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-s,\n\t\t\tc,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\trotateAxis(axis, rad) {\n\t\tconst norm = Vector3Math.normalize(axis);\n\t\tconst x = norm[0];\n\t\tconst y = norm[1];\n\t\tconst z = norm[2];\n\t\tconst c = Math.cos(rad);\n\t\tconst s = Math.sin(rad);\n\t\tconst t = 1 - c;\n\t\treturn [\n\t\t\tt * x * x + c,\n\t\t\tt * x * y + s * z,\n\t\t\tt * x * z - s * y,\n\t\t\t0,\n\t\t\tt * x * y - s * z,\n\t\t\tt * y * y + c,\n\t\t\tt * y * z + s * x,\n\t\t\t0,\n\t\t\tt * x * z + s * y,\n\t\t\tt * y * z - s * x,\n\t\t\tt * z * z + c,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\tlookAt(eye, target, up = [\n\t\t0,\n\t\t-1,\n\t\t0\n\t]) {\n\t\tlet f = Vector3Math.subtract(target, eye);\n\t\tif (Vector3Math.lengthSq(f) === 0) f = [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t\telse f = Vector3Math.normalize(f);\n\t\tlet r = Vector3Math.cross(f, up);\n\t\tif (Vector3Math.lengthSq(r) === 0) r = [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t\telse r = Vector3Math.normalize(r);\n\t\tconst u = Vector3Math.cross(r, f);\n\t\treturn [\n\t\t\tr[0],\n\t\t\tu[0],\n\t\t\tf[0],\n\t\t\t0,\n\t\t\tr[1],\n\t\t\tu[1],\n\t\t\tf[1],\n\t\t\t0,\n\t\t\tr[2],\n\t\t\tu[2],\n\t\t\tf[2],\n\t\t\t0,\n\t\t\t-Vector3Math.dot(r, eye),\n\t\t\t-Vector3Math.dot(u, eye),\n\t\t\t-Vector3Math.dot(f, eye),\n\t\t\t1\n\t\t];\n\t},\n\tperspective(fovYRad, aspect, near, far) {\n\t\tconst f = 1 / Math.tan(fovYRad / 2);\n\t\tconst rangeInv = 1 / (far - near);\n\t\treturn [\n\t\t\tf / aspect,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tf,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tfar * rangeInv,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-near * far * rangeInv,\n\t\t\t0\n\t\t];\n\t},\n\torthographic(left, right, bottom, top, near, far) {\n\t\tconst lr = 1 / (right - left);\n\t\tconst bt = 1 / (top - bottom);\n\t\tconst nf = 1 / (far - near);\n\t\treturn [\n\t\t\t2 * lr,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t2 * bt,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tnf,\n\t\t\t0,\n\t\t\t-(right + left) * lr,\n\t\t\t-(top + bottom) * bt,\n\t\t\t-near * nf,\n\t\t\t1\n\t\t];\n\t},\n\tinvert(m) {\n\t\tconst inv = new Array(16);\n\t\tinv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];\n\t\tinv[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10];\n\t\tinv[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9];\n\t\tinv[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9];\n\t\tinv[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10];\n\t\tinv[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10];\n\t\tinv[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9];\n\t\tinv[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9];\n\t\tinv[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6];\n\t\tinv[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6];\n\t\tinv[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5];\n\t\tinv[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5];\n\t\tinv[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6];\n\t\tinv[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6];\n\t\tinv[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5];\n\t\tinv[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5];\n\t\tlet det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12];\n\t\tif (Math.abs(det) < 1e-12) return null;\n\t\tdet = 1 / det;\n\t\tfor (let i = 0; i < 16; i++) inv[i] *= det;\n\t\treturn inv;\n\t},\n\ttranspose(m) {\n\t\treturn [\n\t\t\tm[0],\n\t\t\tm[4],\n\t\t\tm[8],\n\t\t\tm[12],\n\t\t\tm[1],\n\t\t\tm[5],\n\t\t\tm[9],\n\t\t\tm[13],\n\t\t\tm[2],\n\t\t\tm[6],\n\t\t\tm[10],\n\t\t\tm[14],\n\t\t\tm[3],\n\t\t\tm[7],\n\t\t\tm[11],\n\t\t\tm[15]\n\t\t];\n\t},\n\tprojectPoint(m, p) {\n\t\tconst x = p[0];\n\t\tconst y = p[1];\n\t\tconst z = p[2];\n\t\tconst X = m[0] * x + m[4] * y + m[8] * z + m[12];\n\t\tconst Y$1 = m[1] * x + m[5] * y + m[9] * z + m[13];\n\t\tconst Z = m[2] * x + m[6] * y + m[10] * z + m[14];\n\t\tconst W = m[3] * x + m[7] * y + m[11] * z + m[15];\n\t\tconst wInv = Math.abs(W) > 1e-6 ? 1 / W : 1;\n\t\treturn [\n\t\t\tX * wInv,\n\t\t\tY$1 * wInv,\n\t\t\tZ * wInv\n\t\t];\n\t},\n\tprojectRectangle(m, width, height) {\n\t\treturn [\n\t\t\tMatrix4Math.projectPoint(m, [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t]),\n\t\t\tMatrix4Math.projectPoint(m, [\n\t\t\t\twidth,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t]),\n\t\t\tMatrix4Math.projectPoint(m, [\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0\n\t\t\t]),\n\t\t\tMatrix4Math.projectPoint(m, [\n\t\t\t\t0,\n\t\t\t\theight,\n\t\t\t\t0\n\t\t\t])\n\t\t];\n\t},\n\ttoFloat32Array(m) {\n\t\treturn new Float32Array(m);\n\t}\n};\n\n//#endregion\n//#region src/math3d/camera3d.ts\n/**\n* Camera 3D mathematics, kinematics, and projection solver.\n* Provides unified View-Projection matrices, LookAt target tracking,\n* spherical orbit turntable, multi-octave camera shake, and rack-focus CoC solvers.\n*/\n/** Smooth multi-harmonic procedural continuous noise */\nfunction smoothHarmonicNoise(t, seed, octaves = 3) {\n\tlet total = 0;\n\tlet frequency = 1;\n\tlet amplitude = 1;\n\tlet maxAmp = 0;\n\tfor (let i = 0; i < octaves; i++) {\n\t\tconst s1 = Math.sin(t * frequency * 2 * Math.PI + seed + i * 1.7);\n\t\tconst s2 = Math.cos(t * frequency * 1.414 * Math.PI + seed * 2.1 + i * .9);\n\t\ttotal += (s1 * .6 + s2 * .4) * amplitude;\n\t\tmaxAmp += amplitude;\n\t\tfrequency *= 2;\n\t\tamplitude *= .5;\n\t}\n\treturn maxAmp > 0 ? total / maxAmp : 0;\n}\nconst Camera3D = {\n\tcreateDefaultCamera(width, height, fovDegrees = 50) {\n\t\tconst fovRad = fovDegrees * Math.PI / 180;\n\t\tconst distance = height / 2 / Math.tan(fovRad / 2);\n\t\treturn {\n\t\t\teye: [\n\t\t\t\twidth / 2,\n\t\t\t\theight / 2,\n\t\t\t\t-distance\n\t\t\t],\n\t\t\ttarget: [\n\t\t\t\twidth / 2,\n\t\t\t\theight / 2,\n\t\t\t\t0\n\t\t\t],\n\t\t\tup: [\n\t\t\t\t0,\n\t\t\t\t-1,\n\t\t\t\t0\n\t\t\t],\n\t\t\tfov: fovDegrees,\n\t\t\taspect: Math.max(1e-4, width / height),\n\t\t\tnear: 1,\n\t\t\tfar: 5e4,\n\t\t\tzoom: 1,\n\t\t\tfocusDistance: distance,\n\t\t\tfStop: 2.8,\n\t\t\tmaxBlurRadius: 32\n\t\t};\n\t},\n\tcomputeViewMatrix(camera) {\n\t\treturn Matrix4Math.lookAt(camera.eye, camera.target, camera.up);\n\t},\n\tcomputeProjectionMatrix(camera) {\n\t\tconst fovRad = camera.fov * Math.PI / 180;\n\t\tconst p = Matrix4Math.perspective(fovRad, camera.aspect, camera.near, camera.far);\n\t\tif (camera.zoom !== 1 && camera.zoom > 0) {\n\t\t\tp[0] *= camera.zoom;\n\t\t\tp[5] *= camera.zoom;\n\t\t}\n\t\treturn p;\n\t},\n\tcomputeViewProjectionMatrix(camera) {\n\t\tconst v = Camera3D.computeViewMatrix(camera);\n\t\tconst p = Camera3D.computeProjectionMatrix(camera);\n\t\treturn Matrix4Math.multiply(p, v);\n\t},\n\tdolly(eye, target, deltaDistance) {\n\t\tconst forward = Vector3Math.normalize(Vector3Math.subtract(target, eye));\n\t\tconst move = Vector3Math.multiplyScalar(forward, deltaDistance);\n\t\treturn {\n\t\t\teye: Vector3Math.add(eye, move),\n\t\t\ttarget\n\t\t};\n\t},\n\ttruckPedestal(eye, target, up, deltaX, deltaY) {\n\t\tconst forward = Vector3Math.normalize(Vector3Math.subtract(target, eye));\n\t\tconst right = Vector3Math.normalize(Vector3Math.cross(forward, up));\n\t\tconst trueUp = Vector3Math.cross(right, forward);\n\t\tconst moveX = Vector3Math.multiplyScalar(right, deltaX);\n\t\tconst moveY = Vector3Math.multiplyScalar(trueUp, deltaY);\n\t\tconst totalMove = Vector3Math.add(moveX, moveY);\n\t\treturn {\n\t\t\teye: Vector3Math.add(eye, totalMove),\n\t\t\ttarget: Vector3Math.add(target, totalMove)\n\t\t};\n\t},\n\torbit(target, radius, azimuthDeg, elevationDeg) {\n\t\tconst azRad = azimuthDeg * Math.PI / 180;\n\t\tconst elRad = elevationDeg * Math.PI / 180;\n\t\tconst cosEl = Math.cos(elRad);\n\t\tconst sinEl = Math.sin(elRad);\n\t\tconst cosAz = Math.cos(azRad);\n\t\tconst sinAz = Math.sin(azRad);\n\t\treturn [\n\t\t\ttarget[0] + radius * cosEl * sinAz,\n\t\t\ttarget[1] - radius * sinEl,\n\t\t\ttarget[2] - radius * cosEl * cosAz\n\t\t];\n\t},\n\tapplyOrientation(pose, pitchDeg, yawDeg, rollDeg) {\n\t\tif (pitchDeg === 0 && yawDeg === 0 && rollDeg === 0) return pose;\n\t\tconst forward = Vector3Math.normalize(Vector3Math.subtract(pose.target, pose.eye));\n\t\tconst right = Vector3Math.normalize(Vector3Math.cross(forward, pose.up));\n\t\tconst trueUp = Vector3Math.cross(right, forward);\n\t\tconst dist = Vector3Math.distance(pose.eye, pose.target);\n\t\tlet fwd = forward;\n\t\tlet up = trueUp;\n\t\tif (yawDeg !== 0) {\n\t\t\tconst yawRad = yawDeg * Math.PI / 180;\n\t\t\tconst cosY = Math.cos(yawRad);\n\t\t\tconst sinY = Math.sin(yawRad);\n\t\t\tfwd = Vector3Math.normalize(Vector3Math.subtract(Vector3Math.multiplyScalar(fwd, cosY), Vector3Math.multiplyScalar(right, sinY)));\n\t\t}\n\t\tconst currentRight = Vector3Math.normalize(Vector3Math.cross(fwd, up));\n\t\tif (pitchDeg !== 0) {\n\t\t\tconst pitchRad = pitchDeg * Math.PI / 180;\n\t\t\tconst cosP = Math.cos(pitchRad);\n\t\t\tconst sinP = Math.sin(pitchRad);\n\t\t\tfwd = Vector3Math.normalize(Vector3Math.add(Vector3Math.multiplyScalar(fwd, cosP), Vector3Math.multiplyScalar(up, sinP)));\n\t\t\tup = Vector3Math.normalize(Vector3Math.cross(currentRight, fwd));\n\t\t}\n\t\tif (rollDeg !== 0) {\n\t\t\tconst rollRad = rollDeg * Math.PI / 180;\n\t\t\tconst cosR = Math.cos(rollRad);\n\t\t\tconst sinR = Math.sin(rollRad);\n\t\t\tup = Vector3Math.normalize(Vector3Math.add(Vector3Math.multiplyScalar(up, cosR), Vector3Math.multiplyScalar(currentRight, sinR)));\n\t\t}\n\t\tconst newTarget = Vector3Math.add(pose.eye, Vector3Math.multiplyScalar(fwd, dist));\n\t\treturn {\n\t\t\t...pose,\n\t\t\ttarget: newTarget,\n\t\t\tup\n\t\t};\n\t},\n\tapplyCameraShake(pose, timeSeconds, options) {\n\t\tconst { translationAmplitude, rotationAmplitude, frequency = 2.5, octaves = 3, seed = 42 } = options;\n\t\tif (translationAmplitude <= 0 && rotationAmplitude <= 0) return pose;\n\t\tconst t = timeSeconds * frequency;\n\t\tconst dx = smoothHarmonicNoise(t, seed, octaves) * translationAmplitude;\n\t\tconst dy = smoothHarmonicNoise(t, seed + 101.5, octaves) * translationAmplitude;\n\t\tconst dz = smoothHarmonicNoise(t, seed + 203.7, octaves) * (translationAmplitude * .5);\n\t\tconst rotX = smoothHarmonicNoise(t, seed + 307.1, octaves) * rotationAmplitude;\n\t\tconst rotY = smoothHarmonicNoise(t, seed + 409.3, octaves) * rotationAmplitude;\n\t\tconst forward = Vector3Math.normalize(Vector3Math.subtract(pose.target, pose.eye));\n\t\tconst right = Vector3Math.normalize(Vector3Math.cross(forward, pose.up));\n\t\tconst trueUp = Vector3Math.cross(right, forward);\n\t\tconst disp = Vector3Math.add(Vector3Math.multiplyScalar(right, dx), Vector3Math.add(Vector3Math.multiplyScalar(trueUp, dy), Vector3Math.multiplyScalar(forward, dz)));\n\t\tconst newEye = Vector3Math.add(pose.eye, disp);\n\t\tconst newTarget = Vector3Math.add(pose.target, Vector3Math.add(Vector3Math.multiplyScalar(right, rotY * 10), Vector3Math.multiplyScalar(trueUp, rotX * 10)));\n\t\treturn {\n\t\t\t...pose,\n\t\t\teye: newEye,\n\t\t\ttarget: newTarget\n\t\t};\n\t},\n\tcomputeCircleOfConfusion(depth, focusDistance, focalLengthMm, fStop, maxBlurRadius = 32) {\n\t\tif (focusDistance <= 0 || fStop <= 0 || depth <= 0) return 0;\n\t\tconst delta = Math.abs(depth - focusDistance);\n\t\tconst aperture = focalLengthMm / fStop;\n\t\tconst coc = delta / depth * aperture * .5;\n\t\treturn Math.min(maxBlurRadius, Math.max(0, coc));\n\t},\n\tcomputeCameraFrustumPlanes(vp) {\n\t\tconst normalizePlane = (p) => {\n\t\t\tconst len = Math.hypot(p[0], p[1], p[2]);\n\t\t\tif (len === 0) return p;\n\t\t\treturn [\n\t\t\t\tp[0] / len,\n\t\t\t\tp[1] / len,\n\t\t\t\tp[2] / len,\n\t\t\t\tp[3] / len\n\t\t\t];\n\t\t};\n\t\treturn {\n\t\t\tleft: normalizePlane([\n\t\t\t\tvp[3] + vp[0],\n\t\t\t\tvp[7] + vp[4],\n\t\t\t\tvp[11] + vp[8],\n\t\t\t\tvp[15] + vp[12]\n\t\t\t]),\n\t\t\tright: normalizePlane([\n\t\t\t\tvp[3] - vp[0],\n\t\t\t\tvp[7] - vp[4],\n\t\t\t\tvp[11] - vp[8],\n\t\t\t\tvp[15] - vp[12]\n\t\t\t]),\n\t\t\tbottom: normalizePlane([\n\t\t\t\tvp[3] + vp[1],\n\t\t\t\tvp[7] + vp[5],\n\t\t\t\tvp[11] + vp[9],\n\t\t\t\tvp[15] + vp[13]\n\t\t\t]),\n\t\t\ttop: normalizePlane([\n\t\t\t\tvp[3] - vp[1],\n\t\t\t\tvp[7] - vp[5],\n\t\t\t\tvp[11] - vp[9],\n\t\t\t\tvp[15] - vp[13]\n\t\t\t]),\n\t\t\tnear: normalizePlane([\n\t\t\t\tvp[2],\n\t\t\t\tvp[6],\n\t\t\t\tvp[10],\n\t\t\t\tvp[14]\n\t\t\t]),\n\t\t\tfar: normalizePlane([\n\t\t\t\tvp[3] - vp[2],\n\t\t\t\tvp[7] - vp[6],\n\t\t\t\tvp[11] - vp[10],\n\t\t\t\tvp[15] - vp[14]\n\t\t\t])\n\t\t};\n\t},\n\tisBoxInFrustum(min, max, planes) {\n\t\tconst planeList = [\n\t\t\tplanes.left,\n\t\t\tplanes.right,\n\t\t\tplanes.bottom,\n\t\t\tplanes.top,\n\t\t\tplanes.near,\n\t\t\tplanes.far\n\t\t];\n\t\tfor (const p of planeList) {\n\t\t\tconst px = p[0] > 0 ? max[0] : min[0];\n\t\t\tconst py = p[1] > 0 ? max[1] : min[1];\n\t\t\tconst pz = p[2] > 0 ? max[2] : min[2];\n\t\t\tif (p[0] * px + p[1] * py + p[2] * pz + p[3] < 0) return false;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n//#endregion\n//#region src/math3d/light3d.ts\n/**\n* WebGPU 3D Lighting & Material Shading engine.\n* Supports Ambient, Directional, Point, and Spot light sources,\n* normal matrix computation for non-uniform surface scaling,\n* and binary uniform buffer packing for WGSL shaders.\n*/\nconst MAX_LIGHTS = 8;\nconst LIGHT_UNIFORM_SIZE_BYTES = 544;\n/**\n* Parses CSS / hex / rgb color strings, arrays, or color objects into normalized linear [r, g, b] floats in [0, 1].\n*/\nfunction parseColorToRgb(color) {\n\tif (!color) return [\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tif (Array.isArray(color)) {\n\t\tconst r = color[0] ?? 1;\n\t\tconst g = color[1] ?? 1;\n\t\tconst b = color[2] ?? 1;\n\t\treturn [\n\t\t\tr > 1 ? r / 255 : r,\n\t\t\tg > 1 ? g / 255 : g,\n\t\t\tb > 1 ? b / 255 : b\n\t\t];\n\t}\n\tif (typeof color === \"object\" && color !== null) {\n\t\tconst r = color.r ?? 1;\n\t\tconst g = color.g ?? 1;\n\t\tconst b = color.b ?? 1;\n\t\treturn [\n\t\t\tr > 1 ? r / 255 : r,\n\t\t\tg > 1 ? g / 255 : g,\n\t\t\tb > 1 ? b / 255 : b\n\t\t];\n\t}\n\tif (typeof color !== \"string\") return [\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tconst str = color.trim().toLowerCase();\n\tif (str.startsWith(\"#\")) {\n\t\tconst hex = str.slice(1);\n\t\tif (hex.length === 3) return [\n\t\t\tNumber.parseInt(hex[0] + hex[0], 16) / 255,\n\t\t\tNumber.parseInt(hex[1] + hex[1], 16) / 255,\n\t\t\tNumber.parseInt(hex[2] + hex[2], 16) / 255\n\t\t];\n\t\tif (hex.length >= 6) return [\n\t\t\tNumber.parseInt(hex.slice(0, 2), 16) / 255,\n\t\t\tNumber.parseInt(hex.slice(2, 4), 16) / 255,\n\t\t\tNumber.parseInt(hex.slice(4, 6), 16) / 255\n\t\t];\n\t}\n\tconst rgbMatch = str.match(/rgba?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/);\n\tif (rgbMatch) {\n\t\tconst r = Number.parseFloat(rgbMatch[1]) / 255;\n\t\tconst g = Number.parseFloat(rgbMatch[2]) / 255;\n\t\tconst b = Number.parseFloat(rgbMatch[3]) / 255;\n\t\treturn [\n\t\t\tMath.max(0, Math.min(1, r)),\n\t\t\tMath.max(0, Math.min(1, g)),\n\t\t\tMath.max(0, Math.min(1, b))\n\t\t];\n\t}\n\tconst hslMatch = str.match(/hsla?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%?\\s*,\\s*([\\d.]+)%?/);\n\tif (hslMatch) return hslToRgb(Number.parseFloat(hslMatch[1]) / 360, Number.parseFloat(hslMatch[2]) / 100, Number.parseFloat(hslMatch[3]) / 100);\n\treturn [\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n}\nfunction hslToRgb(h, s, l) {\n\tif (s === 0) return [\n\t\tl,\n\t\tl,\n\t\tl\n\t];\n\tconst hue2rgb = (p$1, q$1, t) => {\n\t\tlet tt = t;\n\t\tif (tt < 0) tt += 1;\n\t\tif (tt > 1) tt -= 1;\n\t\tif (tt < 1 / 6) return p$1 + (q$1 - p$1) * 6 * tt;\n\t\tif (tt < 1 / 2) return q$1;\n\t\tif (tt < 2 / 3) return p$1 + (q$1 - p$1) * (2 / 3 - tt) * 6;\n\t\treturn p$1;\n\t};\n\tconst q = l < .5 ? l * (1 + s) : l + s - l * s;\n\tconst p = 2 * l - q;\n\treturn [\n\t\thue2rgb(p, q, h + 1 / 3),\n\t\thue2rgb(p, q, h),\n\t\thue2rgb(p, q, h - 1 / 3)\n\t];\n}\nconst Light3D = {\n\tcomputeNormalMatrix(modelMatrix) {\n\t\tconst inv = Matrix4Math.invert(modelMatrix);\n\t\tif (!inv) return Matrix4Math.identity();\n\t\treturn [\n\t\t\tinv[0],\n\t\t\tinv[4],\n\t\t\tinv[8],\n\t\t\t0,\n\t\t\tinv[1],\n\t\t\tinv[5],\n\t\t\tinv[9],\n\t\t\t0,\n\t\t\tinv[2],\n\t\t\tinv[6],\n\t\t\tinv[10],\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t},\n\tprocessLight(opt) {\n\t\tconst color = parseColorToRgb(opt.color);\n\t\tconst intensity = opt.intensity ?? 1;\n\t\tconst posX = opt.position ? opt.position[0] : opt.x ?? 0;\n\t\tconst posY = opt.position ? opt.position[1] : opt.y ?? 0;\n\t\tconst posZ = opt.position ? opt.position[2] : opt.z ?? 0;\n\t\tconst kind = opt.lightType ?? opt.type ?? \"directional\";\n\t\tlet typeVal = 1;\n\t\tif (kind === \"ambient\") typeVal = 0;\n\t\telse if (kind === \"directional\") typeVal = 1;\n\t\telse if (kind === \"point\") typeVal = 2;\n\t\telse if (kind === \"spot\") typeVal = 3;\n\t\tlet dir = [\n\t\t\t0,\n\t\t\t0,\n\t\t\t-1\n\t\t];\n\t\tif (opt.direction) dir = Vector3Math.normalize(opt.direction);\n\t\telse if (opt.target || opt.targetX !== void 0 || opt.targetY !== void 0 || opt.targetZ !== void 0) {\n\t\t\tconst target = [\n\t\t\t\topt.target ? opt.target[0] : opt.targetX ?? posX,\n\t\t\t\topt.target ? opt.target[1] : opt.targetY ?? posY,\n\t\t\t\topt.target ? opt.target[2] : opt.targetZ ?? posZ\n\t\t\t];\n\t\t\tconst fromLight = Vector3Math.subtract(target, [\n\t\t\t\tposX,\n\t\t\t\tposY,\n\t\t\t\tposZ\n\t\t\t]);\n\t\t\tif (Vector3Math.length(fromLight) > 1e-4) dir = Vector3Math.normalize(fromLight);\n\t\t}\n\t\tconst radius = Math.max(1, opt.radius ?? 1e3);\n\t\tconst decay = opt.decay ?? 2;\n\t\tconst angleDeg = Math.max(.1, Math.min(180, opt.angle ?? 45));\n\t\tconst penumbraFrac = Math.max(0, Math.min(1, opt.penumbra ?? .2));\n\t\tconst outerRad = angleDeg * Math.PI / 180;\n\t\tconst innerRad = outerRad * (1 - penumbraFrac);\n\t\tconst cosOuter = Math.cos(outerRad);\n\t\tconst cosInner = Math.cos(innerRad);\n\t\treturn {\n\t\t\tposType: [\n\t\t\t\tposX,\n\t\t\t\tposY,\n\t\t\t\tposZ,\n\t\t\t\ttypeVal\n\t\t\t],\n\t\t\tdirRadius: [\n\t\t\t\tdir[0],\n\t\t\t\tdir[1],\n\t\t\t\tdir[2],\n\t\t\t\tradius\n\t\t\t],\n\t\t\tcolorIntensity: [\n\t\t\t\tcolor[0],\n\t\t\t\tcolor[1],\n\t\t\t\tcolor[2],\n\t\t\t\tintensity\n\t\t\t],\n\t\t\tspotParams: [\n\t\t\t\tcosOuter,\n\t\t\t\tcosInner,\n\t\t\t\tdecay,\n\t\t\t\t0\n\t\t\t]\n\t\t};\n\t},\n\tpackLightsUniforms(lights) {\n\t\tconst buffer = new Float32Array(LIGHT_UNIFORM_SIZE_BYTES / 4);\n\t\tif (!lights || lights.length === 0) {\n\t\t\tbuffer[4] = 0;\n\t\t\tbuffer[5] = 0;\n\t\t\treturn buffer;\n\t\t}\n\t\tlet ambientR = 0;\n\t\tlet ambientG = 0;\n\t\tlet ambientB = 0;\n\t\tconst directLights = [];\n\t\tfor (const l of lights) if ((l.lightType ?? l.type) === \"ambient\") {\n\t\t\tconst col = parseColorToRgb(l.color);\n\t\t\tconst int = l.intensity ?? 1;\n\t\t\tambientR += col[0] * int;\n\t\t\tambientG += col[1] * int;\n\t\t\tambientB += col[2] * int;\n\t\t} else if (directLights.length < MAX_LIGHTS) directLights.push(Light3D.processLight(l));\n\t\tbuffer[0] = ambientR;\n\t\tbuffer[1] = ambientG;\n\t\tbuffer[2] = ambientB;\n\t\tbuffer[3] = 1;\n\t\tbuffer[4] = directLights.length;\n\t\tbuffer[5] = 1;\n\t\tbuffer[6] = 0;\n\t\tbuffer[7] = 0;\n\t\tlet offset = 8;\n\t\tfor (let i = 0; i < MAX_LIGHTS; i++) {\n\t\t\tif (i < directLights.length) {\n\t\t\t\tconst dl = directLights[i];\n\t\t\t\tbuffer[offset + 0] = dl.posType[0];\n\t\t\t\tbuffer[offset + 1] = dl.posType[1];\n\t\t\t\tbuffer[offset + 2] = dl.posType[2];\n\t\t\t\tbuffer[offset + 3] = dl.posType[3];\n\t\t\t\tbuffer[offset + 4] = dl.dirRadius[0];\n\t\t\t\tbuffer[offset + 5] = dl.dirRadius[1];\n\t\t\t\tbuffer[offset + 6] = dl.dirRadius[2];\n\t\t\t\tbuffer[offset + 7] = dl.dirRadius[3];\n\t\t\t\tbuffer[offset + 8] = dl.colorIntensity[0];\n\t\t\t\tbuffer[offset + 9] = dl.colorIntensity[1];\n\t\t\t\tbuffer[offset + 10] = dl.colorIntensity[2];\n\t\t\t\tbuffer[offset + 11] = dl.colorIntensity[3];\n\t\t\t\tbuffer[offset + 12] = dl.spotParams[0];\n\t\t\t\tbuffer[offset + 13] = dl.spotParams[1];\n\t\t\t\tbuffer[offset + 14] = dl.spotParams[2];\n\t\t\t\tbuffer[offset + 15] = dl.spotParams[3];\n\t\t\t} else for (let j = 0; j < 16; j++) buffer[offset + j] = 0;\n\t\t\toffset += 16;\n\t\t}\n\t\treturn buffer;\n\t}\n};\n\n//#endregion\n//#region src/math3d/path3d.ts\n/**\n* 3D Path Mathematical Curves, Arc-Length Lookup Tables, and Rotation-Minimizing Frames (RMF).\n* Provides uniform-velocity parameterization and smooth tangent/normal kinematics along 3D curves.\n*/\nvar Path3D = class Path3D {\n\tsamples = [];\n\tframes = [];\n\ttotalLength = 0;\n\tconstructor(samples) {\n\t\tif (samples.length < 2) throw new Error(\"Path3D requires at least 2 coordinate samples\");\n\t\tthis.samples = samples;\n\t\tthis.totalLength = samples[samples.length - 1].distance;\n\t\tthis.computeRotationMinimizingFrames();\n\t}\n\t/**\n\t* Computes continuous Rotation-Minimizing Frames (RMF) along the path\n\t* using the Double Reflection Method (Wang et al. 2008), preventing gimbal flips.\n\t*/\n\tcomputeRotationMinimizingFrames() {\n\t\tconst count = this.samples.length;\n\t\tthis.frames = new Array(count);\n\t\tconst t0 = this.samples[0].tangent;\n\t\tlet upRef = [\n\t\t\t0,\n\t\t\t-1,\n\t\t\t0\n\t\t];\n\t\tif (Math.abs(Vector3Math.dot(t0, upRef)) > .95) upRef = [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t];\n\t\tlet n0 = Vector3Math.normalize(Vector3Math.subtract(upRef, Vector3Math.multiplyScalar(t0, Vector3Math.dot(upRef, t0))));\n\t\tif (Vector3Math.lengthSq(n0) < 1e-4) n0 = [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t\tconst b0 = Vector3Math.normalize(Vector3Math.cross(t0, n0));\n\t\tthis.frames[0] = {\n\t\t\tnormal: n0,\n\t\t\tbinormal: b0,\n\t\t\trotation: this.eulerFromFrame(t0, n0, b0)\n\t\t};\n\t\tfor (let i = 0; i < count - 1; i++) {\n\t\t\tconst x0 = this.samples[i].position;\n\t\t\tconst x1 = this.samples[i + 1].position;\n\t\t\tconst t_i = this.samples[i].tangent;\n\t\t\tconst t_next = this.samples[i + 1].tangent;\n\t\t\tconst n_i = this.frames[i].normal;\n\t\t\tconst v1 = Vector3Math.subtract(x1, x0);\n\t\t\tconst c1 = Vector3Math.dot(v1, v1);\n\t\t\tlet n_next;\n\t\t\tif (c1 > 1e-8) {\n\t\t\t\tconst t_i_L = Vector3Math.subtract(t_i, Vector3Math.multiplyScalar(v1, 2 * Vector3Math.dot(v1, t_i) / c1));\n\t\t\t\tconst n_i_L = Vector3Math.subtract(n_i, Vector3Math.multiplyScalar(v1, 2 * Vector3Math.dot(v1, n_i) / c1));\n\t\t\t\tconst v2 = Vector3Math.subtract(t_next, t_i_L);\n\t\t\t\tconst c2 = Vector3Math.dot(v2, v2);\n\t\t\t\tif (c2 > 1e-8) n_next = Vector3Math.subtract(n_i_L, Vector3Math.multiplyScalar(v2, 2 * Vector3Math.dot(v2, n_i_L) / c2));\n\t\t\t\telse n_next = n_i_L;\n\t\t\t} else n_next = n_i;\n\t\t\tn_next = Vector3Math.normalize(Vector3Math.subtract(n_next, Vector3Math.multiplyScalar(t_next, Vector3Math.dot(t_next, n_next))));\n\t\t\tconst b_next = Vector3Math.normalize(Vector3Math.cross(t_next, n_next));\n\t\t\tthis.frames[i + 1] = {\n\t\t\t\tnormal: n_next,\n\t\t\t\tbinormal: b_next,\n\t\t\t\trotation: this.eulerFromFrame(t_next, n_next, b_next)\n\t\t\t};\n\t\t}\n\t}\n\t/**\n\t* Extracts pitch, yaw, roll Euler angles in degrees from the orthonormal frame.\n\t*/\n\teulerFromFrame(tangent, normal, binormal) {\n\t\treturn [\n\t\t\tMath.asin(Math.max(-1, Math.min(1, -tangent[1]))) * (180 / Math.PI),\n\t\t\tMath.atan2(tangent[0], tangent[2]) * (180 / Math.PI),\n\t\t\tMath.atan2(normal[0], normal[1]) * (180 / Math.PI)\n\t\t];\n\t}\n\t/**\n\t* Evaluates point, tangent, normal, binormal, and rotation at normalized progress u in [0, 1].\n\t* Progression moves with constant velocity along the arc length of the path.\n\t*/\n\tgetPointAt(u) {\n\t\tconst targetDist = Math.max(0, Math.min(1, u)) * this.totalLength;\n\t\treturn this.getPointAtDistance(targetDist);\n\t}\n\t/**\n\t* Evaluates point along path by absolute arc-length distance in pixels.\n\t*/\n\tgetPointAtDistance(distance) {\n\t\tconst d = Math.max(0, Math.min(this.totalLength, distance));\n\t\tconst count = this.samples.length;\n\t\tlet low = 0;\n\t\tlet high = count - 1;\n\t\twhile (low < high) {\n\t\t\tconst mid = low + high >> 1;\n\t\t\tif (this.samples[mid].distance < d) low = mid + 1;\n\t\t\telse high = mid;\n\t\t}\n\t\tconst idx1 = Math.max(1, low);\n\t\tconst idx0 = idx1 - 1;\n\t\tconst s0 = this.samples[idx0];\n\t\tconst s1 = this.samples[idx1];\n\t\tconst segLen = s1.distance - s0.distance;\n\t\tconst alpha = segLen > 1e-6 ? (d - s0.distance) / segLen : 0;\n\t\tconst position = Vector3Math.lerp(s0.position, s1.position, alpha);\n\t\tconst tangent = Vector3Math.normalize(Vector3Math.lerp(s0.tangent, s1.tangent, alpha));\n\t\tconst f0 = this.frames[idx0];\n\t\tconst f1 = this.frames[idx1];\n\t\tconst normal = Vector3Math.normalize(Vector3Math.lerp(f0.normal, f1.normal, alpha));\n\t\tconst binormal = Vector3Math.normalize(Vector3Math.cross(tangent, normal));\n\t\tconst rotation = [\n\t\t\tf0.rotation[0] + (f1.rotation[0] - f0.rotation[0]) * alpha,\n\t\t\tf0.rotation[1] + (f1.rotation[1] - f0.rotation[1]) * alpha,\n\t\t\tf0.rotation[2] + (f1.rotation[2] - f0.rotation[2]) * alpha\n\t\t];\n\t\treturn {\n\t\t\tposition,\n\t\t\ttangent,\n\t\t\tnormal,\n\t\t\tbinormal,\n\t\t\tdistance: d,\n\t\t\tt: this.totalLength > 0 ? d / this.totalLength : 0,\n\t\t\trotation\n\t\t};\n\t}\n\t/**\n\t* Creates a smooth Catmull-Rom spline path interpolating through 3D waypoints.\n\t*/\n\tstatic catmullRom(waypoints, options = {}) {\n\t\tif (waypoints.length < 2) throw new Error(\"Catmull-Rom spline requires at least 2 waypoints\");\n\t\tconst closed = Boolean(options.closed);\n\t\tconst samplesPerSegment = options.samplesPerSegment ?? 40;\n\t\tconst pts = [];\n\t\tif (closed) {\n\t\t\tpts.push(waypoints[waypoints.length - 1]);\n\t\t\tpts.push(...waypoints);\n\t\t\tpts.push(waypoints[0]);\n\t\t\tpts.push(waypoints[1]);\n\t\t} else {\n\t\t\tconst pFirst = waypoints[0];\n\t\t\tconst pSecond = waypoints[1];\n\t\t\tconst pLast = waypoints[waypoints.length - 1];\n\t\t\tconst pPrevLast = waypoints[waypoints.length - 2];\n\t\t\tpts.push(Vector3Math.subtract(pFirst, Vector3Math.subtract(pSecond, pFirst)));\n\t\t\tpts.push(...waypoints);\n\t\t\tpts.push(Vector3Math.add(pLast, Vector3Math.subtract(pLast, pPrevLast)));\n\t\t}\n\t\tconst numSegments = closed ? waypoints.length : waypoints.length - 1;\n\t\tconst rawSamples = [];\n\t\tfor (let s = 0; s < numSegments; s++) {\n\t\t\tconst p0 = pts[s];\n\t\t\tconst p1 = pts[s + 1];\n\t\t\tconst p2 = pts[s + 2];\n\t\t\tconst p3 = pts[s + 3];\n\t\t\tconst steps = s === numSegments - 1 ? samplesPerSegment : samplesPerSegment - 1;\n\t\t\tfor (let step = 0; step <= steps; step++) {\n\t\t\t\tconst t = step / samplesPerSegment;\n\t\t\t\tconst t2 = t * t;\n\t\t\t\tconst t3 = t2 * t;\n\t\t\t\tconst a0 = -.5 * t3 + t2 - .5 * t;\n\t\t\t\tconst a1 = 1.5 * t3 - 2.5 * t2 + 1;\n\t\t\t\tconst a2 = -1.5 * t3 + 2 * t2 + .5 * t;\n\t\t\t\tconst a3 = .5 * t3 - .5 * t2;\n\t\t\t\tconst pos = [\n\t\t\t\t\ta0 * p0[0] + a1 * p1[0] + a2 * p2[0] + a3 * p3[0],\n\t\t\t\t\ta0 * p0[1] + a1 * p1[1] + a2 * p2[1] + a3 * p3[1],\n\t\t\t\t\ta0 * p0[2] + a1 * p1[2] + a2 * p2[2] + a3 * p3[2]\n\t\t\t\t];\n\t\t\t\tconst da0 = -1.5 * t2 + 2 * t - .5;\n\t\t\t\tconst da1 = 4.5 * t2 - 5 * t;\n\t\t\t\tconst da2 = -4.5 * t2 + 4 * t + .5;\n\t\t\t\tconst da3 = 1.5 * t2 - 1 * t;\n\t\t\t\tconst tanVel = [\n\t\t\t\t\tda0 * p0[0] + da1 * p1[0] + da2 * p2[0] + da3 * p3[0],\n\t\t\t\t\tda0 * p0[1] + da1 * p1[1] + da2 * p2[1] + da3 * p3[1],\n\t\t\t\t\tda0 * p0[2] + da1 * p1[2] + da2 * p2[2] + da3 * p3[2]\n\t\t\t\t];\n\t\t\t\tconst tangent = Vector3Math.normalize(tanVel);\n\t\t\t\trawSamples.push({\n\t\t\t\t\tposition: pos,\n\t\t\t\t\ttangent\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tlet cumulativeDist = 0;\n\t\tconst samples = [{\n\t\t\tposition: rawSamples[0].position,\n\t\t\ttangent: rawSamples[0].tangent,\n\t\t\tdistance: 0\n\t\t}];\n\t\tfor (let i = 1; i < rawSamples.length; i++) {\n\t\t\tconst d = Vector3Math.distance(rawSamples[i].position, rawSamples[i - 1].position);\n\t\t\tcumulativeDist += d;\n\t\t\tsamples.push({\n\t\t\t\tposition: rawSamples[i].position,\n\t\t\t\ttangent: rawSamples[i].tangent,\n\t\t\t\tdistance: cumulativeDist\n\t\t\t});\n\t\t}\n\t\treturn new Path3D(samples);\n\t}\n\t/**\n\t* Creates a continuous 3D path from a chain of cubic Bezier segments.\n\t*/\n\tstatic bezier(segments, samplesPerSegment = 50) {\n\t\tif (segments.length === 0) throw new Error(\"Bezier path requires at least 1 segment\");\n\t\tconst rawSamples = [];\n\t\tfor (let s = 0; s < segments.length; s++) {\n\t\t\tconst seg = segments[s];\n\t\t\tconst steps = s === segments.length - 1 ? samplesPerSegment : samplesPerSegment - 1;\n\t\t\tfor (let step = 0; step <= steps; step++) {\n\t\t\t\tconst t = step / samplesPerSegment;\n\t\t\t\tconst u = 1 - t;\n\t\t\t\tconst uu = u * u;\n\t\t\t\tconst uuu = uu * u;\n\t\t\t\tconst tt = t * t;\n\t\t\t\tconst ttt = tt * t;\n\t\t\t\tconst pos = [\n\t\t\t\t\tuuu * seg.p0[0] + 3 * uu * t * seg.p1[0] + 3 * u * tt * seg.p2[0] + ttt * seg.p3[0],\n\t\t\t\t\tuuu * seg.p0[1] + 3 * uu * t * seg.p1[1] + 3 * u * tt * seg.p2[1] + ttt * seg.p3[1],\n\t\t\t\t\tuuu * seg.p0[2] + 3 * uu * t * seg.p1[2] + 3 * u * tt * seg.p2[2] + ttt * seg.p3[2]\n\t\t\t\t];\n\t\t\t\tconst tanVel = [\n\t\t\t\t\t3 * uu * (seg.p1[0] - seg.p0[0]) + 6 * u * t * (seg.p2[0] - seg.p1[0]) + 3 * tt * (seg.p3[0] - seg.p2[0]),\n\t\t\t\t\t3 * uu * (seg.p1[1] - seg.p0[1]) + 6 * u * t * (seg.p2[1] - seg.p1[1]) + 3 * tt * (seg.p3[1] - seg.p2[1]),\n\t\t\t\t\t3 * uu * (seg.p1[2] - seg.p0[2]) + 6 * u * t * (seg.p2[2] - seg.p1[2]) + 3 * tt * (seg.p3[2] - seg.p2[2])\n\t\t\t\t];\n\t\t\t\tconst tangent = Vector3Math.normalize(tanVel);\n\t\t\t\trawSamples.push({\n\t\t\t\t\tposition: pos,\n\t\t\t\t\ttangent\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tlet cumulativeDist = 0;\n\t\tconst samples = [{\n\t\t\tposition: rawSamples[0].position,\n\t\t\ttangent: rawSamples[0].tangent,\n\t\t\tdistance: 0\n\t\t}];\n\t\tfor (let i = 1; i < rawSamples.length; i++) {\n\t\t\tcumulativeDist += Vector3Math.distance(rawSamples[i].position, rawSamples[i - 1].position);\n\t\t\tsamples.push({\n\t\t\t\tposition: rawSamples[i].position,\n\t\t\t\ttangent: rawSamples[i].tangent,\n\t\t\t\tdistance: cumulativeDist\n\t\t\t});\n\t\t}\n\t\treturn new Path3D(samples);\n\t}\n\t/**\n\t* Creates a 3D volumetric helix / spiral path.\n\t*/\n\tstatic helix(options) {\n\t\tconst { center, radius, pitch, turns, axis = \"z\", samplesPerTurn = 60 } = options;\n\t\tconst totalSamples = Math.max(10, Math.round(turns * samplesPerTurn));\n\t\tconst rawSamples = [];\n\t\tfor (let i = 0; i <= totalSamples; i++) {\n\t\t\tconst progress = i / totalSamples;\n\t\t\tconst theta = progress * turns * Math.PI * 2;\n\t\t\tconst axial = (progress - .5) * pitch * turns;\n\t\t\tconst c = Math.cos(theta);\n\t\t\tconst s = Math.sin(theta);\n\t\t\tlet pos;\n\t\t\tlet tanVel;\n\t\t\tif (axis === \"z\") {\n\t\t\t\tpos = [\n\t\t\t\t\tcenter[0] + radius * c,\n\t\t\t\t\tcenter[1] + radius * s,\n\t\t\t\t\tcenter[2] + axial\n\t\t\t\t];\n\t\t\t\ttanVel = [\n\t\t\t\t\t-radius * s,\n\t\t\t\t\tradius * c,\n\t\t\t\t\tpitch * turns / (turns * Math.PI * 2)\n\t\t\t\t];\n\t\t\t} else if (axis === \"y\") {\n\t\t\t\tpos = [\n\t\t\t\t\tcenter[0] + radius * c,\n\t\t\t\t\tcenter[1] + axial,\n\t\t\t\t\tcenter[2] + radius * s\n\t\t\t\t];\n\t\t\t\ttanVel = [\n\t\t\t\t\t-radius * s,\n\t\t\t\t\tpitch * turns / (turns * Math.PI * 2),\n\t\t\t\t\tradius * c\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tpos = [\n\t\t\t\t\tcenter[0] + axial,\n\t\t\t\t\tcenter[1] + radius * c,\n\t\t\t\t\tcenter[2] + radius * s\n\t\t\t\t];\n\t\t\t\ttanVel = [\n\t\t\t\t\tpitch * turns / (turns * Math.PI * 2),\n\t\t\t\t\t-radius * s,\n\t\t\t\t\tradius * c\n\t\t\t\t];\n\t\t\t}\n\t\t\trawSamples.push({\n\t\t\t\tposition: pos,\n\t\t\t\ttangent: Vector3Math.normalize(tanVel)\n\t\t\t});\n\t\t}\n\t\tlet cumulativeDist = 0;\n\t\tconst samples = [{\n\t\t\tposition: rawSamples[0].position,\n\t\t\ttangent: rawSamples[0].tangent,\n\t\t\tdistance: 0\n\t\t}];\n\t\tfor (let i = 1; i < rawSamples.length; i++) {\n\t\t\tcumulativeDist += Vector3Math.distance(rawSamples[i].position, rawSamples[i - 1].position);\n\t\t\tsamples.push({\n\t\t\t\tposition: rawSamples[i].position,\n\t\t\t\ttangent: rawSamples[i].tangent,\n\t\t\t\tdistance: cumulativeDist\n\t\t\t});\n\t\t}\n\t\treturn new Path3D(samples);\n\t}\n\t/**\n\t* Creates a 3D circular or arc orbit path.\n\t*/\n\tstatic circle(options) {\n\t\tconst { center, radius, startAngleDeg = 0, endAngleDeg = 360, samples = 128 } = options;\n\t\tconst startRad = startAngleDeg * Math.PI / 180;\n\t\tconst endRad = endAngleDeg * Math.PI / 180;\n\t\tconst rawSamples = [];\n\t\tfor (let i = 0; i <= samples; i++) {\n\t\t\tconst theta = startRad + (endRad - startRad) * (i / samples);\n\t\t\tconst c = Math.cos(theta);\n\t\t\tconst s = Math.sin(theta);\n\t\t\tconst pos = [\n\t\t\t\tcenter[0] + radius * c,\n\t\t\t\tcenter[1],\n\t\t\t\tcenter[2] + radius * s\n\t\t\t];\n\t\t\tconst tanVel = [\n\t\t\t\t-radius * s,\n\t\t\t\t0,\n\t\t\t\tradius * c\n\t\t\t];\n\t\t\trawSamples.push({\n\t\t\t\tposition: pos,\n\t\t\t\ttangent: Vector3Math.normalize(tanVel)\n\t\t\t});\n\t\t}\n\t\tlet cumulativeDist = 0;\n\t\tconst pathSamples = [{\n\t\t\tposition: rawSamples[0].position,\n\t\t\ttangent: rawSamples[0].tangent,\n\t\t\tdistance: 0\n\t\t}];\n\t\tfor (let i = 1; i < rawSamples.length; i++) {\n\t\t\tcumulativeDist += Vector3Math.distance(rawSamples[i].position, rawSamples[i - 1].position);\n\t\t\tpathSamples.push({\n\t\t\t\tposition: rawSamples[i].position,\n\t\t\t\ttangent: rawSamples[i].tangent,\n\t\t\t\tdistance: cumulativeDist\n\t\t\t});\n\t\t}\n\t\treturn new Path3D(pathSamples);\n\t}\n};\n\n//#endregion\n//#region src/utils.ts\n/**\n* Preloads a font into the browser or headless environment.\n*/\nasync function preloadFont(family, url) {\n\tif (typeof window !== \"undefined\" && typeof FontFace !== \"undefined\") try {\n\t\tconst loadedFace = await new FontFace(family, `url(${url})`).load();\n\t\tdocument.fonts.add(loadedFace);\n\t\tawait document.fonts.ready;\n\t} catch (e) {\n\t\tconsole.warn(`[preloadFont] Failed to load font \"${family}\" from ${url}:`, e);\n\t}\n\telse await registerHeadlessFont(family, url);\n}\n\n//#endregion\n//#region src/preload-fonts.ts\nconst EMOJI_REGEX = /\\p{Extended_Pictographic}/gu;\nlet warnedNoEmojiFont = false;\n/**\n* Loads every font a composition's text uses (for layout and for drawing) and\n* the emoji it draws. The browser preview and the export both call this, so\n* they start each render from the same glyphs.\n*/\nasync function preloadCompositionFonts(media, device, onError = (err, what) => console.warn(`[framefields] ${what}`, err)) {\n\tconst families = /* @__PURE__ */ new Set();\n\tconst emoji = /* @__PURE__ */ new Map();\n\t(function walk(node) {\n\t\tconst op = node.operation;\n\t\tif (op) {\n\t\t\tconst isText = op.op === \"text\" || op.kind === \"text\" || op.op === \"caption\" || op.kind === \"caption\" || typeof op.text === \"string\";\n\t\t\tconst family = op.fontFamily || (isText ? \"Inter\" : \"\");\n\t\t\tif (family) families.add(family);\n\t\t\tif (op.op === \"text\" && typeof op.text === \"string\") {\n\t\t\t\tconst fontSize = op.fontSize ?? 48;\n\t\t\t\tfor (const char of op.text.match(EMOJI_REGEX) ?? []) emoji.set(`${char}-${fontSize}`, fontSize);\n\t\t\t}\n\t\t}\n\t\tfor (const child of node.children ?? []) walk(child);\n\t})(media);\n\tconst tasks = [];\n\tfor (const family of families) {\n\t\tconst url = getHeadlessFontPath(family) ?? GetFontAssetUrl(family);\n\t\ttasks.push(preloadFont(family, url).catch((err) => onError(err, `font \"${family}\" from ${url}`)));\n\t\tif (device) tasks.push(SlugFontCache.preloadSlugFont(device, family, url).catch((err) => onError(err, `Slug font \"${family}\" from ${url}`)));\n\t}\n\tif (device && emoji.size > 0) {\n\t\tif (!SlugFontCache.hasEmojiFont() && !warnedNoEmojiFont) {\n\t\t\twarnedNoEmojiFont = true;\n\t\t\tconsole.warn(\"[framefields] Text uses emoji but no emoji font is registered, so exports draw nothing for them. Register a color emoji font (e.g. Noto Color Emoji) with FontManager.registerEmojiFont(path).\");\n\t\t}\n\t\tfor (const [key, fontSize] of emoji) {\n\t\t\tconst char = key.slice(0, key.lastIndexOf(\"-\"));\n\t\t\ttasks.push(SlugFontCache.preloadEmoji(device, char, fontSize).catch((err) => {\n\t\t\t\tif (SlugFontCache.hasEmojiFont()) onError(err, `emoji \"${char}\"`);\n\t\t\t}));\n\t\t}\n\t}\n\tawait Promise.all(tasks);\n}\n\n//#endregion\n//#region src/spring.ts\nconst defaultSpringConfig = {\n\tdamping: 10,\n\tmass: 1,\n\tstiffness: 100,\n\tovershootClamping: false\n};\nconst advanceCache = {};\nfunction advance({ animation, now, config }) {\n\tconst { toValue, lastTimestamp, current, velocity } = animation;\n\tconst deltaTime = Math.min(now - lastTimestamp, 64);\n\tif (config.damping <= 0) throw new Error(\"Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.\");\n\tif (config.stiffness <= 0) throw new Error(\"Spring stiffness must be greater than 0.\");\n\tif (config.mass <= 0) throw new Error(\"Spring mass must be greater than 0.\");\n\tconst c = config.damping;\n\tconst m = config.mass;\n\tconst k = config.stiffness;\n\tconst cacheKey = [\n\t\ttoValue,\n\t\tlastTimestamp,\n\t\tcurrent,\n\t\tvelocity,\n\t\tc,\n\t\tm,\n\t\tk,\n\t\tnow\n\t].join(\"-\");\n\tif (advanceCache[cacheKey]) return advanceCache[cacheKey];\n\tconst v0 = -velocity;\n\tconst x0 = toValue - current;\n\tconst zeta = c / (2 * Math.sqrt(k * m));\n\tconst omega0 = Math.sqrt(k / m);\n\tconst omega1 = omega0 * Math.sqrt(1 - zeta ** 2);\n\tconst t = deltaTime / 1e3;\n\tconst sin1 = Math.sin(omega1 * t);\n\tconst cos1 = Math.cos(omega1 * t);\n\tconst underDampedEnvelope = Math.exp(-zeta * omega0 * t);\n\tconst underDampedFrag1 = underDampedEnvelope * (sin1 * ((v0 + zeta * omega0 * x0) / omega1) + x0 * cos1);\n\tconst underDampedPosition = toValue - underDampedFrag1;\n\tconst underDampedVelocity = zeta * omega0 * underDampedFrag1 - underDampedEnvelope * (cos1 * (v0 + zeta * omega0 * x0) - omega1 * x0 * sin1);\n\tconst criticallyDampedEnvelope = Math.exp(-omega0 * t);\n\tconst criticallyDampedPosition = toValue - criticallyDampedEnvelope * (x0 + (v0 + omega0 * x0) * t);\n\tconst criticallyDampedVelocity = criticallyDampedEnvelope * (v0 * (t * omega0 - 1) + t * x0 * omega0 * omega0);\n\tconst animationNode = {\n\t\ttoValue,\n\t\tprevPosition: current,\n\t\tlastTimestamp: now,\n\t\tcurrent: zeta < 1 ? underDampedPosition : criticallyDampedPosition,\n\t\tvelocity: zeta < 1 ? underDampedVelocity : criticallyDampedVelocity\n\t};\n\tadvanceCache[cacheKey] = animationNode;\n\treturn animationNode;\n}\nconst calculationCache = {};\nfunction springCalculation({ frame, fps, config = {} }) {\n\tconst from = 0;\n\tconst to = 1;\n\tconst cacheKey = [\n\t\tframe,\n\t\tfps,\n\t\tconfig.damping,\n\t\tconfig.mass,\n\t\tconfig.overshootClamping,\n\t\tconfig.stiffness\n\t].join(\"-\");\n\tif (calculationCache[cacheKey]) return calculationCache[cacheKey];\n\tlet animation = {\n\t\tlastTimestamp: 0,\n\t\tcurrent: from,\n\t\ttoValue: to,\n\t\tvelocity: 0,\n\t\tprevPosition: 0\n\t};\n\tconst frameClamped = Math.max(0, frame);\n\tconst unevenRest = frameClamped % 1;\n\tfor (let f = 0; f <= Math.floor(frameClamped); f++) {\n\t\tif (f === Math.floor(frameClamped)) f += unevenRest;\n\t\tconst time = f / fps * 1e3;\n\t\tanimation = advance({\n\t\t\tanimation,\n\t\t\tnow: time,\n\t\t\tconfig: {\n\t\t\t\t...defaultSpringConfig,\n\t\t\t\t...config\n\t\t\t}\n\t\t});\n\t}\n\tcalculationCache[cacheKey] = animation;\n\treturn animation;\n}\nconst measureCache = /* @__PURE__ */ new Map();\nfunction measureSpring({ fps, config = {}, threshold = .005 }) {\n\tif (typeof threshold !== \"number\") throw new TypeError(`threshold must be a number, got ${threshold}`);\n\tif (threshold === 0) return Infinity;\n\tif (threshold === 1) return 0;\n\tif (Number.isNaN(threshold)) throw new TypeError(\"Threshold is NaN\");\n\tif (!Number.isFinite(threshold)) throw new TypeError(\"Threshold is not finite\");\n\tif (threshold < 0) throw new TypeError(\"Threshold is below 0\");\n\tconst cacheKey = [\n\t\tfps,\n\t\tconfig.damping,\n\t\tconfig.mass,\n\t\tconfig.overshootClamping,\n\t\tconfig.stiffness,\n\t\tthreshold\n\t].join(\"-\");\n\tif (measureCache.has(cacheKey)) return measureCache.get(cacheKey);\n\tlet frame = 0;\n\tlet finishedFrame = 0;\n\tconst calc = () => {\n\t\treturn springCalculation({\n\t\t\tfps,\n\t\t\tframe,\n\t\t\tconfig\n\t\t});\n\t};\n\tlet animation = calc();\n\tconst calcDifference = () => {\n\t\treturn Math.abs(animation.current - animation.toValue);\n\t};\n\tlet difference = calcDifference();\n\twhile (difference >= threshold) {\n\t\tframe++;\n\t\tanimation = calc();\n\t\tdifference = calcDifference();\n\t}\n\tfinishedFrame = frame;\n\tfor (let i = 0; i < 20; i++) {\n\t\tframe++;\n\t\tanimation = calc();\n\t\tdifference = calcDifference();\n\t\tif (difference >= threshold) {\n\t\t\ti = 0;\n\t\t\tfinishedFrame = frame + 1;\n\t\t}\n\t}\n\tmeasureCache.set(cacheKey, finishedFrame);\n\treturn finishedFrame;\n}\nfunction spring({ frame: passedFrame, fps, config = {}, from = 0, to = 1, durationInFrames: passedDurationInFrames, durationRestThreshold, delay = 0, reverse = false }) {\n\tconst needsToCalculateNaturalDuration = reverse || typeof passedDurationInFrames !== \"undefined\";\n\tconst naturalDuration = needsToCalculateNaturalDuration ? measureSpring({\n\t\tfps,\n\t\tconfig,\n\t\tthreshold: durationRestThreshold\n\t}) : void 0;\n\tconst naturalDurationGetter = needsToCalculateNaturalDuration ? { get: () => naturalDuration } : { get: () => {\n\t\tthrow new Error(\"did not calculate natural duration\");\n\t} };\n\tconst delayProcessed = (reverse ? (passedDurationInFrames ?? naturalDurationGetter.get()) - passedFrame : passedFrame) + (reverse ? delay : -delay);\n\tconst durationProcessed = passedDurationInFrames === void 0 ? delayProcessed : delayProcessed / (passedDurationInFrames / naturalDurationGetter.get());\n\tif (passedDurationInFrames && delayProcessed > passedDurationInFrames) return to;\n\tconst spr = springCalculation({\n\t\tfps,\n\t\tframe: durationProcessed,\n\t\tconfig\n\t});\n\tconst inner = config.overshootClamping ? to >= from ? Math.min(spr.current, to) : Math.max(spr.current, to) : spr.current;\n\treturn from === 0 && to === 1 ? inner : interpolate(inner, [0, 1], [from, to]);\n}\n\n//#endregion\n//#region src/text-measurer.ts\nconst cache = /* @__PURE__ */ new Map();\nfunction getCacheKey(text, style) {\n\treturn JSON.stringify({\n\t\ttext,\n\t\t...style\n\t});\n}\n/**\n* Shared text measurer that uses SlugGeometry.measure for all environments.\n*/\nfunction measureText(text, style) {\n\tconst safeText = text ? String(text) : \" \";\n\tconst cacheKey = getCacheKey(safeText, style);\n\tconst cached = cache.get(cacheKey);\n\tif (cached) return cached;\n\tconst fontSize = style.fontSize ?? 48;\n\tlet fontFamily = style.fontFamily ?? \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) fontFamily = \"Inter\";\n\tconst letterSpacing = style.letterSpacing ?? 0;\n\tconst calculatedLineHeight = style.lineHeight !== void 0 && style.lineHeight < 10 ? style.lineHeight * fontSize : style.lineHeight ?? fontSize * 1.2;\n\tconst slugFont = SlugFontCache.getFont(fontFamily, style.fontWeight, null);\n\tconst padding = style.padding ?? 0;\n\tif (!slugFont) {\n\t\tif (!SlugFontCache.isFailed(fontFamily)) {\n\t\t\tconst fontUrl = GetFontAssetUrl(fontFamily);\n\t\t\tSlugFontCache.preloadSlugFont(null, fontFamily, fontUrl).catch(() => {});\n\t\t}\n\t\tconst lines = safeText.split(\"\\n\");\n\t\tlet totalWrappedLines = 0;\n\t\tconst maxW = style.width !== void 0 ? Math.max(10, style.width - padding * 2) : 0;\n\t\tfor (const line of lines) if (maxW > 0) {\n\t\t\tconst estLineWidth = line.length * fontSize * .55 + letterSpacing * line.length;\n\t\t\tconst wrapCount = Math.max(1, Math.ceil(estLineWidth / maxW));\n\t\t\ttotalWrappedLines += wrapCount;\n\t\t} else totalWrappedLines += 1;\n\t\tconst result$1 = {\n\t\t\twidth: style.width !== void 0 ? style.width : Math.ceil(safeText.length * fontSize * .6 + letterSpacing * safeText.length) + 2 + padding * 2,\n\t\t\theight: style.height !== void 0 ? style.height : Math.ceil(totalWrappedLines * calculatedLineHeight) + 2 + padding * 2\n\t\t};\n\t\tcache.set(cacheKey, result$1);\n\t\treturn result$1;\n\t}\n\tconst measured = SlugGeometry.measure(safeText, slugFont, fontSize, letterSpacing, calculatedLineHeight, style.width !== void 0 ? Math.max(0, style.width - padding * 2) : void 0, style.spans);\n\tconst result = {\n\t\twidth: style.width !== void 0 && !style.keepNaturalWidth ? style.width : Math.ceil(measured.width) + padding * 2 + 8,\n\t\theight: style.height !== void 0 ? style.height : Math.ceil(measured.height) + padding * 2\n\t};\n\tcache.set(cacheKey, result);\n\treturn result;\n}\n/**\n* Async variant of measureText. Preloads the Slug font and yields to the browser.\n*/\nfunction measureTextAsync(text, style) {\n\tlet fontFamily = style.fontFamily ?? \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) fontFamily = \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) return Promise.resolve(measureText(text, style));\n\tconst fontUrl = GetFontAssetUrl(fontFamily);\n\treturn SlugFontCache.preloadSlugFont(null, fontFamily, fontUrl).then(() => measureText(text, style)).catch(() => measureText(text, style));\n}\n\n//#endregion\nexport { Camera3D, Easing, LIGHT_UNIFORM_SIZE_BYTES, Light3D, MAX_LIGHTS, Matrix4Math, Path3D, Vector3Math, bezier, computeStrokeRect, interpolate, mapBlendModeToSkia, measureSpring, measureText, measureTextAsync, parseColorToRgb, preloadCompositionFonts, preloadFont, requiresIsolation, spring, springCalculation };\n//# sourceMappingURL=index.mjs.map","import { DEFAULT_DURATION_MS, getActiveMediaMetadata, resolveMediaMimeType } from \"@framefields/core\";\nimport { getEnv, resolveMediaSourceUrl } from \"@framefields/client-utils\";\nimport { interpolate, spring } from \"@framefields/renderers\";\n\n//#region src/utils/apply-operations.ts\nconst BASE_URL = getEnv(\"BASE_URL\");\nconst CDN_DOMAIN = getEnv(\"R2_CUSTOM_DOMAIN\");\nfunction getFontUrl(name) {\n\tif (CDN_DOMAIN) return `https://${CDN_DOMAIN}/fonts/${name}/font_file.ttf`;\n\treturn `${BASE_URL}/api/v1/fonts/load/${name}`;\n}\n/**\n* Compute render parameters for the CURRENT node only — does NOT recurse into\n* children. Each node in the VirtualMedia tree is responsible for exactly its\n* own operation; `SingleClipComposition` drives traversal via React recursion.\n*\n* This is the correct function to use inside the renderer.\n*/\nfunction computeRenderParams(vv) {\n\tconst op = vv.operation;\n\tconst baseMeta = getActiveMediaMetadata(vv);\n\tconst params = {\n\t\tsourceUrl: void 0,\n\t\ttrimStartSec: 0,\n\t\ttrimEndSec: null,\n\t\tspeed: 1,\n\t\tcropRegion: null,\n\t\tflipH: false,\n\t\tflipV: false,\n\t\trotation: 0,\n\t\teffectiveDurationSec: 0,\n\t\tmimeType: resolveMediaMimeType(vv) || null\n\t};\n\tswitch (op.op) {\n\t\tcase \"text\":\n\t\t\tparams.sourceUrl = void 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tparams.sourceUrl = resolveMediaSourceUrl(vv);\n\t\t\tbreak;\n\t}\n\tconst sourceDurationSec = (baseMeta?.durationMs ?? 0) / 1e3;\n\tparams.effectiveDurationSec = ((params.trimEndSec ?? sourceDurationSec) - params.trimStartSec) / params.speed;\n\treturn params;\n}\n\n//#endregion\n//#region src/utils/timing.ts\nfunction framesToSeconds(frames, fps) {\n\treturn frames / fps;\n}\nfunction secondsToFrames(seconds, fps) {\n\treturn Math.round(seconds * fps);\n}\nfunction formatTimecode(seconds) {\n\tconst mins = Math.floor(seconds / 60);\n\tconst secs = Math.floor(seconds % 60);\n\tconst ms = Math.floor(seconds % 1 * 100);\n\treturn `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}.${ms.toString().padStart(2, \"0\")}`;\n}\n\n//#endregion\n//#region src/utils/layer-logic.ts\nconst isStaticVisualMedia = (type) => type === \"Image\" || type === \"SVG\" || type === \"Text\";\nconst resolveLayerDuration = (layerDurationInMS, metaDurationMs, defaultDuration = DEFAULT_DURATION_MS, type) => {\n\tif (type === \"Caption\") return metaDurationMs && metaDurationMs > 0 ? metaDurationMs : layerDurationInMS || defaultDuration;\n\tconst isStatic = isStaticVisualMedia(type);\n\tif (layerDurationInMS && metaDurationMs && !isStatic) return Math.min(layerDurationInMS, metaDurationMs);\n\treturn layerDurationInMS || metaDurationMs || defaultDuration;\n};\nconst calculateLayerTransform = (layer, frame, fps, viewport) => {\n\tconst relativeFrame = frame - (layer.startFrame ?? 0);\n\tlet x = layer.x ?? 0;\n\tlet y = layer.y ?? 0;\n\tlet scale = layer.scale ?? 1;\n\tlet rotation = layer.rotation ?? 0;\n\tlet opacity = layer.opacity ?? 1;\n\tconst volume = layer.volume ?? 1;\n\tconst layerDurationMs = resolveLayerDuration(layer.durationInMS, layer.virtualMedia?.metadata?.durationMs ?? void 0, DEFAULT_DURATION_MS, layer.type);\n\tconst duration = Math.round(layerDurationMs / 1e3 * fps);\n\tconst animations = layer.type === \"Text\" || layer.type === \"Caption\" ? [] : layer.animations ?? [];\n\tif (animations.length === 0) return {\n\t\tx,\n\t\ty,\n\t\tscale,\n\t\trotation,\n\t\topacity,\n\t\tvolume\n\t};\n\tanimations.forEach((anim) => {\n\t\tconst durFrames = anim.value * fps;\n\t\tconst isOut = anim.type.includes(\"-out\");\n\t\tconst startAnimFrame = isOut ? duration - durFrames : 0;\n\t\tconst endAnimFrame = isOut ? duration : durFrames;\n\t\tif (relativeFrame < startAnimFrame || relativeFrame > endAnimFrame) return;\n\t\tconst progress = interpolate(relativeFrame, [startAnimFrame, endAnimFrame], [0, 1], {\n\t\t\textrapolateLeft: \"clamp\",\n\t\t\textrapolateRight: \"clamp\"\n\t\t});\n\t\tswitch (anim.type) {\n\t\t\tcase \"fade-in\":\n\t\t\t\topacity *= progress;\n\t\t\t\tbreak;\n\t\t\tcase \"fade-out\":\n\t\t\t\topacity *= 1 - progress;\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-left\":\n\t\t\t\tx += -1 * viewport.w * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-right\":\n\t\t\t\tx += 1 * viewport.w * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-top\":\n\t\t\t\ty += -1 * viewport.h * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-bottom\":\n\t\t\t\ty += 1 * viewport.h * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"zoom-in\":\n\t\t\t\tscale *= interpolate(progress, [0, 1], [0, 1]);\n\t\t\t\tbreak;\n\t\t\tcase \"zoom-out\":\n\t\t\t\tscale *= interpolate(progress, [0, 1], [1, 0]);\n\t\t\t\tbreak;\n\t\t\tcase \"rotate-cw\":\n\t\t\t\trotation += 360 * progress;\n\t\t\t\tbreak;\n\t\t\tcase \"rotate-ccw\":\n\t\t\t\trotation += -360 * progress;\n\t\t\t\tbreak;\n\t\t\tcase \"bounce\": {\n\t\t\t\tconst bounceVal = spring({\n\t\t\t\t\tframe: relativeFrame - startAnimFrame,\n\t\t\t\t\tfps,\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tdamping: 10,\n\t\t\t\t\t\tmass: .5,\n\t\t\t\t\t\tstiffness: 100\n\t\t\t\t\t},\n\t\t\t\t\tdurationInFrames: durFrames\n\t\t\t\t});\n\t\t\t\tscale *= bounceVal;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"shake\":\n\t\t\t\tx += 20 * Math.sin(relativeFrame * 10 * 2 * Math.PI / durFrames) * (1 - progress);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\treturn {\n\t\tx,\n\t\ty,\n\t\tscale,\n\t\trotation,\n\t\topacity,\n\t\tvolume\n\t};\n};\n\n//#endregion\nexport { framesToSeconds as a, getFontUrl as c, formatTimecode as i, isStaticVisualMedia as n, secondsToFrames as o, resolveLayerDuration as r, computeRenderParams as s, calculateLayerTransform as t };\n//# sourceMappingURL=layer-logic-DBs4NHoi.mjs.map","import { a as framesToSeconds, c as getFontUrl, i as formatTimecode, n as isStaticVisualMedia, o as secondsToFrames, r as resolveLayerDuration, s as computeRenderParams, t as calculateLayerTransform } from \"./layer-logic-DBs4NHoi.mjs\";\nimport { getActiveMediaMetadata, getMediaType, isSignal, updateClockSignals } from \"@framefields/core\";\nimport { audioRegistry, webgpuRegistry } from \"@framefields/node-sdk\";\nimport { drawCaptionNode, drawGifNode, drawImageNode, drawLottieNode, drawParagraphNode, drawSignalNode, drawSvgNode, drawVideoNode, inputStore, shaderStore, signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { AudioSampleSink } from \"mediabunny\";\n\n//#region src/compositions/canvas-composition.ts\nconst segmentRangeCache = /* @__PURE__ */ new WeakMap();\nfunction getCachedSegmentRanges(segments, fps) {\n\tconst cached = segmentRangeCache.get(segments);\n\tif (cached && cached.fps === fps) return cached.ranges;\n\tlet currentStart = 0;\n\tconst ranges = segments.map((seg) => {\n\t\tconst durSec = (seg.endSec ?? 0) - seg.startSec;\n\t\tconst durFrames = Math.max(1, Math.round(durSec * fps));\n\t\tconst start = currentStart;\n\t\tcurrentStart += durFrames;\n\t\treturn {\n\t\t\tseg,\n\t\t\tstart,\n\t\t\tduration: durFrames\n\t\t};\n\t});\n\tsegmentRangeCache.set(segments, {\n\t\tfps,\n\t\tranges\n\t});\n\treturn ranges;\n}\nconst frameCtxPool = [];\nfunction acquireFrameContext() {\n\treturn frameCtxPool.pop() ?? {};\n}\n/**\n* Effect operations carry every config field as a signal. Hand node renderers\n* the plain value for this frame (nested objects/arrays included), keeping only\n* GPU-bound signals intact since those are consumed as textures.\n*/\nfunction resolveSignalOperation(virtualMedia, frameCtx) {\n\tconst op = virtualMedia.operation;\n\tconst resolved = { ...op };\n\tfor (const [key, sig] of Object.entries(op.signals)) if (isSignal(sig) && !sig.gpuBinding) resolved[key] = sig.get(frameCtx);\n\treturn {\n\t\t...virtualMedia,\n\t\toperation: resolved\n\t};\n}\nasync function drawCompositionTree(ctx, encoder, targetView, targetTexture, targetWidth, targetHeight, virtualMedia, props, inheritedSeekOffset = 0, inheritedClockOffset = 0) {\n\tconst fps = props.fps ?? 24;\n\tconst op = virtualMedia.operation;\n\tif (!op) return;\n\tconst isCompositor = op.op === \"Compositor\";\n\tconst frame = props.frame ?? 0;\n\tconst segments = op.timeline?.segments || [];\n\tconst localFrame = frame - (op.startFrame ?? op.timeline?.startFrame ?? 0);\n\tconst isTimelineProvider = op.timeline !== void 0 || op.startFrame !== void 0 || op.op === \"compose\";\n\tconst resolvedDurationMs = isTimelineProvider ? getActiveMediaMetadata(virtualMedia)?.durationMs ?? props.durationMs ?? void 0 : props.durationMs ?? getActiveMediaMetadata(virtualMedia)?.durationMs ?? void 0;\n\tif (!(op.op === \"source\" || op.op === \"text\" || op.op === \"caption\")) updateClockSignals(frame, fps, resolvedDurationMs);\n\tconst frameCtx = acquireFrameContext();\n\tframeCtx.frame = frame;\n\tframeCtx.fps = fps;\n\tframeCtx.time = fps > 0 ? frame / fps : 0;\n\tframeCtx.duration = (resolvedDurationMs ?? 0) / 1e3;\n\tframeCtx.durationMs = resolvedDurationMs ?? 0;\n\tframeCtx.progress = resolvedDurationMs && resolvedDurationMs > 0 ? Math.max(0, Math.min(1, frame / fps * 1e3 / resolvedDurationMs)) : 0;\n\tframeCtx.deltaTime = fps > 0 ? 1 / fps : 0;\n\tconst resolvedElapsedMs = isTimelineProvider ? (localFrame !== void 0 && fps !== void 0 ? localFrame / fps * 1e3 : void 0) ?? props.elapsedMs : props.elapsedMs ?? (localFrame !== void 0 && fps !== void 0 ? localFrame / fps * 1e3 : void 0);\n\tconst effectiveLocalFrame = localFrame + Math.round(inheritedSeekOffset * fps);\n\tlet activeSeg = null;\n\tlet windowStartFrame = 0;\n\tif (segments.length > 0) {\n\t\tconst active = getCachedSegmentRanges(segments, fps).find(({ start, duration }) => effectiveLocalFrame >= start && effectiveLocalFrame < start + duration);\n\t\tif (active) {\n\t\t\tactiveSeg = active.seg;\n\t\t\twindowStartFrame = active.start;\n\t\t} else return;\n\t}\n\tconst segmentLocalFrame = localFrame - windowStartFrame;\n\tconst accumulatedSeekOffsetSec = inheritedSeekOffset + (activeSeg ? activeSeg.startSec - windowStartFrame / fps : 0);\n\tconst accumulatedClockOffsetSec = inheritedClockOffset + windowStartFrame / fps;\n\tif (typeof op.onRequestFrame === \"function\") op.onRequestFrame(frameCtx);\n\telse if (op.effect && typeof op.effect.notifyFrame === \"function\") op.effect.notifyFrame(frameCtx);\n\tconst CustomRenderer = webgpuRegistry.get(op.op);\n\tif (CustomRenderer) {\n\t\tif (op.signals) virtualMedia = resolveSignalOperation(virtualMedia, frameCtx);\n\t\tconst inputs = op?.inputs;\n\t\tif (inputs) {\n\t\t\tfor (const entry of Object.values(inputs)) if (entry?.connectionValid && entry?.outputItem?.type === \"LUT\") {\n\t\t\t\tconst lutVirtualMedia = entry.outputItem.data;\n\t\t\t\tif (lutVirtualMedia && typeof lutVirtualMedia === \"object\" && lutVirtualMedia.operation) {\n\t\t\t\t\tconst lutW = lutVirtualMedia.metadata?.width ?? targetWidth;\n\t\t\t\t\tconst lutH = lutVirtualMedia.metadata?.height ?? targetHeight;\n\t\t\t\t\tconst dummyTex = ctx.renderer.getTemporaryTexture(lutW, lutH);\n\t\t\t\t\tawait drawCompositionTree(ctx, encoder, dummyTex.createView(), dummyTex, lutW, lutH, lutVirtualMedia, {\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\tvirtualMedia: lutVirtualMedia\n\t\t\t\t\t}, accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t\t\t\t}\n\t\t\t} else if (entry?.connectionValid && entry?.outputItem?.type === \"Signal\") {\n\t\t\t\tconst sigData = entry.outputItem.data;\n\t\t\t\tif (sigData && typeof sigData === \"object\") await signalRegistry.ensureAudioSourcesExtracted(ctx.device, sigData.signalConfig ?? sigData, fps, props.renderId);\n\t\t\t}\n\t\t}\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tlet passEnded = false;\n\t\tconst originalEnd = pass.end.bind(pass);\n\t\tpass.end = () => {\n\t\t\tif (!passEnded) {\n\t\t\t\toriginalEnd();\n\t\t\t\tpassEnded = true;\n\t\t\t}\n\t\t};\n\t\tconst renderArgs = {\n\t\t\tctx,\n\t\t\tencoder,\n\t\t\tpass,\n\t\t\ttargetView,\n\t\t\ttargetTexture,\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tvirtualMedia,\n\t\t\t\tinheritedSeekOffset: accumulatedSeekOffsetSec,\n\t\t\t\tinheritedClockOffset: accumulatedClockOffsetSec,\n\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\telapsedMs: resolvedElapsedMs\n\t\t\t},\n\t\t\tdrawChild: async (child, overrides, targetViewOverride, targetTextureOverride, targetWidthOverride, targetHeightOverride) => {\n\t\t\t\tawait drawCompositionTree(ctx, encoder, targetViewOverride ?? targetView, targetTextureOverride ?? targetTexture, targetWidthOverride ?? targetWidth, targetHeightOverride ?? targetHeight, child, {\n\t\t\t\t\t...props,\n\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\t\tvirtualMedia: child,\n\t\t\t\t\t...overrides,\n\t\t\t\t\texcludeTextures: [\n\t\t\t\t\t\t...props.excludeTextures || [],\n\t\t\t\t\t\t...overrides?.excludeTextures || [],\n\t\t\t\t\t\ttargetTextureOverride ?? targetTexture\n\t\t\t\t\t]\n\t\t\t\t}, isCompositor ? 0 : accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t\t\t}\n\t\t};\n\t\tawait CustomRenderer(renderArgs);\n\t\trenderArgs.pass.end();\n\t\treturn;\n\t}\n\tif (op.op === \"LUT\") return;\n\tif (op.op === \"Signal\" || op.op === \"SignalMath\" || op.dataType === \"Signal\") {\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tawait drawSignalNode(ctx, encoder, pass, {\n\t\t\tnodeId: op.nodeId || op.signalConfig?.nodeId || props.renderId,\n\t\t\tfunc: op.func,\n\t\t\tamplitude: Number(op.amplitude ?? 1),\n\t\t\tfrequency: Number(op.frequency ?? 1),\n\t\t\tphase: Number(op.phase ?? 0),\n\t\t\toffset: Number(op.offset ?? 0),\n\t\t\tsignalConfig: {\n\t\t\t\t...op.signalConfig,\n\t\t\t\t...op\n\t\t\t},\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\tdurationMs: resolvedDurationMs ?? 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight,\n\t\t\tdrawChild: async (child, childProps, childView, childTex, childW, childH) => {\n\t\t\t\tawait drawCompositionTree(ctx, encoder, childView, childTex, childW, childH, child, {\n\t\t\t\t\t...props,\n\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\t\t...childProps,\n\t\t\t\t\texcludeTextures: [\n\t\t\t\t\t\t...props.excludeTextures || [],\n\t\t\t\t\t\t...childProps?.excludeTextures || [],\n\t\t\t\t\t\tchildTex\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (op.op === \"source\" || op.op === \"text\" || op.op === \"caption\") {\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tif (op.op === \"source\") {\n\t\t\tconst mediaType = getMediaType(virtualMedia);\n\t\t\tconst params = computeRenderParams(virtualMedia);\n\t\t\tif (params.sourceUrl) {\n\t\t\t\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\t\t\t\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\t\t\t\tif (mediaType === \"Image\") await drawImageNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"SVG\") await drawSvgNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\topacity: Number(op.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"Lottie\") await drawLottieNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\tframe: segmentLocalFrame + Math.round(accumulatedSeekOffsetSec * fps),\n\t\t\t\t\tfps,\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"GIF\") await drawGifNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\tframe: segmentLocalFrame + Math.round(accumulatedSeekOffsetSec * fps),\n\t\t\t\t\tfps,\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"Text\") {\n\t\t\t\t\tconst opText = { ...op };\n\t\t\t\t\tdrawParagraphNode(ctx, pass, {\n\t\t\t\t\t\ttext: opText.text || \"\",\n\t\t\t\t\t\tdstRect: {\n\t\t\t\t\t\t\tx: Number(opText.x ?? 0),\n\t\t\t\t\t\t\ty: Number(opText.y ?? 0),\n\t\t\t\t\t\t\twidth: Number(opText.width ?? containerWidth),\n\t\t\t\t\t\t\theight: Number(opText.height ?? containerHeight)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfontFamily: opText.fontFamily,\n\t\t\t\t\t\tfontSize: Number(opText.fontSize ?? 48),\n\t\t\t\t\t\tcolor: opText.fill ?? opText.color ?? \"white\",\n\t\t\t\t\t\twidth: opText.width ? Number(opText.width) : void 0,\n\t\t\t\t\t\theight: opText.height ? Number(opText.height) : void 0,\n\t\t\t\t\t\tlineHeight: Number(opText.lineHeight ?? 1.2),\n\t\t\t\t\t\talign: opText.align,\n\t\t\t\t\t\tverticalAlign: opText.verticalAlign,\n\t\t\t\t\t\tfontWeight: opText.fontWeight,\n\t\t\t\t\t\tfontStyle: opText.fontStyle,\n\t\t\t\t\t\tletterSpacing: opText.letterSpacing,\n\t\t\t\t\t\tshadows: opText.shadows,\n\t\t\t\t\t\ttextBackgroundColor: opText.textBackgroundColor,\n\t\t\t\t\t\tborderRadius: opText.borderRadius != null ? Number(opText.borderRadius) : void 0,\n\t\t\t\t\t\tpadding: opText.padding != null ? Number(opText.padding) : void 0,\n\t\t\t\t\t\tstroke: opText.stroke,\n\t\t\t\t\t\tstrokeWidth: opText.strokeWidth ?? opText.strokeThickness ? Number(opText.strokeWidth ?? opText.strokeThickness) : void 0,\n\t\t\t\t\t\tstrokeAlign: opText.strokeAlign,\n\t\t\t\t\t\topacity: Number(opText.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\t\tanimation: opText.animation ?? opText.textAnimation,\n\t\t\t\t\t\tanimators: opText.animators,\n\t\t\t\t\t\tpathOptions: opText.pathOptions,\n\t\t\t\t\t\ttypewriter: opText.typewriter,\n\t\t\t\t\t\tmarquee: opText.marquee,\n\t\t\t\t\t\ttextProgress: opText.textProgress != null ? Number(opText.textProgress) : void 0,\n\t\t\t\t\t\tsignals: props.signals ?? opText.signals,\n\t\t\t\t\t\tfirstMargin: opText.firstMargin != null ? Number(opText.firstMargin) : void 0,\n\t\t\t\t\t\tlastMargin: opText.lastMargin != null ? Number(opText.lastMargin) : void 0,\n\t\t\t\t\t\tbaselineShift: opText.baselineShift != null ? Number(opText.baselineShift) : void 0,\n\t\t\t\t\t\tframe: localFrame,\n\t\t\t\t\t\tfps,\n\t\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\t\t\tisVideoMode: props.isVideoMode\n\t\t\t\t\t});\n\t\t\t\t} else if (mediaType === \"Video\") {\n\t\t\t\t\tconst finalPlaybackRate = Math.max(.01, (Number(props.playbackRateOverride) || 1) * (Number(params.speed) || 1));\n\t\t\t\t\tconst effectiveTrimSec = Math.max(0, (Number(props.trimStartOverride) || 0) + (Number(params.trimStartSec) || 0) + accumulatedSeekOffsetSec);\n\t\t\t\t\tconst rawTimestampSec = segmentLocalFrame / fps * finalPlaybackRate + effectiveTrimSec;\n\t\t\t\t\tconst timestampSec = Math.max(0, Number.isFinite(rawTimestampSec) ? rawTimestampSec : 0);\n\t\t\t\t\tawait drawVideoNode(ctx, pass, {\n\t\t\t\t\t\tnodeId: props.renderId,\n\t\t\t\t\t\tframeKey: `${props.renderId ?? \"video\"}-${params.sourceUrl}-${Math.round(timestampSec * fps)}`,\n\t\t\t\t\t\tsourceUrl: params.sourceUrl,\n\t\t\t\t\t\ttimestampSec,\n\t\t\t\t\t\tdstRect: {\n\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\t\tisPlaying: props.isPlaying,\n\t\t\t\t\t\tforceWait: props.forceWait\n\t\t\t\t\t});\n\t\t\t\t} else if (mediaType === \"Caption\") {\n\t\t\t\t\tconst opCap = {\n\t\t\t\t\t\t...op,\n\t\t\t\t\t\t...props\n\t\t\t\t\t};\n\t\t\t\t\tawait drawCaptionNode(ctx, pass, {\n\t\t\t\t\t\trenderId: props.renderId,\n\t\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\t\tdstRect: {\n\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\tframe: localFrame,\n\t\t\t\t\t\tfps,\n\t\t\t\t\t\tfontFamily: opCap.fontFamily,\n\t\t\t\t\t\tfontSize: Number(opCap.fontSize ?? 48),\n\t\t\t\t\t\tcolor: opCap.fill ?? opCap.color ?? \"white\",\n\t\t\t\t\t\tlineHeight: Number(opCap.lineHeight ?? 1.2),\n\t\t\t\t\t\talign: opCap.align === \"start\" ? \"left\" : opCap.align === \"end\" ? \"right\" : opCap.align ?? \"center\",\n\t\t\t\t\t\ttextAlignVertical: opCap.verticalAlign ?? opCap.textAlignVertical,\n\t\t\t\t\t\tfontWeight: opCap.fontWeight,\n\t\t\t\t\t\tfontStyle: opCap.fontStyle,\n\t\t\t\t\t\tletterSpacing: opCap.letterSpacing,\n\t\t\t\t\t\tshadows: opCap.shadows,\n\t\t\t\t\t\ttextBackgroundColor: opCap.background ?? opCap.textBackgroundColor,\n\t\t\t\t\t\tborderRadius: (opCap.borderRadius ?? opCap.strokeRadius) != null ? Number(opCap.borderRadius ?? opCap.strokeRadius) : void 0,\n\t\t\t\t\t\tstrokeRadius: (opCap.strokeRadius ?? opCap.borderRadius) != null ? Number(opCap.strokeRadius ?? opCap.borderRadius) : void 0,\n\t\t\t\t\t\tstroke: opCap.stroke,\n\t\t\t\t\t\tstrokeWidth: (opCap.strokeWidth ?? opCap.strokeThickness) != null ? Number(opCap.strokeWidth ?? opCap.strokeThickness) : void 0,\n\t\t\t\t\t\tmaxWidth: opCap.maxWidth,\n\t\t\t\t\t\tpadding: opCap.padding != null ? Number(opCap.padding) : void 0,\n\t\t\t\t\t\topacity: Number(opCap.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\t\tisVideoMode: props.isVideoMode\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (op.op === \"text\") {\n\t\t\tconst opText = { ...op };\n\t\t\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\t\t\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\t\t\tdrawParagraphNode(ctx, pass, {\n\t\t\t\trenderId: props.renderId,\n\t\t\t\ttext: opText.text || \"\",\n\t\t\t\tdstRect: {\n\t\t\t\t\tx: Number(opText.x ?? 0),\n\t\t\t\t\ty: Number(opText.y ?? 0),\n\t\t\t\t\twidth: Number(opText.width ?? containerWidth),\n\t\t\t\t\theight: Number(opText.height ?? containerHeight)\n\t\t\t\t},\n\t\t\t\tspans: opText.spans,\n\t\t\t\tfontFamily: opText.fontFamily,\n\t\t\t\tfontSize: Number(opText.fontSize ?? 48),\n\t\t\t\tcolor: opText.fill ?? opText.color ?? \"white\",\n\t\t\t\twidth: opText.width ? Number(opText.width) : void 0,\n\t\t\t\theight: opText.height ? Number(opText.height) : void 0,\n\t\t\t\tlineHeight: Number(opText.lineHeight ?? 1.2),\n\t\t\t\talign: opText.align,\n\t\t\t\tverticalAlign: opText.verticalAlign,\n\t\t\t\tfontWeight: opText.fontWeight,\n\t\t\t\tfontStyle: opText.fontStyle,\n\t\t\t\tletterSpacing: opText.letterSpacing,\n\t\t\t\tshadows: opText.shadows,\n\t\t\t\ttextBackgroundColor: opText.textBackgroundColor,\n\t\t\t\tborderRadius: (opText.borderRadius ?? opText.strokeRadius) != null ? Number(opText.borderRadius ?? opText.strokeRadius) : void 0,\n\t\t\t\tstrokeRadius: (opText.strokeRadius ?? opText.borderRadius) != null ? Number(opText.strokeRadius ?? opText.borderRadius) : void 0,\n\t\t\t\tpadding: opText.padding != null ? Number(opText.padding) : void 0,\n\t\t\t\tstroke: opText.stroke,\n\t\t\t\tstrokeWidth: opText.strokeWidth ?? opText.strokeThickness ? Number(opText.strokeWidth ?? opText.strokeThickness) : void 0,\n\t\t\t\tstrokeAlign: opText.strokeAlign,\n\t\t\t\topacity: Number(opText.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\tanimation: opText.animation ?? opText.textAnimation,\n\t\t\t\tanimators: opText.animators,\n\t\t\t\tpathOptions: opText.pathOptions,\n\t\t\t\ttypewriter: opText.typewriter,\n\t\t\t\tmarquee: opText.marquee,\n\t\t\t\tsignals: props.signals ?? opText.signals,\n\t\t\t\tfirstMargin: opText.firstMargin != null ? Number(opText.firstMargin) : void 0,\n\t\t\t\tlastMargin: opText.lastMargin != null ? Number(opText.lastMargin) : void 0,\n\t\t\t\tbaselineShift: opText.baselineShift != null ? Number(opText.baselineShift) : void 0,\n\t\t\t\tframe: localFrame,\n\t\t\t\tfps,\n\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\tisVideoMode: props.isVideoMode\n\t\t\t});\n\t\t}\n\t\tpass.end();\n\t}\n\tif (virtualMedia.children && virtualMedia.children.length > 0) for (let i = 0; i < virtualMedia.children.length; i++) {\n\t\tconst child = virtualMedia.children[i];\n\t\tif (child) await drawCompositionTree(ctx, encoder, targetView, targetTexture, targetWidth, targetHeight, child, {\n\t\t\t...props,\n\t\t\tdurationMs: resolvedDurationMs,\n\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\tvirtualMedia: child,\n\t\t\trenderId: `${props.renderId}-c${i}`\n\t\t}, isCompositor ? 0 : accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t}\n}\n\n//#endregion\n//#region src/compositions/composition-state.ts\nconst DEFAULT_STATE = {\n\tframe: 0,\n\tfps: 30,\n\tisPlaying: false\n};\nvar CompositionStateStore = class {\n\tstates = /* @__PURE__ */ new Map();\n\tlisteners = /* @__PURE__ */ new Map();\n\tsetState(key, frame, fps, isPlaying) {\n\t\tconst current = this.states.get(key);\n\t\tconst resolvedPlaying = isPlaying !== void 0 ? isPlaying : current?.isPlaying ?? false;\n\t\tif (current?.frame === frame && current?.fps === fps && current?.isPlaying === resolvedPlaying) return;\n\t\tthis.states.set(key, {\n\t\t\tframe,\n\t\t\tfps,\n\t\t\tisPlaying: resolvedPlaying\n\t\t});\n\t\tthis.notify(key);\n\t}\n\tgetState(key) {\n\t\tif (this.states.has(key)) return this.states.get(key);\n\t\tfor (const [storeKey, value] of this.states.entries()) if (key.startsWith(storeKey)) return value;\n\t\treturn DEFAULT_STATE;\n\t}\n\tsubscribe(key, listener) {\n\t\tif (!this.listeners.has(key)) this.listeners.set(key, /* @__PURE__ */ new Set());\n\t\tthis.listeners.get(key).add(listener);\n\t\treturn () => {\n\t\t\tconst set = this.listeners.get(key);\n\t\t\tset?.delete(listener);\n\t\t\tif (set?.size === 0) {\n\t\t\t\tthis.listeners.delete(key);\n\t\t\t\tthis.states.delete(key);\n\t\t\t}\n\t\t};\n\t}\n\tclearKey(key) {\n\t\tthis.states.delete(key);\n\t}\n\tnotify(key) {\n\t\tfor (const [listenerKey, set] of this.listeners.entries()) if (listenerKey === key || listenerKey.startsWith(key)) set.forEach((l) => l());\n\t}\n};\nconst compositionStateStore = new CompositionStateStore();\n\n//#endregion\n//#region src/utils/normalization.ts\n/**\n* normalizeTimeline recurses through the virtual media tree and \"absorbs\"\n* generic timeline-shifting operations into standard properties\n* of their children.\n*/\nfunction normalizeTimeline(vv, fps, context = { timeOffsetSec: 0 }) {\n\tif (!vv) return vv;\n\tconst { operation, metadata = {}, children = [] } = vv;\n\tconst { timeOffsetSec, durationLimitMs } = context;\n\tif (!operation) return {\n\t\t...vv,\n\t\tchildren: (children || []).map((child) => normalizeTimeline(child, fps, context))\n\t};\n\tconst timeline = operation.timeline;\n\tconst segments = timeline?.segments || [];\n\tlet totalDurationMs = getActiveMediaMetadata(vv)?.durationMs ?? 0;\n\tif (segments.length > 0) {\n\t\tconst totalSegmentsFrames = segments.reduce((acc, seg) => {\n\t\t\tconst durSec = seg.endSec != null ? seg.endSec - seg.startSec : 0;\n\t\t\treturn acc + Math.max(1, Math.round(durSec * fps));\n\t\t}, 0);\n\t\tif (totalSegmentsFrames > 0) totalDurationMs = totalSegmentsFrames / fps * 1e3;\n\t}\n\tconst newOperation = { ...operation };\n\tconst rawStartFrame = timeline?.startFrame ?? newOperation.startFrame;\n\tif (typeof rawStartFrame === \"number\") newOperation.startFrame = rawStartFrame - secondsToFrames(timeOffsetSec, fps);\n\tconst newMetadata = {\n\t\t...metadata,\n\t\tdurationMs: totalDurationMs\n\t};\n\tconst childContext = typeof rawStartFrame === \"number\" || newOperation.op === \"compose\" ? {\n\t\ttimeOffsetSec: 0,\n\t\tdurationLimitMs: void 0\n\t} : {\n\t\ttimeOffsetSec,\n\t\tdurationLimitMs\n\t};\n\treturn {\n\t\tmetadata: newMetadata,\n\t\toperation: newOperation,\n\t\tchildren: (children || []).map((child) => normalizeTimeline(child, fps, childContext))\n\t};\n}\n\n//#endregion\n//#region src/utils/audio-extractor.ts\nconst verbose = typeof process !== \"undefined\" && /^(debug|trace)$/i.test(process.env?.LOG_LEVEL ?? \"\");\nlet mediaLogger = {\n\tdebug: (msg, ...args) => {\n\t\tif (!verbose) return;\n\t\tif (typeof msg === \"object\" && msg !== null) console.info(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.info(`[AudioExtractor] ${msg}`, ...args);\n\t},\n\twarn: (msg, ...args) => {\n\t\tif (typeof msg === \"object\" && msg !== null) console.warn(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.warn(`[AudioExtractor] ${msg}`, ...args);\n\t},\n\terror: (msg, ...args) => {\n\t\tif (typeof msg === \"object\" && msg !== null) console.error(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.error(`[AudioExtractor] ${msg}`, ...args);\n\t}\n};\nif (typeof window === \"undefined\" || typeof process !== \"undefined\" && process.versions?.node) import(\n\t/* webpackIgnore: true */\n\t/* @vite-ignore */\n\t\"@framefields/server-utils\"\n).then((m) => {\n\tif (m.mediaLogger) mediaLogger = m.mediaLogger;\n}).catch(() => {});\nconst yieldToMain = () => {\n\tif (typeof window === \"undefined\") return Promise.resolve();\n\tconst sched = globalThis.scheduler;\n\treturn typeof sched?.yield === \"function\" ? sched.yield() : new Promise((resolve) => setTimeout(resolve, 0));\n};\nconst waitForDelayRender = async (timeoutMs = 3e4) => {\n\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\tconst start = Date.now();\n\treturn new Promise((resolve) => {\n\t\tconst check = () => {\n\t\t\tconst browserHandles = typeof window !== \"undefined\" && window.renderer_delayRenderHandles ? window.renderer_delayRenderHandles : [];\n\t\t\tconst globalDelays = typeof globalThis !== \"undefined\" ? globalThis.__GATEWAI_DELAYS__ : null;\n\t\t\tconst hasBrowserDelays = browserHandles.length > 0;\n\t\t\tconst hasGlobalDelays = globalDelays instanceof Set && globalDelays.size > 0;\n\t\t\tif (!hasBrowserDelays && !hasGlobalDelays) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() - start > timeoutMs) {\n\t\t\t\tmediaLogger.warn(`[AudioExtractor] waitForDelayRender timed out waiting for handles: ${JSON.stringify({\n\t\t\t\t\tbrowserHandles,\n\t\t\t\t\tglobalDelays: globalDelays ? Array.from(globalDelays) : []\n\t\t\t\t})}`);\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(check, 50);\n\t\t};\n\t\tcheck();\n\t});\n};\n/**\n* Decodes all audio samples from a given source URL into raw Float32 mono/stereo channel buffers.\n*/\nasync function decodeAudioSource(url) {\n\tmediaLogger.debug(`[AudioExtractor] decodeAudioSource started for url: ${url}`);\n\ttry {\n\t\tif (typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && !(typeof process !== \"undefined\" && process.versions && process.versions.node)) {\n\t\t\tmediaLogger.debug(`[AudioExtractor] Browser detected. Fetching arrayBuffer for ${url}...`);\n\t\t\tconst AudioContextClass = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContextClass) throw new Error(\"AudioContext is not supported in this browser\");\n\t\t\tconst audioCtx = new AudioContextClass();\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url);\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Fetch response status for ${url}: ${response.status} (${response.statusText})`);\n\t\t\t\tif (!response.ok) throw new Error(`Failed to fetch audio source: ${response.statusText}`);\n\t\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Fetched ${arrayBuffer.byteLength} bytes. Decoding audio data...`);\n\t\t\t\tconst audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Decoded successfully: ${audioBuffer.numberOfChannels} channels, sampleRate: ${audioBuffer.sampleRate}, duration: ${audioBuffer.duration}s`);\n\t\t\t\tconst channels = [];\n\t\t\t\tfor (let c = 0; c < audioBuffer.numberOfChannels; c++) channels.push(new Float32Array(audioBuffer.getChannelData(c)));\n\t\t\t\treturn {\n\t\t\t\t\tchannels,\n\t\t\t\t\tsampleRate: audioBuffer.sampleRate\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\taudioCtx.close();\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] AudioContext closed for ${url}`);\n\t\t\t}\n\t\t}\n\t\tlet inputAcquired = false;\n\t\ttry {\n\t\t\tmediaLogger.debug(`[AudioExtractor] Server / Node.js detected. Acquiring from inputStore for ${url}...`);\n\t\t\tconst input = await inputStore.acquire(url);\n\t\t\tinputAcquired = true;\n\t\t\tmediaLogger.debug(`[AudioExtractor] inputStore acquired. Retrieving primary audio track...`);\n\t\t\tconst track = await input.getPrimaryAudioTrack();\n\t\t\tif (!track) {\n\t\t\t\tmediaLogger.warn(`[AudioExtractor] No primary audio track found in input for ${url}`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst generator = new AudioSampleSink(track).samples(0);\n\t\t\tconst decodedPlanes = [];\n\t\t\tlet totalFrames = 0;\n\t\t\tlet sampleRate = 48e3;\n\t\t\tlet numChannels = 1;\n\t\t\tmediaLogger.debug(`[AudioExtractor] Starting mediabunny generator loop for ${url}...`);\n\t\t\tfor await (const sample of generator) {\n\t\t\t\tsampleRate = sample.sampleRate;\n\t\t\t\tnumChannels = sample.numberOfChannels;\n\t\t\t\tconst sampleFrames = sample.numberOfFrames;\n\t\t\t\tif (decodedPlanes.length === 0) for (let c = 0; c < numChannels; c++) decodedPlanes.push([]);\n\t\t\t\tfor (let c = 0; c < numChannels; c++) {\n\t\t\t\t\tlet planeBuffer;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst allocSize = sample.allocationSize({\n\t\t\t\t\t\t\tplaneIndex: c,\n\t\t\t\t\t\t\tformat: \"f32-planar\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\tplaneBuffer = new Float32Array(allocSize / 4);\n\t\t\t\t\t\tsample.copyTo(planeBuffer, {\n\t\t\t\t\t\t\tplaneIndex: c,\n\t\t\t\t\t\t\tformat: \"f32-planar\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tconst allocSize = sample.allocationSize({ planeIndex: c });\n\t\t\t\t\t\tif (sample.format === \"s16\" || sample.format === \"s16-planar\") {\n\t\t\t\t\t\t\tconst int16Buffer = new Int16Array(allocSize / 2);\n\t\t\t\t\t\t\tsample.copyTo(int16Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(int16Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < int16Buffer.length; i++) planeBuffer[i] = (int16Buffer[i] ?? 0) / 32768;\n\t\t\t\t\t\t} else if (sample.format === \"s32\" || sample.format === \"s32-planar\") {\n\t\t\t\t\t\t\tconst int32Buffer = new Int32Array(allocSize / 4);\n\t\t\t\t\t\t\tsample.copyTo(int32Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(int32Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < int32Buffer.length; i++) planeBuffer[i] = (int32Buffer[i] ?? 0) / 2147483648;\n\t\t\t\t\t\t} else if (sample.format === \"u8\" || sample.format === \"u8-planar\") {\n\t\t\t\t\t\t\tconst u8Buffer = new Uint8Array(allocSize);\n\t\t\t\t\t\t\tsample.copyTo(u8Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(u8Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < u8Buffer.length; i++) planeBuffer[i] = ((u8Buffer[i] ?? 128) - 128) / 128;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(allocSize / 4);\n\t\t\t\t\t\t\tsample.copyTo(planeBuffer, { planeIndex: c });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdecodedPlanes[c].push(planeBuffer);\n\t\t\t\t}\n\t\t\t\ttotalFrames += sampleFrames;\n\t\t\t\tsample.close();\n\t\t\t}\n\t\t\tmediaLogger.debug(`[AudioExtractor] Generator loop finished. Decoded total frames: ${totalFrames}`);\n\t\t\tif (totalFrames === 0 || decodedPlanes.length === 0) return null;\n\t\t\treturn {\n\t\t\t\tchannels: decodedPlanes.map((planes) => {\n\t\t\t\t\tconst merged = new Float32Array(totalFrames);\n\t\t\t\t\tlet offset = 0;\n\t\t\t\t\tfor (const plane of planes) {\n\t\t\t\t\t\tmerged.set(plane, offset);\n\t\t\t\t\t\toffset += plane.length;\n\t\t\t\t\t}\n\t\t\t\t\treturn merged;\n\t\t\t\t}),\n\t\t\t\tsampleRate\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (typeof process !== \"undefined\" && process.versions?.node) try {\n\t\t\t\tconst { execSync } = await import(\"node:child_process\");\n\t\t\t\tconst stdout = execSync(`ffmpeg -v error -i \"${url}\" -f f32le -ar 48000 -ac 2 pipe:1`, { maxBuffer: 100 * 1024 * 1024 });\n\t\t\t\tconst totalSamples = stdout.byteLength / 4;\n\t\t\t\tconst numFrames = totalSamples / 2;\n\t\t\t\tconst interleaved = new Float32Array(stdout.buffer, stdout.byteOffset, totalSamples);\n\t\t\t\tconst left = new Float32Array(numFrames);\n\t\t\t\tconst right = new Float32Array(numFrames);\n\t\t\t\tfor (let i = 0; i < numFrames; i++) {\n\t\t\t\t\tleft[i] = interleaved[i * 2];\n\t\t\t\t\tright[i] = interleaved[i * 2 + 1];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tchannels: [left, right],\n\t\t\t\t\tsampleRate: 48e3\n\t\t\t\t};\n\t\t\t} catch (ffmpegErr) {\n\t\t\t\tmediaLogger.warn({ ffmpegErr }, `[AudioExtractor] ffmpeg fallback decode failed for ${url}`);\n\t\t\t}\n\t\t\tmediaLogger.error({ err }, `[AudioExtractor] Failed to decode source ${url}`);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tif (inputAcquired) inputStore.release(url);\n\t\t}\n\t} catch (err) {\n\t\tmediaLogger.error({ err }, `[AudioExtractor] Failed to decode source ${url}`);\n\t\treturn null;\n\t}\n}\n/**\n* Resamples a PCM buffer using linear interpolation to target sample rate & speed.\n*/\nasync function resampleAndStretchPCM(inputChannel, sourceSampleRate, targetSampleRate, speed, outputLength, trimOffsetSamples) {\n\tconst output = new Float32Array(outputLength);\n\tconst factor = sourceSampleRate / targetSampleRate * speed;\n\tconst YIELD_INTERVAL = 1e5;\n\tfor (let i = 0; i < outputLength; i++) {\n\t\tif (i > 0 && i % YIELD_INTERVAL === 0) await yieldToMain();\n\t\tconst srcIndex = trimOffsetSamples + i * factor;\n\t\tconst indexFloor = Math.floor(srcIndex);\n\t\tconst indexCeil = Math.ceil(srcIndex);\n\t\tif (indexFloor < 0) {\n\t\t\toutput[i] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (indexFloor >= inputChannel.length) break;\n\t\tconst weight = srcIndex - indexFloor;\n\t\tconst sampleFloor = inputChannel[indexFloor] ?? 0;\n\t\tconst val = sampleFloor + weight * ((indexCeil >= 0 && indexCeil < inputChannel.length ? inputChannel[indexCeil] ?? sampleFloor : sampleFloor) - sampleFloor);\n\t\toutput[i] = Number.isFinite(val) ? val : 0;\n\t}\n\treturn output;\n}\n/**\n* Recursively parses the VirtualMediaData tree and mixes all active audio tracks\n* into a single unified stereo PCM stream (Float32Array channels).\n*/\nasync function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device, renderId) {\n\tmediaLogger.debug(`[AudioExtractor] mixAudioTracks started. FPS: ${fps}, targetSampleRate: ${targetSampleRate}`);\n\tawait waitForDelayRender();\n\tshaderStore.registerSignalsFromComposition(renderId, virtualMedia);\n\tconst durationMs = getActiveMediaMetadata(virtualMedia)?.durationMs || 1e3;\n\tconst totalDurationSec = durationMs / 1e3;\n\tconst totalTargetSamples = Math.ceil(totalDurationSec * targetSampleRate);\n\tmediaLogger.debug(`[AudioExtractor] Composition total duration: ${durationMs}ms (${totalDurationSec}s). Total mixed samples to allocate: ${totalTargetSamples}`);\n\tconst outputLeft = new Float32Array(totalTargetSamples);\n\tconst outputRight = new Float32Array(totalTargetSamples);\n\tconst mixedChannels = [outputLeft, outputRight];\n\tconst decodedCache = /* @__PURE__ */ new Map();\n\tasync function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames) {\n\t\tif (!node) return null;\n\t\tconst op = node.operation;\n\t\tif (!op) {\n\t\t\tconst durationMs$1 = getActiveMediaMetadata(node)?.durationMs ?? 0;\n\t\t\tconst durationFrames = Math.round(durationMs$1 / 1e3 * fps);\n\t\t\tconst actualDurationFrames = inheritedDurationFrames !== null ? durationFrames > 0 ? Math.min(inheritedDurationFrames, durationFrames) : inheritedDurationFrames : durationFrames;\n\t\t\tconst localSamplesCount$1 = Math.ceil(actualDurationFrames / fps * targetSampleRate);\n\t\t\tif (localSamplesCount$1 <= 0) return null;\n\t\t\tconst localChannels$1 = [new Float32Array(localSamplesCount$1), new Float32Array(localSamplesCount$1)];\n\t\t\tfor (const child of node.children) {\n\t\t\t\tconst childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames);\n\t\t\t\tif (childChannels) {\n\t\t\t\t\tconst childOp = child.operation;\n\t\t\t\t\tconst childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;\n\t\t\t\t\tconst childStartSample = Math.round(childStartFrame / fps * targetSampleRate);\n\t\t\t\t\tfor (let c = 0; c < 2; c++) {\n\t\t\t\t\t\tconst dest = localChannels$1[c];\n\t\t\t\t\t\tconst src = childChannels[c];\n\t\t\t\t\t\tconst len = Math.min(src.length, dest.length - childStartSample);\n\t\t\t\t\t\tfor (let i = 0; i < len; i++) if (childStartSample + i >= 0) dest[childStartSample + i] += src[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn localChannels$1;\n\t\t}\n\t\tconst volume = inheritedVolume * (op.volume ?? 1) * (op.opacity === 0 ? 0 : 1) * (op.muted ? 0 : 1);\n\t\tconst speedMultiplier = inheritedSpeed;\n\t\tconst localClockFrames = inheritedClockFrames + (op.startFrame ?? op.timeline?.startFrame ?? 0);\n\t\tconst segments = op.timeline?.segments || [];\n\t\tconst nodeDurationMs = getActiveMediaMetadata(node)?.durationMs ?? 0;\n\t\tconst nodeDurationFrames = Math.round(nodeDurationMs / 1e3 * fps);\n\t\tconst nodeActualDurationFrames = inheritedDurationFrames !== null ? nodeDurationFrames > 0 ? Math.min(inheritedDurationFrames, nodeDurationFrames) : inheritedDurationFrames : nodeDurationFrames;\n\t\tconst localSamplesCount = Math.ceil(nodeActualDurationFrames / fps * targetSampleRate);\n\t\tif (localSamplesCount <= 0) return null;\n\t\tconst localLeft = new Float32Array(localSamplesCount);\n\t\tconst localRight = new Float32Array(localSamplesCount);\n\t\tconst localChannels = [localLeft, localRight];\n\t\tconst processSegment = async (seg, windowStartFrameOffset) => {\n\t\t\tconst totalSeekSec = inheritedSeekSec + (seg ? seg.startSec : 0);\n\t\t\tconst totalClockFrames = localClockFrames + windowStartFrameOffset;\n\t\t\tlet segDurationFrames = 0;\n\t\t\tif (seg) segDurationFrames = Math.max(1, Math.round(((seg.endSec ?? 0) - seg.startSec) * fps));\n\t\t\telse segDurationFrames = nodeDurationFrames;\n\t\t\tconst actualDurationFrames = inheritedDurationFrames !== null ? Math.min(inheritedDurationFrames, segDurationFrames) : segDurationFrames;\n\t\t\tconst segmentStartSample = Math.round(windowStartFrameOffset / fps * targetSampleRate);\n\t\t\tif (op.op === \"source\") {\n\t\t\t\tconst mediaType = getMediaType(node);\n\t\t\t\tconst params = computeRenderParams(node);\n\t\t\t\tif (params.sourceUrl && (mediaType === \"Audio\" || mediaType === \"Video\") && volume > 0) {\n\t\t\t\t\tconst finalSpeed = Math.max(.5, speedMultiplier * (Number(params.speed) || 1));\n\t\t\t\t\tconst effectiveTrimSec = Math.max(0, (Number(params.trimStartSec) || 0) + totalSeekSec);\n\t\t\t\t\tlet decoded = decodedCache.get(params.sourceUrl);\n\t\t\t\t\tif (decoded === void 0) {\n\t\t\t\t\t\tdecoded = await decodeAudioSource(params.sourceUrl);\n\t\t\t\t\t\tdecodedCache.set(params.sourceUrl, decoded);\n\t\t\t\t\t}\n\t\t\t\t\tif (decoded) {\n\t\t\t\t\t\tconst clipDurationSec = actualDurationFrames / fps;\n\t\t\t\t\t\tconst clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));\n\t\t\t\t\t\tif (clipSamplesCount > 0 && segmentStartSample < localSamplesCount) {\n\t\t\t\t\t\t\tconst trimOffsetSamples = Math.round(effectiveTrimSec * decoded.sampleRate);\n\t\t\t\t\t\t\tconst srcLeft = decoded.channels[0];\n\t\t\t\t\t\t\tconst srcRight = decoded.channels.length > 1 ? decoded.channels[1] : decoded.channels[0];\n\t\t\t\t\t\t\tconst stretchedLeft = await resampleAndStretchPCM(srcLeft, decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples);\n\t\t\t\t\t\t\tconst stretchedRight = await resampleAndStretchPCM(srcRight, decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples);\n\t\t\t\t\t\t\tfor (let i = 0; i < clipSamplesCount; i++) {\n\t\t\t\t\t\t\t\tconst outIndex = segmentStartSample + i;\n\t\t\t\t\t\t\t\tlocalLeft[outIndex] += stretchedLeft[i] * volume;\n\t\t\t\t\t\t\t\tlocalRight[outIndex] += stretchedRight[i] * volume;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tawait yieldToMain();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node.children) for (const child of node.children) {\n\t\t\t\tconst childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames);\n\t\t\t\tif (childChannels) {\n\t\t\t\t\tconst childOp = child.operation;\n\t\t\t\t\tconst childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;\n\t\t\t\t\tconst destStartSample = segmentStartSample + Math.round(childStartFrame / fps * targetSampleRate);\n\t\t\t\t\tfor (let c = 0; c < 2; c++) {\n\t\t\t\t\t\tconst dest = localChannels[c];\n\t\t\t\t\t\tconst src = childChannels[c];\n\t\t\t\t\t\tconst len = Math.min(src.length, dest.length - destStartSample);\n\t\t\t\t\t\tfor (let i = 0; i < len; i++) if (destStartSample + i >= 0) dest[destStartSample + i] += src[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst pluginProcessor = audioRegistry.get(op.op);\n\t\t\tif (pluginProcessor) try {\n\t\t\t\tconst clipDurationSec = actualDurationFrames / fps;\n\t\t\t\tconst clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));\n\t\t\t\tif (clipSamplesCount > 0 && segmentStartSample < localSamplesCount && segmentStartSample >= 0) await pluginProcessor(localChannels.map((ch) => ch.subarray(segmentStartSample, segmentStartSample + clipSamplesCount)), targetSampleRate, node, {\n\t\t\t\t\tdevice,\n\t\t\t\t\tframe: totalClockFrames,\n\t\t\t\t\tfps,\n\t\t\t\t\trenderId,\n\t\t\t\t\telapsedMs: (totalClockFrames / fps + totalSeekSec) * 1e3,\n\t\t\t\t\tdurationMs: getActiveMediaMetadata(node)?.durationMs ?? void 0\n\t\t\t\t});\n\t\t\t} catch (pluginErr) {\n\t\t\t\tmediaLogger.error({ err: pluginErr }, `[AudioExtractor] Custom plugin for operation '${op.op}' failed`);\n\t\t\t}\n\t\t};\n\t\tif (segments.length > 0) {\n\t\t\tlet currentStart = 0;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst durSec = (seg.endSec ?? 0) - seg.startSec;\n\t\t\t\tconst durFrames = Math.max(1, Math.round(durSec * fps));\n\t\t\t\tawait processSegment(seg, currentStart);\n\t\t\t\tcurrentStart += durFrames;\n\t\t\t}\n\t\t} else await processSegment(null, 0);\n\t\treturn localChannels;\n\t}\n\tconst rootChannels = await traverse(normalizeTimeline(virtualMedia, fps), 0, 0, 1, 1, null);\n\tif (rootChannels) for (let c = 0; c < 2; c++) {\n\t\tconst dest = mixedChannels[c];\n\t\tconst src = rootChannels[c];\n\t\tconst len = Math.min(src.length, dest.length);\n\t\tfor (let i = 0; i < len; i++) dest[i] = src[i];\n\t}\n\tdecodedCache.clear();\n\tlet mixPeak = 0;\n\tfor (let i = 0; i < totalTargetSamples; i++) {\n\t\tconst l = Math.abs(outputLeft[i] ?? 0);\n\t\tconst r = Math.abs(outputRight[i] ?? 0);\n\t\tif (l > mixPeak) mixPeak = l;\n\t\tif (r > mixPeak) mixPeak = r;\n\t}\n\tconst autoGain = mixPeak > .95 ? .92 / mixPeak : 1;\n\tfor (let i = 0; i < totalTargetSamples; i++) {\n\t\tconst l = (outputLeft[i] ?? 0) * autoGain;\n\t\tconst r = (outputRight[i] ?? 0) * autoGain;\n\t\toutputLeft[i] = Number.isFinite(l) ? Math.tanh(l) : 0;\n\t\toutputRight[i] = Number.isFinite(r) ? Math.tanh(r) : 0;\n\t}\n\treturn {\n\t\tchannels: mixedChannels,\n\t\tsampleRate: targetSampleRate\n\t};\n}\n\n//#endregion\nexport { calculateLayerTransform, compositionStateStore, computeRenderParams, decodeAudioSource, drawCompositionTree, formatTimecode, framesToSeconds, getFontUrl, isStaticVisualMedia, mixAudioTracks, normalizeTimeline, resolveLayerDuration, secondsToFrames };\n//# sourceMappingURL=index.mjs.map"],"mappings":"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AM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC3I,MAAI,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5I,MAAI,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC1I,MAAI,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5I,MAAI,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5I,MAAI,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC3I,MAAI,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC3I,MAAI,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC3I,MAAI,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACxI,MAAI,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACzI,MAAI,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACzI,MAAI,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AAC1I,MAAI,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,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"}
@@ -5343,11 +5343,34 @@ var SlugFontCache = class SlugFontCache$1 {
5343
5343
  static cblcOffset = 0;
5344
5344
  static cbdtOffset = 0;
5345
5345
  /**
5346
+ * Sets the color emoji font text draws emoji with: a CBDT/CBLC bitmap font
5347
+ * such as Noto Color Emoji. framefields ships none, so without one emoji
5348
+ * draw nothing in exports (the browser preview falls back to the system's).
5349
+ */
5350
+ static setEmojiFont(bytes, filePath) {
5351
+ SlugFontCache$1.parseTableDirectory(bytes);
5352
+ if (!SlugFontCache$1.cblcOffset || !SlugFontCache$1.cbdtOffset) {
5353
+ SlugFontCache$1.emojiFontBuffer = null;
5354
+ throw new Error(`Emoji font ${filePath ? `"${filePath}" ` : ""}has no CBDT/CBLC color bitmaps. Use a bitmap color emoji font such as Noto Color Emoji.`);
5355
+ }
5356
+ SlugFontCache$1.emojiFontPath = filePath ?? null;
5357
+ SlugFontCache$1.emojiFontLoadPromise = null;
5358
+ for (const tex of SlugFontCache$1.emojiTextureCache.values()) tex.destroy();
5359
+ SlugFontCache$1.emojiTextureCache.clear();
5360
+ }
5361
+ /** True once an emoji font is set or a path / URL to load one from is. */
5362
+ static hasEmojiFont() {
5363
+ return !!(SlugFontCache$1.emojiFontBuffer || SlugFontCache$1.emojiFontPath || SlugFontCache$1.emojiFontUrl);
5364
+ }
5365
+ /**
5346
5366
  * Parse the SFNT table directory from a raw font buffer and cache
5347
5367
  * the offsets for cmap, CBLC, and CBDT tables.
5348
5368
  */
5349
5369
  static parseTableDirectory(uint8) {
5350
5370
  SlugFontCache$1.emojiFontBuffer = uint8;
5371
+ SlugFontCache$1.cmapOffset = 0;
5372
+ SlugFontCache$1.cblcOffset = 0;
5373
+ SlugFontCache$1.cbdtOffset = 0;
5351
5374
  const view = new DataView(uint8.buffer, uint8.byteOffset, uint8.byteLength);
5352
5375
  const numTables = view.getUint16(4);
5353
5376
  let offset = 12;
@@ -5474,16 +5497,18 @@ var SlugFontCache = class SlugFontCache$1 {
5474
5497
  const key = `${char}-${fontSize}`;
5475
5498
  let tex = SlugFontCache$1.emojiTextureCache.get(key);
5476
5499
  if (tex) return tex;
5477
- if (!!globalThis.__IS_HEADLESS_RENDERER__ || typeof window === "undefined" || typeof globalThis.document === "undefined") {
5478
- const codePoint = char.codePointAt(0);
5479
- if (!codePoint) throw new Error("No codepoint");
5480
- const pngInfo = await SlugFontCache$1.getEmojiPngBuffer(codePoint);
5481
- if (!pngInfo) throw new Error(`Emoji glyph not found in font for ${char}`);
5500
+ const isNode = !!globalThis.__IS_HEADLESS_RENDERER__ || typeof window === "undefined" || typeof globalThis.document === "undefined";
5501
+ const codePoint = char.codePointAt(0);
5502
+ if (!codePoint) throw new Error("No codepoint");
5503
+ const resolutionScale = 4;
5504
+ const targetSize = Math.max(16, Math.ceil(fontSize * 1.5 * resolutionScale));
5505
+ const pngInfo = SlugFontCache$1.hasEmojiFont() ? await SlugFontCache$1.getEmojiPngBuffer(codePoint) : null;
5506
+ if (isNode) {
5507
+ if (!pngInfo) throw new Error(SlugFontCache$1.hasEmojiFont() ? `Emoji glyph not found in font for ${char}` : `No emoji font is set for ${char}; register one with FontManager.registerEmojiFont()`);
5482
5508
  const sharp = (await import(
5483
5509
  /* webpackIgnore: true */
5484
5510
  "sharp"
5485
5511
  )).default;
5486
- const targetSize = Math.max(16, Math.ceil(fontSize * 1.5 * 4));
5487
5512
  const { data, info } = await sharp(Buffer.from(pngInfo.buffer)).ensureAlpha().resize(targetSize, targetSize, {
5488
5513
  fit: "contain",
5489
5514
  background: {
@@ -5512,14 +5537,34 @@ var SlugFontCache = class SlugFontCache$1 {
5512
5537
  usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
5513
5538
  });
5514
5539
  device.queue.writeTexture({ texture: tex }, pixels, { bytesPerRow: info.width * 4 }, [info.width, info.height]);
5540
+ } else if (pngInfo) {
5541
+ const bitmap = await createImageBitmap(new Blob([pngInfo.buffer], { type: "image/png" }));
5542
+ const canvas = new OffscreenCanvas(targetSize, targetSize);
5543
+ const c2d = canvas.getContext("2d");
5544
+ if (c2d) {
5545
+ const fit = Math.min(targetSize / bitmap.width, targetSize / bitmap.height);
5546
+ const w = bitmap.width * fit;
5547
+ const h = bitmap.height * fit;
5548
+ c2d.imageSmoothingQuality = "high";
5549
+ c2d.drawImage(bitmap, (targetSize - w) / 2, (targetSize - h) / 2, w, h);
5550
+ }
5551
+ bitmap.close();
5552
+ tex = device.createTexture({
5553
+ label: `Emoji-${char}`,
5554
+ size: [targetSize, targetSize],
5555
+ format: "rgba8unorm",
5556
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
5557
+ });
5558
+ device.queue.copyExternalImageToTexture({ source: canvas }, {
5559
+ texture: tex,
5560
+ premultipliedAlpha: true
5561
+ }, [targetSize, targetSize]);
5515
5562
  } else {
5516
- const resolutionScale = 4;
5517
- const emojiSize = Math.max(16, Math.ceil(fontSize * 1.5 * resolutionScale));
5518
- const size = Math.ceil(emojiSize / 4) * 4;
5563
+ const size = Math.ceil(targetSize / 4) * 4;
5519
5564
  const canvas = new OffscreenCanvas(size, size);
5520
5565
  const c2d = canvas.getContext("2d");
5521
5566
  if (c2d) {
5522
- c2d.font = `${fontSize * resolutionScale}px "NotoColorEmoji", "Emoji", "Apple Color Emoji", "Segoe UI Emoji", sans-serif`;
5567
+ c2d.font = `${fontSize * resolutionScale}px "Apple Color Emoji", "Segoe UI Emoji", sans-serif`;
5523
5568
  c2d.textBaseline = "middle";
5524
5569
  c2d.textAlign = "center";
5525
5570
  c2d.fillText(char, size / 2, size / 2);
@@ -5766,13 +5811,13 @@ var SlugFontCache = class SlugFontCache$1 {
5766
5811
  }
5767
5812
  const arrayBuffer = await response.arrayBuffer();
5768
5813
  SlugFontCache$1.parseTableDirectory(new Uint8Array(arrayBuffer));
5769
- const loadedFace = await new FontFace("NotoColorEmoji", arrayBuffer).load();
5814
+ const loadedFace = await new FontFace("FramefieldsEmoji", arrayBuffer).load();
5770
5815
  document.fonts.add(loadedFace);
5771
5816
  await document.fonts.ready;
5772
5817
  debugLog("[SlugFontCache] Emoji font preloaded and registered via Cache API.");
5773
5818
  SlugFontCache$1.listeners.forEach((l) => {
5774
5819
  try {
5775
- l("NotoColorEmoji");
5820
+ l("FramefieldsEmoji");
5776
5821
  } catch (e) {
5777
5822
  console.error("[SlugFontCache] Error in listener:", e);
5778
5823
  }
@@ -12307,7 +12352,7 @@ function getOrCreateEmojiTexture(device, char, fontSize) {
12307
12352
  const canvas = new OffscreenCanvas(size, size);
12308
12353
  const c2d = canvas.getContext("2d");
12309
12354
  if (c2d) {
12310
- c2d.font = `${fontSize * resolutionScale}px "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "NotoColorEmoji", sans-serif`;
12355
+ c2d.font = `${fontSize * resolutionScale}px "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif`;
12311
12356
  c2d.textBaseline = "middle";
12312
12357
  c2d.textAlign = "center";
12313
12358
  c2d.fillText(char, size / 2, size / 2);
@@ -14249,6 +14294,14 @@ var VideoDecoder = class extends BaseMediaDecoder {
14249
14294
  nextSample = null;
14250
14295
  headlessQueue = [];
14251
14296
  isDecoding = false;
14297
+ /**
14298
+ * Reused RGBA staging array for headless decode. Only one decode is in
14299
+ * flight per decoder (`isDecoding` serializes them) and callers consume the
14300
+ * pixels synchronously (uploadFrameToTexture → writeTexture copies before
14301
+ * the next decode can run), so the array is never read after it is
14302
+ * overwritten. Avoids a full-frame allocation on every decoded frame.
14303
+ */
14304
+ decodeBuffer = null;
14252
14305
  nextRequest = null;
14253
14306
  pushHeadlessQueue(sample) {
14254
14307
  const index = this.headlessQueue.findIndex((s) => s.timestamp > sample.timestamp);
@@ -14291,6 +14344,7 @@ var VideoDecoder = class extends BaseMediaDecoder {
14291
14344
  sample.close();
14292
14345
  } catch (_) {}
14293
14346
  this.headlessQueue = [];
14347
+ this.decodeBuffer = null;
14294
14348
  this.iteratorStartTimestamp = -1;
14295
14349
  }
14296
14350
  onDestroy() {
@@ -14383,7 +14437,12 @@ var VideoDecoder = class extends BaseMediaDecoder {
14383
14437
  if (!currentSample) return null;
14384
14438
  const width = currentSample.displayWidth;
14385
14439
  const height = currentSample.displayHeight;
14386
- const buffer = new Uint8Array(width * height * 4);
14440
+ const byteLength = width * height * 4;
14441
+ let buffer = this.decodeBuffer;
14442
+ if (!buffer || buffer.length !== byteLength) {
14443
+ buffer = new Uint8Array(byteLength);
14444
+ this.decodeBuffer = buffer;
14445
+ }
14387
14446
  await currentSample.copyTo(buffer, { format: "RGBA" });
14388
14447
  if (this.currentFetchId !== fetchId || this.destroyed || !this.input) return null;
14389
14448
  return {
@@ -27475,5 +27534,5 @@ var ScreenSpaceRelightPipeline = class {
27475
27534
  };
27476
27535
 
27477
27536
  //#endregion
27478
- export { registerHeadlessFont as $, drawLottieNode as A, inputStore as B, WebGPUAudioProcessor as C, drawCaptionNode as D, colorMatrixWgsl as E, ensureDevice as F, lutStore as G, loadFBX as H, generateExtrudedTextGeometry as I, parseColor as J, measureMaxCaptionHeight as K, getHeadlessFontPath as L, drawSignalNode as M, drawSvgNode as N, drawGifNode as O, drawVideoNode as P, poseNodes as Q, getRenderer2D as R, Vector3Math as S, clearAllVideoCache as T, loadModel3D as U, jointMatrices as V, loadOBJ as W, parseMTL as X, parseFBX as Y, parseOBJ as Z, ShadowPipeline as _, Camera3D as a, R2_CUSTOM_DOMAIN as at, SlugGeometry as b, Light3D as c, NodeSurfaceProvider as d, shaderStore as et, Path3D as f, ScreenSpaceRelightPipeline as g, SSAOPipeline as h, AudioSignalComputePipeline as i, GetFontAssetUrl as it, drawParagraphNode as j, drawImageNode as k, Matrix4Math as l, Renderer3D as m, AudioLatentTrackCache as n, srtLoader as nt, EffectPipeline as o, getEnv as ot, Renderer2D as p, mediaDecoderCache as q, AudioMeshDeformPipeline as r, textureCache as rt, GlassPipeline as s, resolveMediaSourceUrl as st, AudioLatentEngine as t, signalRegistry as tt, MotionBlurPipeline as u, SignalRegistry as v, buildWGSLSignalFn as w, SlugPipeline as x, SlugFontCache as y, initHeadlessWebGPU as z };
27479
- //# sourceMappingURL=dist-gjHmorxL.mjs.map
27537
+ export { registerHeadlessFont as $, drawLottieNode as A, inputStore as B, WebGPUAudioProcessor as C, drawCaptionNode as D, colorMatrixWgsl as E, ensureDevice as F, lutStore as G, loadFBX as H, generateExtrudedTextGeometry as I, parseColor as J, measureMaxCaptionHeight as K, getHeadlessFontPath as L, drawSignalNode as M, drawSvgNode as N, drawGifNode as O, drawVideoNode as P, poseNodes as Q, getRenderer2D as R, Vector3Math as S, clearAllVideoCache as T, loadModel3D as U, jointMatrices as V, loadOBJ as W, parseMTL as X, parseFBX as Y, parseOBJ as Z, ShadowPipeline as _, Camera3D as a, getEnv as at, SlugGeometry as b, Light3D as c, NodeSurfaceProvider as d, shaderStore as et, Path3D as f, ScreenSpaceRelightPipeline as g, SSAOPipeline as h, AudioSignalComputePipeline as i, GetFontAssetUrl as it, drawParagraphNode as j, drawImageNode as k, Matrix4Math as l, Renderer3D as m, AudioLatentTrackCache as n, srtLoader as nt, EffectPipeline as o, resolveMediaSourceUrl as ot, Renderer2D as p, mediaDecoderCache as q, AudioMeshDeformPipeline as r, textureCache as rt, GlassPipeline as s, AudioLatentEngine as t, signalRegistry as tt, MotionBlurPipeline as u, SignalRegistry as v, buildWGSLSignalFn as w, SlugPipeline as x, SlugFontCache as y, initHeadlessWebGPU as z };
27538
+ //# sourceMappingURL=dist-DgIKXWZ1.mjs.map