framefields 2.8.1 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/README.md +30 -1
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-vatRe308.mjs → audio-BfQg37MW.mjs} +3 -3
  4. package/dist/{audio-vatRe308.mjs.map → audio-BfQg37MW.mjs.map} +1 -1
  5. package/dist/cli/check-worker.mjs +44 -44
  6. package/dist/components/index.d.mts +2 -2
  7. package/dist/components/index.mjs +43 -43
  8. package/dist/{dist-CFe1fC9l.mjs → dist-C1cCW7Bt.mjs} +8 -1
  9. package/dist/{dist-CFe1fC9l.mjs.map → dist-C1cCW7Bt.mjs.map} +1 -1
  10. package/dist/{dist-BbwtlSZO.mjs → dist-C8Xq3zgx.mjs} +2 -2
  11. package/dist/{dist-BbwtlSZO.mjs.map → dist-C8Xq3zgx.mjs.map} +1 -1
  12. package/dist/effects/index.d.mts +1 -1
  13. package/dist/effects/index.mjs +35 -35
  14. package/dist/{effects-CCyfjbhZ.mjs → effects-CemgqEPv.mjs} +2 -2
  15. package/dist/{effects-CCyfjbhZ.mjs.map → effects-CemgqEPv.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-C1mgtkCa.mjs → fonts-BW0pPcvJ.mjs} +2 -2
  18. package/dist/{fonts-C1mgtkCa.mjs.map → fonts-BW0pPcvJ.mjs.map} +1 -1
  19. package/dist/{gpu-CU2tEKJJ.mjs → gpu-CMaa63nz.mjs} +2 -2
  20. package/dist/{gpu-CU2tEKJJ.mjs.map → gpu-CMaa63nz.mjs.map} +1 -1
  21. package/dist/{index-BwRrsP_V.d.mts → index-Bnh42ouE.d.mts} +71 -10
  22. package/dist/index-Bnh42ouE.d.mts.map +1 -0
  23. package/dist/index-CFoAmh7q.d.mts.map +1 -1
  24. package/dist/{index-UDDAfHAF.d.mts → index-CQ-bbZk3.d.mts} +64 -13
  25. package/dist/index-CQ-bbZk3.d.mts.map +1 -0
  26. package/dist/index-D5UDyVMb.d.mts.map +1 -1
  27. package/dist/index.d.mts +3 -3
  28. package/dist/index.mjs +50 -50
  29. package/dist/preview/index.mjs +10 -10
  30. package/dist/{preview-WXbsf6Dv.mjs → preview-DvP8AZuV.mjs} +2 -2
  31. package/dist/{preview-WXbsf6Dv.mjs.map → preview-DvP8AZuV.mjs.map} +1 -1
  32. package/dist/preview-engine/audio.mjs +1 -1
  33. package/dist/preview-engine/{chunk-JGDZQCNU.mjs → chunk-2B722GXM.mjs} +1 -1
  34. package/dist/preview-engine/{chunk-GFW3D464.mjs → chunk-2DWY7UBV.mjs} +1 -1
  35. package/dist/preview-engine/{chunk-72DYOIMP.mjs → chunk-2PYTDN2C.mjs} +1 -1
  36. package/dist/preview-engine/{chunk-PF3SXQNV.mjs → chunk-34DL53D5.mjs} +1 -1
  37. package/dist/preview-engine/{chunk-GLXJOXBE.mjs → chunk-34RJ7GAS.mjs} +1 -1
  38. package/dist/preview-engine/{chunk-6OY4YLTC.mjs → chunk-35HMRW4I.mjs} +1 -1
  39. package/dist/preview-engine/{chunk-W26U6BP2.mjs → chunk-4WYM72ZN.mjs} +1 -1
  40. package/dist/preview-engine/{chunk-EQ4VBUWM.mjs → chunk-5AWAOMBR.mjs} +1 -1
  41. package/dist/preview-engine/{chunk-J4SHMCTG.mjs → chunk-6R3UJBL5.mjs} +1 -1
  42. package/dist/preview-engine/{chunk-VHGC72XP.mjs → chunk-73CNXGAK.mjs} +1 -1
  43. package/dist/preview-engine/{chunk-KYOPOCO5.mjs → chunk-AHQCDTD6.mjs} +1 -1
  44. package/dist/preview-engine/{chunk-ADV2TIKA.mjs → chunk-BEYA25UZ.mjs} +1 -1
  45. package/dist/preview-engine/{chunk-RBDIRBEI.mjs → chunk-BJV2LBII.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-LBJBBEKP.mjs → chunk-BVDWS3D2.mjs} +1 -1
  47. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
  48. package/dist/preview-engine/{chunk-NIPWL6Z5.mjs → chunk-C4M3B2Q2.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-LLUFOFF4.mjs → chunk-CC4NNNIY.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-NX66555S.mjs → chunk-CN2VLYLB.mjs} +1 -1
  51. package/dist/preview-engine/chunk-D73ZKPFN.mjs +138 -0
  52. package/dist/preview-engine/{chunk-SK7PUBTC.mjs → chunk-DMSZXG56.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-WC257OBY.mjs → chunk-DVZITDQS.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-LLB3AGBQ.mjs → chunk-EJJITH6U.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-COZG35ZR.mjs → chunk-FTCEG3SF.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-57LES7TL.mjs → chunk-GA4HNR44.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-S4WNCEMO.mjs → chunk-GIICZZQI.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-RTHU7REC.mjs → chunk-GRJJVSOV.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-RGDM6PQ5.mjs → chunk-GZWA5QJS.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-LZNNM5OB.mjs → chunk-H7BSN7V7.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-JXUENEQO.mjs → chunk-HOV6DDBZ.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-C6XLAJLL.mjs → chunk-JSYG6OWZ.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-GZVPVOHB.mjs → chunk-K3C6GUQD.mjs} +1 -1
  64. package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
  65. package/dist/preview-engine/chunk-KXLXP66K.mjs +1974 -0
  66. package/dist/preview-engine/{chunk-Y6TWMUJC.mjs → chunk-LVYVXVZO.mjs} +1 -1
  67. package/dist/preview-engine/{chunk-NKAVHU7H.mjs → chunk-MIEH74UH.mjs} +7 -7
  68. package/dist/preview-engine/{chunk-AVDHZNIZ.mjs → chunk-OH5W5EL6.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-22F33PPP.mjs → chunk-P5FKRQFU.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-7X2AUKTU.mjs → chunk-PM2W4VLT.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-PYX6Q2EJ.mjs → chunk-QCSVT73T.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-523CTDOC.mjs → chunk-RJIAES3X.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-DPQN7WYQ.mjs → chunk-S2ABWY5G.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-G7JJ6HVL.mjs → chunk-SF37HXAH.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-OKLYIQ5F.mjs → chunk-SPJPM43P.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-UOTMBWBJ.mjs → chunk-TNJEZKXM.mjs} +1 -1
  77. package/dist/preview-engine/chunk-ULOFDFHJ.mjs +1 -0
  78. package/dist/preview-engine/{chunk-DISKQ5MH.mjs → chunk-UXYM2G6J.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-U5YNECNG.mjs → chunk-VN36PRVD.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-PMOKPVSD.mjs → chunk-VVE2QHVG.mjs} +1 -1
  81. package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
  82. package/dist/preview-engine/{chunk-PEUQRSIM.mjs → chunk-Y5K5LVOR.mjs} +1 -1
  83. package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
  84. package/dist/preview-engine/{chunk-PSEMCJBH.mjs → chunk-ZJ5SWTCW.mjs} +1 -1
  85. package/dist/preview-engine/chunk-ZY47XIRK.mjs +5 -0
  86. package/dist/preview-engine/components.mjs +1 -1
  87. package/dist/preview-engine/effects.mjs +1 -1
  88. package/dist/preview-engine/framefields.mjs +1 -1
  89. package/dist/preview-engine/player.mjs +1 -1
  90. package/dist/preview-engine/renderers-3BOQOUEU.mjs +1 -0
  91. package/dist/preview-engine/renderers-3M2FESR2.mjs +1 -0
  92. package/dist/preview-engine/{renderers-FEEIDQF3.mjs → renderers-4F7WLQD5.mjs} +1 -1
  93. package/dist/preview-engine/{renderers-OP6MKYRM.mjs → renderers-5KANN7XF.mjs} +1 -1
  94. package/dist/preview-engine/{renderers-TVRR7PGN.mjs → renderers-5TO2SXFR.mjs} +1 -1
  95. package/dist/preview-engine/{renderers-DR7UZ3QR.mjs → renderers-5UZ3YFBD.mjs} +1 -1
  96. package/dist/preview-engine/renderers-6LHIWKMZ.mjs +1 -0
  97. package/dist/preview-engine/{renderers-7F2KF5RE.mjs → renderers-6Z7DWAPH.mjs} +1 -1
  98. package/dist/preview-engine/renderers-77PDUMYI.mjs +1 -0
  99. package/dist/preview-engine/{renderers-3J3NCOAI.mjs → renderers-7C5RA3R5.mjs} +1 -1
  100. package/dist/preview-engine/{renderers-KPCQGBIY.mjs → renderers-7XHO6M3B.mjs} +1 -1
  101. package/dist/preview-engine/{renderers-KJAOPYAU.mjs → renderers-A24KZK2Q.mjs} +1 -1
  102. package/dist/preview-engine/renderers-A43VCJ7X.mjs +1 -0
  103. package/dist/preview-engine/renderers-AKY464RY.mjs +1 -0
  104. package/dist/preview-engine/renderers-C5UO6PL5.mjs +1 -0
  105. package/dist/preview-engine/renderers-C64QSZO4.mjs +1 -0
  106. package/dist/preview-engine/renderers-CIRCR6NG.mjs +1 -0
  107. package/dist/preview-engine/renderers-CIWOPETY.mjs +1 -0
  108. package/dist/preview-engine/renderers-CUMVIVHI.mjs +1 -0
  109. package/dist/preview-engine/renderers-CZEZCELP.mjs +1 -0
  110. package/dist/preview-engine/{renderers-R3YVLWKV.mjs → renderers-ENMY4DKF.mjs} +1 -1
  111. package/dist/preview-engine/{renderers-AAENCA7X.mjs → renderers-FSI5KNGZ.mjs} +1 -1
  112. package/dist/preview-engine/renderers-FSQMWHQM.mjs +1 -0
  113. package/dist/preview-engine/renderers-FZEW5C23.mjs +1 -0
  114. package/dist/preview-engine/renderers-HCET2IML.mjs +1 -0
  115. package/dist/preview-engine/{renderers-LBX7GPDU.mjs → renderers-IHGAWLUF.mjs} +1 -1
  116. package/dist/preview-engine/renderers-IUOOC6K7.mjs +1 -0
  117. package/dist/preview-engine/{renderers-VXMR47WZ.mjs → renderers-KC6ZSKCW.mjs} +1 -1
  118. package/dist/preview-engine/renderers-KYYJLVIJ.mjs +1 -0
  119. package/dist/preview-engine/renderers-L4GE7WV3.mjs +1 -0
  120. package/dist/preview-engine/renderers-L6YDX6GS.mjs +1 -0
  121. package/dist/preview-engine/renderers-LRAFWKCO.mjs +1 -0
  122. package/dist/preview-engine/renderers-LU3XZWEB.mjs +1 -0
  123. package/dist/preview-engine/{renderers-4YYGKLDK.mjs → renderers-MD3PRFZL.mjs} +1 -1
  124. package/dist/preview-engine/renderers-MDHPQY6D.mjs +1 -0
  125. package/dist/preview-engine/renderers-MOEC2XZZ.mjs +1 -0
  126. package/dist/preview-engine/{renderers-RGDTRVZM.mjs → renderers-NCGH2WWJ.mjs} +1 -1
  127. package/dist/preview-engine/renderers-ND2WV4K3.mjs +1 -0
  128. package/dist/preview-engine/renderers-NJ5CWVVH.mjs +1 -0
  129. package/dist/preview-engine/renderers-NKXYPR3V.mjs +1 -0
  130. package/dist/preview-engine/{renderers-WVQQZQ6Y.mjs → renderers-NUAI4TO5.mjs} +1 -1
  131. package/dist/preview-engine/renderers-NWR66CGK.mjs +1 -0
  132. package/dist/preview-engine/renderers-O22WTBRM.mjs +1 -0
  133. package/dist/preview-engine/renderers-PBBA7LQB.mjs +1 -0
  134. package/dist/preview-engine/{renderers-BL7Z3FTF.mjs → renderers-PIIEUKFE.mjs} +1 -1
  135. package/dist/preview-engine/renderers-PPZK6VEW.mjs +1 -0
  136. package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +1 -0
  137. package/dist/preview-engine/{renderers-7TNEKJZS.mjs → renderers-QA2HKUJJ.mjs} +1 -1
  138. package/dist/preview-engine/renderers-RMEACSRL.mjs +1 -0
  139. package/dist/preview-engine/{renderers-AWRIELVX.mjs → renderers-RN2MHIFK.mjs} +1 -1
  140. package/dist/preview-engine/renderers-SEIAUKJF.mjs +1 -0
  141. package/dist/preview-engine/renderers-SP42LCSI.mjs +1 -0
  142. package/dist/preview-engine/{renderers-OE55O27K.mjs → renderers-T74CQCEN.mjs} +1 -1
  143. package/dist/preview-engine/renderers-T7SZA3BX.mjs +1 -0
  144. package/dist/preview-engine/{renderers-ZUQ2ZBYY.mjs → renderers-TGJSOKDY.mjs} +1 -1
  145. package/dist/preview-engine/renderers-TSBV4KPE.mjs +1 -0
  146. package/dist/preview-engine/{renderers-2SE5BLLB.mjs → renderers-U4M7ZCV4.mjs} +1 -1
  147. package/dist/preview-engine/{renderers-YEI4K4W4.mjs → renderers-V3AQO7AR.mjs} +1 -1
  148. package/dist/preview-engine/renderers-VADTDAHD.mjs +1 -0
  149. package/dist/preview-engine/renderers-VNNWI5C3.mjs +1 -0
  150. package/dist/preview-engine/{renderers-YYMRKHAA.mjs → renderers-WEYAHOBK.mjs} +1 -1
  151. package/dist/preview-engine/renderers-WZ75MLP3.mjs +1 -0
  152. package/dist/preview-engine/renderers-XB5R4UQA.mjs +1 -0
  153. package/dist/preview-engine/{renderers-YIVPMPQS.mjs → renderers-Y22VSOXF.mjs} +1 -1
  154. package/dist/preview-engine/{renderers-Y53D5CQ7.mjs → renderers-YBIUZDGQ.mjs} +1 -1
  155. package/dist/preview-engine/renderers-YESJR4O7.mjs +1 -0
  156. package/dist/preview-engine/renderers-YKSRZRRT.mjs +1 -0
  157. package/dist/preview-engine/{renderers-V4VML5IG.mjs → renderers-ZACSHGNZ.mjs} +1 -1
  158. package/dist/preview-engine/signals.mjs +1 -1
  159. package/dist/preview-engine/src-4IUYUKIZ.mjs +8 -0
  160. package/dist/{program-Cq4gP9Dd.mjs → program-CKpKkllV.mjs} +2 -2
  161. package/dist/{program-Cq4gP9Dd.mjs.map → program-CKpKkllV.mjs.map} +1 -1
  162. package/dist/renderer/index.mjs +2 -2
  163. package/dist/renderer--Ac-dg4A.mjs +5 -0
  164. package/dist/renderer--N7TMqzU.mjs +5 -0
  165. package/dist/{renderer-CXWAdRqn.mjs → renderer--fkmiVjl.mjs} +2 -2
  166. package/dist/{renderer-CXWAdRqn.mjs.map → renderer--fkmiVjl.mjs.map} +1 -1
  167. package/dist/{renderer-CZyJ72JZ.mjs → renderer-1r-Uq-Ae.mjs} +2 -2
  168. package/dist/{renderer-CZyJ72JZ.mjs.map → renderer-1r-Uq-Ae.mjs.map} +1 -1
  169. package/dist/renderer-2ecmdOae.mjs +5 -0
  170. package/dist/{renderer-D8CMakyz.mjs → renderer-8QIwXh7O.mjs} +3 -3
  171. package/dist/{renderer-D8CMakyz.mjs.map → renderer-8QIwXh7O.mjs.map} +1 -1
  172. package/dist/{renderer-B4iCFvJh.mjs → renderer-B-ur0Ej8.mjs} +3 -3
  173. package/dist/{renderer-B4iCFvJh.mjs.map → renderer-B-ur0Ej8.mjs.map} +1 -1
  174. package/dist/{renderer-BD25uND8.mjs → renderer-B2P1vgb7.mjs} +418 -187
  175. package/dist/renderer-B2P1vgb7.mjs.map +1 -0
  176. package/dist/{renderer-BZKkT-6Q.mjs → renderer-B2jjxsjO.mjs} +2 -2
  177. package/dist/{renderer-BZKkT-6Q.mjs.map → renderer-B2jjxsjO.mjs.map} +1 -1
  178. package/dist/{renderer-DEcbSNQd.mjs → renderer-B39I6CQw.mjs} +3 -3
  179. package/dist/{renderer-DEcbSNQd.mjs.map → renderer-B39I6CQw.mjs.map} +1 -1
  180. package/dist/{renderer-DIPyUVX2.mjs → renderer-B522Dkdk.mjs} +3 -3
  181. package/dist/{renderer-DIPyUVX2.mjs.map → renderer-B522Dkdk.mjs.map} +1 -1
  182. package/dist/renderer-B5RJp5g-.mjs +5 -0
  183. package/dist/renderer-B7xyT1Vb.mjs +5 -0
  184. package/dist/{renderer-CeX7uUXB.mjs → renderer-BAYTI6jj.mjs} +2 -2
  185. package/dist/{renderer-CeX7uUXB.mjs.map → renderer-BAYTI6jj.mjs.map} +1 -1
  186. package/dist/{renderer-DoRazdp_.mjs → renderer-BAusZ6Vu.mjs} +2 -2
  187. package/dist/{renderer-DoRazdp_.mjs.map → renderer-BAusZ6Vu.mjs.map} +1 -1
  188. package/dist/renderer-BBeArN_x.mjs +5 -0
  189. package/dist/renderer-BCAZDu-r.mjs +5 -0
  190. package/dist/{renderer-D41gHat4.mjs → renderer-BF0hx_iJ.mjs} +3 -3
  191. package/dist/{renderer-D41gHat4.mjs.map → renderer-BF0hx_iJ.mjs.map} +1 -1
  192. package/dist/renderer-BJnhik7Y.mjs +5 -0
  193. package/dist/{renderer-BeQrWrOa.mjs → renderer-BPWDsufX.mjs} +2 -2
  194. package/dist/{renderer-BeQrWrOa.mjs.map → renderer-BPWDsufX.mjs.map} +1 -1
  195. package/dist/{renderer-CxEBV-w0.mjs → renderer-BXJXziIt.mjs} +2 -2
  196. package/dist/{renderer-CxEBV-w0.mjs.map → renderer-BXJXziIt.mjs.map} +1 -1
  197. package/dist/{renderer-Ce8VPaog.mjs → renderer-BdyopiLC.mjs} +2 -2
  198. package/dist/{renderer-Ce8VPaog.mjs.map → renderer-BdyopiLC.mjs.map} +1 -1
  199. package/dist/{renderer-Bkqg-U2F.mjs → renderer-Bfk6A7UO.mjs} +3 -3
  200. package/dist/{renderer-Bkqg-U2F.mjs.map → renderer-Bfk6A7UO.mjs.map} +1 -1
  201. package/dist/{renderer-CAagaRag.mjs → renderer-BgO6BA_z.mjs} +2 -2
  202. package/dist/{renderer-CAagaRag.mjs.map → renderer-BgO6BA_z.mjs.map} +1 -1
  203. package/dist/{renderer-DlZwbO-A.mjs → renderer-BlPqTEii.mjs} +2 -2
  204. package/dist/{renderer-DlZwbO-A.mjs.map → renderer-BlPqTEii.mjs.map} +1 -1
  205. package/dist/{renderer-BEuU7qlG.mjs → renderer-BlvGcyAN.mjs} +2 -2
  206. package/dist/{renderer-BEuU7qlG.mjs.map → renderer-BlvGcyAN.mjs.map} +1 -1
  207. package/dist/{renderer-BrWOcJ9Q.mjs → renderer-BpIF1QIE.mjs} +3 -3
  208. package/dist/{renderer-BrWOcJ9Q.mjs.map → renderer-BpIF1QIE.mjs.map} +1 -1
  209. package/dist/renderer-BxRW8MZO.mjs +5 -0
  210. package/dist/renderer-C-lfsEAN.mjs +5 -0
  211. package/dist/{renderer-eAVNsuX8.mjs → renderer-C41U1tK6.mjs} +5 -5
  212. package/dist/{renderer-eAVNsuX8.mjs.map → renderer-C41U1tK6.mjs.map} +1 -1
  213. package/dist/renderer-C6nOFN4-.mjs +5 -0
  214. package/dist/{renderer-CjklM-KD.mjs → renderer-C7L8Ceqr.mjs} +2 -2
  215. package/dist/{renderer-CjklM-KD.mjs.map → renderer-C7L8Ceqr.mjs.map} +1 -1
  216. package/dist/{renderer-xLQ_nkmy.mjs → renderer-C7eFJf0_.mjs} +3 -3
  217. package/dist/{renderer-xLQ_nkmy.mjs.map → renderer-C7eFJf0_.mjs.map} +1 -1
  218. package/dist/renderer-C84TSQmS.mjs +5 -0
  219. package/dist/renderer-C8_6YofT.mjs +5 -0
  220. package/dist/{renderer-DsAoxQ8O.mjs → renderer-CCycwCEB.mjs} +2 -2
  221. package/dist/{renderer-DsAoxQ8O.mjs.map → renderer-CCycwCEB.mjs.map} +1 -1
  222. package/dist/{renderer-Cjx3x7xM.mjs → renderer-CHr7MiYW.mjs} +3 -3
  223. package/dist/{renderer-Cjx3x7xM.mjs.map → renderer-CHr7MiYW.mjs.map} +1 -1
  224. package/dist/renderer-COb3tOPG.mjs +5 -0
  225. package/dist/{renderer-DSpTGqUU.mjs → renderer-CQvmbRQ5.mjs} +3 -3
  226. package/dist/{renderer-DSpTGqUU.mjs.map → renderer-CQvmbRQ5.mjs.map} +1 -1
  227. package/dist/renderer-CSCIzaLy.mjs +5 -0
  228. package/dist/{renderer-D7Kk7VxM.mjs → renderer-CYC32bDW.mjs} +3 -3
  229. package/dist/{renderer-D7Kk7VxM.mjs.map → renderer-CYC32bDW.mjs.map} +1 -1
  230. package/dist/{renderer-Ci9x2WUd.mjs → renderer-CcvvoKiZ.mjs} +3 -3
  231. package/dist/{renderer-Ci9x2WUd.mjs.map → renderer-CcvvoKiZ.mjs.map} +1 -1
  232. package/dist/{renderer-DTgO5LPf.mjs → renderer-CiQhD8Gg.mjs} +3 -3
  233. package/dist/{renderer-DTgO5LPf.mjs.map → renderer-CiQhD8Gg.mjs.map} +1 -1
  234. package/dist/renderer-CmI4c8MS.mjs +5 -0
  235. package/dist/{renderer-BlVmbzPs.mjs → renderer-CpUJBOfb.mjs} +2 -2
  236. package/dist/renderer-CqVltdX9.mjs +5 -0
  237. package/dist/{renderer-LY2MiIj0.mjs → renderer-CwFqqpWY.mjs} +3 -3
  238. package/dist/{renderer-LY2MiIj0.mjs.map → renderer-CwFqqpWY.mjs.map} +1 -1
  239. package/dist/renderer-D-FpMzLY.mjs +5 -0
  240. package/dist/renderer-D-Oyn9mG.mjs +5 -0
  241. package/dist/renderer-D2QrkA8_.mjs +5 -0
  242. package/dist/{renderer-D7Cu9OZx.mjs → renderer-D47AEJE_.mjs} +2 -2
  243. package/dist/{renderer-D7Cu9OZx.mjs.map → renderer-D47AEJE_.mjs.map} +1 -1
  244. package/dist/renderer-D5bjOx83.mjs +3 -0
  245. package/dist/{renderer-DPn2DhMU.mjs → renderer-D61B9bXF.mjs} +2 -2
  246. package/dist/{renderer-DPn2DhMU.mjs.map → renderer-D61B9bXF.mjs.map} +1 -1
  247. package/dist/renderer-D64r4iN-.mjs +5 -0
  248. package/dist/{renderer-CUq2qgyc.mjs → renderer-D7Al3_-5.mjs} +3 -3
  249. package/dist/{renderer-CUq2qgyc.mjs.map → renderer-D7Al3_-5.mjs.map} +1 -1
  250. package/dist/{renderer-CyWRvKUI.mjs → renderer-D7r6onRT.mjs} +2 -2
  251. package/dist/{renderer-CyWRvKUI.mjs.map → renderer-D7r6onRT.mjs.map} +1 -1
  252. package/dist/{renderer-DxHICEk3.mjs → renderer-D8bBHrWC.mjs} +3 -3
  253. package/dist/{renderer-DxHICEk3.mjs.map → renderer-D8bBHrWC.mjs.map} +1 -1
  254. package/dist/renderer-DCq6YkgP.mjs +5 -0
  255. package/dist/{renderer-Dk45W8Zd.mjs → renderer-DDEkFbVI.mjs} +3 -3
  256. package/dist/{renderer-Dk45W8Zd.mjs.map → renderer-DDEkFbVI.mjs.map} +1 -1
  257. package/dist/renderer-DDHG3GdR.mjs +5 -0
  258. package/dist/{renderer-BWlMAacF.mjs → renderer-DEmYyaqj.mjs} +2 -2
  259. package/dist/{renderer-BWlMAacF.mjs.map → renderer-DEmYyaqj.mjs.map} +1 -1
  260. package/dist/{renderer-DRGa6tlX.mjs → renderer-DF-yvIrV.mjs} +2 -2
  261. package/dist/{renderer-DRGa6tlX.mjs.map → renderer-DF-yvIrV.mjs.map} +1 -1
  262. package/dist/{renderer-C-5RNIeX.mjs → renderer-DFzI3yI_.mjs} +2 -2
  263. package/dist/{renderer-C-5RNIeX.mjs.map → renderer-DFzI3yI_.mjs.map} +1 -1
  264. package/dist/{renderer-AMBVtZ_G.mjs → renderer-DIw3UtEU.mjs} +3 -3
  265. package/dist/{renderer-AMBVtZ_G.mjs.map → renderer-DIw3UtEU.mjs.map} +1 -1
  266. package/dist/renderer-DMdNfcud.mjs +6 -0
  267. package/dist/{renderer-DnPzvIHK.mjs → renderer-DMvmf3T2.mjs} +2 -2
  268. package/dist/{renderer-Gw1ICOJ3.mjs → renderer-DNQvOrkY.mjs} +3 -3
  269. package/dist/{renderer-Gw1ICOJ3.mjs.map → renderer-DNQvOrkY.mjs.map} +1 -1
  270. package/dist/{renderer-CP2FOWyJ.mjs → renderer-DO-KbpYZ.mjs} +3 -3
  271. package/dist/{renderer-CP2FOWyJ.mjs.map → renderer-DO-KbpYZ.mjs.map} +1 -1
  272. package/dist/{renderer-BeFiQfzV.mjs → renderer-DPAD6fL1.mjs} +70 -70
  273. package/dist/{renderer-BeFiQfzV.mjs.map → renderer-DPAD6fL1.mjs.map} +1 -1
  274. package/dist/{renderer-cg06hb82.mjs → renderer-DTqDy2m9.mjs} +3 -3
  275. package/dist/{renderer-cg06hb82.mjs.map → renderer-DTqDy2m9.mjs.map} +1 -1
  276. package/dist/{renderer-BXAgUuAq.mjs → renderer-DVCJjVn7.mjs} +2 -2
  277. package/dist/{renderer-BXAgUuAq.mjs.map → renderer-DVCJjVn7.mjs.map} +1 -1
  278. package/dist/{renderer-D6X9vWkN.mjs → renderer-DX41niRU.mjs} +2 -2
  279. package/dist/{renderer-D6X9vWkN.mjs.map → renderer-DX41niRU.mjs.map} +1 -1
  280. package/dist/{renderer-D3K9FEQk.mjs → renderer-DXEWbnRF.mjs} +3 -3
  281. package/dist/{renderer-D3K9FEQk.mjs.map → renderer-DXEWbnRF.mjs.map} +1 -1
  282. package/dist/renderer-DZQXZ4lK.mjs +5 -0
  283. package/dist/{renderer-CiMIftlS.mjs → renderer-DbRZe0Re.mjs} +3 -3
  284. package/dist/{renderer-CiMIftlS.mjs.map → renderer-DbRZe0Re.mjs.map} +1 -1
  285. package/dist/renderer-DczJJLA1.mjs +5 -0
  286. package/dist/renderer-DfqJj9oe.mjs +5 -0
  287. package/dist/renderer-DgO9ihVJ.mjs +5 -0
  288. package/dist/renderer-DhgnQZYb.mjs +5 -0
  289. package/dist/{renderer-CrgfMDbh.mjs → renderer-DiY70S8S.mjs} +3 -3
  290. package/dist/{renderer-CrgfMDbh.mjs.map → renderer-DiY70S8S.mjs.map} +1 -1
  291. package/dist/renderer-DjxKjHMf.mjs +5 -0
  292. package/dist/{renderer-Br4UZvfL.mjs → renderer-DkRSZg5g.mjs} +3 -3
  293. package/dist/{renderer-Br4UZvfL.mjs.map → renderer-DkRSZg5g.mjs.map} +1 -1
  294. package/dist/{renderer-CCSzKnvs.mjs → renderer-DmkWrWAk.mjs} +2 -2
  295. package/dist/{renderer-CCSzKnvs.mjs.map → renderer-DmkWrWAk.mjs.map} +1 -1
  296. package/dist/{renderer-D2JOseb1.mjs → renderer-DpruWmZU.mjs} +2 -2
  297. package/dist/{renderer-D2JOseb1.mjs.map → renderer-DpruWmZU.mjs.map} +1 -1
  298. package/dist/renderer-DqLA5cdR.mjs +5 -0
  299. package/dist/{renderer-DxbFjINv.mjs → renderer-DqvoMLca.mjs} +3 -3
  300. package/dist/{renderer-DxbFjINv.mjs.map → renderer-DqvoMLca.mjs.map} +1 -1
  301. package/dist/renderer-Dudp6ZlH.mjs +5 -0
  302. package/dist/{renderer-COQc1jn6.mjs → renderer-EaLUCobW.mjs} +2 -2
  303. package/dist/{renderer-COQc1jn6.mjs.map → renderer-EaLUCobW.mjs.map} +1 -1
  304. package/dist/{renderer-BioUC9zE.mjs → renderer-GBmWjBvy.mjs} +2 -2
  305. package/dist/{renderer-BioUC9zE.mjs.map → renderer-GBmWjBvy.mjs.map} +1 -1
  306. package/dist/{renderer-BNzT34UV.mjs → renderer-Lth37j17.mjs} +2 -2
  307. package/dist/{renderer-D-17HVPb.mjs → renderer-SSBL4M1o.mjs} +3 -3
  308. package/dist/{renderer-D-17HVPb.mjs.map → renderer-SSBL4M1o.mjs.map} +1 -1
  309. package/dist/{renderer-C8rxyjaE.mjs → renderer-SWr3vbrV.mjs} +2 -2
  310. package/dist/{renderer-C8rxyjaE.mjs.map → renderer-SWr3vbrV.mjs.map} +1 -1
  311. package/dist/{renderer-LwrcnEtI.mjs → renderer-WCZu2Rf5.mjs} +3 -3
  312. package/dist/{renderer-LwrcnEtI.mjs.map → renderer-WCZu2Rf5.mjs.map} +1 -1
  313. package/dist/{renderer-BIGILDEA.mjs → renderer-Xv6GfNUI.mjs} +2 -2
  314. package/dist/{renderer-BIGILDEA.mjs.map → renderer-Xv6GfNUI.mjs.map} +1 -1
  315. package/dist/renderer-_jC5KIT1.mjs +5 -0
  316. package/dist/{renderer-DveQQCi8.mjs → renderer-bAKUeHF3.mjs} +3 -3
  317. package/dist/{renderer-DveQQCi8.mjs.map → renderer-bAKUeHF3.mjs.map} +1 -1
  318. package/dist/renderer-cTgAuVmJ.mjs +5 -0
  319. package/dist/{renderer-DGPaKIFf.mjs → renderer-cod5Ona9.mjs} +2 -2
  320. package/dist/{renderer-DgLt0TPo.mjs → renderer-g_vrrAQU.mjs} +2 -2
  321. package/dist/{renderer-DgLt0TPo.mjs.map → renderer-g_vrrAQU.mjs.map} +1 -1
  322. package/dist/{renderer-uorPCWdC.mjs → renderer-hSCfnvaK.mjs} +3 -3
  323. package/dist/{renderer-uorPCWdC.mjs.map → renderer-hSCfnvaK.mjs.map} +1 -1
  324. package/dist/{renderer-BGPnCRFI.mjs → renderer-ktWXVYka.mjs} +3 -3
  325. package/dist/{renderer-BGPnCRFI.mjs.map → renderer-ktWXVYka.mjs.map} +1 -1
  326. package/dist/renderer-nVKDvDLO.mjs +5 -0
  327. package/dist/{renderer-U-12BOhe.mjs → renderer-oKRF4A0M.mjs} +2 -2
  328. package/dist/{renderer-U-12BOhe.mjs.map → renderer-oKRF4A0M.mjs.map} +1 -1
  329. package/dist/{renderer-CsilJwL-.mjs → renderer-pHWEHDnM.mjs} +3 -3
  330. package/dist/{renderer-CsilJwL-.mjs.map → renderer-pHWEHDnM.mjs.map} +1 -1
  331. package/dist/renderer-pZ6_pUo1.mjs +5 -0
  332. package/dist/{renderer-BD00i68i.mjs → renderer-sCovEubT.mjs} +3 -3
  333. package/dist/{renderer-BD00i68i.mjs.map → renderer-sCovEubT.mjs.map} +1 -1
  334. package/dist/{renderer-BdbGTz7z.mjs → renderer-sYSkIUfo.mjs} +3 -3
  335. package/dist/{renderer-BdbGTz7z.mjs.map → renderer-sYSkIUfo.mjs.map} +1 -1
  336. package/dist/{renderer-BLU0PQTB.mjs → renderer-zXPVLRlD.mjs} +3 -3
  337. package/dist/{renderer-BLU0PQTB.mjs.map → renderer-zXPVLRlD.mjs.map} +1 -1
  338. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs → renderers-CP8CFWDs-DH2oktaC.mjs} +2 -2
  339. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs.map → renderers-CP8CFWDs-DH2oktaC.mjs.map} +1 -1
  340. package/dist/signals/index.mjs +4 -4
  341. package/dist/{src-B0KFNjj4.mjs → src-DFEqficI.mjs} +445 -35
  342. package/dist/src-DFEqficI.mjs.map +1 -0
  343. package/package.json +67 -58
  344. package/dist/index-BwRrsP_V.d.mts.map +0 -1
  345. package/dist/index-UDDAfHAF.d.mts.map +0 -1
  346. package/dist/preview-engine/chunk-3U2A3RW4.mjs +0 -5
  347. package/dist/preview-engine/chunk-6E3JSPJN.mjs +0 -1
  348. package/dist/preview-engine/chunk-F4F2UDRX.mjs +0 -1
  349. package/dist/preview-engine/chunk-KFNVUGNN.mjs +0 -1974
  350. package/dist/preview-engine/chunk-PYSBWKIJ.mjs +0 -1
  351. package/dist/preview-engine/chunk-U2IFQMS3.mjs +0 -174
  352. package/dist/preview-engine/renderers-2GMY2ZNK.mjs +0 -1
  353. package/dist/preview-engine/renderers-2QJNKL7Q.mjs +0 -1
  354. package/dist/preview-engine/renderers-3OYU6O6F.mjs +0 -1
  355. package/dist/preview-engine/renderers-433Y2PCK.mjs +0 -1
  356. package/dist/preview-engine/renderers-4AGPGEL4.mjs +0 -1
  357. package/dist/preview-engine/renderers-54DBHGUW.mjs +0 -1
  358. package/dist/preview-engine/renderers-5M2O55U3.mjs +0 -1
  359. package/dist/preview-engine/renderers-6FVMDEAY.mjs +0 -1
  360. package/dist/preview-engine/renderers-6R7ZJ7DU.mjs +0 -1
  361. package/dist/preview-engine/renderers-75GCMFOD.mjs +0 -1
  362. package/dist/preview-engine/renderers-7LWLUCVQ.mjs +0 -1
  363. package/dist/preview-engine/renderers-BLDENIEV.mjs +0 -1
  364. package/dist/preview-engine/renderers-CDB3YK3R.mjs +0 -1
  365. package/dist/preview-engine/renderers-D6D4XDFY.mjs +0 -1
  366. package/dist/preview-engine/renderers-DJVFQZYU.mjs +0 -1
  367. package/dist/preview-engine/renderers-DMXSV7VO.mjs +0 -1
  368. package/dist/preview-engine/renderers-EBMASIOE.mjs +0 -1
  369. package/dist/preview-engine/renderers-F262HDFS.mjs +0 -1
  370. package/dist/preview-engine/renderers-FMXKIF22.mjs +0 -1
  371. package/dist/preview-engine/renderers-GJKSZ6DR.mjs +0 -1
  372. package/dist/preview-engine/renderers-GR3RLYDZ.mjs +0 -1
  373. package/dist/preview-engine/renderers-GT3W2QIA.mjs +0 -1
  374. package/dist/preview-engine/renderers-IHC7HUK3.mjs +0 -1
  375. package/dist/preview-engine/renderers-J56ZGEVM.mjs +0 -1
  376. package/dist/preview-engine/renderers-KYM6352U.mjs +0 -1
  377. package/dist/preview-engine/renderers-LFXX6TWI.mjs +0 -1
  378. package/dist/preview-engine/renderers-NAHUPFPU.mjs +0 -1
  379. package/dist/preview-engine/renderers-NM3FZLHH.mjs +0 -1
  380. package/dist/preview-engine/renderers-NNB4BTJA.mjs +0 -1
  381. package/dist/preview-engine/renderers-OYVQW6QI.mjs +0 -1
  382. package/dist/preview-engine/renderers-P5RIFU3C.mjs +0 -1
  383. package/dist/preview-engine/renderers-QB7HJUTS.mjs +0 -1
  384. package/dist/preview-engine/renderers-QRQVOCDC.mjs +0 -1
  385. package/dist/preview-engine/renderers-QVFHJTZA.mjs +0 -1
  386. package/dist/preview-engine/renderers-R3WQIE4L.mjs +0 -1
  387. package/dist/preview-engine/renderers-SQBVOLG7.mjs +0 -1
  388. package/dist/preview-engine/renderers-TLXMYEDI.mjs +0 -1
  389. package/dist/preview-engine/renderers-X4S3WELJ.mjs +0 -1
  390. package/dist/preview-engine/renderers-XT7U25I7.mjs +0 -1
  391. package/dist/preview-engine/renderers-XVGLMBB3.mjs +0 -1
  392. package/dist/preview-engine/renderers-YUWU3TQZ.mjs +0 -1
  393. package/dist/preview-engine/renderers-ZNUD5OVO.mjs +0 -1
  394. package/dist/renderer-01zxT4CK.mjs +0 -5
  395. package/dist/renderer-35LHkj36.mjs +0 -5
  396. package/dist/renderer-B0OIdCGj.mjs +0 -5
  397. package/dist/renderer-B3IPtkK9.mjs +0 -5
  398. package/dist/renderer-BD25uND8.mjs.map +0 -1
  399. package/dist/renderer-BMC39abo.mjs +0 -5
  400. package/dist/renderer-BQj3nlAI.mjs +0 -5
  401. package/dist/renderer-BnBvSmp_.mjs +0 -5
  402. package/dist/renderer-BsDSpTpL.mjs +0 -5
  403. package/dist/renderer-BtW6_gvE.mjs +0 -5
  404. package/dist/renderer-By8U44Rt.mjs +0 -5
  405. package/dist/renderer-C3lDmxuX.mjs +0 -5
  406. package/dist/renderer-C6SZAE_x.mjs +0 -5
  407. package/dist/renderer-CA3IVeZj.mjs +0 -5
  408. package/dist/renderer-CFoCH_mO.mjs +0 -5
  409. package/dist/renderer-CLhZqJF8.mjs +0 -6
  410. package/dist/renderer-CYJXQS8E.mjs +0 -5
  411. package/dist/renderer-C_vj6_WJ.mjs +0 -5
  412. package/dist/renderer-CeqfC6OR.mjs +0 -5
  413. package/dist/renderer-CkZCGMAc.mjs +0 -5
  414. package/dist/renderer-Clxju1r9.mjs +0 -5
  415. package/dist/renderer-Cvz22ZSh.mjs +0 -3
  416. package/dist/renderer-CyWtKBF7.mjs +0 -5
  417. package/dist/renderer-D27STGoB.mjs +0 -5
  418. package/dist/renderer-D78Aq9YK.mjs +0 -5
  419. package/dist/renderer-DHEffABL.mjs +0 -5
  420. package/dist/renderer-DUuNCgzW.mjs +0 -5
  421. package/dist/renderer-DVD5pzRq.mjs +0 -5
  422. package/dist/renderer-Dsp6xDw5.mjs +0 -5
  423. package/dist/renderer-DuC-BFXR.mjs +0 -5
  424. package/dist/renderer-DuWs_Wsv.mjs +0 -5
  425. package/dist/renderer-OSgsiIrW.mjs +0 -5
  426. package/dist/renderer-OZaMFYtZ.mjs +0 -5
  427. package/dist/renderer-T79TmHET.mjs +0 -5
  428. package/dist/renderer-UhsC9oTU.mjs +0 -5
  429. package/dist/renderer-WYZV1jWf.mjs +0 -5
  430. package/dist/renderer-Y7evDjHH.mjs +0 -5
  431. package/dist/renderer-mcePkmUe.mjs +0 -5
  432. package/dist/src-B0KFNjj4.mjs.map +0 -1
@@ -0,0 +1,1974 @@
1
+ import{a as Id}from"./chunk-2YJ2EW2B.mjs";import{N as Xi,O as qi,T as nu,U as iu,X as Rn,Y as Fn,d as mt,m as Wi,w as Qs,x as Ed,y as Js,z as eu}from"./chunk-QCSVT73T.mjs";import{a as Nn,b as On}from"./chunk-3F6JGYSP.mjs";import{a as Hi,b as Xs}from"./chunk-JJ7D26WR.mjs";import{a as Or}from"./chunk-MIEH74UH.mjs";import{p as qs,s as Zs,u as Ks}from"./chunk-FKG27DVO.mjs";import{$ as vo,E as fo,G as Ln,I as ho,J as Jt,K as go,O as En,R as In,T as er,U as Tt,V as bo,W as yo,X as et,Y as xo,_ as wo,aa as Ct,b as oo,ba as So,ca as ko,da as Po,ea as Mo,fa as Lr,ga as To,ha as Co,ia as Ao,ja as Do,ka as No,l as ao,la as Er,m as so,ma as dt,n as uo,na as Oo,oa as Ro,p as Br,pa as Fo,s as lo,w as co,x as mo,z as po}from"./chunk-EJJITH6U.mjs";import{$ as Bn,S as ou,X as Qi,a as qt,d as zs,e as An,ea as Qt,f as Mt,fa as Ji,ha as eo,ia as to,la as Rr,ma as ro,na as no,oa as Fr}from"./chunk-D73ZKPFN.mjs";import{a as zd}from"./chunk-BREZX5L5.mjs";import{a as Ki}from"./chunk-OGSZZ4JO.mjs";import{a as Zi}from"./chunk-LGQSJCKE.mjs";import{i as Gi}from"./chunk-6ISHV73H.mjs";import{c as Hs}from"./chunk-BXPM5SJ3.mjs";import{d as io}from"./chunk-2CECZN67.mjs";import{a as ue}from"./chunk-3DXMWDQ3.mjs";import{a as ru}from"./chunk-C4M3B2Q2.mjs";import{f as js,i as Vs,j as $s,k as Us,n as Dn}from"./chunk-HOV6DDBZ.mjs";import{a as l}from"./chunk-6FULVULN.mjs";import{c as tu}from"./chunk-P4Y3PMJF.mjs";import{h as _s,j as Gs}from"./chunk-RECQ74RP.mjs";import{e as Zt}from"./chunk-32WC4FRR.mjs";import{a as Xt,l as Is,t as Dr}from"./chunk-ULOFDFHJ.mjs";import{a as ze}from"./chunk-GN3NDRLI.mjs";import{j as Kt,y as Yi}from"./chunk-BJXNKMSY.mjs";import{m as Nr}from"./chunk-VEDMJBJV.mjs";import{r as ge,t as _i}from"./chunk-QEWDIPJ7.mjs";import{a as Ws}from"./chunk-OGPJTUAL.mjs";import{a as Ys}from"./chunk-354GX6IB.mjs";import{c as $i,h as Ui}from"./chunk-5RRKGN2U.mjs";import{o as _}from"./chunk-BDZ3TSOT.mjs";import{b as Es,d as Ar,f as x,g as h}from"./chunk-Y4NIR77Z.mjs";var Xm=Es((oT,Ym)=>{h();var Ni=()=>new Proxy(function(){},{get:(e,t)=>t==="__esModule"?!0:t===Symbol.toPrimitive?()=>"":Ni(),apply:()=>Ni(),construct:()=>Ni()});Ym.exports=Ni()});var cd=Es((n3,ld)=>{h();var Ei=()=>new Proxy(function(){},{get:(e,t)=>t==="__esModule"?!0:t===Symbol.toPrimitive?()=>"":Ei(),apply:()=>Ei(),construct:()=>Ei()});ld.exports=Ei()});h();h();h();h();var jd=e=>!e.source||e.source.type==="keyframe";function Ir(e){let t=[],r=new Map;for(let n of e){if(!jd(n)){t.push(n);continue}let i=r.get(n.prop);if(!i){let a={...n,keyframes:[...n.keyframes??[]]};r.set(n.prop,a),t.push(a);continue}let o=new Map(i.keyframes.map(a=>[a.frame,a]));for(let a of n.keyframes??[])o.set(a.frame,a);i.keyframes=[...o.values()].sort((a,s)=>a.frame-s.frame)}return t}function au(e,t){if(!e)return t;let r=Bo(e);if(!r||r.name==="none")return t;let{name:n,dir:i,params:o}=r,a=Math.max(0,Math.min(1,t)),s=u=>i==="in"?u(a):i==="out"?1-u(1-a):a<.5?u(a*2)/2:1-u((1-a)*2)/2;switch(n){case"power1":return s(u=>u*u);case"power2":return s(u=>u*u*u);case"power3":return s(u=>u*u*u*u);case"sine":return s(u=>1-Math.cos(u*Math.PI/2));case"circ":return s(u=>1-Math.sqrt(Math.max(0,1-u*u)));case"expo":return s(u=>u===0?0:2**(10*(u-1)));case"back":{let u=o?.[0]??1.70158,c=u+1;return s(m=>c*m*m*m-u*m*m)}case"bounce":{let u=c=>{if(c<.36363636363636365)return 7.5625*c*c;if(c<.7272727272727273){let f=c-.5454545454545454;return 7.5625*f*f+.75}if(c<.9090909090909091){let f=c-.8181818181818182;return 7.5625*f*f+.9375}let p=c-2.625/2.75;return 7.5625*p*p+.984375};return i==="out"?u(a):i==="in"?1-u(1-a):a<.5?(1-u(1-2*a))/2:(1+u(2*a-1))/2}default:return a}}function Bo(e){if(e){if(typeof e=="object"&&"name"in e&&"dir"in e)return e;if(typeof e=="string"){let t=e.trim(),r=t.match(/^([a-zA-Z0-9]+)(?:\.([a-zA-Z]+))?(?:\(([^)]+)\))?$/);if(r){let u=r[1].toLowerCase(),c=u==="linear"?"none":u,m=(r[2]||"out").toLowerCase(),d="out";m==="in"?d="in":m==="out"?d="out":m==="inout"&&(d="inOut");let p;return r[3]&&(p=r[3].split(",").map(f=>Number.parseFloat(f.trim())).filter(f=>!Number.isNaN(f))),{name:c,dir:d,...p&&p.length>0?{params:p}:{}}}let n=t.indexOf(".");if(n===-1){let u=t.toLowerCase();return{name:u==="linear"?"none":u,dir:"out"}}let i=t.slice(0,n).toLowerCase(),o=i==="linear"?"none":i,a=t.slice(n+1).toLowerCase(),s="out";return a==="in"?s="in":a==="out"?s="out":a==="inout"&&(s="inOut"),{name:o,dir:s}}}}var te=class e{tracks=[];frameStep;defaultRepeat;defaultYoyo;constructor(t=[]){this.tracks=[...t]}static create(){return new e}static stepped(t=2){return new e().stepped(t)}stepped(t=2){return this.frameStep=Math.max(1,Math.min(24,Math.round(t))),this}static fromTo(t,r,n,i={}){return new e().fromTo(t,r,n,i)}static keys(t,r,n){return new e().keys(t,r,n)}static signal(t,r,n={}){return new e().signal(t,r,n)}static colorSignal(t,r,n){return new e().colorSignal(t,r,n)}static kineticSweep(t=-1,r=1,n=0,i=24,o="power2.out"){return new e().kineticSweep(t,r,n,i,o)}static typewriter(t=0,r=30,n="linear"){return new e().typewriter(t,r,n)}static letterSpacing(t,r,n=0,i=24,o="power2.out"){return new e().letterSpacing(t,r,n,i,o)}static wiggle(t,r={}){return new e().wiggle(t,r)}static spring(t,r={}){return new e().spring(t,r)}static firstMargin(t,r,n={}){return new e().firstMargin(t,r,n)}static strokeWidth(t,r,n={}){return new e().fromTo("strokeWidth",t,r,n)}static rotateX(t,r,n={}){return new e().fromTo("rotateX",t,r,n)}static rotateY(t,r,n={}){return new e().fromTo("rotateY",t,r,n)}static rotateZ(t,r,n={}){return new e().fromTo("rotateZ",t,r,n)}static rotation(t,r,n={}){return new e().fromTo("rotation",t,r,n)}static scale(t,r,n={}){return new e().fromTo("scale",t,r,n)}static scaleX(t,r,n={}){return new e().fromTo("scaleX",t,r,n)}static scaleY(t,r,n={}){return new e().fromTo("scaleY",t,r,n)}addTrack(t){return this.tracks.push(t),this}repeat(t=-1,r){this.defaultRepeat=t;for(let n of this.tracks)(!r||n.prop===r)&&(n.repeat=t);return this}yoyo(t=!0,r){this.defaultYoyo=t;for(let n of this.tracks)(!r||n.prop===r)&&(n.yoyo=t);return this}loop(t={},r){return this.repeat(-1,r),t.yoyo&&this.yoyo(!0,r),this}fromTo(t,r,n,i={}){let o=i.from??i.start??i.fromFrame??0,a=i.to??i.end??i.toFrame??(i.durationFrames!==void 0?o+i.durationFrames:o+24),s=Bo(i.ease),u=this.tracks.find(m=>m.prop===t&&(!m.source||m.source.type==="keyframe"));if(!u){let m={id:`${t}_fromTo_${this.tracks.length}`,prop:t,keyframes:[],...this.defaultRepeat!==void 0&&{repeat:this.defaultRepeat},...this.defaultYoyo!==void 0&&{yoyo:this.defaultYoyo}};this.tracks.push(m),u=m}i.repeat!==void 0&&(u.repeat=i.repeat),i.yoyo!==void 0&&(u.yoyo=i.yoyo),i.durationFrames!==void 0&&(u.durationFrames=i.durationFrames);let c=u.id;return u.keyframes.length===0&&o>0&&u.keyframes.push({id:`${c}_k0`,frame:0,value:r}),(u.keyframes.length===0||u.keyframes[u.keyframes.length-1].frame<o)&&u.keyframes.push({id:`${c}_k_${o}`,frame:o,value:r}),u.keyframes.push({id:`${c}_k_${a}`,frame:a,value:n,...s&&{ease:s}}),u.keyframes.sort((m,d)=>m.frame-d.frame),this}keyframe(t,r,n,i){let o=this.tracks.find(c=>c.prop===t&&(!c.source||c.source.type==="keyframe"));if(!o){let c={id:`${t}_track_${this.tracks.length}`,prop:t,keyframes:[],...this.defaultRepeat!==void 0&&{repeat:this.defaultRepeat},...this.defaultYoyo!==void 0&&{yoyo:this.defaultYoyo}};this.tracks.push(c),o=c}let a=Bo(i),s={id:`k_${o.keyframes.length}_f${r}`,frame:r,value:n,...a&&{ease:a}},u=o.keyframes.findIndex(c=>c.frame===r);return u>=0?o.keyframes[u]=s:o.keyframes.push(s),o.keyframes.sort((c,m)=>c.frame-m.frame),this}keys(t,r,n){for(let[i,o,a]of r)this.keyframe(t,Math.round(i),o,a);if(n){let i=this.tracks.find(o=>o.prop===t&&(!o.source||o.source.type==="keyframe"));i&&(n.repeat!==void 0&&(i.repeat=n.repeat),n.yoyo!==void 0&&(i.yoyo=n.yoyo),n.durationFrames!==void 0&&(i.durationFrames=n.durationFrames))}return this}fadeIn(t=0,r=20,n="power2.out"){return this.fromTo("opacity",0,1,{from:t,to:r,ease:n})}fadeOut(t,r,n="power2.in"){return this.fromTo("opacity",1,0,{from:t,to:r,ease:n})}slideInY(t,r,n=0,i=24,o="power2.out"){return this.fromTo("y",t,r,{from:n,to:i,ease:o})}slideInX(t,r,n=0,i=24,o="power2.out"){return this.fromTo("x",t,r,{from:n,to:i,ease:o})}kineticSweep(t=-1,r=1,n=0,i=24,o="power2.out"){return this.fromTo("offset",t,r,{from:n,to:i,ease:o})}typewriter(t=0,r=30,n="linear"){return this.fromTo("text",0,1,{from:t,to:r,ease:n})}letterSpacing(t,r,n=0,i=24,o="power2.out"){return this.fromTo("letterSpacing",t,r,{from:n,to:i,ease:o})}firstMargin(t,r,n={}){return this.fromTo("firstMargin",t,r,n)}lastMargin(t,r,n={}){return this.fromTo("lastMargin",t,r,n)}baselineShift(t,r,n={}){return this.fromTo("baselineShift",t,r,n)}rotateX(t,r,n={}){return this.fromTo("rotateX",t,r,n)}rotateY(t,r,n={}){return this.fromTo("rotateY",t,r,n)}rotateZ(t,r,n={}){return this.fromTo("rotateZ",t,r,n)}scaleX(t,r,n={}){return this.fromTo("scaleX",t,r,n)}scaleY(t,r,n={}){return this.fromTo("scaleY",t,r,n)}scale(t,r,n={}){return this.fromTo("scale",t,r,n)}perspective(t,r,n={}){return this.fromTo("perspective",t,r,n)}translateZ(t,r,n={}){return this.fromTo("translateZ",t,r,n)}tilt3D(t){let r=t.start??t.fromFrame,n=t.end??t.toFrame,i=t.ease,o=t.from??{},a=t.to,s=["rotateX","rotateY","rotateZ","translateZ","perspective"];for(let u of s){let c=a[u];if(c!==void 0){let m=o[u]??0;this.fromTo(u,m,c,{from:r,to:n,fromFrame:r,toFrame:n,ease:i})}}return this}signal(t,r,n={}){let{handleId:i,inline:o}=Xi(r),a=`${t}_sig_${i}_${this.tracks.length}`,s={type:"signal",inputHandleId:i,multiplier:n.multiplier??1,offset:n.offset??0,smoothingWindowFrames:n.smoothing??0,signalMode:n.mode??"continuous",threshold:n.threshold??.15,accumulateThreshold:n.threshold??.15,debounceFrames:n.debounceFrames??2,channel:n.channel??"primary"};return o&&qi(s,o),this.tracks.push({id:a,prop:t,source:s,keyframes:[]}),this}colorSignal(t,r,n){let{handleId:i,inline:o}=Xi(r),a=`${t}_colorSig_${i}_${this.tracks.length}`,s={type:"signal",inputHandleId:i,multiplier:n.multiplier??1,offset:n.offset??0,smoothingWindowFrames:n.smoothing??0,colorMode:n.colorMode??"interpolate",colorA:n.colorA,colorB:n.colorB,colorThreshold:n.threshold,channel:"primary"};return o&&qi(s,o),this.tracks.push({id:a,prop:t,source:s,keyframes:[]}),this}wiggle(t,r={}){let n=`${t}_wiggle_${this.tracks.length}`,i={type:"wiggle",frequency:r.frequency??2,amplitude:r.amplitude??20,octaves:r.octaves??1,seed:r.seed??1234};return this.tracks.push({id:n,prop:t,source:i,keyframes:[]}),this}spring(t,r={}){let n=`${t}_spring_${this.tracks.length}`,i={type:"springOvershoot",damping:r.damping??12,stiffness:r.stiffness??180,mass:r.mass??1};return this.tracks.push({id:n,prop:t,source:i,keyframes:[]}),this}followPath(t,r={}){let n=r.start??r.fromFrame??0,i=r.end??r.toFrame??60,o=Math.max(1,i-n),a=r.samples??Math.max(8,Math.min(60,Math.round(o/2))),s=t.totalLength??1,u=r.fromProgress??0,c=r.toProgress??1;r.fromDistance!==void 0&&s>0&&(u=r.fromDistance/s),r.toDistance!==void 0&&s>0&&(c=r.toDistance/s);let m=r.autoOrient??!0,d=r.banking??0,p=r.pitchOffset??0,f=r.yawOffset??0,b=r.rollOffset??0,g=!1,y=!1,v=!1,T=[];for(let C=0;C<=a;C++){let w=C/a,A=au(r.ease,w),S=u+A*(c-u),M=Math.round(n+w*o),D=[0,0,0],V=[1,0,0],W=[0,0,0];if(typeof t.getFrameAt=="function"){let P=t.getFrameAt(S);D=P.position,V=P.tangent,W=P.rotation??[0,0,0]}else{let P=t.getPointAt(S);D=P.position,P.tangent&&(V=P.tangent);let G=Math.asin(Math.max(-1,Math.min(1,-V[1])))*(180/Math.PI),Y=Math.atan2(V[0],V[2])*(180/Math.PI),$=Math.atan2(V[1],V[0])*(180/Math.PI);W=[G,Y,$]}let z=W[0]+p,B=W[1]+f,k=(Math.abs(V[2])<1e-4?Math.atan2(V[1],V[0])*(180/Math.PI):W[2])+b;if(d!==0){let P=Math.min(1,S+.02),G=Math.max(0,S-.02),Y=t.getPointAt(P),$=t.getPointAt(G),I=Y.tangent??[1,0,0],J=$.tangent??[1,0,0],oe=Math.atan2(I[0],I[2]),he=Math.atan2(J[0],J[2]),le=oe-he;k-=le*d*57.2958}Math.abs(D[2])>1e-4&&(g=!0),Math.abs(z)>1e-4&&(y=!0),Math.abs(B)>1e-4&&(v=!0),T.push({f:M,x:D[0],y:D[1],z:D[2],rx:z,ry:B,rz:k})}for(let C of T)this.keyframe("x",C.f,C.x),this.keyframe("y",C.f,C.y),g&&this.keyframe("z",C.f,C.z),m&&(this.keyframe("rotateZ",C.f,C.rz),y&&this.keyframe("rotateX",C.f,C.rx),v&&this.keyframe("rotateY",C.f,C.ry));return this}applyTo(t){return t.animation=this.toSpec(),t}merge(...t){return this.tracks=Ir([...this.tracks,...t.flatMap(r=>r.tracks)]),this}static merge(...t){let r=new e;return r.tracks=Ir(t.flatMap(n=>n.tracks)),r}toSpec(){return{tracks:this.tracks,...this.frameStep!==void 0&&{frameStep:this.frameStep}}}toJSON(){return this.toSpec()}},Lo=class e extends te{static camera(){return new e}dolly(t,r,n={}){if(typeof t=="object"){let i=t,o=i.start??i.fromFrame??0,a=i.end??i.toFrame??0;return this.fromTo("cameraZ",i.fromDistance,i.toDistance,{from:o,to:a,ease:i.ease})}return this.fromTo("cameraZ",t,r??t,n)}orbit(t){let r=t.start??t.fromFrame??0,n=t.end??t.toFrame??0;return t.azimuth&&this.fromTo("orbitAzimuth",t.azimuth.from??0,t.azimuth.to,{from:r,to:n,ease:t.ease}),t.elevation&&this.fromTo("orbitElevation",t.elevation.from??0,t.elevation.to,{from:r,to:n,ease:t.ease}),t.radius&&this.fromTo("orbitRadius",t.radius.from??1500,t.radius.to,{from:r,to:n,ease:t.ease}),this}truck(t,r,n={}){return this.fromTo("cameraX",t,r,n)}pedestal(t,r,n={}){return this.fromTo("cameraY",t,r,n)}pan(t,r,n={}){return this.fromTo("cameraYaw",t,r,n)}tilt(t,r,n={}){return this.fromTo("cameraPitch",t,r,n)}roll(t,r,n={}){return this.fromTo("cameraRoll",t,r,n)}rackFocus(t){let r=t.start??t.fromFrame??0,n=t.end??t.toFrame??0;return this.fromTo("focusDistance",t.fromDistance,t.toDistance,{from:r,to:n,ease:t.ease??"power2.inOut"}),t.toFStop!==void 0&&this.fromTo("fStop",t.fromFStop??2.8,t.toFStop,{from:r,to:n,ease:t.ease??"power2.inOut"}),this}handheld(t){let r=t.start??t.fromFrame??0,n=t.end??t.toFrame??0;return this.fromTo("shakeTranslation",0,t.translationAmplitude,{from:r,to:n}),this.fromTo("shakeRotation",0,t.rotationAmplitude,{from:r,to:n}),this}followPath3D(t,r={}){let n=r.start??r.fromFrame??0,i=r.end??r.toFrame??60,o=Math.max(1,i-n),a=r.samples??Math.max(8,Math.min(60,Math.round(o/2))),s=r.mode??(r.target?"lookAtTarget":"leadTarget"),u=r.fromProgress??0,c=r.toProgress??1,m=r.lookAhead??.05;for(let d=0;d<=a;d++){let p=d/a,f=au(r.ease,p),b=u+f*(c-u),g=Math.round(n+p*o),y=[0,0,0],v=[0,0,0];if(typeof t.getFrameAt=="function"){let T=t.getFrameAt(b);y=T.position,v=T.rotation??[0,0,0]}else y=t.getPointAt(b).position;if(this.keyframe("cameraX",g,y[0]),this.keyframe("cameraY",g,y[1]),this.keyframe("cameraZ",g,y[2]),s==="lookAtTarget"){let T=r.target??[y[0],y[1],0];this.keyframe("targetX",g,T[0]),this.keyframe("targetY",g,T[1]),this.keyframe("targetZ",g,T[2])}else if(s==="leadTarget"){let T=Math.min(1,b+m),C=t.getPointAt(T);this.keyframe("targetX",g,C.position[0]),this.keyframe("targetY",g,C.position[1]),this.keyframe("targetZ",g,C.position[2])}else s==="orientAlongPath"&&(this.keyframe("cameraPitch",g,v[0]),this.keyframe("cameraYaw",g,v[1]),this.keyframe("cameraRoll",g,v[2]))}return this}};h();var Eo=class e{name;props={};selectors=[];constructor(t){this.name=t}static create(t){return new e(t)}skew(t,r=0){return this.props.skew=t,this.props.skewAxis=r,this}anchor(t,r="character",n=0,i=0){return this.props.anchor={grouping:r,preset:t,anchorX:.5,anchorY:.5,offsetX:n,offsetY:i},this}anchorNormalized(t,r,n="character"){return this.props.anchor={grouping:n,preset:"custom",anchorX:t,anchorY:r,offsetX:0,offsetY:0},this}translateZ(t){return this.props.translateZ=t,this}tilt3D(t=0,r=0,n=0){return this.props.rotationX=t,this.props.rotationY=r,this.props.rotationZ=n,this}rotationX(t){return this.props.rotationX=t,this}rotationY(t){return this.props.rotationY=t,this}rotationZ(t){return this.props.rotationZ=t,this}volumetricFormation(t="cylinder",r=300,n=120,i=360,o=1200,a="y"){return this.props.formation={mode:t,radius:r,pitch:n,totalAngle:i,perspective:o,axis:a},this}lineSpacing(t,r=0){return this.props.lineSpacing=t,this.props.lineAnchor=r,this}lineAnchor(t){return this.props.lineAnchor=t,this}spring(t=180,r=12,n=1,i=0){return this.props.spring={stiffness:t,damping:r,mass:n,initialVelocity:i,overshootMultiplier:1},this}stroke(t,r="#ffffff",n=1){return this.props.stroke={strokeWidth:t,strokeColor:r,strokeAlign:"center",fillOpacity:n,dashOffset:0},this}variableFont(t){return this.props.variableAxes=t,this}chromaticGlitch(t,r=0,n=-t,i=0){return this.props.chromaticGlitch={redShiftX:t,redShiftY:r,blueShiftX:n,blueShiftY:i,sliceProbability:0,sliceAmplitude:0},this}audioSpectrum(t,r=60,n=16e3,i=2.5){return this.props.audioSpectrum={signalChannel:t,minFreqHz:r,maxFreqHz:n,scaleAxis:"scaleY",minScale:.2,maxScale:i,peakDecay:.8},this}longShadow(t=45,r=40,n="#000000",i=.8,o=0,a=16){return this.props.longShadow={angle:t,length:r,color:n,startOpacity:i,endOpacity:o,steps:a},this}particleDissolve(t=0,r=90,n=120){return this.props.particleDissolve={progress:t,dispersalAngle:r,maxDisplacement:n,turbulence:.5,particleSize:2},this}addExpressionSelector(t,r="add"){return this.selectors.push({type:"expression",expression:t,mode:r,amount:1}),this}expressionSelector(t,r="add"){return this.addExpressionSelector(t,r)}x(t){return this.props.x=t,this}y(t){return this.props.y=t,this}scale(t){return this.props.scale=t,this}scaleX(t){return this.props.scaleX=t,this}scaleY(t){return this.props.scaleY=t,this}rotation(t){return this.props.rotation=t,this}opacity(t){return this.props.opacity=t,this}blur(t){return this.props.blur=t,this}fillColor(t){return this.props.fillColor=t,this}build(){return{name:this.name,selectors:this.selectors,props:this.props}}};h();var su=l.enum(["character","word","line","all"]),uu=l.enum(["center","baseline","bottom_left","bottom_center","bottom_right","top_left","top_center","top_right","custom"]),lu=l.object({grouping:su.default("character"),preset:uu.default("center"),anchorX:l.number().default(.5),anchorY:l.number().default(.5),offsetX:l.number().default(0),offsetY:l.number().default(0)}),Vd=l.object({skew:l.number().min(-90).max(90),skewAxis:l.number().default(0)}),$d=l.object({lineSpacing:l.number(),lineAnchor:l.number().min(0).max(1).default(0)}),cu=l.enum(["planar","vortex","cylinder","helix"]),Io=l.object({mode:cu.default("planar"),radius:l.number().default(300),pitch:l.number().default(120),totalAngle:l.number().default(360),axis:l.enum(["x","y","z"]).default("y"),perspective:l.number().positive().default(1200)}),Ud=l.object({translateZ:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),rotationZ:l.number().optional(),formation:Io.optional()}),mu=l.object({stiffness:l.number().positive().default(180),damping:l.number().positive().default(12),mass:l.number().positive().default(1),initialVelocity:l.number().default(0),overshootMultiplier:l.number().min(.5).max(3).default(1)}),_d=l.object({type:l.literal("expression"),name:l.string().optional(),expression:l.string(),mode:l.enum(["add","subtract","intersect","min","max","difference"]).default("add"),amount:l.number().default(1)}),du=l.object({strokeWidth:l.number().min(0).default(0),strokeColor:l.string().default("#ffffff"),strokeAlign:l.enum(["center","inside","outside"]).default("center"),fillOpacity:l.number().min(0).max(1).default(1),dashArray:l.tuple([l.number(),l.number()]).optional(),dashOffset:l.number().default(0)}),zo=l.object({direction:l.enum(["left","right","up","down"]).default("left"),velocity:l.number().default(120),loop:l.boolean().default(!0),repeatGap:l.number().default(80),snap:l.object({enabled:l.boolean().default(!1),granularity:l.enum(["character","word","line"]).default("word"),stopIndex:l.number().default(0),decelEase:l.string().default("cubic.out")}).optional()}),pu=l.object({weight:l.number().min(100).max(1e3).optional(),width:l.number().min(50).max(200).optional(),slant:l.number().min(-25).max(25).optional(),italic:l.number().min(0).max(1).optional(),opticalSize:l.number().min(6).max(144).optional()}),fu=l.object({redShiftX:l.number().default(0),redShiftY:l.number().default(0),blueShiftX:l.number().default(0),blueShiftY:l.number().default(0),sliceProbability:l.number().min(0).max(1).default(0),sliceAmplitude:l.number().default(0)}),hu=l.object({signalChannel:l.string(),minFreqHz:l.number().default(60),maxFreqHz:l.number().default(16e3),scaleAxis:l.enum(["scaleY","scaleX","scale","y"]).default("scaleY"),minScale:l.number().default(.2),maxScale:l.number().default(2.5),peakDecay:l.number().min(0).max(.99).default(.8)}),gu=l.object({angle:l.number().default(45),length:l.number().min(0).default(0),color:l.string().default("#000000"),startOpacity:l.number().min(0).max(1).default(.8),endOpacity:l.number().min(0).max(1).default(0),steps:l.number().int().min(4).max(64).default(16)}),bu=l.object({progress:l.number().min(0).max(1).default(0),dispersalAngle:l.number().default(90),maxDisplacement:l.number().default(120),turbulence:l.number().default(.5),particleSize:l.number().default(2)}),yu=l.object({x:l.number().optional(),y:l.number().optional(),translateZ:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),rotationZ:l.number().optional(),formation:Io.optional(),skew:l.number().optional(),skewAxis:l.number().optional(),tracking:l.number().optional(),lineSpacing:l.number().optional(),lineAnchor:l.number().optional(),anchor:lu.optional(),opacity:l.number().optional(),blur:l.number().optional(),fillColor:l.string().optional(),stroke:du.optional(),variableAxes:pu.optional(),chromaticGlitch:fu.optional(),longShadow:gu.optional(),particleDissolve:bu.optional(),audioSpectrum:hu.optional(),spring:mu.optional()}),jo=l.object({name:l.string().default("AdvancedAnimator"),selectors:l.array(l.record(l.string(),l.unknown())).default([]),props:yu});h();h();var zr=l.object({x:l.number(),y:l.number()}),xu=l.object({p0:zr,p1:zr,p2:zr,p3:zr}),wu=l.discriminatedUnion("type",[l.object({type:l.literal("svg"),d:l.string().min(1,"SVG path string cannot be empty")}),l.object({type:l.literal("bezier"),segments:l.array(xu).min(1)}),l.object({type:l.literal("ellipse"),cx:l.number(),cy:l.number(),rx:l.number().positive(),ry:l.number().positive(),startAngleDeg:l.number().default(0),endAngleDeg:l.number().default(360)}),l.object({type:l.literal("wave"),startX:l.number(),startY:l.number(),length:l.number().positive(),amplitude:l.number(),frequency:l.number().positive(),phaseDeg:l.number().default(0)})]),tr=l.object({path:wu,firstMargin:l.number().default(0),lastMargin:l.number().default(0),reversePath:l.boolean().default(!1),perpendicularToPath:l.boolean().default(!0),forceAlignment:l.boolean().default(!1),loop:l.boolean().default(!1),baselineOffset:l.enum(["baseline","center","ascender","descender"]).default("baseline"),baselineShift:l.number().default(0)}),vu=l.enum(["bar","underscore","block","custom"]),Su=l.object({enabled:l.boolean().default(!0),style:vu.default("bar"),customChar:l.string().default("|"),color:l.string().optional(),blinkFrequency:l.number().min(0).default(2),hideOnComplete:l.boolean().default(!1),width:l.number().positive().default(2.5),spacing:l.number().default(3)}),ku=l.discriminatedUnion("mode",[l.object({mode:l.literal("constant")}),l.object({mode:l.literal("human"),jitter:l.number().min(0).max(1).default(.35),commaPauseMultiplier:l.number().min(1).default(3),sentencePauseMultiplier:l.number().min(1).default(5.5),paragraphPauseMultiplier:l.number().min(1).default(7)})]),Pu=l.object({enabled:l.boolean().default(!1),charset:l.enum(["ascii","alphanumeric","matrix","binary","hex","custom"]).default("alphanumeric"),customCharset:l.string().optional(),scrambleFramesPerChar:l.number().int().min(1).default(8),highlightProbability:l.number().min(0).max(1).default(.25),scrambleColor:l.string().optional()}),zn=l.object({granularity:l.enum(["character","word","line"]).default("character"),cursor:Su.default({enabled:!0,style:"bar",customChar:"|",blinkFrequency:2,hideOnComplete:!1,width:2.5,spacing:3}),cadence:ku.default({mode:"human",jitter:.35,commaPauseMultiplier:3,sentencePauseMultiplier:5.5,paragraphPauseMultiplier:7}),scramble:Pu.default({enabled:!1,charset:"alphanumeric",scrambleFramesPerChar:8,highlightProbability:.25}),soundSync:l.boolean().default(!1)}),jn=l.enum(["characters","characters_excluding_spaces","words","lines"]),Mu=l.enum(["percentage","index"]),Tu=l.enum(["square","ramp_up","ramp_down","triangle","round","smooth"]),Vn=l.enum(["add","subtract","intersect","min","max","difference"]),Cu=l.object({type:l.literal("range"),start:l.number().default(0),end:l.number().default(1),offset:l.number().default(0),units:Mu.default("percentage"),basedOn:jn.default("characters"),shape:Tu.default("square"),mode:Vn.default("add"),amount:l.number().min(-1).max(1).default(1),easeHigh:l.number().min(-1).max(1).default(0),easeLow:l.number().min(-1).max(1).default(0),randomizeOrder:l.boolean().default(!1),randomSeed:l.number().int().default(12345)}),Au=l.object({type:l.literal("wiggly"),wigglesPerSecond:l.number().positive().default(2),correlation:l.number().min(0).max(1).default(.5),temporalPhaseDeg:l.number().default(0),spatialPhaseDeg:l.number().default(0),minAmount:l.number().min(-1).max(1).default(-1),maxAmount:l.number().min(-1).max(1).default(1),randomSeed:l.number().int().default(42),basedOn:jn.default("characters"),mode:Vn.default("intersect")}),Du=l.object({type:l.literal("signal"),signalId:l.string(),multiplier:l.number().default(1),offset:l.number().default(0),phaseSpread:l.number().default(0),basedOn:jn.default("characters"),mode:Vn.default("add")}),Nu=l.discriminatedUnion("type",[Cu,Au,Du]),Ou=l.object({x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),skew:l.number().optional(),skewAxis:l.number().optional(),tracking:l.number().optional(),lineSpacing:l.number().optional(),opacity:l.number().min(0).max(1).optional(),fillColor:l.string().optional(),strokeColor:l.string().optional(),strokeWidth:l.number().min(0).optional(),blur:l.number().min(0).optional(),characterOffset:l.number().int().optional()}),Ru=l.enum(["character","word","line","all"]),Fu=l.object({grouping:Ru.default("character"),anchorX:l.number().default(.5),anchorY:l.number().default(.8)}),rr=l.object({name:l.string().default("Animator"),selectors:l.array(Nu).min(1),props:Ou,anchor:Fu.default({grouping:"character",anchorX:.5,anchorY:.8})}),Gd=l.object({text:l.string(),fontFamily:l.string().default("Inter"),fontSize:l.number().positive().default(24),fontWeight:l.union([l.number(),l.string()]).default(400),fill:l.string().default("#ffffff"),letterSpacing:l.number().default(0),lineHeight:l.number().positive().default(1.2),textAlign:l.enum(["left","center","right"]).default("left"),pathOptions:tr.optional(),typewriter:zn.optional(),animators:l.array(rr).default([])});var Vo=class e{options={firstMargin:0,lastMargin:0,reversePath:!1,perpendicularToPath:!0,forceAlignment:!1,loop:!1,baselineOffset:"baseline",baselineShift:0};static fromSvg(t){let r=new e;return r.options.path={type:"svg",d:t},r}static fromBezier(t){let r=new e;return r.options.path={type:"bezier",segments:t},r}static fromCurve(t){return e.fromBezier([t])}static circularBadge(t,r,n){let i=new e;return i.options.path={type:"ellipse",cx:t,cy:r,rx:n,ry:n,startAngleDeg:0,endAngleDeg:360},i.options.loop=!0,i}static ellipse(t,r,n,i,o=0,a=360){let s=new e;return s.options.path={type:"ellipse",cx:t,cy:r,rx:n,ry:i,startAngleDeg:o,endAngleDeg:a},s.options.loop=Math.abs(a-o)>=360,s}static wave(t,r,n,i,o,a=0){let s=new e;return s.options.path={type:"wave",startX:t,startY:r,length:n,amplitude:i,frequency:o,phaseDeg:a},s}firstMargin(t){return this.options.firstMargin=t,this}lastMargin(t){return this.options.lastMargin=t,this}reversePath(t){return this.options.reversePath=t,this}perpendicularToPath(t){return this.options.perpendicularToPath=t,this}forceAlignment(t){return this.options.forceAlignment=t,this}loop(t){return this.options.loop=t,this}baselineOffset(t){return this.options.baselineOffset=t,this}baselineShift(t){return this.options.baselineShift=t,this}build(){return tr.parse(this.options)}},$o=class e{name="Animator";selectors=[];props={};anchor={grouping:"character",anchorX:.5,anchorY:.8};static create(t){let r=new e;return r.name=t,r}addRangeSelector(t){let r=t.easeHigh??0,n=Math.abs(r)>1?r/100:r,i=t.easeLow??0,o=Math.abs(i)>1?i/100:i;return this.selectors.push({type:"range",start:t.start??0,end:t.end??1,offset:t.offset??0,units:"percentage",basedOn:t.basedOn??"characters",shape:t.shape??"smooth",mode:t.mode??"add",amount:1,easeHigh:Math.max(-1,Math.min(1,n)),easeLow:Math.max(-1,Math.min(1,o)),randomizeOrder:t.randomizeOrder??!1,randomSeed:t.randomSeed??12345}),this}addWigglySelector(t){return this.selectors.push({type:"wiggly",wigglesPerSecond:t.wigglesPerSecond??2,correlation:t.correlation??.5,temporalPhaseDeg:0,spatialPhaseDeg:0,minAmount:t.minAmount??-1,maxAmount:t.maxAmount??1,randomSeed:t.randomSeed??42,basedOn:"characters",mode:t.mode??"intersect"}),this}addSignalSelector(t,r=1,n=0,i=0,o="add"){return this.selectors.push({type:"signal",signalId:t,multiplier:r,offset:i,phaseSpread:n,basedOn:"characters",mode:o}),this}x(t){return this.props.x=t,this}y(t){return this.props.y=t,this}z(t){return this.props.z=t,this}scale(t){return this.props.scale=t,this}scaleX(t){return this.props.scaleX=t,this}scaleY(t){return this.props.scaleY=t,this}rotation(t){return this.props.rotation=t,this}rotationX(t){return this.props.rotationX=t,this}rotationY(t){return this.props.rotationY=t,this}skew(t){return this.props.skew=t,this}skewAxis(t){return this.props.skewAxis=t,this}opacity(t){return this.props.opacity=t,this}blur(t){return this.props.blur=t,this}fill(t){return this.fillColor(t)}fillColor(t){return this.props.fillColor=t,this}strokeColor(t){return this.props.strokeColor=t,this}strokeWidth(t){return this.props.strokeWidth=t,this}tracking(t){return this.props.tracking=t,this}lineSpacing(t){return this.props.lineSpacing=t,this}characterOffset(t){return this.props.characterOffset=t,this}anchorGrouping(t,r=.5,n=.8){return this.anchor={grouping:t,anchorX:r,anchorY:n},this}build(){return rr.parse({name:this.name,selectors:this.selectors,props:this.props,anchor:this.anchor})}};h();h();var Bu=`
2
+ struct CameraUniforms {
3
+ viewMatrix: mat4x4<f32>,
4
+ projMatrix: mat4x4<f32>,
5
+ viewProjMatrix: mat4x4<f32>,
6
+ invViewProjMatrix: mat4x4<f32>,
7
+ cameraPos: vec3<f32>,
8
+ near: f32,
9
+ cameraDir: vec3<f32>,
10
+ far: f32,
11
+ dofParams: vec4<f32>,
12
+ screenParams: vec4<f32>,
13
+ };
14
+
15
+ struct ModelUniforms {
16
+ modelMatrix: mat4x4<f32>,
17
+ normalMatrix: mat4x4<f32>,
18
+ colorTint: vec4<f32>,
19
+ params: vec4<f32>, // opacity, borderRadius, twoSided, unused
20
+ };
21
+
22
+ struct GlassUniforms {
23
+ // 0..15: ior, roughness, f0, transmission
24
+ ior: f32,
25
+ roughness: f32,
26
+ f0: f32,
27
+ transmission: f32,
28
+ // 16..31: dispersion, envIntensity, fresnelPower, unused
29
+ dispersion: f32,
30
+ envIntensity: f32,
31
+ fresnelPower: f32,
32
+ _pad0: f32,
33
+ // 32..47: viewportWidth, viewportHeight, unused, unused
34
+ viewportWidth: f32,
35
+ viewportHeight: f32,
36
+ _pad1: f32,
37
+ _pad2: f32,
38
+ // 48..63: tint (r, g, b, a)
39
+ tintColor: vec4<f32>,
40
+ };
41
+
42
+ @group(0) @binding(0) var<uniform> camera: CameraUniforms;
43
+ @group(1) @binding(0) var<uniform> model: ModelUniforms;
44
+ @group(2) @binding(0) var<uniform> glass: GlassUniforms;
45
+ @group(3) @binding(0) var backdropSampler: sampler;
46
+ @group(3) @binding(1) var backdropTexture: texture_2d<f32>;
47
+
48
+ struct VertexInput {
49
+ @location(0) position: vec3<f32>,
50
+ @location(1) uv: vec2<f32>,
51
+ @location(2) normal: vec3<f32>,
52
+ };
53
+
54
+ struct VertexOutput {
55
+ @builtin(position) clipPos: vec4<f32>,
56
+ @location(0) worldPos: vec3<f32>,
57
+ @location(1) worldNormal: vec3<f32>,
58
+ @location(2) uv: vec2<f32>,
59
+ };
60
+
61
+ @vertex
62
+ fn vs_main(in: VertexInput) -> VertexOutput {
63
+ var out: VertexOutput;
64
+ let worldPos4 = model.modelMatrix * vec4<f32>(in.position, 1.0);
65
+ out.worldPos = worldPos4.xyz;
66
+ let normal4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
67
+ out.worldNormal = normalize(normal4.xyz);
68
+ out.uv = in.uv;
69
+ out.clipPos = camera.viewProjMatrix * worldPos4;
70
+ return out;
71
+ }
72
+
73
+ @fragment
74
+ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
75
+ let V = normalize(camera.cameraPos - in.worldPos);
76
+ var N = normalize(in.worldNormal);
77
+
78
+ // Dynamic normal flip for two-sided surfaces viewed from behind
79
+ if (dot(N, V) < 0.0) {
80
+ N = -N;
81
+ }
82
+
83
+ let NdotV = max(dot(N, V), 0.0001);
84
+
85
+ // 1. Schlick Fresnel Reflectance
86
+ let F = glass.f0 + (1.0 - glass.f0) * pow(1.0 - NdotV, max(1.0, glass.fresnelPower));
87
+
88
+ // 2. Refraction Ray Direction with Chromatic Dispersion
89
+ let ior = max(1.0, glass.ior);
90
+ let disp = max(0.0, glass.dispersion);
91
+ let eta_g = 1.0 / ior;
92
+ let eta_r = 1.0 / max(1.0, ior - disp);
93
+ let eta_b = 1.0 / (ior + disp);
94
+
95
+ let R_refl = reflect(-V, N);
96
+ let R_refr_r = refract(-V, N, eta_r);
97
+ let R_refr_g = refract(-V, N, eta_g);
98
+ let R_refr_b = refract(-V, N, eta_b);
99
+
100
+ let screenUv = in.clipPos.xy / vec2<f32>(glass.viewportWidth, glass.viewportHeight);
101
+
102
+ // 3. Screen-Space Refraction Lookup with Chromatic Aberration Offset
103
+ let refractOffsetScale = 0.035 * (1.0 - glass.roughness * 0.4);
104
+ let uv_r = clamp(screenUv + R_refr_r.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
105
+ let uv_g = clamp(screenUv + R_refr_g.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
106
+ let uv_b = clamp(screenUv + R_refr_b.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
107
+
108
+ // Roughness mip/jitter level
109
+ let mipLevel = glass.roughness * 5.0;
110
+ let sampleR = textureSampleLevel(backdropTexture, backdropSampler, uv_r, mipLevel).r;
111
+ let sampleG = textureSampleLevel(backdropTexture, backdropSampler, uv_g, mipLevel).g;
112
+ let sampleB = textureSampleLevel(backdropTexture, backdropSampler, uv_b, mipLevel).b;
113
+
114
+ let transmittedColor = vec3<f32>(sampleR, sampleG, sampleB) * glass.tintColor.rgb * model.colorTint.rgb;
115
+
116
+ // 4. Procedural Studio HDRI Environment Reflection (Warm key + cool rim highlights)
117
+ let envAngle = atan2(R_refl.z, R_refl.x);
118
+ let envElevation = R_refl.y;
119
+ let studioKey = pow(max(0.0, dot(R_refl, normalize(vec3<f32>(0.6, 0.8, -0.5)))), 32.0) * 1.5;
120
+ let studioRim = pow(max(0.0, dot(R_refl, normalize(vec3<f32>(-0.7, 0.3, 0.6)))), 16.0) * 0.8;
121
+ let ambientSky = mix(vec3<f32>(0.92, 0.94, 0.98), vec3<f32>(0.98, 0.96, 0.92), envElevation * 0.5 + 0.5);
122
+ let envColor = (ambientSky * 0.6 + vec3<f32>(1.0, 0.98, 0.95) * studioKey + vec3<f32>(0.85, 0.92, 1.0) * studioRim) * glass.envIntensity;
123
+
124
+ // 5. Energy-Conserving Blend with Premultiplied Alpha
125
+ let blendedRGB = mix(transmittedColor, envColor, F);
126
+ let alpha = clamp((F + (1.0 - glass.transmission) * 0.6) * model.params.x, 0.0, 1.0);
127
+
128
+ return vec4<f32>(blendedRGB * alpha, alpha);
129
+ }
130
+ `;var Uo=class{device;pipeline;cameraLayout;modelLayout;glassLayout;backdropLayout;modelPool;glassPool;vertexBuffer;indexBuffer;modelData=new Float32Array(40);glassData=new Float32Array(16);constructor(t,r,n="depth24plus",i){this.device=t,this.modelPool=new Yi(160,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.glassPool=new Yi(64,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let o=t.createShaderModule({label:"pbr-glass.wgsl",code:Bu});this.cameraLayout=i??t.createBindGroupLayout({label:"GlassCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=t.createBindGroupLayout({label:"GlassModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.glassLayout=t.createBindGroupLayout({label:"GlassUniformLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.backdropLayout=t.createBindGroupLayout({label:"GlassBackdropLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]});let a=t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.glassLayout,this.backdropLayout]});this.pipeline=t.createRenderPipeline({label:"PBRGlassPipeline",layout:a,vertex:{module:o,entryPoint:"vs_main",buffers:[{arrayStride:32,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"}]}]},fragment:{module:o,entryPoint:"fs_main",targets:[{format:r,blend:Ks}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"}});let s=new Float32Array([-.5,-.5,0,0,0,0,0,-1,.5,-.5,0,1,0,0,0,-1,.5,.5,0,1,1,0,0,-1,-.5,.5,0,0,1,0,0,-1]),u=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=t.createBuffer({size:s.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(s),this.vertexBuffer.unmap(),this.indexBuffer=t.createBuffer({size:u.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(u),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset(),this.glassPool.reset()}draw(t,r,n,i,o){Qs(this.modelData,o.modelMatrix,o.normalMatrix,o.colorTint),this.modelData[36]=o.opacity??1,this.modelData[37]=0,this.modelData[38]=1,this.modelData[39]=0;let a=this.modelPool.getBuffer(this.device,this.modelData);this.glassData[0]=o.ior??1.49,this.glassData[1]=o.roughness??.15,this.glassData[2]=o.f0??.04,this.glassData[3]=o.transmission??.92,this.glassData[4]=o.dispersion??.015,this.glassData[5]=o.envIntensity??.65,this.glassData[6]=o.fresnelPower??5,this.glassData[7]=0,this.glassData[8]=o.viewportWidth,this.glassData[9]=o.viewportHeight,this.glassData[10]=0,this.glassData[11]=0;let s=o.tintColor??[1,1,1,1];this.glassData[12]=s[0],this.glassData[13]=s[1],this.glassData[14]=s[2],this.glassData[15]=s[3];let u=this.glassPool.getBuffer(this.device,this.glassData),c=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:a}}]}),m=this.device.createBindGroup({layout:this.glassLayout,entries:[{binding:0,resource:{buffer:u}}]}),d=this.device.createBindGroup({layout:this.backdropLayout,entries:[{binding:0,resource:i},{binding:1,resource:n.createView()}]});t.setPipeline(this.pipeline),t.setBindGroup(0,r),t.setBindGroup(1,c),t.setBindGroup(2,m),t.setBindGroup(3,d),t.setVertexBuffer(0,this.vertexBuffer),t.setIndexBuffer(this.indexBuffer,"uint16"),t.drawIndexed(6)}destroy(){this.modelPool.destroy(),this.glassPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy()}};h();h();var Lu=`
131
+ struct MotionBlurUniforms {
132
+ shutterFraction: f32, // shutterAngle / 360.0
133
+ sampleCount: u32, // e.g. 16
134
+ maxVelocity: f32, // in pixels
135
+ tileDilation: u32,
136
+ viewportWidth: f32,
137
+ viewportHeight: f32,
138
+ depthThreshold: f32,
139
+ curveType: u32, // 0: box, 1: gaussian, 2: triangle
140
+ };
141
+
142
+ @group(0) @binding(0) var colorTexture: texture_2d<f32>;
143
+ @group(0) @binding(1) var velocityTexture: texture_2d<f32>;
144
+ @group(0) @binding(2) var depthTexture: texture_depth_2d;
145
+ @group(0) @binding(3) var colorSampler: sampler;
146
+ @group(0) @binding(4) var<uniform> u: MotionBlurUniforms;
147
+
148
+ fn computeVertexPos(vertexIndex: u32) -> vec4<f32> {
149
+ var pos = array<vec2<f32>, 4>(
150
+ vec2<f32>(-1.0, -1.0),
151
+ vec2<f32>( 1.0, -1.0),
152
+ vec2<f32>(-1.0, 1.0),
153
+ vec2<f32>( 1.0, 1.0)
154
+ );
155
+ return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
156
+ }
157
+
158
+ @vertex
159
+ fn vs(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
160
+ return computeVertexPos(vertexIndex);
161
+ }
162
+
163
+ @vertex
164
+ fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
165
+ return computeVertexPos(vertexIndex);
166
+ }
167
+
168
+ fn executeMotionBlur(pos: vec4<f32>) -> vec4<f32> {
169
+ let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
170
+ let centerDepth = textureLoad(depthTexture, vec2<i32>(pos.xy), 0);
171
+ let rawVel = textureSampleLevel(velocityTexture, colorSampler, uv, 0.0).xy;
172
+
173
+ // Scale velocity by shutter exposure fraction
174
+ var vel = rawVel * u.shutterFraction;
175
+ let speed = length(vel);
176
+
177
+ if (speed < 0.5) {
178
+ return textureSampleLevel(colorTexture, colorSampler, uv, 0.0);
179
+ }
180
+
181
+ // Clamp to configured max velocity limit
182
+ if (speed > u.maxVelocity) {
183
+ vel = (vel / speed) * u.maxVelocity;
184
+ }
185
+
186
+ let velUV = vel / vec2<f32>(u.viewportWidth, u.viewportHeight);
187
+ let halfSamples = f32(u.sampleCount) * 0.5;
188
+
189
+ var accumColor = vec4<f32>(0.0);
190
+ var totalWeight = 0.0;
191
+
192
+ for (var i = 0u; i < u.sampleCount; i = i + 1u) {
193
+ let t = (f32(i) - halfSamples) / halfSamples;
194
+ let sampleUV = uv + velUV * t;
195
+
196
+ if (sampleUV.x < 0.0 || sampleUV.x > 1.0 || sampleUV.y < 0.0 || sampleUV.y > 1.0) {
197
+ continue;
198
+ }
199
+
200
+ let sampleDepth = textureSampleLevel(depthTexture, colorSampler, sampleUV, 0);
201
+ let depthDelta = abs(sampleDepth - centerDepth);
202
+ let depthWeight = clamp(1.0 - depthDelta / max(u.depthThreshold, 0.0001), 0.05, 1.0);
203
+
204
+ var curveW = 1.0;
205
+ if (u.curveType == 1u) {
206
+ curveW = exp(-2.5 * t * t);
207
+ } else if (u.curveType == 2u) {
208
+ curveW = 1.0 - abs(t);
209
+ }
210
+
211
+ let w = curveW * depthWeight;
212
+ let sampleCol = textureSampleLevel(colorTexture, colorSampler, sampleUV, 0.0);
213
+
214
+ accumColor += sampleCol * w;
215
+ totalWeight += w;
216
+ }
217
+
218
+ if (totalWeight <= 0.0) {
219
+ return textureSampleLevel(colorTexture, colorSampler, uv, 0.0);
220
+ }
221
+
222
+ return accumColor / totalWeight;
223
+ }
224
+
225
+ @fragment
226
+ fn fs(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
227
+ return executeMotionBlur(pos);
228
+ }
229
+
230
+ @fragment
231
+ fn fs_motion_blur(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
232
+ return executeMotionBlur(pos);
233
+ }
234
+ `;var _o=class{device;pipeline;bindGroupLayout;uniformBuffer;sampler;constructor(t){this.device=t;let r=t.createShaderModule({label:"motion-blur-shader",code:Lu});this.bindGroupLayout=t.createBindGroupLayout({label:"motion-blur-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:4,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]});let n=t.createPipelineLayout({label:"motion-blur-layout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=t.createRenderPipeline({label:"motion-blur-pipeline",layout:n,vertex:{module:r,entryPoint:"vs_main"},fragment:{module:r,entryPoint:"fs_motion_blur",targets:[{format:"rgba8unorm",blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}}),this.uniformBuffer=t.createBuffer({label:"motion-blur-uniforms",size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.sampler=t.createSampler({label:"motion-blur-sampler",magFilter:"linear",minFilter:"linear"})}render(t,r,n,i,o,a){let s=(a.shutterAngle??180)/360,u=a.sampleCount??16,c=a.maxVelocity??64,m=a.depthThreshold??.05,d=a.curveType==="box"?0:a.curveType==="triangle"?2:1,p=new ArrayBuffer(32),f=new Float32Array(p),b=new Uint32Array(p);f[0]=s,b[1]=u,f[2]=c,b[3]=16,f[4]=a.width,f[5]=a.height,f[6]=m,b[7]=d,this.device.queue.writeBuffer(this.uniformBuffer,0,p);let g=this.device.createBindGroup({label:"motion-blur-bg",layout:this.bindGroupLayout,entries:[{binding:0,resource:r},{binding:1,resource:n},{binding:2,resource:i},{binding:3,resource:this.sampler},{binding:4,resource:{buffer:this.uniformBuffer}}]}),y=t.beginRenderPass({label:"motion-blur-pass",colorAttachments:[{view:o,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});y.setPipeline(this.pipeline),y.setBindGroup(0,g),y.draw(4),y.end()}destroy(){this.uniformBuffer.destroy()}};h();var Go=class{shadowDepthTexture;shadowDepthView;shadowComparisonSampler;lightViewProjMatrix;constructor(t,r=2048){this.lightViewProjMatrix=mt.identity(),this.shadowDepthTexture=t.createTexture({label:"shadow-depth-map",size:[r,r,1],format:"depth32float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.shadowDepthView=this.shadowDepthTexture.createView({label:"shadow-depth-view"}),this.shadowComparisonSampler=t.createSampler({label:"shadow-pcf-sampler",compare:"less-equal",magFilter:"linear",minFilter:"linear"})}computeDirectionalLightMatrix(t,r,n=2e3,i=10,o=4e3){let a=mt.lookAt(t,r,[0,1,0]),s=n*.5,u=mt.orthographic(-s,s,-s,s,i,o);return this.lightViewProjMatrix=mt.multiply(u,a),this.lightViewProjMatrix}destroy(){this.shadowDepthTexture.destroy()}};h();h();var Eu=`
235
+ struct SSAOUniforms {
236
+ projMatrix: mat4x4<f32>,
237
+ invProjMatrix: mat4x4<f32>,
238
+ viewMatrix: mat4x4<f32>,
239
+ radius: f32,
240
+ bias: f32,
241
+ intensity: f32,
242
+ sampleCount: u32,
243
+ viewportWidth: f32,
244
+ viewportHeight: f32,
245
+ };
246
+
247
+ @group(0) @binding(0) var depthTexture: texture_depth_2d;
248
+ @group(0) @binding(1) var normalTexture: texture_2d<f32>;
249
+ @group(0) @binding(2) var noiseTexture: texture_2d<f32>;
250
+ @group(0) @binding(3) var colorSampler: sampler;
251
+ @group(0) @binding(4) var<storage, read> kernelSamples: array<vec4<f32>>;
252
+ @group(0) @binding(5) var<uniform> u: SSAOUniforms;
253
+
254
+ @vertex
255
+ fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
256
+ var pos = array<vec2<f32>, 4>(
257
+ vec2<f32>(-1.0, -1.0),
258
+ vec2<f32>( 1.0, -1.0),
259
+ vec2<f32>(-1.0, 1.0),
260
+ vec2<f32>( 1.0, 1.0)
261
+ );
262
+ return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
263
+ }
264
+
265
+ fn reconstructViewPos(uv: vec2<f32>, depth: f32) -> vec3<f32> {
266
+ let clipPos = vec4<f32>(uv.x * 2.0 - 1.0, (1.0 - uv.y) * 2.0 - 1.0, depth, 1.0);
267
+ let viewPos = u.invProjMatrix * clipPos;
268
+ return viewPos.xyz / viewPos.w;
269
+ }
270
+
271
+ @fragment
272
+ fn fs_ssao(@builtin(position) pos: vec4<f32>) -> @location(0) f32 {
273
+ let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
274
+ let depth = textureSampleLevel(depthTexture, colorSampler, uv, 0);
275
+
276
+ if (depth >= 1.0) {
277
+ return 1.0;
278
+ }
279
+
280
+ let rawNormal = textureSampleLevel(normalTexture, colorSampler, uv, 0.0).xyz;
281
+ let normal = normalize(rawNormal * 2.0 - 1.0);
282
+ let viewPos = reconstructViewPos(uv, depth);
283
+
284
+ let noiseUV = pos.xy / 4.0;
285
+ let randomVec = normalize(textureSampleLevel(noiseTexture, colorSampler, noiseUV, 0.0).xyz * 2.0 - 1.0);
286
+
287
+ let tangent = normalize(randomVec - normal * dot(randomVec, normal));
288
+ let bitangent = cross(normal, tangent);
289
+ let TBN = mat3x3<f32>(tangent, bitangent, normal);
290
+
291
+ var occlusion = 0.0;
292
+ let count = min(u.sampleCount, arrayLength(&kernelSamples));
293
+
294
+ for (var i = 0u; i < count; i = i + 1u) {
295
+ let sampleDir = TBN * kernelSamples[i].xyz;
296
+ let samplePos = viewPos + sampleDir * u.radius;
297
+
298
+ let offset = u.projMatrix * vec4<f32>(samplePos, 1.0);
299
+ var sampleUV = vec2<f32>(
300
+ (offset.x / offset.w) * 0.5 + 0.5,
301
+ (1.0 - (offset.y / offset.w)) * 0.5
302
+ );
303
+
304
+ if (sampleUV.x < 0.0 || sampleUV.x > 1.0 || sampleUV.y < 0.0 || sampleUV.y > 1.0) {
305
+ continue;
306
+ }
307
+
308
+ let sampleDepthVal = textureSampleLevel(depthTexture, colorSampler, sampleUV, 0);
309
+ let sampleViewZ = reconstructViewPos(sampleUV, sampleDepthVal).z;
310
+
311
+ let rangeCheck = smoothstep(0.0, 1.0, u.radius / max(abs(viewPos.z - sampleViewZ), 0.001));
312
+ if (sampleViewZ >= samplePos.z + u.bias) {
313
+ occlusion += rangeCheck;
314
+ }
315
+ }
316
+
317
+ let ao = 1.0 - (occlusion / f32(max(count, 1u))) * u.intensity;
318
+ return clamp(ao, 0.0, 1.0);
319
+ }
320
+ `,Iu=`
321
+ struct BlurUniforms {
322
+ viewportWidth: f32,
323
+ viewportHeight: f32,
324
+ blurRadius: i32,
325
+ depthThreshold: f32,
326
+ };
327
+
328
+ @group(0) @binding(0) var ssaoTexture: texture_2d<f32>;
329
+ @group(0) @binding(1) var depthTexture: texture_depth_2d;
330
+ @group(0) @binding(2) var colorSampler: sampler;
331
+ @group(0) @binding(3) var<uniform> u: BlurUniforms;
332
+
333
+ @vertex
334
+ fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
335
+ var pos = array<vec2<f32>, 4>(
336
+ vec2<f32>(-1.0, -1.0),
337
+ vec2<f32>( 1.0, -1.0),
338
+ vec2<f32>(-1.0, 1.0),
339
+ vec2<f32>( 1.0, 1.0)
340
+ );
341
+ return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
342
+ }
343
+
344
+ @fragment
345
+ fn fs_blur(@builtin(position) pos: vec4<f32>) -> @location(0) f32 {
346
+ let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
347
+ let centerDepth = textureSampleLevel(depthTexture, colorSampler, uv, 0);
348
+ let centerAO = textureSampleLevel(ssaoTexture, colorSampler, uv, 0.0).r;
349
+
350
+ if (centerDepth >= 1.0) {
351
+ return 1.0;
352
+ }
353
+
354
+ var result = 0.0;
355
+ var totalWeight = 0.0;
356
+ let texelSize = 1.0 / vec2<f32>(u.viewportWidth, u.viewportHeight);
357
+ let r = u.blurRadius;
358
+
359
+ for (var x = -r; x <= r; x = x + 1) {
360
+ for (var y = -r; y <= r; y = y + 1) {
361
+ let offsetUV = uv + vec2<f32>(f32(x), f32(y)) * texelSize;
362
+ let sampleDepth = textureSampleLevel(depthTexture, colorSampler, offsetUV, 0);
363
+ let depthDelta = abs(sampleDepth - centerDepth);
364
+
365
+ let spatialW = exp(-f32(x * x + y * y) / f32(2 * r * r));
366
+ let depthW = clamp(1.0 - depthDelta / max(u.depthThreshold, 0.0001), 0.0, 1.0);
367
+ let w = spatialW * depthW;
368
+
369
+ let sampleAO = textureSampleLevel(ssaoTexture, colorSampler, offsetUV, 0.0).r;
370
+ result += sampleAO * w;
371
+ totalWeight += w;
372
+ }
373
+ }
374
+
375
+ if (totalWeight <= 0.0) {
376
+ return centerAO;
377
+ }
378
+ return result / totalWeight;
379
+ }
380
+ `;var Wo=class{device;ssaoPipeline;blurPipeline;ssaoBindGroupLayout;blurBindGroupLayout;ssaoUniformBuffer;blurUniformBuffer;kernelBuffer;noiseTexture;sampler;constructor(t){this.device=t,this.noiseTexture=t.createTexture({label:"ssao-noise-tex",size:[4,4,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});let r=new Uint8Array(64);for(let a=0;a<16;a++)r[a*4+0]=Math.floor(Math.random()*255),r[a*4+1]=Math.floor(Math.random()*255),r[a*4+2]=128,r[a*4+3]=255;t.queue.writeTexture({texture:this.noiseTexture},r,{bytesPerRow:16},[4,4,1]);let n=new Float32Array(128);for(let a=0;a<32;a++){let s=Math.random(),u=Math.random(),c=Math.acos(Math.sqrt(1-s)),m=2*Math.PI*u,d=(a+1)/32;d=.1+.9*(d*d),n[a*4+0]=Math.sin(c)*Math.cos(m)*d,n[a*4+1]=Math.sin(c)*Math.sin(m)*d,n[a*4+2]=Math.cos(c)*d,n[a*4+3]=0}this.kernelBuffer=t.createBuffer({label:"ssao-kernel-buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(this.kernelBuffer,0,n);let i=t.createShaderModule({label:"ssao-shader",code:Eu});this.ssaoBindGroupLayout=t.createBindGroupLayout({label:"ssao-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:4,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.ssaoPipeline=t.createRenderPipeline({label:"ssao-eval-pipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.ssaoBindGroupLayout]}),vertex:{module:i,entryPoint:"vs_main"},fragment:{module:i,entryPoint:"fs_ssao",targets:[{format:"r8unorm"}]},primitive:{topology:"triangle-strip"}}),this.ssaoUniformBuffer=t.createBuffer({label:"ssao-uniforms",size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let o=t.createShaderModule({label:"ssao-blur-shader",code:Iu});this.blurBindGroupLayout=t.createBindGroupLayout({label:"ssao-blur-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.blurPipeline=t.createRenderPipeline({label:"ssao-blur-pipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.blurBindGroupLayout]}),vertex:{module:o,entryPoint:"vs_main"},fragment:{module:o,entryPoint:"fs_blur",targets:[{format:"r8unorm"}]},primitive:{topology:"triangle-strip"}}),this.blurUniformBuffer=t.createBuffer({label:"ssao-blur-uniforms",size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.sampler=t.createSampler({label:"ssao-sampler",magFilter:"linear",minFilter:"linear",addressModeU:"repeat",addressModeV:"repeat"})}render(t,r,n,i,o,a){let s=a.invProjMatrix??mt.invert(a.projMatrix)??mt.identity(),u=new Float32Array(64);u.set(a.projMatrix,0),u.set(s,16),u.set(a.viewMatrix,32),u[48]=a.radius??45,u[49]=a.bias??.025,u[50]=a.intensity??1.5,new Uint32Array(u.buffer)[51]=a.kernelSamples??16,u[52]=a.width,u[53]=a.height,this.device.queue.writeBuffer(this.ssaoUniformBuffer,0,u);let c=this.device.createBindGroup({label:"ssao-eval-bg",layout:this.ssaoBindGroupLayout,entries:[{binding:0,resource:r},{binding:1,resource:n},{binding:2,resource:this.noiseTexture.createView()},{binding:3,resource:this.sampler},{binding:4,resource:{buffer:this.kernelBuffer}},{binding:5,resource:{buffer:this.ssaoUniformBuffer}}]}),m=t.beginRenderPass({label:"ssao-eval-pass",colorAttachments:[{view:i,loadOp:"clear",storeOp:"store",clearValue:{r:1,g:1,b:1,a:1}}]});m.setPipeline(this.ssaoPipeline),m.setBindGroup(0,c),m.draw(4),m.end();let d=new ArrayBuffer(32),p=new Float32Array(d),f=new Int32Array(d);p[0]=a.width,p[1]=a.height,f[2]=a.blurRadius??4,p[3]=a.depthThreshold??.05,this.device.queue.writeBuffer(this.blurUniformBuffer,0,d);let b=this.device.createBindGroup({label:"ssao-blur-bg",layout:this.blurBindGroupLayout,entries:[{binding:0,resource:i},{binding:1,resource:r},{binding:2,resource:this.sampler},{binding:3,resource:{buffer:this.blurUniformBuffer}}]}),g=t.beginRenderPass({label:"ssao-blur-pass",colorAttachments:[{view:o,loadOp:"clear",storeOp:"store",clearValue:{r:1,g:1,b:1,a:1}}]});g.setPipeline(this.blurPipeline),g.setBindGroup(0,b),g.draw(4),g.end()}destroy(){this.ssaoUniformBuffer.destroy(),this.blurUniformBuffer.destroy(),this.noiseTexture.destroy()}};h();var Wd=["background","fill","fillColor","strokeColor","borderColor","gradientEndColor","emissive","color"],zu=2e3;function Hd(e){for(let{segment:t}of Yd().segment(e))if(Ws(t)==="emoji")return!0;return!1}var ju;function Yd(){return ju??=new Intl.Segmenter(void 0,{granularity:"grapheme"}),ju}function Xd(e){let t=e.spans??[];return[e.text,...t.map(r=>r.text)].filter(r=>typeof r=="string").join("")}var Vu=3;function Ho(e){return e.animation?.tracks??[]}var $u=(e,t)=>Ho(e).some(r=>t.includes(r.prop)),qd=new Set(["box","flex","block","group"]);function Uu(e){if(e.kind==="text"||e.kind==="light"||e.kind==="camera")return!1;if(!qd.has(String(e.kind)))return!0;let t=e.background;return typeof t=="string"&&t!==""&&t!=="transparent"?!0:(e.children??[]).some(Uu)}var Zd=e=>[...e].sort((t,r)=>(Number(t.zIndex)||0)-(Number(r.zIndex)||0));function $n(e){if(typeof e!="string"||e.includes("gradient("))return null;let t=$i(e);return t&&t[3]>.99?e:null}function Yo(e,t={}){let r=[],n=(b,g,y,v)=>r.push({severity:b,code:g,message:y,...v&&{layerId:v}}),i=e.width,o=e.height,a=!1,s=[],u=!1,c=[],m=[],d=(b,g,y)=>{let v=String(b.id??"?");t.emojiFont===!1&&b.kind==="text"&&Hd(Xd(b))&&m.push(v);for(let M of Wd){let D=b[M];typeof D!="string"||D===""||D==="transparent"||(D.includes("gradient(")?Hs(D)||n("error","invalid_gradient",`\`${M}\` on '${v}' is not a gradient this renderer reads: ${D}. It draws nothing.`,v):$i(D)||n("warning","unknown_color",`\`${M}: "${D}"\` on '${v}' is not a color (hex, rgb(), hsl(), oklch() or a CSS name). It draws transparent.`,v))}if(b.kind==="light"){let M=b.lightType??"directional";M==="environment"&&(a=!0),M==="ambient"&&s.push(v),b.castShadow&&M!=="directional"&&M!=="spot"&&n("warning","shadow_unsupported_light",`'${v}' is a ${String(M)} light: only directional and spot lights cast shadows.`,v);return}if(b.kind==="camera")return;if(b.kind==="media"){let M=b.inputHandleId;typeof M=="string"&&(b.dataType??"Video")==="Image"&&(/\.(json|lottie)(\?.*)?$/i.test(M)?n("error","unsupported_image_format",`'${v}' is an image layer with source '${M}', which is a Lottie vector animation. Use Layer.lottie() instead.`,v):/\.(mp4|mov|webm|mkv)(\?.*)?$/i.test(M)?n("error","unsupported_image_format",`'${v}' is an image layer with video source '${M}'. Use Layer.video() instead.`,v):/\.(mp3|wav|ogg|m4a|aac)(\?.*)?$/i.test(M)&&n("error","unsupported_image_format",`'${v}' is an image layer with audio source '${M}'. Use Layer.audio() instead.`,v))}let T=!!b.is3D||typeof b.z=="number"&&b.z!==0;if((T||b.kind==="model3d")&&(u=!0),(b.roughness!==void 0||b.metallic!==void 0)&&c.push(v),b.kind==="text"&&g&&!$u(b,["fill","color"])){let M=$n(b.fill??b.color),D=$n(b.background)??g;if(M){let V=Ui.contrast(M,D);V<Vu&&n("warning","low_contrast_text",`Text '${v}' (${M}) on ${D} has contrast ${V.toFixed(2)}:1 (aim for \u2265 ${Vu}; ${Ui.readableOn(D)} reads well).`,v)}}if(y&&!T&&b.position==="absolute"&&typeof b.x=="number"&&typeof b.y=="number"&&typeof b.width=="number"&&typeof b.height=="number"&&!$u(b,["x","y","translateX","translateY","scale","scaleX","scaleY","rotation"])){let{x:M,y:D,width:V,height:W}=b;(M+V<=0||D+W<=0||M>=i||D>=o)&&n("warning","offscreen_layer",`'${v}' sits entirely outside the ${i}\xD7${o} canvas (x ${M}, y ${D}) and never moves in.`,v)}let C=Ho(b).reduce((M,D)=>M+(D.keyframes?.length??0),0);C>zu&&n("warning","large_animation",`'${v}' has ${C} keyframes across its tracks (over ${zu}). Keying every frame is rarely needed: key the turning points and let eases fill in, or drive the prop from a signal.`,v);for(let M of Ho(b)){let D=M.keyframes??[];(!M.source||M.source.type==="keyframe")&&D.length>=2&&D.every(V=>JSON.stringify(V.value)===JSON.stringify(D[0].value))&&n("info","static_track",`'${v}' animates \`${M.prop}\` but every keyframe holds ${JSON.stringify(D[0].value)}.`,v)}let w=$n(b.background)??g,A=b.children,S=b.x===0&&b.y===0&&b.width===i&&b.height===o;p(A??[],w,y&&S)},p=(b,g,y)=>{let v=g;for(let T of Zd(b))d(T,v,y),Uu(T)&&(v=null)},f=$n(e.backgroundColor)??null;if(p(e.layout,f,!0),m.length>0){let b=m.slice(0,3).map(g=>`'${g}'`).join(", ");n("warning","missing_emoji_font",`${m.length===1?"Text":`${m.length} text layers`} ${b}${m.length>3?", \u2026":""} ${m.length===1?"has":"have"} emoji, but no emoji font is registered, so the emoji draw nothing. Run \`npx framefields fonts add emoji\` and call the generated \`registerFonts()\`, or \`FontManager.registerEmojiFont(path)\` with a color emoji font.`,m[0])}return a&&s.length>0&&n("info","ambient_with_environment",`The environment already fills shadows with light; ambient light ${s.join(", ")} adds flat light on top (remove it, or lower it, if the scene looks washed out).`),u&&c.length>0&&!a&&n("info","pbr_without_environment",`roughness / metallic are set (${c.slice(0,3).join(", ")}${c.length>3?", \u2026":""}) but the scene has no Layer.environment(): add one for physically based shading, reflections and tone mapping.`),r}h();var _u=l.union([l.number().min(0),l.enum(["auto","fit","fill"]),l.custom()]),Kd=l.enum(["rect","circle","ellipse","polygon","star","arrow","path"]),Gu=l.union([l.instanceof(qt),l.object({op:l.string().min(1)}).passthrough(),l.custom(e=>!!(e&&typeof e=="object"&&"op"in e&&typeof e.op=="string"))]),Qd=l.enum(["x","y","scale","rotation","opacity","width","height","volume","hidden","muted","gap","padding","borderRadius","fontSize","text","fill","color","letterSpacing","d","trimStart","trimEnd","trimOffset","strokeWidth","strokeDashOffset","cornerRadius","starInnerRadiusRatio","fillColor","strokeColor","borderColor","borderWidth","motionBlurShutter","rangeStart","rangeEnd","offset","animatorRangeStart","animatorRangeEnd","animatorOffset","firstMargin","lastMargin","baselineShift","rotateX","rotateY","rotateZ","perspective","translateZ","perspectiveOriginX","perspectiveOriginY","cameraX","cameraY","cameraZ","targetX","targetY","targetZ","cameraPitch","cameraYaw","cameraRoll","cameraFov","cameraZoom","focalLength","focusDistance","fStop","maxBlurRadius","shakeTranslation","shakeRotation","orbitRadius","orbitAzimuth","orbitElevation","z","scaleZ","intensity","angle","radius","penumbra","decay","shininess","roughness","specularIntensity","ambientIntensity","metallic","ior","dispersion","transmission","fresnelPower","envIntensity","animationProgress","animationTime","animationSpeed","wireframe","scaleX","scaleY","emissive","emissiveIntensity","exposure"]),Xo=l.enum(["alpha","alpha-inverted","luma","luma-inverted"]),Wu=l.enum(["lit","unlit","toon","glass","acrylic","frosted","metallic"]);var Jd=l.enum(["interpolate","hueRotate","threshold"]),ep=l.object({name:l.enum(["none","power1","power2","power3","sine","circ","expo","back","elastic","bounce","spring","cubic","hold"]),dir:l.enum(["in","out","inOut"]),params:l.array(l.number()).optional()}).strict().superRefine((e,t)=>{if(e.name==="spring"&&e.params){let[r,n,i]=e.params;r!==void 0&&r<=0&&t.addIssue({code:l.ZodIssueCode.custom,message:"Spring damping must be greater than 0.",path:["params",0]}),n!==void 0&&n<=0&&t.addIssue({code:l.ZodIssueCode.custom,message:"Spring stiffness must be greater than 0.",path:["params",1]}),i!==void 0&&i<=0&&t.addIssue({code:l.ZodIssueCode.custom,message:"Spring mass must be greater than 0.",path:["params",2]})}}),tp=l.object({id:l.string().min(1),frame:l.number().int().min(0),value:l.union([l.number(),l.boolean(),l.string()]),ease:ep.optional(),presetGroupId:l.string().optional(),presetType:l.string().optional(),spatialTangentIn:l.object({x:l.number(),y:l.number()}).optional(),spatialTangentOut:l.object({x:l.number(),y:l.number()}).optional()}).strict(),rp=l.enum(["continuous","accumulate"]),np=l.discriminatedUnion("type",[l.object({type:l.literal("keyframe")}),l.object({type:l.literal("signal"),inputHandleId:l.string(),multiplier:l.number().default(1),offset:l.number().default(0),smoothingWindowFrames:l.number().min(0).default(0),colorMode:Jd.optional(),colorA:l.string().optional(),colorB:l.string().optional(),colorThreshold:l.number().optional(),signalMode:rp.optional(),threshold:l.number().optional(),accumulateThreshold:l.number().optional(),debounceFrames:l.number().int().min(0).optional(),channel:l.string().optional()}),l.object({type:l.literal("wiggle"),frequency:l.number().default(2),amplitude:l.number().default(50),octaves:l.number().int().min(1).max(4).default(1),seed:l.number().default(1234)}),l.object({type:l.literal("springOvershoot"),damping:l.number().default(12),stiffness:l.number().default(180),mass:l.number().default(1)})]),ip=l.preprocess(e=>{if(!e||typeof e!="object")return e;let t=e;if(t.type==="signal"){let r=typeof t.threshold=="number"?t.threshold:typeof t.accumulateThreshold=="number"?t.accumulateThreshold:.15;return{type:"signal",inputHandleId:t.inputHandleId??t.handleId,multiplier:t.multiplier??t.amplitude??1,offset:t.offset??0,smoothingWindowFrames:t.smoothingWindowFrames??t.smoothing??0,colorMode:t.colorMode,colorA:t.colorA,colorB:t.colorB,colorThreshold:t.colorThreshold,signalMode:t.signalMode??"continuous",threshold:r,accumulateThreshold:r,debounceFrames:t.debounceFrames??2,channel:typeof t.channel=="string"?t.channel:"primary"}}return e},np),op=(e,t)=>{if(e?.tracks)for(let r=0;r<e.tracks.length;r++){let n=e.tracks[r],i=n.keyframes??[];(!n.source||n.source.type==="keyframe")&&i.length<1&&t.addIssue({code:l.ZodIssueCode.custom,message:`Track for property '${n.prop}' must have at least 1 keyframe.`,path:["tracks",r,"keyframes"]});let a=n.prop==="hidden"||n.prop==="muted",s=n.prop==="fillColor"||n.prop==="strokeColor"||n.prop==="fill"||n.prop==="color";for(let u=0;u<i.length;u++){let c=i[u];if(u>0){let d=i[u-1];c.frame<d.frame?t.addIssue({code:l.ZodIssueCode.custom,message:"Keyframes must be sorted in ascending order of frame.",path:["tracks",r,"keyframes",u]}):c.frame===d.frame&&t.addIssue({code:l.ZodIssueCode.custom,message:"Duplicate keyframes at the same frame are not allowed.",path:["tracks",r,"keyframes",u]})}let m=typeof c.value;a?m!=="boolean"&&t.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for discrete property '${n.prop}' must be a boolean.`,path:["tracks",r,"keyframes",u,"value"]}):s?m!=="string"&&t.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for color property '${n.prop}' must be a string.`,path:["tracks",r,"keyframes",u,"value"]}):m!=="number"||Number.isNaN(c.value)||!Number.isFinite(c.value)?t.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for numeric property '${n.prop}' must be a finite number.`,path:["tracks",r,"keyframes",u,"value"]}):(n.prop==="volume"||n.prop==="trimStart"||n.prop==="trimEnd")&&(c.value<0||c.value>1)&&t.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for property '${n.prop}' must be between 0 and 1.`,path:["tracks",r,"keyframes",u,"value"]})}}},ap=l.object({id:l.string().min(1),prop:Qd,source:ip.optional(),keyframes:l.array(tp).default([]),repeat:l.number().int().optional(),yoyo:l.boolean().optional(),durationFrames:l.number().int().min(1).optional()}).strict(),qo=l.object({tracks:l.array(ap).max(24),frameStep:l.number().int().min(1).max(24).optional()}).strict().superRefine(op),At={id:l.string().min(1),inputHandleId:l.string().optional(),position:l.enum(["relative","absolute"]).default("relative"),x:l.union([l.number(),l.custom()]).default(0),y:l.union([l.number(),l.custom()]).default(0),width:_u.optional(),height:_u.optional(),grow:l.number().min(0).optional(),flexShrink:l.number().min(0).optional(),flexBasis:l.number().min(0).optional(),alignSelf:l.enum(["auto","start","center","end","stretch","baseline"]).optional(),aspectRatio:l.number().positive().optional(),zIndex:l.number().int().default(0),hidden:l.boolean().default(!1),opacity:l.number().min(0).max(1).default(1),blendMode:l.string().optional(),effects:l.array(Gu).optional(),rotation:l.number().default(0),scale:l.number().min(0).default(1),scaleX:l.number().default(1),scaleY:l.number().default(1),anchorX:l.number().min(0).max(1).default(.5),anchorY:l.number().min(0).max(1).default(.5),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),motionBlurShutter:l.number().min(0).max(360).optional(),rotateX:l.number().default(0),rotateY:l.number().default(0),rotateZ:l.number().default(0),perspective:l.number().min(0).default(0),perspectiveOriginX:l.number().default(.5),perspectiveOriginY:l.number().default(.5),translateZ:l.number().default(0),backfaceVisibility:l.enum(["visible","hidden"]).default("visible"),transformStyle:l.enum(["flat","preserve-3d"]).default("flat"),is3D:l.boolean().default(!1),z:l.union([l.number(),l.custom()]).default(0),scaleZ:l.number().default(1),twoSided:l.boolean().default(!0),material:Wu.default("lit"),ior:l.number().min(1).max(3).optional(),roughness:l.number().min(0).max(1).optional(),shininess:l.number().min(1).max(512).default(32),specularIntensity:l.number().min(0).default(.5),metallic:l.number().min(0).max(1).optional(),ambientIntensity:l.number().min(0).default(1),transmission:l.number().min(0).max(1).optional(),dispersion:l.number().min(0).max(1).optional(),fresnelPower:l.number().min(1).max(10).optional(),envIntensity:l.number().min(0).max(10).optional(),emissive:ue.optional(),emissiveIntensity:l.number().min(0).optional(),castShadow:l.boolean().optional(),matte:l.object({node:l.custom(e=>typeof e=="object"&&e!==null),mode:Xo.optional()}).optional(),matteId:l.string().optional(),matteOf:l.string().optional(),matteMode:Xo.optional(),animation:qo.default({tracks:[]}),vision:l.unknown().optional(),relighting:l.unknown().optional()},Hu=l.object({color:ue,offset:l.object({x:l.number(),y:l.number()}).optional(),blurRadius:l.number().min(0).optional()}).strict(),sp=l.object({x:l.number().optional(),y:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),opacity:l.number().optional(),blur:l.number().optional(),color:l.string().optional()}).strict(),Yu=l.object({id:l.string(),unit:l.enum(["character","word","line"]).default("character"),rangeStart:l.number().min(0).max(1).default(0),rangeEnd:l.number().min(0).max(1).default(1),offset:l.number().min(-1).max(1).default(0),easing:l.string().default("power2.out"),transform:sp.optional()}),up={waveRise(e={}){return{id:e.id??"wave-rise",unit:e.unit??"character",rangeStart:e.rangeStart??0,rangeEnd:e.rangeEnd??1,offset:e.offset??-1,easing:e.easing??"power2.out",transform:{y:e.y??40,rotationX:e.rotationX??45,opacity:e.opacity??0,blur:e.blur??0}}},wordPop(e={}){return{id:e.id??"word-pop",unit:"word",rangeStart:0,rangeEnd:1,offset:-1,easing:e.easing??"back.out(1.6)",transform:{scale:e.scale??0,y:e.y??20,opacity:0}}},blurIn(e={}){return{id:e.id??"blur-in",unit:e.unit??"character",rangeStart:0,rangeEnd:1,offset:-1,easing:e.easing??"power3.out",transform:{blur:e.blur??16,y:e.y??20,opacity:e.opacity??0}}},flip3D(e={}){return{id:e.id??"flip-3d",unit:e.unit??"character",rangeStart:0,rangeEnd:1,offset:-1,easing:e.easing??"back.out(1.4)",transform:{rotationX:e.rotationX??90,opacity:0}}},colorSweep(e){return{id:e.id??"color-sweep",unit:e.unit??"character",rangeStart:0,rangeEnd:.5,offset:-.5,easing:e.easing??"power2.inOut",transform:{color:e.color}}}},lp=l.object({focalLength:l.number().min(5).max(500).default(50),fov:l.number().min(5).max(160).optional(),sensorWidth:l.number().default(36),near:l.number().min(.1).default(1),far:l.number().min(10).default(5e4),zoom:l.number().min(.01).default(1)}).strict(),cp=l.object({enabled:l.boolean().default(!1),focusDistance:l.number().min(1).default(1e3),fStop:l.number().min(.5).max(64).default(2.8),maxBlurRadius:l.number().min(0).max(128).default(32),apertureBlades:l.number().int().min(0).max(12).default(0),anamorphicRatio:l.number().min(.5).max(3).default(1)}).strict(),mp=l.object({translationAmplitude:l.number().min(0).default(0),rotationAmplitude:l.number().min(0).default(0),frequency:l.number().min(.1).max(60).default(2.5),octaves:l.number().int().min(1).max(6).default(3),seed:l.number().default(42)}).strict(),Xu=l.object({id:l.string().min(1),kind:l.literal("camera"),mode:l.enum(["lookAt","free","orbit"]).default("lookAt"),x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),targetX:l.number().optional(),targetY:l.number().optional(),targetZ:l.number().optional(),pitch:l.number().default(0),yaw:l.number().default(0),roll:l.number().default(0),lens:lp.optional(),dof:cp.optional(),shake:mp.optional(),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),animation:qo.default({tracks:[]})}).strict(),qu=l.enum(["ambient","directional","point","spot","environment"]),Zu=l.enum(["studio","soft","sunset","night","neutral"]),Ku=l.enum(["neutral","agx","aces","none"]),Qu=l.object({color:ue,start:l.number().min(0),end:l.number().min(0),opacity:l.number().min(0).max(1).optional()}).strict(),Ju=l.object({intensity:l.number().min(0).max(10).optional(),threshold:l.number().min(0).max(16).optional(),knee:l.number().min(0).max(1).optional(),radius:l.number().min(1).max(8).optional()}).strict(),el=l.object({y:l.number(),color:ue.optional(),reflectivity:l.number().min(0).max(1).optional(),roughness:l.number().min(0).max(1).optional(),fadeDistance:l.number().min(0).optional(),opacity:l.number().min(0).max(1).optional()}).strict(),tl=l.object({id:l.string().min(1),kind:l.literal("light"),lightType:qu.default("directional"),color:ue.default("#ffffff"),intensity:l.number().default(1),x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),targetX:l.number().optional(),targetY:l.number().optional(),targetZ:l.number().optional(),direction:l.tuple([l.number(),l.number(),l.number()]).optional(),radius:l.number().min(0).default(1e3),decay:l.number().min(0).default(2),angle:l.number().min(0).max(180).default(45),penumbra:l.number().min(0).max(1).default(.2),castShadow:l.boolean().optional(),shadowSoftness:l.number().min(0).max(64).optional(),shadowDarkness:l.number().min(0).max(1).optional(),shadowMapSize:l.number().int().min(256).max(8192).optional(),preset:Zu.optional(),top:ue.optional(),horizon:ue.optional(),bottom:ue.optional(),softboxes:l.number().min(0).optional(),rotation:l.number().optional(),exposure:l.number().min(-16).max(16).optional(),toneMapping:Ku.optional(),fog:Qu.optional(),floor:el.optional(),bloom:l.union([l.boolean(),Ju]).optional(),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),animation:qo.default({tracks:[]})}).strict(),Zo=()=>l.array(l.lazy(()=>Ko)),rl=l.object({...At,kind:l.literal("flex"),dir:l.enum(["row","column"]).default("row"),gap:l.number().min(0).default(0),padding:l.number().min(0).default(0),justify:l.enum(["start","center","end","space-between","space-around"]).default("start"),align:l.enum(["start","center","end","stretch"]).default("start"),wrap:l.boolean().default(!1),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),background:ue.optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),dp=l.object({...At,kind:l.literal("block"),gap:l.number().min(0).default(0),padding:l.number().min(0).default(0),align:l.enum(["start","center","end","stretch"]).default("start"),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),background:ue.optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),nl=l.object({...At,kind:l.literal("box"),background:ue,borderRadius:l.number().min(0).optional(),padding:l.number().min(0).default(0),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),il=l.object({background:ue,borderRadius:l.number().min(0).optional(),paddingX:l.number().min(0).optional(),paddingY:l.number().min(0).optional()}).strict(),ol=l.object({text:l.union([l.string(),l.custom(e=>!!(e&&typeof e=="object"&&"get"in e))]),fontFamily:l.string().optional(),fontSize:l.union([l.number().positive(),l.custom(e=>!!(e&&typeof e=="object"&&"get"in e))]).optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.enum(["normal","italic"]).optional(),fill:l.union([ue,l.custom(e=>!!(e&&typeof e=="object"&&"get"in e))]).optional(),letterSpacing:l.number().optional(),baselineShift:l.number().optional(),opacity:l.union([l.number().min(0).max(1),l.custom(e=>!!(e&&typeof e=="object"&&"get"in e))]).optional(),mark:il.optional()}).strict(),pp={text:l.string().default(""),spans:l.array(ol).optional(),fontFamily:l.string().optional(),fontSize:l.number().positive().optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.string().optional(),fill:ue,align:l.enum(["start","center","end"]).optional(),direction:l.enum(["ltr","rtl","auto"]).optional(),verticalAlign:l.enum(["top","middle","bottom"]).optional(),lineHeight:l.number().positive().optional(),letterSpacing:l.number().optional(),background:ue,borderRadius:l.number().min(0).optional(),padding:l.number().min(0).optional(),stroke:ue,strokeWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),textShadow:l.string().optional(),shadows:l.array(Hu).optional(),pathOptions:tr.optional(),typewriter:zn.optional(),marquee:zo.optional(),animators:l.array(l.union([Yu,rr,jo])).optional()},al=l.object({...At,...pp,kind:l.literal("text")}).strict(),sl=l.object({...At,kind:l.literal("media"),inputHandleId:l.string().min(1),src:l.string().optional(),dataType:l.string().optional(),fit:l.enum(["cover","contain","fill","none"]).default("contain"),dpr:l.number().min(1).max(4).optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),volume:l.number().min(0).max(1).default(1),muted:l.boolean().default(!1),trimStartSec:l.number().min(0).optional(),timeRemap:Vs.optional(),fontFamily:l.string().optional(),fontSize:l.number().positive().optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.string().optional(),fill:ue,align:l.enum(["start","center","end"]).optional(),direction:l.enum(["ltr","rtl","auto"]).optional(),verticalAlign:l.enum(["top","middle","bottom"]).optional(),lineHeight:l.number().positive().optional(),letterSpacing:l.number().optional(),background:ue,padding:l.number().min(0).optional(),stroke:ue,strokeWidth:l.number().min(0).optional(),textShadow:l.string().optional(),shadows:l.array(Hu).optional(),maxWidth:l.number().optional()}).strict().superRefine((e,t)=>{if(!e.timeRemap)return;e.trimStartSec!==void 0&&t.addIssue({code:"custom",path:["timeRemap"],message:"timeRemap cannot be combined with trimStartSec"}),e.dataType!=="Video"&&e.dataType!=="Audio"&&t.addIssue({code:"custom",path:["timeRemap"],message:"timeRemap requires video or audio media"});let r=$s(e.timeRemap,e.durationFrames??0);r&&t.addIssue({code:"custom",path:["timeRemap"],message:r})}),fp={shapeType:Kd.default("rect"),borderRadius:l.number().min(0).optional(),radiusTL:l.number().min(0).optional(),radiusTR:l.number().min(0).optional(),radiusBR:l.number().min(0).optional(),radiusBL:l.number().min(0).optional(),polygonSides:l.number().int().min(3).max(64).optional(),starPoints:l.number().int().min(3).max(64).optional(),starInnerRadiusRatio:l.number().min(.01).max(.99).optional(),arrowHeadWidth:l.number().min(0).optional(),arrowHeadLength:l.number().min(0).optional(),arrowShaftWidth:l.number().min(1).optional(),d:l.string().optional(),fillType:l.enum(["solid","linear","radial","none"]).default("solid"),fillColor:ue.default("#3b82f6"),gradientEndColor:ue.optional(),gradientAngle:l.number().default(0),strokeColor:ue.default("#ffffff"),strokeWidth:l.number().min(0).default(0),strokeDashArray:l.string().optional(),strokeDashOffset:l.number().default(0),strokeLineCap:l.enum(["butt","round","square"]).default("round"),strokeLineJoin:l.enum(["miter","round","bevel"]).default("round"),strokeAlign:l.enum(["inside","center","outside"]).optional(),trimStart:l.number().min(0).max(1).default(0),trimEnd:l.number().min(0).max(1).default(1),trimOffset:l.number().default(0)},ul=l.object({...At,...fp,kind:l.literal("shape")}).strict(),hp=l.object({offset:l.number().min(0).max(1),color:l.string()}),ll=l.object({...At,kind:l.literal("model3d"),src:l.string().default(""),modelFormat:l.enum(["obj","fbx","gltf","glb","stl","ply","vox","3ds","off","auto"]).default("auto"),modelData:l.unknown().optional(),animationName:l.string().optional(),animationProgress:l.number().min(0).max(1).default(0),animationTime:l.number().min(0).default(0),animationSpeed:l.number().default(1),loop:l.boolean().default(!0),wireframe:l.boolean().default(!1),texture:l.string().optional(),center:l.boolean().optional(),normalizeSize:l.number().optional(),scaleX:l.number().default(1),scaleY:l.number().default(1),audioDeform:l.record(l.string(),l.unknown()).optional(),color:ue.optional(),colorTint:ue.optional(),text3dOptions:l.unknown().optional(),primitive3d:l.unknown().optional(),instances3d:l.unknown().optional(),swarm3d:l.unknown().optional()}).strict(),Ko=l.lazy(()=>l.discriminatedUnion("kind",[rl,dp,nl,al,sl,ul,Xu,tl,ll])),gp=l.object({width:l.number().int().min(1).max(4096),height:l.number().int().min(1).max(4096),backgroundColor:ue,volume:l.number().min(0).max(1).default(1),fps:l.number().int().min(1).max(120).default(24),mode:l.enum(["Video","Image"]).default("Video"),antialias3d:l.boolean().optional(),layout:l.array(Ko).default([]),fonts:l.array(l.string()).optional(),signals:l.record(l.string(),l.unknown()).optional(),effects:l.array(Gu).optional(),vision:l.unknown().optional(),onRequestFrame:l.custom().optional()}).strict();h();var cl=l.enum(["cut","carrierMatchCut","cameraWhip","focusPullDissolve","irisAperture","pushDirectional"]),ml=l.object({sourceLayerId:l.string(),targetLayerId:l.string(),mode:l.enum(["exact","preserveVelocity","morph"]).default("preserveVelocity"),blendFrames:l.number().int().min(0).max(30).default(0)}).strict(),dl=l.object({id:l.string(),chapter:l.enum(["hook","tension","solution","feature_spotlight","outro","custom"]).default("custom"),durationMs:l.number().positive().optional(),durationFrames:l.number().int().positive().optional(),transitionOut:l.object({type:cl.default("cut"),durationFrames:l.number().int().min(0).default(0),carrier:ml.optional(),whipDirection:l.enum(["left","right","up","down"]).default("left")}).default({type:"cut",durationFrames:0,whipDirection:"left"})}).passthrough();function bp(e,t){return{x:e.x,y:e.y,scale:e.scale,vx:e.vx,vy:e.vy,...t}}function pl(e,t=60){An(t);let r=e.map(s=>yp(s,t)),n=0,i=0,o=[];for(let[s,u]of e.entries()){let c=r[s],m=n+c;if(!Number.isSafeInteger(m))throw new Error(`Scene '${u.id}' exceeds the safe frame range`);o.push({sceneId:u.id,startFrame:n,durationFrames:c}),i=Math.max(i,m);let d=u.transitionOverlap??u.transitionOut?.durationFrames??0;if(!Number.isSafeInteger(d)||d<0)throw new Error(`Scene '${u.id}' overlap must be a nonnegative safe integer`);if(s+1<e.length&&d>Math.min(c,r[s+1]))throw new Error(`Scene '${u.id}' overlap exceeds an adjacent scene duration`);n=m-(s+1<e.length?d:0)}let a=Math.round(i/t*1e3);if(!Number.isFinite(a))throw new Error("Sequence duration exceeds the finite range");return{totalFrames:i,totalDurationMs:a,sceneOffsets:o}}function yp(e,t){if(e.durationMs!==void 0&&(!Number.isFinite(e.durationMs)||e.durationMs<=0))throw new Error(`Scene '${e.id}' durationMs must be finite and positive`);let r=e.durationFrames??(e.durationMs===void 0?60:Math.round(e.durationMs/1e3*t));if(!Number.isSafeInteger(r)||r<=0)throw new Error(`Scene '${e.id}' duration must resolve to a positive safe integer frame count`);return r}function xp(e,t,r){let n=e.startFrame??0,i=e.durationFrames??r.durationFrames-n;if(!Number.isSafeInteger(n)||n<0||!Number.isSafeInteger(i)||i<=0||n+i>r.durationFrames)throw new Error(`Scene '${t}', layer '${e.id}': window must fit within frames [0, ${r.durationFrames})`);return{...e,startFrame:r.startFrame+n,durationFrames:i}}var jr=class e{id;chapter;durationMs;durationFrames;transitionOut;layout;constructor(t){dl.parse(t),this.id=t.id,this.chapter=t.chapter??"custom",this.durationMs=t.durationMs,this.durationFrames=t.durationFrames,this.transitionOut={type:t.transitionOut?.type??"cut",durationFrames:t.transitionOut?.durationFrames??0,carrier:t.transitionOut?.carrier,whipDirection:t.transitionOut?.whipDirection??"left"},this.layout=t.layout??[]}static create(t){return new e(t)}},Qo=class e{fps;width;height;backgroundColor;fonts;signals;scenes=[];constructor(t={}){if(this.fps=t.fps??60,this.width=t.width??1920,this.height=t.height??1080,this.backgroundColor=t.backgroundColor??"#ffffff",this.fonts=t.fonts,this.signals=t.signals,t.scenes)for(let r of t.scenes)this.addScene(r)}static create(t={}){return new e(t)}addScene(t){let r=t instanceof jr?t:new jr(t);return this.scenes.push(r),this}getScenes(){return this.scenes}calculateTimeline(){return pl(this.scenes,this.fps)}toProgram(){let t=this.calculateTimeline(),r=[];for(let n=0;n<this.scenes.length;n++){let i=this.scenes[n],o=t.sceneOffsets[n];if(o)for(let a of i.layout)r.push(xp(a,i.id,o))}return{width:this.width,height:this.height,backgroundColor:this.backgroundColor,fps:this.fps,volume:1,mode:"Video",layout:r,fonts:this.fonts,signals:this.signals}}};h();var Un=e=>e<0?0:e>1?1:e,wp={none:()=>e=>e,linear:()=>e=>e,power1:()=>e=>e*e,power2:()=>e=>e*e*e,cubic:()=>e=>e*e*e,power3:()=>e=>e**4,sine:()=>e=>1-Math.cos(e*Math.PI/2),circ:()=>e=>1-Math.sqrt(Math.max(0,1-e*e)),expo:()=>e=>e===0?0:2**(10*(e-1)),back:([e=1.70158])=>t=>(e+1)*t*t*t-e*t*t,elastic:([e=1,t=.3])=>{let r=Math.max(1,e),n=t/(2*Math.PI)*Math.asin(1/r);return i=>i===0||i===1?i:-(r*2**(10*(i-1))*Math.sin((i-1-n)*(2*Math.PI)/t))},bounce:()=>e=>1-vp(1-e)};function vp(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-1.5/2.75)**2+.75:e<2.5/2.75?7.5625*(e-2.25/2.75)**2+.9375:7.5625*(e-2.625/2.75)**2+.984375}var fl=new Map;function Sp(e){if(!e)return s=>Un(s);let t=fl.get(e);if(t)return t;let r=e.trim().match(/^([a-zA-Z0-9]+)(?:\.([a-zA-Z]+))?(?:\(([^)]*)\))?$/);if(!r)throw new Error(`Unknown ease "${e}"`);let n=(r[1]??"").toLowerCase(),i=(r[2]??"out").toLowerCase(),o=(r[3]??"").split(",").map(s=>Number.parseFloat(s)).filter(s=>!Number.isNaN(s)),a;if(n==="hold")a=s=>s>=1?1:0;else{let s=wp[n];if(!s)throw new Error(`Unknown ease "${e}"`);let u=s(o);if(i==="in")a=c=>u(Un(c));else if(i==="inout")a=c=>{let m=Un(c);return m<.5?u(m*2)/2:1-u((1-m)*2)/2};else if(i==="out")a=c=>1-u(1-Un(c));else throw new Error(`Unknown ease direction in "${e}"`)}return fl.set(e,a),a}function _n(e,t){return Sp(e)(t)}var Vr=(e,t=3)=>{let r=10**t;return Math.round(e*r)/r},Jo=e=>e[e.length-1];function kp(e){let t=new Map;for(let r of e)t.set(r[0],r);return[...t.values()].sort((r,n)=>r[0]-n[0])}function Pp(e){let t=[];for(let r of e){for(;t.length>0&&Jo(t)[0]>=r[0];)t.pop();t.push(r)}return t}function f0(e,t){let r=e[0];if(!r)return 0;if(t<=r[0])return r[1];for(let n=1;n<e.length;n++){let[i,o]=e[n-1],[a,s,u]=e[n];if(t>a)continue;if(u==="hold")return t===a?s:o;let c=_n(typeof u=="string"?u:void 0,(t-i)/Math.max(1,a-i));return o+(s-o)*c}return Jo(e)[1]}var hl=class{constructor(t){this.initial=t}initial;changes=[];to(t,r,n,i="power2.out"){return this.changes.push({start:t,end:Math.max(t,r),to:n,ease:i}),this}set(t,r){return this.to(t,t,r)}keys(){let t=[[0,this.initial]],r=this.initial;for(let n of[...this.changes].sort((i,o)=>i.start-o.start)){let i=Jo(t),o=Math.max(n.start,i[0]+(n.end===n.start?1:0));o>i[0]&&t.push([o,r]);let a=Math.max(n.end,o);a===o?t[t.length-1]=[o,n.to,"hold"]:t.push([a,n.to,n.ease]),r=n.to}return Pp(t)}},gl=class{book=new Map;key(t,r,n){let i=this.book.get(t)??new Map;return this.book.set(t,i),i.set(r,[...i.get(r)??[],...n]),this}apply(){for(let[t,r]of this.book){let n=te.create();for(let[i,o]of r)n.keys(i,kp(o));t.animate(n)}}};var tt=2048,Mp=42,Tp=30,Cp=48,bl=-60;function Ap(e,t){let r=e.length;for(let n=1,i=0;n<r;n++){let o=r>>1;for(;i&o;o>>=1)i^=o;i^=o,n<i&&([e[n],e[i]]=[e[i],e[n]],[t[n],t[i]]=[t[i],t[n]])}for(let n=2;n<=r;n<<=1){let i=-2*Math.PI/n,o=Math.cos(i),a=Math.sin(i);for(let s=0;s<r;s+=n){let u=1,c=0;for(let m=0;m<n/2;m++){let d=s+m,p=d+n/2,f=e[p]*u-t[p]*c,b=e[p]*c+t[p]*u;e[p]=e[d]-f,t[p]=t[d]-b,e[d]=e[d]+f,t[d]=t[d]+b;let g=u*o-c*a;c=u*a+c*o,u=g}}}}function yl(e,t){if(e.length===0)return 0;let r=[...e].sort((n,i)=>n-i);return r[Math.min(r.length-1,Math.floor(t*r.length))]}var Gn=e=>20*Math.log10(e+1e-9),xl=e=>e<0?0:e>1?1:e;function Dp(e,t,r){return Array.from({length:e+1},(n,i)=>t*(r/t)**(i/e))}function wl(e,t,r={}){let n=r.fps??30,i=r.bands??32,o=r.minHz??50,a=Math.min(r.maxHz??12e3,t/2),s=Math.max(0,...e.map(z=>z.length)),u=new Float32Array(s);for(let z of e)for(let B=0;B<z.length;B++)u[B]=u[B]+z[B]/e.length;let c=Math.ceil(s/t*n),m=t/n,d=Float64Array.from({length:tt},(z,B)=>.5-.5*Math.cos(2*Math.PI*B/(tt-1))),p=Dp(i,o,a),f=t/tt,b=p.slice(0,-1).map((z,B)=>{let k=Math.max(1,Math.floor(z/f)),P=Math.max(k+1,Math.ceil(p[B+1]/f));return[k,Math.min(tt/2,P)]}),g=p.filter(z=>z<150).length,y=Array.from({length:i},()=>new Array(c)),v=new Array(c),T=new Array(c).fill(0),C=null,w=new Float64Array(tt),A=new Float64Array(tt);for(let z=0;z<c;z++){let k=Math.round((z+.5)*m)-tt/2;for(let I=0;I<tt;I++){let J=u[k+I];w[I]=(J??0)*d[I],A[I]=0}Ap(w,A);let P=[];b.forEach(([I,J],oe)=>{let he=0;for(let L=I;L<J;L++)he+=Math.hypot(w[L],A[L]);let le=he/(J-I)*(4/tt);y[oe][z]=le,oe<Math.max(1,g)&&P.push(le)}),C&&(T[z]=P.reduce((I,J,oe)=>I+Math.max(0,J-(C[oe]??0)),0)),C=P;let G=Math.round(z*m),Y=Math.min(s,Math.round((z+1)*m)),$=0;for(let I=G;I<Y;I++)$+=u[I]**2;v[z]=Math.sqrt($/Math.max(1,Y-G))}let S=y.map(z=>yl(z.map(Gn),.98)),M=Math.max(...S),D=y.map((z,B)=>{let k=Math.max(S[B],M-Tp,bl-20);return z.map(P=>Vr(xl(1-(k-Gn(P))/Mp)))}),V=Math.max(bl,yl(v.map(Gn),.98)),W=v.map(z=>Vr(xl(1-(V-Gn(z))/Cp)));return{fps:n,frames:c,bands:D,level:W,beats:Np(T,n)}}function Np(e,t){let r=Math.max(2,Math.round(t*.5)),n=Math.max(1,Math.round(t*.15)),i=Math.max(0,...e),o=[];for(let a=1;a<e.length;a++){let s=e[a];if(s<=i*.08||s<e[a-1]||s<(e[a+1]??0))continue;let u=e.slice(Math.max(0,a-r),a+r+1),c=u.reduce((p,f)=>p+f,0)/u.length,m=Math.sqrt(u.reduce((p,f)=>p+(f-c)**2,0)/u.length);if(s<c+1.5*m)continue;let d=o[o.length-1];d!==void 0&&a-d<n||o.push(a)}return o}function x0(e,t){let r=e.length;if(r===0)return[];let n=e[0]?.length??0;return Array.from({length:t},(i,o)=>{let a=Math.floor(o*r/t),s=Math.max(a+1,Math.floor((o+1)*r/t));return Array.from({length:n},(u,c)=>{let m=0;for(let d=a;d<s;d++)m+=e[d][c]??0;return Vr(m/(s-a))})})}function w0(e,t){if(t<=0)return[...e];let r=1/(t+1),n=0;return e.map(i=>(n=i>=n?i:n+(i-n)*r,Vr(n)))}function v0(){return l.object({fps:l.number().positive(),frames:l.number().int().min(0),bands:l.array(l.array(l.number())),level:l.array(l.number()),beats:l.array(l.number().int())})}h();function vl(e,t=0,r={}){let n=r.tolerance??.25;if(e.length===0)return[];if(e.length===1)return[[t,e[0]]];let i=new Uint8Array(e.length);i[0]=1,i[e.length-1]=1;let o=[[0,e.length-1]];for(;o.length>0;){let[s,u]=o.pop(),c=e[s],m=e[u],d=-1,p=n;for(let f=s+1;f<u;f++){let b=(f-s)/(u-s),g=Math.abs(e[f]-(c+(m-c)*b));g>p&&(p=g,d=f)}d!==-1&&(i[d]=1,o.push([s,d],[d,u]))}let a=[];for(let s=0;s<e.length;s++)i[s]&&a.push([t+s,e[s]]);return a}function P0(e,t,r,n){let i=[];for(let o=t;o<=r;o++)i.push(e(o));return vl(i,t,n)}function Wn(e,{stiffness:t=170,damping:r=26,mass:n=1}={}){if(e<=0)return 0;let i=Math.sqrt(t/n),o=r/(2*Math.sqrt(t*n));if(o<1){let m=i*Math.sqrt(1-o*o);return 1-Math.exp(-o*i*e)*(Math.cos(m*e)+o*i/m*Math.sin(m*e))}if(o===1)return 1-Math.exp(-i*e)*(1+i*e);let a=-i*(o-Math.sqrt(o*o-1)),s=-i*(o+Math.sqrt(o*o-1)),u=a/(a-s);return 1-((1-u)*Math.exp(a*e)+u*Math.exp(s*e))}function Op(e,t,r=.001,n=600){let i=0;for(let o=0;o<=n;o++)Math.abs(1-Wn(o/e,t))>r&&(i=o);return Math.min(n,i+1)}function M0(e,t,r,n,i,o=Math.max(1e-4,Math.abs(r-t)*.002)){let a=Op(n,i),s=Array.from({length:a+1},(u,c)=>c===a?r:t+(r-t)*Wn(c/n,i));return vl(s,e,{tolerance:o})}function T0(e,t,r,n,i={stiffness:230,damping:24}){let o=[...e].sort((d,p)=>d[0]-p[0]),a=new Array(r+1),s=t,u=t,c=0,m=0;for(let d=0;d<=r;d++){for(;m<o.length&&o[m][0]<=d;)s=s+(u-s)*Wn((d-c)/n,i),u=o[m][1],c=o[m][0],m++;a[d]=s+(u-s)*Wn((d-c)/n,i)}return a}h();var Rp={white:[255,255,255,1],black:[0,0,0,1],transparent:[0,0,0,0]};function $r(e){let t=e.trim().toLowerCase(),r=Rp[t];if(r)return[...r];let n=t.match(/^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/);if(n?.[1]){let o=n[1].length<=4?[...n[1]].map(s=>s+s).join(""):n[1],a=s=>Number.parseInt(o.slice(s,s+2),16);return[a(0),a(2),a(4),o.length===8?a(6)/255:1]}let i=t.match(/^rgba?\(([^)]*)\)$/);if(i?.[1]){let o=i[1].split(/[\s,/]+/).filter(Boolean);if(o.length!==3&&o.length!==4)return null;let a=(d,p)=>d.endsWith("%")?Number.parseFloat(d)/100*p:Number(d),[s,u,c]=o.slice(0,3).map(d=>a(d,255)),m=o[3]===void 0?1:a(o[3],1);return[s,u,c,m].some(d=>d===void 0||Number.isNaN(d))?null:[s,u,c,m]}return null}var ta=([e,t,r,n])=>`rgba(${Math.round(e)},${Math.round(t)},${Math.round(r)},${+n.toFixed(3)})`;function D0(e,t){let r=$r(e);return r?ta([r[0],r[1],r[2],t]):e}function N0(e){let t=$r(e);return ta(t?[t[0],t[1],t[2],0]:[0,0,0,0])}function Sl(e,t,r){let n=$r(e),i=$r(t);if(!n||!i)return e;let o=n.map((a,s)=>a+(i[s]-a)*r);return o[3]<1?ta(o):`#${o.slice(0,3).map(a=>Math.round(a).toString(16).padStart(2,"0")).join("")}`}function ea(e){let t=$r(e);if(!t)return null;let r=n=>{let i=n/255;return i<=.03928?i/12.92:((i+.055)/1.055)**2.4};return .2126*r(t[0])+.7152*r(t[1])+.0722*r(t[2])}function Hn(e,t){let r=ea(e),n=ea(t);if(r===null||n===null)return null;let[i,o]=r>n?[r,n]:[n,r];return(i+.05)/(o+.05)}function kl(e){return(ea(e)??0)>.179}function O0(e,t="#ffffff",r="#0b0c0e"){return(Hn(t,e)??0)>=(Hn(r,e)??0)?t:r}h();h();h();h();function ra(e){let t=e>>>0,r=()=>{t=t+2654435769>>>0;let n=t;return n=Math.imul(n^n>>>16,2246822507)>>>0,n=Math.imul(n^n>>>13,3266489909)>>>0,n=(n^n>>>16)>>>0,n/4294967296};return{next:r,range:(n,i)=>n+(i-n)*r(),int:(n,i)=>n+Math.floor(r()*(i-n+1)),pick:n=>{if(n.length===0)throw new Error("rng.pick: empty list");return n[Math.floor(r()*n.length)]},spread:n=>(r()*2-1)*n}}function Fp(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t>>>0}function Ur(e,t){return ra((Math.imul(e>>>0,2654435761)^Fp(String(t)))>>>0)}function I0(e,t){return na(t),Math.round(e*t)}function z0(e,t){return na(t),e/t}function j0(e,t){return Math.round(e*t)}function V0(e,t){return!t||t<=0?Math.round(e):Math.round(Math.round(e/t)*t)}function Yn(e,t){return na(t),Math.max(1,Math.round(e*t/30))}function $0(e,t,r="forward",n=1){return e<=0?[]:Bp(e,r,n).map(o=>Math.round(o*t))}function Bp(e,t,r=1){let n=Array.from({length:e},(o,a)=>a),i=(e-1)/2;switch(t){case"forward":return n;case"reverse":return n.map(o=>e-1-o);case"center":return n.map(o=>Math.abs(o-i));case"edges":return n.map(o=>i-Math.abs(o-i));case"random":{let o=ra(r),a=[...n];for(let u=a.length-1;u>0;u--){let c=Math.floor(o.next()*(u+1));[a[u],a[c]]=[a[c],a[u]]}let s=new Array(e);return a.forEach((u,c)=>{s[u]=c}),s}}}var Lp=(e,t)=>({start:e,end:e+Math.max(0,t)}),U0=(e,t)=>e>=t.start&&e<=t.end;function _0(e){if(e.length===0)return{start:0,end:0};let t=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let n of e)t=Math.min(t,n.start),r=Math.max(r,n.end);return{start:t,end:r}}function G0(e,t=0,r=0){let n=[],i=t;for(let o of e)n.push(Lp(i,o)),i+=o+r;return n}function na(e){if(!(e>0)||!Number.isFinite(e))throw new Error(`fps must be a positive number, got ${e}`)}var _r=["none","fade","rise","drop","scale","pop","slide-left","slide-right","slide-up","slide-down","tilt","mask-up","mask-down","mask-left","mask-right"];function ia(e,t,r,n=30){if(e===!1||e===void 0)return null;let i=typeof e=="string"?{preset:e}:e;if(i.preset==="none")return null;if(!_r.includes(i.preset))throw new Error(`Unknown motion preset "${i.preset}". Use one of: ${_r.join(", ")}.`);return{preset:i.preset,duration:Math.max(1,Math.round(i.duration??Yn(r.motion.speed.base,n))),ease:i.ease??(i.preset==="pop"?r.motion.ease.snap:t==="enter"?r.motion.ease.enter:r.motion.ease.exit),distance:i.distance??(i.preset.startsWith("slide-")?120:40)*r.scale,delay:Math.max(0,Math.round(i.delay??0)),blur:Ep(i.blur??i.preset.startsWith("slide-"))}}var Ep=e=>e===!0?90:e===!1?0:Math.max(0,Math.min(360,e)),Pl=e=>e.preset.startsWith("mask-");function Ml(e,t){switch(e.preset){case"mask-up":return[0,t?.height??e.distance];case"mask-down":return[0,-(t?.height??e.distance)];case"mask-left":return[t?.width??e.distance,0];case"mask-right":return[-(t?.width??e.distance),0];case"rise":case"slide-up":return[0,e.distance];case"drop":case"slide-down":return[0,-e.distance];case"slide-left":return[e.distance,0];case"slide-right":return[-e.distance,0];default:return[0,0]}}function Tl(e,t=0,r){let n=t+e.delay,i=n+e.duration,o=te.create();Pl(e)||o.keys("opacity",[[n,0],[i,1,e.ease]]);let[a,s]=Ml(e,r);return a!==0&&o.keys("x",[[n,a],[i,0,e.ease]]),s!==0&&o.keys("y",[[n,s],[i,0,e.ease]]),e.preset==="scale"&&o.keys("scale",[[n,.92],[i,1,e.ease]]),e.preset==="pop"&&o.keys("scale",[[n,.6],[i,1,e.ease]]),e.preset==="tilt"&&(o.keys("perspective",[[n,1200]]),o.keys("rotateX",[[n,28],[i,0,e.ease]]),o.keys("translateZ",[[n,-160],[i,0,e.ease]])),o}function Cl(e,t,r){let n=t-e.delay,i=Math.max(0,n-e.duration),o=te.create();Pl(e)||o.keys("opacity",[[i,1],[n,0,e.ease]]);let[a,s]=Ml(e,r);return a!==0&&o.keys("x",[[i,0],[n,-a,e.ease]]),s!==0&&o.keys("y",[[i,0],[n,-s,e.ease]]),e.preset==="scale"&&o.keys("scale",[[i,1],[n,.92,e.ease]]),e.preset==="pop"&&o.keys("scale",[[i,1],[n,.6,e.ease]]),e.preset==="tilt"&&(o.keys("perspective",[[i,1200]]),o.keys("rotateX",[[i,0],[n,-28,e.ease]]),o.keys("translateZ",[[i,0],[n,-160,e.ease]])),o}h();var Xn={ease:{enter:"expo.out",exit:"power2.in",move:"power3.inOut",snap:"back.out(1.6)"},speed:{fast:8,base:16,slow:30},spring:{settle:{stiffness:230,damping:24},base:{stiffness:260,damping:20},pop:{stiffness:320,damping:14}}},oa={regular:400,medium:500,semibold:600,bold:700,heavy:800},ua={low:{opacity:.32,distance:3,size:10,edge:.07},mid:{opacity:.4,distance:10,size:30,edge:.08},high:{opacity:.5,distance:22,size:60,edge:.1}},Al={low:{opacity:.1,distance:2,size:8,edge:0},mid:{opacity:.14,distance:8,size:26,edge:0},high:{opacity:.2,distance:18,size:54,edge:0}},aa={radius:{sm:6,md:12,lg:24,pill:999},stroke:{hair:1,base:2,bold:4}},sa={display:"Inter",body:"Inter",mono:"JetBrains Mono"},Dl={graphite:{mode:"dark",color:{bg:"#0d0e11",surface:"#16181d",raised:"#1f2229",line:"#2b2f38",ink:"#f3f4f6",muted:"#8b909c",accent:"#5b8cff",accent2:"#b07cff",positive:"#3ecf8e",negative:"#ff5c5c",highlight:"#ffd23f",shadow:"#000000"},font:sa,weight:oa,...aa,elevation:ua,motion:Xn,scale:1},paper:{mode:"light",color:{bg:"#f4f1ea",surface:"#fffdf8",raised:"#ffffff",line:"#dcd6c8",ink:"#1a1814",muted:"#6b665c",accent:"#e0451f",accent2:"#1f5fe0",positive:"#1f8a4c",negative:"#c8282d",highlight:"#ffe066",shadow:"#3b2f1e"},font:sa,weight:oa,...aa,elevation:Al,motion:Xn,scale:1},signal:{mode:"dark",color:{bg:"#000000",surface:"#111111",raised:"#1c1c1c",line:"#333333",ink:"#ffffff",muted:"#a3a3a3",accent:"#c6ff00",accent2:"#ff2e88",positive:"#00e676",negative:"#ff1744",highlight:"#c6ff00",shadow:"#000000"},font:sa,weight:oa,...aa,elevation:ua,motion:{...Xn,ease:{...Xn.ease,enter:"back.out(1.8)"},speed:{fast:6,base:12,slow:24},spring:{settle:{stiffness:300,damping:26},base:{stiffness:340,damping:22},pop:{stiffness:400,damping:14}}},scale:1}};function Gr(e={},t=Dl.graphite){let r=Nl(t,e);e.mode===void 0&&e.color?.bg!==void 0&&(r.mode=kl(r.color.bg)?"light":"dark",e.elevation===void 0&&(r.elevation=r.mode==="light"?Al:ua));let n=Hn(r.color.ink,r.color.surface);if(n!==null&&n<4.5)throw new Error(`Theme contrast too low: ink ${r.color.ink} on surface ${r.color.surface} is ${n.toFixed(2)}:1 (needs 4.5:1).`);return r}function J0(e,t,r=30){return Yn(e.motion.speed[t],r)}function Nl(e,t){if(t===void 0)return e;if(e===null||t===null||typeof e!="object"||typeof t!="object"||Array.isArray(e)||Array.isArray(t))return t;let r={...e};for(let[n,i]of Object.entries(t))r[n]=Nl(r[n],i);return r}function Ip(e,t){let r={};for(let[n,i]of Object.entries(e))r[n]=i.map(o=>{let a={...o,frame:o.frame+t};return typeof o.end=="number"&&(a.end=o.end+t),a});return r}function zp(e,{rest:t=0,peak:r=1,attack:n=0,release:i=8,ease:o="power2.out"}={}){let a=e.map(u=>typeof u=="number"?u:u.frame).sort((u,c)=>u-c),s=new Map;for(let u of a){let c=Math.max(0,u-n);s.has(c)||s.set(c,[c,t]),s.set(u,[u,r]),s.set(u+i,[u+i,t,o])}return[...s.values()].sort((u,c)=>u[0]-c[0])}var jp=()=>l.custom(e=>typeof e=="function",{message:"Expected a function"});function Ol(){return l.union([l.enum(_r),l.object({preset:l.enum(_r),duration:l.number().int().positive().optional(),ease:l.string().optional(),distance:l.number().optional(),delay:l.number().int().min(0).optional(),blur:l.union([l.boolean(),l.number().min(0).max(360)]).optional()})])}var Rl;function Vp(){return Rl??=$p(),Rl}function $p(){return l.object({id:l.string().min(1).optional(),at:l.number().int().min(0).optional(),duration:l.number().int().positive().optional(),hold:l.number().int().min(0).optional(),enter:l.union([Ol(),l.literal(!1)]).optional(),exit:l.union([Ol(),l.literal(!1)]).optional(),x:l.number().optional(),y:l.number().optional(),width:l.number().positive().optional(),height:l.number().positive().optional(),position:l.enum(["absolute","relative"]).optional(),theme:l.custom(e=>typeof e=="object"&&e!==null).optional(),seed:l.number().int().optional(),fps:l.number().positive().optional(),canvas:l.object({width:l.number().positive(),height:l.number().positive()}).strict().optional(),customize:jp().optional()})}function ax(e){return e}function Up(e){let t=e.theme?Gr(e.theme):void 0;return r=>n=>r({...e,...n,theme:n.theme&&t?Gr(n.theme,t):n.theme??t})}function _p(e,t=0){if(!Number.isFinite(e.span.end))throw new Error("after(): this component is open-ended (it stays until its parent ends). Give it a `duration`, or use its cues.");return e.span.end+t}var Gp=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();function Fl(e,t){let r;return n=>{r??=Vp().extend(t.props()).strict();let i=r.safeParse(n??{});if(!i.success){let o=Object.keys(r.shape),a=i.error.issues.map(u=>{let c=u.path.join(".")||"(props)",m=u.code==="unrecognized_keys"&&u.path.length===0?Wp(u.keys,o):"";return` - ${c}: ${u.message}${m}`}).join(`
381
+ `),s=typeof n?.id=="string"?`${t.name}#${n.id}`:t.name;throw new Error(`${s}: invalid props
382
+ ${a}`)}return Yp(e,t,i.data)}}function Wp(e,t){let r=e.flatMap(n=>{let i,o=3;for(let a of t){let s=Hp(n.toLowerCase(),a.toLowerCase());s<o&&([i,o]=[a,s])}return i?[`"${n}" \u2192 "${i}"`]:[]});return r.length>0?` (did you mean ${r.join(", ")}?)`:""}function Hp(e,t){let r=Array.from({length:t.length+1},(n,i)=>i);for(let n=1;n<=e.length;n++){let i=[n];for(let o=1;o<=t.length;o++)i[o]=Math.min(r[o]+1,i[o-1]+1,r[o-1]+(e[n-1]===t[o-1]?0:1));r=i}return r[t.length]}function Yp(e,t,r){let n=Gr(r.theme??{}),i=r.fps??30,o=r.seed??1,a=r.id??e.autoId(Gp(t.name)),s=t.defaults??{},u=r.hold??s.hold??0,c={host:e,theme:n,fps:i,seed:o,id:a,partId:k=>`${a}-${k}`,rng:k=>Ur(o,k),requested:{width:r.width,height:r.height,duration:r.duration,at:r.at??0},hold:u,canvas:r.canvas??{width:1920*n.scale,height:1080*n.scale}},m=t.build(c,r),d=ia(r.enter===void 0?s.enter:r.enter,"enter",n,i),p=ia(r.exit===void 0?s.exit:r.exit,"exit",n,i),f=m.duration===null||m.openEnded===!0&&!p&&!m.afterHold,b=r.duration??(f||m.duration===null?null:Math.max(1,m.duration+u+(m.afterHold??0)+(p?p.duration+p.delay:0)));if(b===null&&p)throw new Error(`${t.name}: an exit needs a known end. Give \`duration\`, or drop \`exit\`.`);let g=r.width??m.width,y=r.height??m.height,v=Math.max(d?.blur??0,p?.blur??0),T=d?.preset.startsWith("mask-")||p?.preset.startsWith("mask-"),C=e.box({id:c.partId("stage"),position:"absolute",x:0,y:0,width:g,height:y,overflow:"visible",...v>0&&{motionBlurShutter:v},children:m.children}),w={width:g,height:y};d&&C.animate(Tl(d,0,w)),p&&b!==null&&C.animate(Cl(p,b,w));let A=r.x===void 0&&r.y===void 0&&!r.position?m.origin:void 0,S=r.x!==void 0||r.y!==void 0||A!==void 0,M=r.x??A?.[0]??0,D=r.y??A?.[1]??0,V=e.box({id:a,...S?{position:"absolute",x:M,y:D}:r.position?{position:r.position}:{},width:g,height:y,overflow:T?"hidden":"visible",startFrame:r.at??0,...b!==null&&{durationFrames:b},children:[C]}),W={...m.parts,root:V,stage:C};r.customize?.(W),la(V);let z=r.at??0,B=Ip(m.cues,z);if(Object.defineProperties(V,{cues:{value:B,enumerable:!1},span:{value:{start:z,end:b===null?Number.POSITIVE_INFINITY:z+b,duration:b??Number.POSITIVE_INFINITY},enumerable:!1},part:{value:k=>W[k],enumerable:!1},partNames:{value:Object.keys(W),enumerable:!1}}),m.api){let k=m.api({x:S?M:0,y:S?D:0,width:g,height:y,absolute:S,start:z});for(let[P,G]of Object.entries(k))Object.defineProperty(V,P,{value:G,enumerable:!1})}return V}function la(e){let t=e;for(let r of t.animation?.tracks??[]){let n=r.keyframes?.[0];!n||n.frame<=0||r.repeat||r.keyframes?.unshift({id:`${n.id}-hold`,frame:0,value:n.value})}for(let r of t.children??[])la(r);t.matte?.node&&la(t.matte.node)}h();h();var Bl=(e,t)=>Math.hypot(t[0]-e[0],t[1]-e[1]),Ll=(e,t,r)=>[e[0]+(t[0]-e[0])*r,e[1]+(t[1]-e[1])*r];function El(e,t=16){if(e.length<2)return e.map(n=>[n[0],n[1]]);let r=[[e[0][0],e[0][1]]];for(let n=0;n<e.length-1;n++){let i=e[Math.max(0,n-1)],o=e[n],a=e[n+1],s=e[Math.min(e.length-1,n+2)];for(let u=1;u<=t;u++)r.push(Xp(i,o,a,s,u/t))}return r}function Xp(e,t,r,n,i){let o=(v,T)=>Math.max(1e-6,Math.sqrt(Bl(v,T))),s=0+o(e,t),u=s+o(t,r),c=u+o(r,n),m=s+(u-s)*i,d=(v,T,C,w)=>w===C?v:Ll(v,T,(m-C)/(w-C)),p=d(e,t,0,s),f=d(t,r,s,u),b=d(r,n,u,c),g=d(p,f,0,u),y=d(f,b,s,c);return d(g,y,s,u)}function lx(e){if(e.length===0)throw new Error("arcPath: no points");let t=[0];for(let i=1;i<e.length;i++)t.push(t[i-1]+Bl(e[i-1],e[i]));let r=t[t.length-1],n=i=>{if(e.length===1||r===0)return[0,0];let o=Math.min(1,Math.max(0,i))*r,a=0,s=t.length-1;for(;s-a>1;){let c=a+s>>1;t[c]<=o?a=c:s=c}let u=t[s]-t[a];return[a,u>0?(o-t[a])/u:0]};return{points:e,length:r,at(i){let[o,a]=n(i);return e.length===1?[e[0][0],e[0][1]]:Ll(e[o],e[Math.min(o+1,e.length-1)],a)},angleAt(i){let[o]=n(i),a=e[Math.min(o,e.length-2)]??e[0],s=e[Math.min(o+1,e.length-1)];return Math.atan2(s[1]-a[1],s[0]-a[0])}}}function rt(e,t=!1){if(e.length===0)return"";let r=a=>Math.round(a*100)/100,[n,...i]=e,o=[`M${r(n[0])} ${r(n[1])}`];for(let a of i)o.push(`L${r(a[0])} ${r(a[1])}`);return t&&o.push("Z"),o.join(" ")}function cx(e,t,r=0,n=0){let i=c=>Math.round(c*1e3)/1e3,o=e.match(/[a-zA-Z]|[-+]?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi)??[],a=[],s="",u=0;for(let c of o){if(/^[a-zA-Z]$/.test(c)){s=c,u=0,a.push(s);continue}let m=Number(c),d=s.toUpperCase(),p=s!==d;if(d==="A"){let f=u%7;u++,f===2||f===3||f===4?a.push(String(m)):f<2||p?a.push(String(i(m*t))):a.push(String(i(m*t+(f===5?r:n))));continue}p?a.push(String(i(m*t))):d==="H"?a.push(String(i(m*t+r))):d==="V"?a.push(String(i(m*t+n))):(a.push(String(i(m*t+(u%2===0?r:n)))),u++)}return a.join(" ").replace(/ ?([a-zA-Z]) ?/g,"$1")}function hx(e,t,r="power2.inOut"){return[[e,0],[e+Math.max(1,t),1,r]]}function Wr(e,{wobble:t=0,seed:r=1}={},n=0){if(t<=0||e.length===0)return e.map(c=>[c[0],c[1]]);let i=Ur(r,`wobble:${n}`),o=Math.max(2,Math.min(8,Math.ceil(e.length/6))),a=Array.from({length:o},()=>i.spread(t)),s=Array.from({length:o},()=>i.spread(t)),u=(c,m)=>{let d=m*(c.length-1),p=Math.min(c.length-2,Math.floor(d)),f=d-p,b=f*f*(3-2*f);return c[p]*(1-b)+c[p+1]*b};return e.map((c,m)=>{let d=e.length===1?0:m/(e.length-1);return[c[0]+u(a,d),c[1]+u(s,d)]})}function gx(e,{padding:t=0,wobble:r=0,seed:n=1}={},i=0){let o=e.x+e.width/2,a=e.y+e.height/2,s=e.width/2+t,u=e.height/2+t,c=Ur(n,`ellipse:${i}`),m=r>0?-Math.PI*.6+c.spread(.3):0,d=r>0?Math.PI*2*1.08:Math.PI*2,p=64,f=[];for(let b=0;b<=p;b++){let g=m+d*b/p,y=r>0?1+(b/p-.5)*.06:1;f.push([o+Math.cos(g)*s*y,a+Math.sin(g)*u*y])}return rt(Wr(f,{wobble:r,seed:n},i),r<=0)}function bx(e,{padding:t=0,wobble:r=0,seed:n=1}={},i=0){let o=e.x-t,a=e.y-t,s=e.x+e.width+t,u=e.y+e.height+t,c=[[o,a],[s,a],[s,u],[o,u],[o,a]];if(r<=0)return rt(c.slice(0,4),!0);let m=s-o,d=[[o+m*.06,a]];for(let p=0;p<4;p++){let f=c[p],b=c[p+1];for(let g=1;g<=8;g++){let y=g/8;p===0&&f[0]+(b[0]-f[0])*y<o+m*.06||d.push([f[0]+(b[0]-f[0])*y,f[1]+(b[1]-f[1])*y])}}return d.push([o+m*.14,a+(u-a)*.01]),rt(Wr(d,{wobble:r,seed:n},i))}function yx(e,t,{wobble:r=0,seed:n=1}={},i=0){let o=r>0?16:1,a=[];for(let s=0;s<=o;s++){let u=s/o;a.push([e[0]+(t[0]-e[0])*u,e[1]+(t[1]-e[1])*u])}return rt(Wr(a,{wobble:r,seed:n},i))}function xx(e,t,{amplitude:r=6,waves:n,wobble:i=0,seed:o=1}={},a=0){let s=Math.hypot(t[0]-e[0],t[1]-e[1]),u=n??Math.max(2,Math.round(s/28)),c=Math.atan2(t[1]-e[1],t[0]-e[0]),m=-Math.sin(c),d=Math.cos(c),p=u*8,f=[];for(let b=0;b<=p;b++){let g=b/p,y=Math.sin(g*u*Math.PI*2)*r;f.push([e[0]+(t[0]-e[0])*g+m*y,e[1]+(t[1]-e[1])*g+d*y])}return rt(Wr(f,{wobble:i,seed:o},a))}function wx(e,t,{curve:r="arc",headSize:n=18,wobble:i=0,seed:o=1}={},a=0){let s=t[0]-e[0],u=t[1]-e[1],c=Math.hypot(s,u)||1,m=-u/c,d=s/c,p=r==="straight"?0:r==="arc"?.18:.35,f=r==="swoop"?[e,[e[0]+s*.3+m*c*p,e[1]+u*.3+d*c*p],[e[0]+s*.75-m*c*p*.4,e[1]+u*.75-d*c*p*.4],t]:[e,[e[0]+s*.5+m*c*p,e[1]+u*.5+d*c*p],t],b=p===0?[e,t]:El(f,12),g=Wr(b,{wobble:i,seed:o},a),y=g[g.length-2]??e,v=Math.atan2(t[1]-y[1],t[0]-y[0]),T=A=>[t[0]-Math.cos(v+A*.5)*n,t[1]-Math.sin(v+A*.5)*n],C=T(1),w=T(-1);return{shaft:rt(g),head:`${rt([C,t])} ${rt([t,w]).replace(/^M/,"L")}`}}function vx(e,{start:t,end:r,every:n,variants:i=3}){let o=Array.from({length:Math.max(1,i)},(u,c)=>e(c));if(n<=0||o.length===1)return[[t,o[0]]];let a=[],s=0;for(let u=t;u<=r;u+=n)a.push([u,o[s%o.length],"hold"]),s++;return a}h();var qn={char:"textIndex",word:"wordIndex",line:"lineIndex"},qp=e=>String(Math.round(e*1e4)/1e4),pt=e=>`[${e.map(qp).join(",")}]`;function Mx(e,t,r,n){let i=Math.max(1,Math.round(t.duration)),o=Array.from({length:i+1},(m,d)=>_n(t.ease,d/i)),a=qn[e],s=m=>`(${m}[${a}]??${m}[${m}.length-1])`,u=r==="enter"?"1-v":"v",c=n?`(${u})*${s("F")}`:u;return["((S,L,F)=>{",`const t=frame-${s("S")};`,"const k=floor(t);",`const v=t<=0?L[0]:t>=${i}?L[${i}]:L[k]+(L[k+1]-L[k])*(t-k);`,`return ${c};`,`})(${pt(t.starts)},${pt(o)},${n?pt(n):"0"})`].join("")}function Tx(e,t,r,n){let i=qn[e],o=n?`*(${pt(n)}[${i}]??0)`:"";return`((S,E)=>{const s=S[${i}];return s!==undefined&&frame>=s&&frame<E[${i}]?1${o}:0;})(${pt(t)},${pt(r)})`}function Cx(e,t){return`((S)=>frame<(S[${qn[e]}]??S[S.length-1])?1:0)(${pt(t)})`}function Ax(e,t){return t.filter((r,n)=>e[n]!==`
383
+ `)}function Dx(e,t){return`(${pt(t)}[${qn[e]}]??0)`}function Nx(e,t,r){return{name:e,selectors:[{type:"expression",expression:t,mode:"add",amount:1}],props:r}}function Ox(e,t){let r={textIndex:t.textIndex??0,wordIndex:t.wordIndex??0,lineIndex:t.lineIndex??0,frame:t.frame,floor:Math.floor,clamp:(o,a,s)=>Math.max(a,Math.min(s,o)),abs:Math.abs,min:Math.min,max:Math.max},n=new Function(...Object.keys(r),`return (${e});`),i=Number(n(...Object.values(r)));return Number.isFinite(i)?Math.max(-1,Math.min(1,i)):0}h();var Zp={titles:{landscape:{x:.06,top:.08,bottom:.1},portrait:{x:.08,top:.1,bottom:.24}},captions:{landscape:{x:.1,top:.08,bottom:.1},portrait:{x:.08,top:.12,bottom:.22}}};function Bx(e,t,r=Zp.titles){if(t&&typeof t=="object")return t;let{width:n,height:i}=e,a=(t?t==="portrait":i>n)?r.portrait:r.landscape;return{x:n*a.x,y:i*a.top,width:n*(1-2*a.x),height:i*(1-a.top-a.bottom)}}h();function Ix(e){if(!/^[A-Z][A-Za-z0-9]+$/.test(e.name))throw new Error(`Component name must be PascalCase: "${e.name}"`);if(e.summary.length>200)throw new Error(`${e.name}: summary must be one sentence (\u2264 200 chars).`);return e}h();var Il;function $x(){return Il??=l.custom(e=>e!=null&&(Array.isArray(e)||typeof e=="object"||typeof e=="function"),{message:"Expected a target: [x, y], a rect, { node }, { text }, { track } or (frame) => point"}),Il}h();function Kp(e,t){let r=e.elevation[t],n=e.scale;return{...r.opacity>0&&{dropShadow:{color:e.color.shadow,opacity:r.opacity,angle:90,distance:r.distance*n,size:r.size*n}},...r.edge>0&&{innerShadow:{color:"#ffffff",opacity:r.edge,angle:270,distance:Math.max(1,n),size:0,blendMode:"normal"}}}}function Wx(e,t,r,n){if(n===!1)return t;let i=Kp(r,n);return Object.keys(i).length>0?e.style(t,i):t}function Hx(e,t,r=.05){if(t.mode==="light"||r<=0)return e;let n=Sl(e,"#ffffff",r);return n===e?e:`linear-gradient(180deg, ${n} 0%, ${e} 100%)`}h();h();function qx(e){let t=[];for(let r of e.matchAll(/\S+/g)){let n=r.index??0;t.push({text:r[0],start:n,end:n+r[0].length,index:t.length})}return t}function zl(e,t,r=0){if(typeof t=="string"){let o=0;for(let a=0;;a++){let s=e.indexOf(t,o);if(s<0)return null;if(a===r)return[s,s+t.length];o=s+Math.max(1,t.length)}}let n=t.flags.includes("g")?t.flags:`${t.flags}g`,i=0;for(let o of e.matchAll(new RegExp(t.source,n))){if(i===r)return[o.index??0,(o.index??0)+o[0].length];i++}return null}function Qp(e,t,r){if(!r.width||!r.align||r.align==="left")return 0;let n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;for(let a of e.glyphs)a.line!==t||a.char.trim()===""||(n=Math.min(n,a.x),i=Math.max(i,a.x+a.width));if(!Number.isFinite(n))return 0;let o=r.width-(i-n);return(r.align==="center"?o/2:o)-n}function jl(e,t,r,n){let i=new Map;for(let o of e.glyphs){if(o.index<t||o.index>=r||o.char.trim()==="")continue;let a=i.get(o.line)??{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};a.min=Math.min(a.min,o.x),a.max=Math.max(a.max,o.x+o.width-(n.letterSpacing??0)),i.set(o.line,a)}return[...i.entries()].sort(([o],[a])=>o-a).map(([o,a])=>{let s=Qp(e,o,n);return{x:a.min+s,y:o*e.lineHeight,width:a.max-a.min,height:e.lineHeight}})}var Vl=e=>Array.isArray(e)&&e.length===2&&e.every(t=>typeof t=="number"),Jp=e=>typeof e=="object"&&e!==null&&["x","y","width","height"].every(t=>typeof e[t]=="number"),He=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0;function Zn(e,t,r){if(typeof e=="function")return e(t);if(e&&typeof e.get=="function"){let n=t/r;return e.get({frame:t,fps:r,time:n,duration:0,durationMs:0,progress:0,deltaTime:1/r})}throw new Error("Tracked target values must be signals or (frame) => number.")}function Jx(e,t={}){if(typeof e=="function")return{kind:"dynamic",anchor:"center",at:i=>{let o=e(i);return Vl(o)?{x:o[0],y:o[1],width:0,height:0}:o}};if(Vl(e))return{kind:"static",anchor:"center",rects:[{x:e[0],y:e[1],width:0,height:0}]};if(Jp(e))return{kind:"static",anchor:"center",rects:[e]};if("track"in e){let i=e.track,o=t.fps??30;return{kind:"dynamic",anchor:e.anchor??"center",at:a=>({x:Zn(i.x,a,o),y:Zn(i.y,a,o),width:Zn(i.width,a,o),height:Zn(i.height,a,o)})}}if("text"in e)return{kind:"static",anchor:e.anchor??"tip",rects:rf(e,t)};let r=e.node,n=ef(r);if(!n)throw new Error(`Target node "${r.id??"?"}" has no absolute geometry. Give it numeric x, y, width and height, or target a rect.`);return{kind:"static",anchor:e.anchor??"center",rects:[n]}}function ef(e){let t=He(e.x),r=He(e.y),n=He(e.width),i=He(e.height);return t===void 0||r===void 0||n===void 0||i===void 0?null:{x:t,y:r,width:n,height:i}}function tf(e,t){let r=e.text,n=typeof r.text=="string"?r.text:typeof r.content=="string"?r.content:null;if(n===null)throw new Error("Text target node has no string content.");let i=He(r.x),o=He(r.y);if(i===void 0||o===void 0)throw new Error(`Text target "${r.id??"?"}" needs numeric x and y so its glyphs can be placed.`);if(!t.measure)throw new Error("Text targets need a measure function.");let a=r.fontFamily??t.textDefaults?.fontFamily;if(!a)throw new Error("Text target has no fontFamily.");let s={...t.textDefaults,fontFamily:a,fontSize:He(r.fontSize)??t.textDefaults?.fontSize,fontWeight:r.fontWeight??t.textDefaults?.fontWeight,letterSpacing:He(r.letterSpacing)??t.textDefaults?.letterSpacing,lineHeight:He(r.lineHeight)??t.textDefaults?.lineHeight,width:He(r.width),align:nf(r.align),direction:r.direction},u=e.range??(e.match!==void 0?zl(n,e.match,e.nth??0):[0,n.length]);if(!u)throw new Error(`Text target: "${String(e.match)}" not found in "${n}".`);return{content:n,metrics:t.measure(n,s),options:s,range:[u[0],u[1]],x:i,y:o}}function rf(e,t){let r=tf(e,t),n=jl(r.metrics,r.range[0],r.range[1],r.options);if(n.length===0)throw new Error("Text target range covers no glyphs.");return n.map(i=>({...i,x:i.x+r.x,y:i.y+r.y}))}function nf(e){return e==="center"?"center":e==="end"||e==="right"?"right":"left"}function of(e){if(e.length===0)return{x:0,y:0,width:0,height:0};let t=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY;for(let o of e)t=Math.min(t,o.x),r=Math.min(r,o.y),n=Math.max(n,o.x+o.width),i=Math.max(i,o.y+o.height);return{x:t,y:r,width:n-t,height:i-r}}function $l(e,t="center",r=!1){let{x:n,y:i,width:o,height:a}=e;switch(t){case"tip":return r?[n,i+a/2]:[n+o/2,i+a/2];case"center":return[n+o/2,i+a/2];case"top":return[n+o/2,i];case"bottom":return[n+o/2,i+a];case"left":return[n,i+a/2];case"right":return[n+o,i+a/2];case"top-left":return[n,i];case"top-right":return[n+o,i];case"bottom-left":return[n,i+a];case"bottom-right":return[n+o,i+a]}}function ew(e,t=0,r=!1){if(e.kind==="dynamic")return $l(e.at(t),e.anchor,r);let n=e.rects[0];return $l(e.anchor==="tip"?n:of(e.rects),e.anchor,r)}h();function nw(e,t,r,n,i=0){let o=r/t,a=[],s=i;for(let u=0;u<e.length;u++){let c=e[u-1]??"",m=u===0?0:o*(1+n.spread(.3));c===" "&&(m+=o*.6),/[.,!?;:]/.test(c)&&(m+=o*3),s+=m,a.push(Math.max(i,Math.round(s)))}for(let u=1;u<a.length;u++)a[u]=Math.max(a[u],a[u-1]+1);return a}h();h();var Hr=class{textures=new Map;set(t,r){this.textures.set(t,r)}get(t){return this.textures.get(t)}has(t){return this.textures.has(t)}getOutputs(){return{canny:this.textures.get("canny"),depth:this.textures.get("depth"),normals:this.textures.get("normals"),poseSkeleton:this.textures.get("poseSkeleton"),segmentationMask:this.textures.get("segmentationMask"),faceLandmarks:this.textures.get("faceLandmarks"),motionVectors:this.textures.get("motionVectors"),deflickered:this.textures.get("deflickered")}}createBindGroupEntry(t,r){let n=this.textures.get(t);if(!n)throw new Error(`[ControlNetMultiplexer] Cannot create bind group entry: conditioning texture "${t}" is not registered in VRAM.`);return{binding:r,resource:n.createView({label:`controlnet_${t}_view`})}}exportTensorView(t){let r=this.textures.get(t);if(!r)throw new Error(`[ControlNetMultiplexer] Conditioning tensor "${t}" not found in multiplexer.`);return{texture:r,width:r.width,height:r.height,format:r.format}}async readPixelsAsync(t,r){let n=this.textures.get(r);if(!n)throw new Error(`[ControlNetMultiplexer] Cannot read pixels: conditioning texture "${r}" is missing.`);let i=n.width,o=n.height,a=n.format,s=4;a==="rgba16float"||a==="rg32float"?s=8:a==="r32float"?s=4:a==="rgba32float"&&(s=16);let u=i*s,c=Math.ceil(u/256)*256,m=c*o,d=t.createBuffer({size:m,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,label:`controlnet_readback_staging_${r}`}),p=t.createCommandEncoder({label:`readback_encoder_${r}`});p.copyTextureToBuffer({texture:n},{buffer:d,bytesPerRow:c,rowsPerImage:o},[i,o,1]),t.queue.submit([p.finish()]),await d.mapAsync(GPUMapMode.READ);let f=d.getMappedRange(),b=new Uint8Array(i*o*s),g=new Uint8Array(f);if(c===u)b.set(g.subarray(0,i*o*s));else for(let y=0;y<o;y++){let v=y*c,T=y*u;b.set(g.subarray(v,v+u),T)}return d.unmap(),d.destroy(),{width:i,height:o,format:a,data:b}}destroy(){for(let t of this.textures.values())try{t.destroy()}catch{}this.textures.clear()}};h();h();h();var Ul=`
384
+ struct CannyParams {
385
+ lowThreshold: f32,
386
+ highThreshold: f32,
387
+ width: u32,
388
+ height: u32,
389
+ };
390
+
391
+ @group(0) @binding(0) var inputTex: texture_2d<f32>;
392
+ @group(0) @binding(1) var magnitudeTex: texture_storage_2d<rgba16float, write>;
393
+ @group(0) @binding(2) var<uniform> params: CannyParams;
394
+
395
+ fn getLuma(coord: vec2<i32>, maxCoord: vec2<i32>) -> f32 {
396
+ let clamped = clamp(coord, vec2<i32>(0), maxCoord);
397
+ let c = textureLoad(inputTex, clamped, 0);
398
+ return dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));
399
+ }
400
+
401
+ @compute @workgroup_size(16, 16)
402
+ fn computeSobel(@builtin(global_invocation_id) id: vec3<u32>) {
403
+ if (id.x >= params.width || id.y >= params.height) { return; }
404
+
405
+ let x = i32(id.x);
406
+ let y = i32(id.y);
407
+ let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
408
+
409
+ let p00 = getLuma(vec2<i32>(x - 1, y - 1), maxCoord);
410
+ let p10 = getLuma(vec2<i32>(x, y - 1), maxCoord);
411
+ let p20 = getLuma(vec2<i32>(x + 1, y - 1), maxCoord);
412
+ let p01 = getLuma(vec2<i32>(x - 1, y), maxCoord);
413
+ let p21 = getLuma(vec2<i32>(x + 1, y), maxCoord);
414
+ let p02 = getLuma(vec2<i32>(x - 1, y + 1), maxCoord);
415
+ let p12 = getLuma(vec2<i32>(x, y + 1), maxCoord);
416
+ let p22 = getLuma(vec2<i32>(x + 1, y + 1), maxCoord);
417
+
418
+ let gx = (p20 + 2.0 * p21 + p22) - (p00 + 2.0 * p01 + p02);
419
+ let gy = (p02 + 2.0 * p12 + p22) - (p00 + 2.0 * p10 + p20);
420
+
421
+ let mag = sqrt(gx * gx + gy * gy);
422
+ let angle = atan2(gy, gx);
423
+
424
+ // Quantize angle into 4 sectors (0: 0 deg, 1: 45 deg, 2: 90 deg, 3: 135 deg)
425
+ var sector: f32 = 0.0;
426
+ let a = (angle * 180.0 / 3.14159265 + 180.0) % 180.0;
427
+ if ((a >= 0.0 && a < 22.5) || (a >= 157.5 && a <= 180.0)) {
428
+ sector = 0.0;
429
+ } else if (a >= 22.5 && a < 67.5) {
430
+ sector = 1.0;
431
+ } else if (a >= 67.5 && a < 112.5) {
432
+ sector = 2.0;
433
+ } else {
434
+ sector = 3.0;
435
+ }
436
+
437
+ textureStore(magnitudeTex, id.xy, vec4<f32>(mag, sector, 0.0, 1.0));
438
+ }
439
+ `,_l=`
440
+ struct CannyParams {
441
+ lowThreshold: f32,
442
+ highThreshold: f32,
443
+ width: u32,
444
+ height: u32,
445
+ };
446
+
447
+ @group(0) @binding(0) var magnitudeTex: texture_2d<f32>;
448
+ @group(0) @binding(1) var edgeTex: texture_storage_2d<rgba8unorm, write>;
449
+ @group(0) @binding(2) var<uniform> params: CannyParams;
450
+
451
+ @compute @workgroup_size(16, 16)
452
+ fn computeNonMaxSuppression(@builtin(global_invocation_id) id: vec3<u32>) {
453
+ if (id.x >= params.width || id.y >= params.height) { return; }
454
+
455
+ let x = i32(id.x);
456
+ let y = i32(id.y);
457
+ let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
458
+
459
+ let center = textureLoad(magnitudeTex, vec2<i32>(x, y), 0);
460
+ let mag = center.r;
461
+ let sector = u32(round(center.g));
462
+
463
+ var n1 = 0.0;
464
+ var n2 = 0.0;
465
+
466
+ switch (sector) {
467
+ case 0u: {
468
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y), vec2<i32>(0), maxCoord), 0).r;
469
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y), vec2<i32>(0), maxCoord), 0).r;
470
+ }
471
+ case 1u: {
472
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
473
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
474
+ }
475
+ case 2u: {
476
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y - 1), vec2<i32>(0), maxCoord), 0).r;
477
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y + 1), vec2<i32>(0), maxCoord), 0).r;
478
+ }
479
+ default: {
480
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
481
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
482
+ }
483
+ }
484
+
485
+ var edge = 0.0;
486
+ // Non-maximum suppression along gradient sector with directional tie-breaking
487
+ if (mag > n1 && mag >= n2 && mag > 0.0) {
488
+ if (mag >= params.highThreshold) {
489
+ edge = 1.0;
490
+ } else if (mag >= params.lowThreshold) {
491
+ edge = 0.5;
492
+ }
493
+ }
494
+
495
+ textureStore(edgeTex, id.xy, vec4<f32>(edge, edge, edge, 1.0));
496
+ }
497
+ `,Gl=`
498
+ struct CannyParams {
499
+ lowThreshold: f32,
500
+ highThreshold: f32,
501
+ width: u32,
502
+ height: u32,
503
+ };
504
+
505
+ @group(0) @binding(0) var magnitudeTex: texture_2d<f32>;
506
+ @group(0) @binding(1) var edgeTex: texture_storage_2d<r32float, write>;
507
+ @group(0) @binding(2) var<uniform> params: CannyParams;
508
+
509
+ @compute @workgroup_size(16, 16)
510
+ fn computeNonMaxSuppression(@builtin(global_invocation_id) id: vec3<u32>) {
511
+ if (id.x >= params.width || id.y >= params.height) { return; }
512
+
513
+ let x = i32(id.x);
514
+ let y = i32(id.y);
515
+ let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
516
+
517
+ let center = textureLoad(magnitudeTex, vec2<i32>(x, y), 0);
518
+ let mag = center.r;
519
+ let sector = u32(round(center.g));
520
+
521
+ var n1 = 0.0;
522
+ var n2 = 0.0;
523
+
524
+ switch (sector) {
525
+ case 0u: {
526
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y), vec2<i32>(0), maxCoord), 0).r;
527
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y), vec2<i32>(0), maxCoord), 0).r;
528
+ }
529
+ case 1u: {
530
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
531
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
532
+ }
533
+ case 2u: {
534
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y - 1), vec2<i32>(0), maxCoord), 0).r;
535
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y + 1), vec2<i32>(0), maxCoord), 0).r;
536
+ }
537
+ default: {
538
+ n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
539
+ n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
540
+ }
541
+ }
542
+
543
+ var edge = 0.0;
544
+ // Non-maximum suppression along gradient sector with directional tie-breaking
545
+ if (mag > n1 && mag >= n2 && mag > 0.0) {
546
+ if (mag >= params.highThreshold) {
547
+ edge = 1.0;
548
+ } else if (mag >= params.lowThreshold) {
549
+ edge = 0.5;
550
+ }
551
+ }
552
+
553
+ textureStore(edgeTex, id.xy, vec4<f32>(edge, 0.0, 0.0, 1.0));
554
+ }
555
+ `;var Yr=class{constructor(t){this.device=t;let r=t.createShaderModule({label:"canny_sobel.wgsl",code:Ul});this.sobelPipeline=t.createComputePipeline({label:"CannySobelPipeline",layout:"auto",compute:{module:r,entryPoint:"computeSobel"}});let n=t.createShaderModule({label:"canny_nms_rgba8.wgsl",code:_l});this.nmsRgba8Pipeline=t.createComputePipeline({label:"CannyNmsRgba8Pipeline",layout:"auto",compute:{module:n,entryPoint:"computeNonMaxSuppression"}});let i=t.createShaderModule({label:"canny_nms_r32f.wgsl",code:Gl});this.nmsR32fPipeline=t.createComputePipeline({label:"CannyNmsR32fPipeline",layout:"auto",compute:{module:i,entryPoint:"computeNonMaxSuppression"}}),this.uniformBuffer=t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"canny_uniform_buffer"})}device;sobelPipeline;nmsRgba8Pipeline;nmsR32fPipeline;uniformBuffer;cachedIntermediateTexture;cachedOutputTexture;execute(t,r={}){let n=t.width,i=t.height,o=r.low??.1,a=r.high??.3,s=r.outputFormat??"rgba8unorm",u=new ArrayBuffer(16),c=new Float32Array(u),m=new Uint32Array(u);c[0]=o,c[1]=a,m[2]=n,m[3]=i,this.device.queue.writeBuffer(this.uniformBuffer,0,u),(!this.cachedIntermediateTexture||this.cachedIntermediateTexture.width!==n||this.cachedIntermediateTexture.height!==i)&&(this.cachedIntermediateTexture?.destroy(),this.cachedIntermediateTexture=this.device.createTexture({label:"canny_magnitude_intermediate",size:[n,i],format:"rgba16float",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING})),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i||this.cachedOutputTexture.format!==s)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:`canny_edge_output_${s}`,size:[n,i],format:s,usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let d=this.device.createCommandEncoder({label:"canny_command_encoder"}),p=this.device.createBindGroup({layout:this.sobelPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:t.createView()},{binding:1,resource:this.cachedIntermediateTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),f=d.beginComputePass({label:"canny_sobel_pass"});f.setPipeline(this.sobelPipeline),f.setBindGroup(0,p),f.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),f.end();let b=s==="r32float"?this.nmsR32fPipeline:this.nmsRgba8Pipeline,g=this.device.createBindGroup({layout:b.getBindGroupLayout(0),entries:[{binding:0,resource:this.cachedIntermediateTexture.createView()},{binding:1,resource:this.cachedOutputTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),y=d.beginComputePass({label:"canny_nms_pass"});return y.setPipeline(b),y.setBindGroup(0,g),y.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),y.end(),this.device.queue.submit([d.finish()]),this.cachedOutputTexture}destroy(){this.cachedIntermediateTexture?.destroy(),this.cachedOutputTexture?.destroy(),this.uniformBuffer.destroy()}};h();h();var Wl=`
556
+ struct DepthNormalParams {
557
+ width: u32,
558
+ height: u32,
559
+ depthScale: f32,
560
+ _pad: f32,
561
+ };
562
+
563
+ @group(0) @binding(0) var depthTex: texture_2d<f32>;
564
+ @group(0) @binding(1) var normalTex: texture_storage_2d<rgba16float, write>;
565
+ @group(0) @binding(2) var<uniform> params: DepthNormalParams;
566
+
567
+ @compute @workgroup_size(16, 16)
568
+ fn computeNormals(@builtin(global_invocation_id) id: vec3<u32>) {
569
+ if (id.x >= params.width || id.y >= params.height) { return; }
570
+
571
+ let c = id.xy;
572
+ let maxX = params.width - 1u;
573
+ let maxY = params.height - 1u;
574
+
575
+ let left = textureLoad(depthTex, vec2<u32>(max(c.x - 1u, 0u), c.y), 0).r;
576
+ let right = textureLoad(depthTex, vec2<u32>(min(c.x + 1u, maxX), c.y), 0).r;
577
+ let up = textureLoad(depthTex, vec2<u32>(c.x, max(c.y - 1u, 0u)), 0).r;
578
+ let down = textureLoad(depthTex, vec2<u32>(c.x, min(c.y + 1u, maxY)), 0).r;
579
+
580
+ let dx = (right - left) * 0.5 * params.depthScale;
581
+ let dy = (down - up) * 0.5 * params.depthScale;
582
+
583
+ let normal = normalize(vec3<f32>(-dx, -dy, 1.0));
584
+ // Pack [-1, 1] range to [0, 1]
585
+ let packedColor = vec4<f32>(normal * 0.5 + 0.5, 1.0);
586
+ textureStore(normalTex, id.xy, packedColor);
587
+ }
588
+ `,Hl=`
589
+ struct DepthNormalParams {
590
+ width: u32,
591
+ height: u32,
592
+ depthScale: f32,
593
+ _pad: f32,
594
+ };
595
+
596
+ @group(0) @binding(0) var depthTex: texture_2d<f32>;
597
+ @group(0) @binding(1) var normalTex: texture_storage_2d<rgba8unorm, write>;
598
+ @group(0) @binding(2) var<uniform> params: DepthNormalParams;
599
+
600
+ @compute @workgroup_size(16, 16)
601
+ fn computeNormals(@builtin(global_invocation_id) id: vec3<u32>) {
602
+ if (id.x >= params.width || id.y >= params.height) { return; }
603
+
604
+ let c = id.xy;
605
+ let maxX = params.width - 1u;
606
+ let maxY = params.height - 1u;
607
+
608
+ let left = textureLoad(depthTex, vec2<u32>(max(c.x - 1u, 0u), c.y), 0).r;
609
+ let right = textureLoad(depthTex, vec2<u32>(min(c.x + 1u, maxX), c.y), 0).r;
610
+ let up = textureLoad(depthTex, vec2<u32>(c.x, max(c.y - 1u, 0u)), 0).r;
611
+ let down = textureLoad(depthTex, vec2<u32>(c.x, min(c.y + 1u, maxY)), 0).r;
612
+
613
+ let dx = (right - left) * 0.5 * params.depthScale;
614
+ let dy = (down - up) * 0.5 * params.depthScale;
615
+
616
+ let normal = normalize(vec3<f32>(-dx, -dy, 1.0));
617
+ // Pack [-1, 1] range to [0, 1]
618
+ let packedColor = vec4<f32>(normal * 0.5 + 0.5, 1.0);
619
+ textureStore(normalTex, id.xy, packedColor);
620
+ }
621
+ `;var Xr=class{constructor(t){this.device=t;let r=t.createShaderModule({label:"depth_normals_rgba16f.wgsl",code:Wl});this.normalRgba16fPipeline=t.createComputePipeline({label:"DepthNormalsRgba16fPipeline",layout:"auto",compute:{module:r,entryPoint:"computeNormals"}});let n=t.createShaderModule({label:"depth_normals_rgba8.wgsl",code:Hl});this.normalRgba8Pipeline=t.createComputePipeline({label:"DepthNormalsRgba8Pipeline",layout:"auto",compute:{module:n,entryPoint:"computeNormals"}}),this.uniformBuffer=t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"depth_normals_uniform_buffer"})}device;normalRgba16fPipeline;normalRgba8Pipeline;uniformBuffer;cachedOutputTexture;execute(t,r={}){let n=t.width,i=t.height,o=r.depthScale??1,a=r.outputFormat??"rgba16float",s=new ArrayBuffer(16),u=new Uint32Array(s),c=new Float32Array(s);u[0]=n,u[1]=i,c[2]=o,c[3]=0,this.device.queue.writeBuffer(this.uniformBuffer,0,s),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i||this.cachedOutputTexture.format!==a)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:`normal_output_${a}`,size:[n,i],format:a,usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let m=a==="rgba8unorm"?this.normalRgba8Pipeline:this.normalRgba16fPipeline,d=this.device.createCommandEncoder({label:"depth_normals_command_encoder"}),p=this.device.createBindGroup({layout:m.getBindGroupLayout(0),entries:[{binding:0,resource:t.createView()},{binding:1,resource:this.cachedOutputTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),f=d.beginComputePass({label:"depth_normals_compute_pass"});return f.setPipeline(m),f.setBindGroup(0,p),f.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),f.end(),this.device.queue.submit([d.finish()]),this.cachedOutputTexture}destroy(){this.cachedOutputTexture?.destroy(),this.uniformBuffer.destroy()}};h();h();var Yl=`
622
+ struct FaceSegment {
623
+ start: vec2<f32>,
624
+ end: vec2<f32>,
625
+ color: vec4<f32>,
626
+ radius: f32,
627
+ enabled: f32,
628
+ pad: vec2<f32>,
629
+ };
630
+
631
+ struct FaceParams {
632
+ width: u32,
633
+ height: u32,
634
+ numSegments: u32,
635
+ pad: u32,
636
+ };
637
+
638
+ @group(0) @binding(0) var outputTex: texture_storage_2d<rgba8unorm, write>;
639
+ @group(0) @binding(1) var<uniform> params: FaceParams;
640
+ @group(0) @binding(2) var<storage, read> segments: array<FaceSegment>;
641
+
642
+ @compute @workgroup_size(16, 16)
643
+ fn computeFaceLandmarks(@builtin(global_invocation_id) id: vec3<u32>) {
644
+ if (id.x >= params.width || id.y >= params.height) {
645
+ return;
646
+ }
647
+
648
+ let p = vec2<f32>(f32(id.x) + 0.5, f32(id.y) + 0.5);
649
+ var outColor = vec4<f32>(0.0, 0.0, 0.0, 1.0); // Solid black background for SDXL ControlNet
650
+
651
+ let count = params.numSegments;
652
+ for (var i = 0u; i < count; i = i + 1u) {
653
+ let seg = segments[i];
654
+ if (seg.enabled < 0.5) {
655
+ continue;
656
+ }
657
+
658
+ let ab = seg.end - seg.start;
659
+ let ap = p - seg.start;
660
+ let l2 = dot(ab, ab);
661
+
662
+ var t: f32 = 0.0;
663
+ if (l2 > 0.0001) {
664
+ t = clamp(dot(ap, ab) / l2, 0.0, 1.0);
665
+ }
666
+
667
+ let closest = seg.start + t * ab;
668
+ let dist = length(p - closest);
669
+
670
+ if (dist <= seg.radius) {
671
+ let edgeAlpha = clamp(seg.radius - dist + 0.5, 0.0, 1.0);
672
+ outColor = vec4<f32>(mix(outColor.rgb, seg.color.rgb, edgeAlpha * seg.color.a), 1.0);
673
+ }
674
+ }
675
+
676
+ textureStore(outputTex, id.xy, outColor);
677
+ }
678
+ `;function nt(e,t){let r=[];for(let n=0;n<e.length-1;n++)r.push({from:e[n],to:e[n+1],color:t});return r}var qr=[...nt([70,63,105,66,107],[0,1,1,1]),...nt([300,293,334,296,336],[0,1,1,1]),...nt([33,160,158,133,153,144,33],[0,1,0,1]),...nt([263,387,385,362,380,373,263],[0,1,0,1]),...nt([168,6,197,195,4],[1,1,0,1]),...nt([98,97,2,326,327],[1,1,0,1]),...nt([61,185,40,39,37,0,267,269,270,409,291,375,321,405,314,17,84,181,91,146,61],[1,.2,.2,1]),...nt([78,95,88,178,87,14,317,402,318,324,308,415,310,311,312,13,82,81,80,191,78],[1,0,.8,1]),...nt([10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109,10],[.9,.9,.9,1])],Kn=class{constructor(t){this.device=t;let r=t.createShaderModule({label:"face_landmarks.wgsl",code:Yl});this.computePipeline=t.createComputePipeline({label:"FaceLandmarksComputePipeline",layout:"auto",compute:{module:r,entryPoint:"computeFaceLandmarks"}}),this.uniformBuffer=t.createBuffer({size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"face_landmarks_uniform_buffer"});let n=Math.max(256,qr.length*48);this.storageBuffer=t.createBuffer({size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,label:"face_landmarks_storage_buffer"})}device;computePipeline;uniformBuffer;storageBuffer;cachedOutputTexture;execute(t,r={}){let n=r.width??1024,i=r.height??1024,o=r.lineWidth??4,a=Math.max(1,o/2),s=new Uint32Array(4);s[0]=n,s[1]=i,s[2]=qr.length,s[3]=0,this.device.queue.writeBuffer(this.uniformBuffer,0,s);let u=new Float32Array(qr.length*12);for(let p=0;p<qr.length;p++){let f=qr[p],b=t[f.from],g=t[f.to],y=p*12;if(!b||!g||(b.visibility??1)<.2||(g.visibility??1)<.2){u[y+9]=0;continue}u[y+0]=b.x*n,u[y+1]=b.y*i,u[y+2]=g.x*n,u[y+3]=g.y*i,u[y+4]=f.color[0],u[y+5]=f.color[1],u[y+6]=f.color[2],u[y+7]=f.color[3],u[y+8]=a,u[y+9]=1,u[y+10]=0,u[y+11]=0}this.device.queue.writeBuffer(this.storageBuffer,0,u),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({size:{width:n,height:i},format:"rgba8unorm",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC|GPUTextureUsage.COPY_DST,label:"face_landmarks_output_texture"}));let c=this.device.createBindGroup({label:"FaceLandmarksBindGroup",layout:this.computePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.cachedOutputTexture.createView()},{binding:1,resource:{buffer:this.uniformBuffer}},{binding:2,resource:{buffer:this.storageBuffer}}]}),m=this.device.createCommandEncoder({label:"FaceLandmarksCommandEncoder"}),d=m.beginComputePass({label:"FaceLandmarksComputePass"});return d.setPipeline(this.computePipeline),d.setBindGroup(0,c),d.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),d.end(),this.device.queue.submit([m.finish()]),this.cachedOutputTexture}destroy(){this.uniformBuffer.destroy(),this.storageBuffer.destroy(),this.cachedOutputTexture?.destroy()}};h();h();var Xl=`
679
+ struct SegParams {
680
+ threshold: f32,
681
+ feather: f32,
682
+ width: u32,
683
+ height: u32,
684
+ };
685
+
686
+ @group(0) @binding(0) var inputTex: texture_2d<f32>;
687
+ @group(0) @binding(1) var outputTex: texture_storage_2d<rgba8unorm, write>;
688
+ @group(0) @binding(2) var<uniform> params: SegParams;
689
+
690
+ @compute @workgroup_size(16, 16)
691
+ fn computeSegmentation(@builtin(global_invocation_id) id: vec3<u32>) {
692
+ if (id.x >= params.width || id.y >= params.height) {
693
+ return;
694
+ }
695
+
696
+ let coord = vec2<i32>(i32(id.x), i32(id.y));
697
+ let sample = textureLoad(inputTex, coord, 0);
698
+
699
+ // Luminance or alpha channel extraction
700
+ let rawAlpha = max(sample.a, dot(sample.rgb, vec3<f32>(0.299, 0.587, 0.114)));
701
+
702
+ let lower = max(0.0, params.threshold - params.feather);
703
+ let upper = min(1.0, params.threshold + params.feather);
704
+ let alpha = smoothstep(lower, upper, rawAlpha);
705
+
706
+ textureStore(outputTex, id.xy, vec4<f32>(alpha, alpha, alpha, 1.0));
707
+ }
708
+ `;var Qn=class{constructor(t){this.device=t;let r=t.createShaderModule({label:"segmentation.wgsl",code:Xl});this.computePipeline=t.createComputePipeline({label:"SegmentationComputePipeline",layout:"auto",compute:{module:r,entryPoint:"computeSegmentation"}}),this.uniformBuffer=t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"segmentation_uniform_buffer"})}device;computePipeline;uniformBuffer;cachedOutputTexture;execute(t,r={}){let n=t.width,i=t.height,o=r.threshold??.5,a=r.feather??.05,s=new ArrayBuffer(16),u=new Float32Array(s),c=new Uint32Array(s);u[0]=o,u[1]=a,c[2]=n,c[3]=i,this.device.queue.writeBuffer(this.uniformBuffer,0,s),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:"segmentation_output_texture",size:[n,i],format:"rgba8unorm",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let m=this.device.createCommandEncoder({label:"segmentation_command_encoder"}),d=this.device.createBindGroup({label:"segmentation_bind_group",layout:this.computePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:t.createView({label:"segmentation_input_view"})},{binding:1,resource:this.cachedOutputTexture.createView({label:"segmentation_output_view"})},{binding:2,resource:{buffer:this.uniformBuffer}}]}),p=m.beginComputePass({label:"segmentation_compute_pass"});return p.setPipeline(this.computePipeline),p.setBindGroup(0,d),p.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16),1),p.end(),this.device.queue.submit([m.finish()]),this.cachedOutputTexture}destroy(){this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=void 0,this.uniformBuffer.destroy()}};var nr=class e{constructor(t){this.source=t;this.id=`tensor-${Math.random().toString(36).slice(2,9)}`}source;id;cannyOptions;depthNormalsOptions;poseSkeletonOptions;faceLandmarksOptions;segmentationOptions;opticalFlowOptions;deflickerOptions;multiplexer=new Hr;cannyPipeline;depthNormalsPipeline;posePipeline;facePipeline;segmentationPipeline;opticalFlowPipeline;deflickerPipeline;prevInputTexture;static from(t){return new e(t)}canny(t={}){return this.cannyOptions=t,this}depthNormals(t={}){return this.depthNormalsOptions=t,this}poseSkeleton(t={}){return this.poseSkeletonOptions=t,this}pose(t,r={}){return this.poseSkeletonOptions={...r,landmarks:t},this}faceLandmarks(t={}){return this.faceLandmarksOptions=t,this}face(t,r={}){return this.faceLandmarksOptions={...r,landmarks:t},this}segmentation(t={}){return this.segmentationOptions=t,this}opticalFlow(t={}){return this.opticalFlowOptions=t,this}deflicker(t={}){return this.deflickerOptions=t,this}getMultiplexer(){return this.multiplexer}async execute(t,r){let n=r;if(!n&&typeof this.source?.createView=="function"&&(n=this.source),!n)throw new Error("[TensorPipeline.execute] No GPUTexture available for tensor compute execution. Pass a valid GPUTexture to execute() or initialize with a GPUTexture source.");if(this.cannyOptions){this.cannyPipeline||(this.cannyPipeline=new Yr(t));let i=this.cannyPipeline.execute(n,this.cannyOptions);this.multiplexer.set("canny",i)}if(this.depthNormalsOptions){this.depthNormalsPipeline||(this.depthNormalsPipeline=new Xr(t));let i=this.depthNormalsPipeline.execute(n,this.depthNormalsOptions);this.multiplexer.set("normals",i)}if(this.poseSkeletonOptions?.landmarks){this.posePipeline||(this.posePipeline=new ou(t));let i=this.posePipeline.execute(this.poseSkeletonOptions.landmarks,{width:this.poseSkeletonOptions.width??n.width,height:this.poseSkeletonOptions.height??n.height,lineWidth:this.poseSkeletonOptions.lineWidth});this.multiplexer.set("poseSkeleton",i)}if(this.faceLandmarksOptions?.landmarks){this.facePipeline||(this.facePipeline=new Kn(t));let i=this.facePipeline.execute(this.faceLandmarksOptions.landmarks,{width:this.faceLandmarksOptions.width??n.width,height:this.faceLandmarksOptions.height??n.height,lineWidth:this.faceLandmarksOptions.lineWidth});this.multiplexer.set("faceLandmarks",i)}if(this.segmentationOptions){this.segmentationPipeline||(this.segmentationPipeline=new Qn(t));let i=this.segmentationPipeline.execute(n,this.segmentationOptions);this.multiplexer.set("segmentationMask",i)}if(this.opticalFlowOptions){this.opticalFlowPipeline||(this.opticalFlowPipeline=new Zi(t));let i=this.prevInputTexture??n,o=this.opticalFlowPipeline.execute(i,n,this.opticalFlowOptions);this.multiplexer.set("motionVectors",o)}if(this.deflickerOptions){this.deflickerPipeline||(this.deflickerPipeline=new Ki(t));let i=this.deflickerPipeline.execute(n,this.deflickerOptions);this.multiplexer.set("deflickered",i)}return this.prevInputTexture=n,this.multiplexer.getOutputs()}toConfig(){return{canny:this.cannyOptions,depthNormals:this.depthNormalsOptions,poseSkeleton:this.poseSkeletonOptions,faceLandmarks:this.faceLandmarksOptions,segmentation:this.segmentationOptions,opticalFlow:this.opticalFlowOptions,deflicker:this.deflickerOptions}}toNode(){return{id:this.id,kind:"tensor",source:this.source,config:this.toConfig()}}destroy(){this.cannyPipeline?.destroy(),this.depthNormalsPipeline?.destroy(),this.posePipeline?.destroy(),this.facePipeline?.destroy(),this.segmentationPipeline?.destroy(),this.opticalFlowPipeline?.destroy(),this.deflickerPipeline?.destroy(),this.multiplexer.destroy()}};h();var zw=e=>{if(!e)return"srcOver";switch(e){case"source-over":return"srcOver";case"source-in":return"srcIn";case"source-out":return"srcOut";case"source-atop":return"srcATop";case"destination-over":return"dstOver";case"destination-in":return"dstIn";case"destination-out":return"dstOut";case"destination-atop":return"dstATop";case"copy":return"src";case"xor":return"xor";case"multiply":return"multiply";case"screen":return"screen";case"overlay":return"overlay";case"darken":return"darken";case"lighten":case"lighter":return"lighten";case"color-dodge":return"colorDodge";case"color-burn":return"colorBurn";case"hard-light":return"hardLight";case"soft-light":return"softLight";case"difference":return"difference";case"exclusion":return"exclusion";case"hue":return"hue";case"saturation":return"saturation";case"color":return"color";case"luminosity":return"luminosity";default:return"srcOver"}},jw=e=>e==="destination-in"||e==="source-in";h();function Uw(e,t,r,n,i="outside"){if(i==="inside"){let o=n/2;return{x:o,y:o,width:Math.max(0,e-n),height:Math.max(0,t-n),radius:r===0?0:Math.max(0,r-o)}}if(i==="outside"){let o=n/2;return{x:-o,y:-o,width:e+n,height:t+n,radius:r===0?0:r+o}}return{x:0,y:0,width:e,height:t,radius:r}}h();function ql(e){if(e.operation?.op==="source")return tu(e).sourceUrl;for(let t of e.children??[]){let r=ql(t);if(r)return r}}async function Zl(e,t){let r=async n=>{let i=n.operation;if(i?.op==="CompositorLayer"&&i.timeRemap&&i.durationFrames){let o=ql(n);if(!o)throw new Error(`Time remap on '${i.id}' has no media source`);let a=[],s=await Zt.acquire(o);try{let c=i.dataType==="Video"?await s.getPrimaryVideoTrack():null,m=i.dataType==="Video"&&(i.muted||i.volume===0)?null:await s.getPrimaryAudioTrack();if(i.dataType==="Video"&&!c)throw new Error(`Time remap on '${i.id}': source has no video track`);if(i.dataType==="Audio"&&!m)throw new Error(`Time remap on '${i.id}': source has no audio track`);for(let d of[c,m])d&&a.push({first:await s.getFirstTimestamp([d]),last:await d.computeDuration()})}finally{Zt.release(o)}let u=c=>{for(let{first:m,last:d}of a)if(c.min<m-1e-8||c.max>d+1e-8||c.maxIncluded&&c.max>=d-1e-8)throw new Error(`Time remap on '${i.id}' requests source ${c.min.toFixed(6)}\u2013${c.max.toFixed(6)}s outside ${m.toFixed(6)}\u2013${d.toFixed(6)}s`)};i.timeRemap.kind==="recorded"?i.timeRemap.recorder.checkRange(u):u(Dn(i.timeRemap,0,i.durationFrames,t))}for(let o of n.children??[])await r(o)};await r(e)}h();var Kl=new Map;function Z(e){let t=(Kl.get(e)??0)+1;return Kl.set(e,t),`${e}-auto-${t}`}h();h();h();h();var $e=class extends Error{status;body;requestId;type;constructor({message:t,status:r,body:n,requestId:i,type:o}){super(t),this.name="ApiError",this.status=r,this.body=n,this.requestId=i??"",this.type=o}},Zr=class extends $e{constructor(t){super(t),this.name="ValidationError"}get fieldErrors(){return Array.isArray(this.body?.detail)?this.body.detail:[]}getFieldErrors(t){return this.fieldErrors.filter(r=>r.loc[r.loc.length-1]===t)}};function af(e,t){if(e?.error?.message)return e.error.message;if(typeof e?.detail=="string")return e.detail;if(Array.isArray(e?.detail)){let r=e.detail[0];if(r?.msg)return`${r.msg} (${(r.loc??[]).join(".")})`}return typeof e?.message=="string"?e.message:t}async function Jn(e){let t=await e.text().catch(()=>""),r=t||void 0;try{r=t?JSON.parse(t):void 0}catch{}let n=typeof r=="object"&&r!==null?r:void 0,i={message:af(n,`${e.status} ${e.statusText}`.trim()),status:e.status,body:r,requestId:e.headers.get("x-framefields-request-id")??void 0,type:n?.error?.type};return e.status===422&&Array.isArray(n?.detail)?new Zr(i):new $e(i)}h();h();var ca="https://api.framefields.dev/v1/ai/proxy",Ql,Jl=e=>typeof x<"u"?x.env?.[e]:void 0;function ec(e){Ql=e}function sf(){let e=Ql??Jl("FRAMEFIELDS_API_KEY");if(!e)throw new Error("framefields ai: no API key. Set FRAMEFIELDS_API_KEY or call ai.config({ apiKey }). Create a key at https://framefields.dev/dashboard/keys");return e}function uf({service:e,path:t,query:r}){let n=new URLSearchParams;for(let[o,a]of Object.entries(r??{}))a!==void 0&&n.set(o,a);let i=n.size?`?${n}`:"";return`${e}/${t.replace(/^\/+/,"")}${i}`}async function ma(e){let t={Authorization:`Key ${sf()}`,Accept:e.accept??"application/json","x-framefields-target":uf(e)},r=e.body!==void 0;r&&(t["Content-Type"]="application/json");let n=await fetch(Jl("FRAMEFIELDS_AI_PROXY_URL")??ca,{method:e.method??(r?"POST":"GET"),headers:t,body:r?JSON.stringify(e.body):void 0,signal:e.signal});if(!n.ok)throw await Jn(n);return n}async function it(e){let t=await ma(e);return{data:await t.json(),requestId:t.headers.get("x-framefields-request-id")??""}}var lf=90*1024*1024,tc=10*1024*1024,cf=3,mf={"image/jpeg":"jpg","image/png":"png","image/webp":"webp","video/mp4":"mp4","audio/mpeg":"mp3","audio/wav":"wav"};function df(e,t){return"name"in e&&typeof e.name=="string"&&e.name?e.name:`${Date.now()}.${mf[t]??"bin"}`}function rc(e,t){let r=e.type||"application/octet-stream";return it({service:"storage",path:t?"upload/initiate-multipart":"upload/initiate",body:{content_type:r,file_name:df(e,r)}}).then(n=>n.data)}async function pa(e,t){let r=await fetch(e,t);if(!r.ok)throw await Jn(r);return r}async function pf(e,t){for(let r=1;;r++)try{return await(await pa(e,{method:"PUT",body:t})).json()}catch(n){if(r>=cf)throw n}}async function ff(e){let t=await rc(e,!0),r=new URL(t.upload_url),n=o=>`${r.origin}${r.pathname}/${o}${r.search}`,i=[];for(let o=0;o<e.size;o+=tc){let a=e.slice(o,Math.min(o+tc,e.size));i.push(await pf(n(i.length+1),a))}return await pa(n("complete"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parts:i.map(({partNumber:o,etag:a})=>({partNumber:o,etag:a}))})}),t.file_url}async function nc(e){if(e.size>lf)return ff(e);let t=await rc(e,!1);return await pa(t.upload_url,{method:"PUT",body:e,headers:{"Content-Type":e.type||"application/octet-stream"}}),t.file_url}var hf=e=>typeof e=="object"&&e!==null&&Object.getPrototypeOf(e)===Object.prototype;async function da(e){if(e instanceof Blob)return await nc(e);if(Array.isArray(e))return await Promise.all(e.map(t=>da(t)));if(hf(e)){let t=await Promise.all(Object.entries(e).map(async([r,n])=>[r,await da(n)]));return Object.fromEntries(t)}return e}var Dt={upload:nc,transformInput:da};var gf=new Set([429,502,503,504]),bf=4,ic=(e,t)=>new Promise((r,n)=>{t?.throwIfAborted();let i=setTimeout(r,e);t?.addEventListener("abort",()=>{clearTimeout(i),n(t.reason)},{once:!0})});async function oc(e,t){for(let r=1;;r++)try{return await e()}catch(n){if(!(n instanceof $e&&gf.has(n.status))||r>=bf)throw n;await ic(500*2**r,t)}}var fa=(e,t,r="")=>`${e}/requests/${encodeURIComponent(t)}${r}`;async function ac(e,{input:t,abortSignal:r}){let{data:n}=await it({service:"queue",path:e,body:await Dt.transformInput(t)??{},signal:r});return n}function sc(e,{requestId:t,logs:r,abortSignal:n}){return oc(async()=>{let{data:i}=await it({service:"queue",path:fa(e,t,"/status"),query:{logs:r?"1":void 0},signal:n});return i},n)}function uc(e,{requestId:t,abortSignal:r}){return oc(async()=>{let{data:n}=await it({service:"queue",path:fa(e,t),signal:r});return{data:n,requestId:t}},r)}async function yf(e,{requestId:t,abortSignal:r}){await it({service:"queue",path:fa(e,t,"/cancel"),method:"PUT",signal:r})}async function lc(e,t){let r=t.pollInterval??500;for(;;){let n=await sc(e,t);if(t.onQueueUpdate?.(n),n.status==="COMPLETED")return n;await ic(r,t.abortSignal)}}var cc={submit:ac,status:sc,result:uc,cancel:yf,subscribeToStatus:lc};async function mc(e,t){let{request_id:r}=await ac(e,t);return t.onEnqueue?.(r),await lc(e,{...t,requestId:r}),uc(e,{requestId:r,abortSignal:t.abortSignal})}h();async function*xf(e){let t=new TextDecoder,r="";for await(let i of e){r+=t.decode(i,{stream:!0}).replace(/\r\n?/g,`
709
+ `);let o=r.indexOf(`
710
+
711
+ `);for(;o!==-1;){let a=r.slice(0,o);r=r.slice(o+2);let s=dc(a);s&&(yield s),o=r.indexOf(`
712
+
713
+ `)}}let n=dc(r);n&&(yield n)}function dc(e){let t="message",r=[];for(let n of e.split(`
714
+ `))n.startsWith("data:")?r.push(n.slice(5).replace(/^ /,"")):n.startsWith("event:")&&(t=n.slice(6).trim());return r.length?{event:t,data:r.join(`
715
+ `)}:null}async function*wf(e,t){for await(let{event:r,data:n}of xf(e)){let i=JSON.parse(n);if(r==="error")throw new $e({message:"The model stream ended with an error",status:500,body:i,requestId:t});yield i}}async function pc(e,{input:t,abortSignal:r}){let n=new AbortController,i=r?AbortSignal.any([r,n.signal]):n.signal,o=await ma({service:"run",path:`${e}/stream`,body:await Dt.transformInput(t)??{},accept:"text/event-stream",signal:i}),a=o.headers.get("x-framefields-request-id")??"";if(!o.body)throw new $e({message:"Empty stream",status:502,requestId:a});let s=wf(o.body,a),u,c;async function*m(){for await(let f of s)u=f,yield f}let d=m(),p=async()=>{let f=await d.next();for(;!f.done;)f=await d.next();if(u===void 0)throw new $e({message:"Stream had no output",status:502,requestId:a});return u};return{requestId:a,[Symbol.asyncIterator]:()=>d,done:()=>(c??=p(),c),abort:()=>n.abort()}}async function vf(e,{input:t,abortSignal:r}){return it({service:"run",path:e,body:await Dt.transformInput(t)??{},signal:r})}var Sf={config(e){ec(e.apiKey)},run:vf,subscribe:mc,stream:pc,queue:cc,storage:Dt};h();function kf(e,...t){let r=[];for(let n=0;n<e.length;n++){let i=e[n];if(i&&r.push({text:i}),n<t.length){let o=t[n];if(o==null)continue;if(Array.isArray(o))for(let a of o)typeof a=="string"?a&&r.push({text:a}):a&&typeof a=="object"&&"text"in a&&r.push(a);else typeof o=="object"&&"text"in o?r.push(o):typeof o=="object"&&"get"in o&&typeof o.get=="function"?r.push({text:o}):r.push({text:String(o)})}}return r}function Pf(e,t={}){return{text:e,...t}}function Mf(e,t={}){return{text:e,fontWeight:t.fontWeight??700,...t}}function Tf(e,t={}){return{text:e,fontStyle:"italic",...t}}function Cf(e,t={}){return{text:e,fill:t.fill??"#6366f1",...t}}function Af(e,t,r={}){return{text:e,fill:t,...r}}function Df(e,t,r={}){return{text:e,fontSize:t,...r}}function Nf(e,t={}){let{bg:r,fill:n,radius:i,paddingX:o,paddingY:a,...s}=t;return{text:e,fill:n,mark:{background:r??"#6366f133",borderRadius:i??4,paddingX:o??6,paddingY:a??2},...s}}function Of(e,t={}){return{text:e,baselineShift:t.baselineShift??-8,...t}}function Rf(e,t={}){return{text:e,baselineShift:t.baselineShift??6,...t}}function Ff(e,t={}){return{text:e,fontFamily:t.fontFamily??"JetBrains Mono",mark:t.mark??{background:"#ffffff18",borderRadius:4,paddingX:6,paddingY:2},...t}}function ei(e){if(typeof e=="string")return{text:e};if(!Array.isArray(e))return{text:String(e)};let t=[],r="";for(let n of e)if(typeof n=="string")n&&(t.push({text:n}),r+=n);else if(n&&typeof n=="object"&&"text"in n){let i=n;t.push(i);let o=typeof i.text=="string"?i.text:i.text&&typeof i.text=="object"&&"get"in i.text&&typeof i.text.get=="function"?String(i.text.get()):String(i.text??"");r+=o}return{text:r,spans:t.length>0?t:void 0}}function Bf(e){if(!e||!e.includes("<"))return[{text:e}];let t=[],r=/<(\/?[a-zA-Z0-9_-]+)([^>]*)>/g,n=0,i=[],o=()=>{let s={};for(let u of i)Object.assign(s,u.style);return s};for(;;){let s=r.exec(e);if(!s)break;let u=e.slice(n,s.index);u&&t.push({text:u,...o()}),n=s.index+s[0].length;let c=s[1].toLowerCase(),m=s[2];if(c.startsWith("/")){let d=c.slice(1);for(let p=i.length-1;p>=0;p--)if(i[p].tag===d){i.splice(p,1);break}}else{let d={},p=/([a-zA-Z0-9_-]+)=["']([^"']*)["']/g;for(;;){let b=p.exec(m);if(!b)break;d[b[1].toLowerCase()]=b[2]}let f={};if(c==="b"||c==="strong")f.fontWeight=700,(d.color||d.fill)&&(f.fill=d.color??d.fill);else if(c==="i"||c==="em")f.fontStyle="italic",(d.color||d.fill)&&(f.fill=d.color??d.fill);else if(c==="accent")f.fill="#6366f1";else if(c==="color")f.fill=d.value??d.hex??d.fill;else if(c==="size"){let b=parseFloat(d.value??d.px??d.pt??"0");b>0&&(f.fontSize=b)}else if(c==="mark")f.mark={background:d.bg??d.background??"#6366f133",borderRadius:d.radius?parseFloat(d.radius):4,paddingX:d.paddingx?parseFloat(d.paddingx):6,paddingY:d.paddingy?parseFloat(d.paddingy):2},(d.color||d.fill)&&(f.fill=d.color??d.fill);else if(c==="sup")f.baselineShift=-8;else if(c==="sub")f.baselineShift=6;else if(c==="code")f.fontFamily="JetBrains Mono",f.mark={background:d.bg??"#ffffff18",borderRadius:4,paddingX:6,paddingY:2};else if(c==="span"){if((d.color||d.fill)&&(f.fill=d.color??d.fill),d.fontfamily&&(f.fontFamily=d.fontfamily),d.fontsize&&(f.fontSize=parseFloat(d.fontsize)),d.fontweight){let b=parseInt(d.fontweight,10);f.fontWeight=Number.isNaN(b)?d.fontweight:b}(d.fontstyle==="italic"||d.fontstyle==="normal")&&(f.fontStyle=d.fontstyle),d.letterspacing&&(f.letterSpacing=parseFloat(d.letterspacing)),d.baselineshift&&(f.baselineShift=parseFloat(d.baselineshift)),d.opacity&&(f.opacity=parseFloat(d.opacity))}i.push({tag:c,style:f})}}let a=e.slice(n);return a&&t.push({text:a,...o()}),t}h();h();h();h();h();h();function fc(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Nt(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function Ye(e){return e=Nt(Math.abs(e)),e?e[1]:NaN}h();function hc(e,t){return function(r,n){for(var i=r.length,o=[],a=0,s=e[0],u=0;i>0&&s>0&&(u+s+1>n&&(s=Math.max(1,n-u)),o.push(r.substring(i-=s,i+s)),!((u+=s+1)>n));)s=e[a=(a+1)%e.length];return o.reverse().join(t)}}h();function gc(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}h();var Lf=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ft(e){if(!(t=Lf.exec(e)))throw new Error("invalid format: "+e);var t;return new ti({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}ft.prototype=ti.prototype;function ti(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}ti.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};h();function bc(e){e:for(var t=e.length,r=1,n=-1,i;r<t;++r)switch(e[r]){case".":n=i=r;break;case"0":n===0&&(n=r),i=r;break;default:if(!+e[r])break e;n>0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(i+1):e}h();h();var Kr;function yc(e,t){var r=Nt(e,t);if(!r)return Kr=void 0,e.toPrecision(t);var n=r[0],i=r[1],o=i-(Kr=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,a=n.length;return o===a?n:o>a?n+new Array(o-a+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Nt(e,Math.max(0,t+o-1))[0]}h();function ha(e,t){var r=Nt(e,t);if(!r)return e+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var ga={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:fc,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>ha(e*100,t),r:ha,s:yc,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};h();function ba(e){return e}var xc=Array.prototype.map,wc=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function vc(e){var t=e.grouping===void 0||e.thousands===void 0?ba:hc(xc.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",i=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?ba:gc(xc.call(e.numerals,String)),a=e.percent===void 0?"%":e.percent+"",s=e.minus===void 0?"\u2212":e.minus+"",u=e.nan===void 0?"NaN":e.nan+"";function c(d,p){d=ft(d);var f=d.fill,b=d.align,g=d.sign,y=d.symbol,v=d.zero,T=d.width,C=d.comma,w=d.precision,A=d.trim,S=d.type;S==="n"?(C=!0,S="g"):ga[S]||(w===void 0&&(w=12),A=!0,S="g"),(v||f==="0"&&b==="=")&&(v=!0,f="0",b="=");var M=(p&&p.prefix!==void 0?p.prefix:"")+(y==="$"?r:y==="#"&&/[boxX]/.test(S)?"0"+S.toLowerCase():""),D=(y==="$"?n:/[%p]/.test(S)?a:"")+(p&&p.suffix!==void 0?p.suffix:""),V=ga[S],W=/[defgprs%]/.test(S);w=w===void 0?6:/[gprs]/.test(S)?Math.max(1,Math.min(21,w)):Math.max(0,Math.min(20,w));function z(B){var k=M,P=D,G,Y,$;if(S==="c")P=V(B)+P,B="";else{B=+B;var I=B<0||1/B<0;if(B=isNaN(B)?u:V(Math.abs(B),w),A&&(B=bc(B)),I&&+B==0&&g!=="+"&&(I=!1),k=(I?g==="("?g:s:g==="-"||g==="("?"":g)+k,P=(S==="s"&&!isNaN(B)&&Kr!==void 0?wc[8+Kr/3]:"")+P+(I&&g==="("?")":""),W){for(G=-1,Y=B.length;++G<Y;)if($=B.charCodeAt(G),48>$||$>57){P=($===46?i+B.slice(G+1):B.slice(G))+P,B=B.slice(0,G);break}}}C&&!v&&(B=t(B,1/0));var J=k.length+B.length+P.length,oe=J<T?new Array(T-J+1).join(f):"";switch(C&&v&&(B=t(oe+B,oe.length?T-P.length:1/0),oe=""),b){case"<":B=k+B+P+oe;break;case"=":B=k+oe+B+P;break;case"^":B=oe.slice(0,J=oe.length>>1)+k+B+P+oe.slice(J);break;default:B=oe+k+B+P;break}return o(B)}return z.toString=function(){return d+""},z}function m(d,p){var f=Math.max(-8,Math.min(8,Math.floor(Ye(p)/3)))*3,b=Math.pow(10,-f),g=c((d=ft(d),d.type="f",d),{suffix:wc[8+f/3]});return function(y){return g(b*y)}}return{format:c,formatPrefix:m}}var ri,ir,ni;ya({thousands:",",grouping:[3],currency:["$",""]});function ya(e){return ri=vc(e),ir=ri.format,ni=ri.formatPrefix,ri}h();function xa(e){return Math.max(0,-Ye(Math.abs(e)))}h();function wa(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Ye(t)/3)))*3-Ye(Math.abs(e)))}h();function va(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,Ye(t)-Ye(e))+1}h();h();h();h();h();function Ot(e,t){return e==null||t==null?NaN:e<t?-1:e>t?1:e>=t?0:NaN}h();h();function Sa(e,t){return e==null||t==null?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function Rt(e){let t,r,n;e.length!==2?(t=Ot,r=(s,u)=>Ot(e(s),u),n=(s,u)=>e(s)-u):(t=e===Ot||e===Sa?e:Ef,r=e,n=e);function i(s,u,c=0,m=s.length){if(c<m){if(t(u,u)!==0)return m;do{let d=c+m>>>1;r(s[d],u)<0?c=d+1:m=d}while(c<m)}return c}function o(s,u,c=0,m=s.length){if(c<m){if(t(u,u)!==0)return m;do{let d=c+m>>>1;r(s[d],u)<=0?c=d+1:m=d}while(c<m)}return c}function a(s,u,c=0,m=s.length){let d=i(s,u,c,m-1);return d>c&&n(s[d-1],u)>-n(s[d],u)?d-1:d}return{left:i,center:a,right:o}}function Ef(){return 0}h();function ka(e){return e===null?NaN:+e}var Sc=Rt(Ot),kc=Sc.right,If=Sc.left,zf=Rt(ka).center,Pa=kc;h();var or=class extends Map{constructor(t,r=$f){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(let[n,i]of t)this.set(n,i)}get(t){return super.get(Pc(this,t))}has(t){return super.has(Pc(this,t))}set(t,r){return super.set(jf(this,t),r)}delete(t){return super.delete(Vf(this,t))}};function Pc({_intern:e,_key:t},r){let n=t(r);return e.has(n)?e.get(n):r}function jf({_intern:e,_key:t},r){let n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function Vf({_intern:e,_key:t},r){let n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function $f(e){return e!==null&&typeof e=="object"?e.valueOf():e}h();var Uf=Math.sqrt(50),_f=Math.sqrt(10),Gf=Math.sqrt(2);function ii(e,t,r){let n=(t-e)/Math.max(0,r),i=Math.floor(Math.log10(n)),o=n/Math.pow(10,i),a=o>=Uf?10:o>=_f?5:o>=Gf?2:1,s,u,c;return i<0?(c=Math.pow(10,-i)/a,s=Math.round(e*c),u=Math.round(t*c),s/c<e&&++s,u/c>t&&--u,c=-c):(c=Math.pow(10,i)*a,s=Math.round(e/c),u=Math.round(t/c),s*c<e&&++s,u*c>t&&--u),u<s&&.5<=r&&r<2?ii(e,t,r*2):[s,u,c]}function oi(e,t,r){if(t=+t,e=+e,r=+r,!(r>0))return[];if(e===t)return[e];let n=t<e,[i,o,a]=n?ii(t,e,r):ii(e,t,r);if(!(o>=i))return[];let s=o-i+1,u=new Array(s);if(n)if(a<0)for(let c=0;c<s;++c)u[c]=(o-c)/-a;else for(let c=0;c<s;++c)u[c]=(o-c)*a;else if(a<0)for(let c=0;c<s;++c)u[c]=(i+c)/-a;else for(let c=0;c<s;++c)u[c]=(i+c)*a;return u}function Qr(e,t,r){return t=+t,e=+e,r=+r,ii(e,t,r)[2]}function ar(e,t,r){t=+t,e=+e,r=+r;let n=t<e,i=n?Qr(t,e,r):Qr(e,t,r);return(n?-1:1)*(i<0?1/-i:i)}h();function ai(e,t,r){e=+e,t=+t,r=(i=arguments.length)<2?(t=e,e=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(i);++n<i;)o[n]=e+n*r;return o}h();function ht(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e);break}return this}h();var Mc=Symbol("implicit");function si(){var e=new or,t=[],r=[],n=Mc;function i(o){let a=e.get(o);if(a===void 0){if(n!==Mc)return n;e.set(o,a=t.push(o)-1)}return r[a%r.length]}return i.domain=function(o){if(!arguments.length)return t.slice();t=[],e=new or;for(let a of o)e.has(a)||e.set(a,t.push(a)-1);return i},i.range=function(o){return arguments.length?(r=Array.from(o),i):r.slice()},i.unknown=function(o){return arguments.length?(n=o,i):n},i.copy=function(){return si(t,r).unknown(n)},ht.apply(i,arguments),i}function Jr(){var e=si().unknown(void 0),t=e.domain,r=e.range,n=0,i=1,o,a,s=!1,u=0,c=0,m=.5;delete e.unknown;function d(){var p=t().length,f=i<n,b=f?i:n,g=f?n:i;o=(g-b)/Math.max(1,p-u+c*2),s&&(o=Math.floor(o)),b+=(g-b-o*(p-u))*m,a=o*(1-u),s&&(b=Math.round(b),a=Math.round(a));var y=ai(p).map(function(v){return b+o*v});return r(f?y.reverse():y)}return e.domain=function(p){return arguments.length?(t(p),d()):t()},e.range=function(p){return arguments.length?([n,i]=p,n=+n,i=+i,d()):[n,i]},e.rangeRound=function(p){return[n,i]=p,n=+n,i=+i,s=!0,d()},e.bandwidth=function(){return a},e.step=function(){return o},e.round=function(p){return arguments.length?(s=!!p,d()):s},e.padding=function(p){return arguments.length?(u=Math.min(1,c=+p),d()):u},e.paddingInner=function(p){return arguments.length?(u=Math.min(1,p),d()):u},e.paddingOuter=function(p){return arguments.length?(c=+p,d()):c},e.align=function(p){return arguments.length?(m=Math.max(0,Math.min(1,p)),d()):m},e.copy=function(){return Jr(t(),[n,i]).round(s).paddingInner(u).paddingOuter(c).align(m)},ht.apply(d(),arguments)}h();h();h();h();h();h();h();function ui(e,t,r){e.prototype=t.prototype=r,r.constructor=e}function Ma(e,t){var r=Object.create(e.prototype);for(var n in t)r[n]=t[n];return r}function rn(){}var en=.7,mi=1/en,sr="\\s*([+-]?\\d+)\\s*",tn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Xe="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Wf=/^#([0-9a-f]{3,8})$/,Hf=new RegExp(`^rgb\\(${sr},${sr},${sr}\\)$`),Yf=new RegExp(`^rgb\\(${Xe},${Xe},${Xe}\\)$`),Xf=new RegExp(`^rgba\\(${sr},${sr},${sr},${tn}\\)$`),qf=new RegExp(`^rgba\\(${Xe},${Xe},${Xe},${tn}\\)$`),Zf=new RegExp(`^hsl\\(${tn},${Xe},${Xe}\\)$`),Kf=new RegExp(`^hsla\\(${tn},${Xe},${Xe},${tn}\\)$`),Tc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};ui(rn,gt,{copy(e){return Object.assign(new this.constructor,this,e)},displayable(){return this.rgb().displayable()},hex:Cc,formatHex:Cc,formatHex8:Qf,formatHsl:Jf,formatRgb:Ac,toString:Ac});function Cc(){return this.rgb().formatHex()}function Qf(){return this.rgb().formatHex8()}function Jf(){return Bc(this).formatHsl()}function Ac(){return this.rgb().formatRgb()}function gt(e){var t,r;return e=(e+"").trim().toLowerCase(),(t=Wf.exec(e))?(r=t[1].length,t=parseInt(t[1],16),r===6?Dc(t):r===3?new Ie(t>>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?li(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?li(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Hf.exec(e))?new Ie(t[1],t[2],t[3],1):(t=Yf.exec(e))?new Ie(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Xf.exec(e))?li(t[1],t[2],t[3],t[4]):(t=qf.exec(e))?li(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Zf.exec(e))?Rc(t[1],t[2]/100,t[3]/100,1):(t=Kf.exec(e))?Rc(t[1],t[2]/100,t[3]/100,t[4]):Tc.hasOwnProperty(e)?Dc(Tc[e]):e==="transparent"?new Ie(NaN,NaN,NaN,0):null}function Dc(e){return new Ie(e>>16&255,e>>8&255,e&255,1)}function li(e,t,r,n){return n<=0&&(e=t=r=NaN),new Ie(e,t,r,n)}function eh(e){return e instanceof rn||(e=gt(e)),e?(e=e.rgb(),new Ie(e.r,e.g,e.b,e.opacity)):new Ie}function ur(e,t,r,n){return arguments.length===1?eh(e):new Ie(e,t,r,n??1)}function Ie(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}ui(Ie,ur,Ma(rn,{brighter(e){return e=e==null?mi:Math.pow(mi,e),new Ie(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?en:Math.pow(en,e),new Ie(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Ie(Bt(this.r),Bt(this.g),Bt(this.b),di(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Nc,formatHex:Nc,formatHex8:th,formatRgb:Oc,toString:Oc}));function Nc(){return`#${Ft(this.r)}${Ft(this.g)}${Ft(this.b)}`}function th(){return`#${Ft(this.r)}${Ft(this.g)}${Ft(this.b)}${Ft((isNaN(this.opacity)?1:this.opacity)*255)}`}function Oc(){let e=di(this.opacity);return`${e===1?"rgb(":"rgba("}${Bt(this.r)}, ${Bt(this.g)}, ${Bt(this.b)}${e===1?")":`, ${e})`}`}function di(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Bt(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function Ft(e){return e=Bt(e),(e<16?"0":"")+e.toString(16)}function Rc(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new Ue(e,t,r,n)}function Bc(e){if(e instanceof Ue)return new Ue(e.h,e.s,e.l,e.opacity);if(e instanceof rn||(e=gt(e)),!e)return new Ue;if(e instanceof Ue)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,i=Math.min(t,r,n),o=Math.max(t,r,n),a=NaN,s=o-i,u=(o+i)/2;return s?(t===o?a=(r-n)/s+(r<n)*6:r===o?a=(n-t)/s+2:a=(t-r)/s+4,s/=u<.5?o+i:2-o-i,a*=60):s=u>0&&u<1?0:a,new Ue(a,s,u,e.opacity)}function Lc(e,t,r,n){return arguments.length===1?Bc(e):new Ue(e,t,r,n??1)}function Ue(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}ui(Ue,Lc,Ma(rn,{brighter(e){return e=e==null?mi:Math.pow(mi,e),new Ue(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?en:Math.pow(en,e),new Ue(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,i=2*r-n;return new Ie(Ta(e>=240?e-240:e+120,i,n),Ta(e,i,n),Ta(e<120?e+240:e-120,i,n),this.opacity)},clamp(){return new Ue(Fc(this.h),ci(this.s),ci(this.l),di(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let e=di(this.opacity);return`${e===1?"hsl(":"hsla("}${Fc(this.h)}, ${ci(this.s)*100}%, ${ci(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Fc(e){return e=(e||0)%360,e<0?e+360:e}function ci(e){return Math.max(0,Math.min(1,e||0))}function Ta(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}h();h();function Ca(e,t,r,n,i){var o=e*e,a=o*e;return((1-3*e+3*o-a)*t+(4-6*o+3*a)*r+(1+3*e+3*o-3*a)*n+a*i)/6}function Ec(e){var t=e.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,t-1):Math.floor(r*t),i=e[n],o=e[n+1],a=n>0?e[n-1]:2*i-o,s=n<t-1?e[n+2]:2*o-i;return Ca((r-n/t)*t,a,i,o,s)}}h();function Ic(e){var t=e.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*t),i=e[(n+t-1)%t],o=e[n%t],a=e[(n+1)%t],s=e[(n+2)%t];return Ca((r-n/t)*t,i,o,a,s)}}h();h();var nn=e=>()=>e;function rh(e,t){return function(r){return e+r*t}}function nh(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function zc(e){return(e=+e)==1?pi:function(t,r){return r-t?nh(t,r,e):nn(isNaN(t)?r:t)}}function pi(e,t){var r=t-e;return r?rh(e,r):nn(isNaN(e)?t:e)}var Aa=(function e(t){var r=zc(t);function n(i,o){var a=r((i=ur(i)).r,(o=ur(o)).r),s=r(i.g,o.g),u=r(i.b,o.b),c=pi(i.opacity,o.opacity);return function(m){return i.r=a(m),i.g=s(m),i.b=u(m),i.opacity=c(m),i+""}}return n.gamma=e,n})(1);function jc(e){return function(t){var r=t.length,n=new Array(r),i=new Array(r),o=new Array(r),a,s;for(a=0;a<r;++a)s=ur(t[a]),n[a]=s.r||0,i[a]=s.g||0,o[a]=s.b||0;return n=e(n),i=e(i),o=e(o),s.opacity=1,function(u){return s.r=n(u),s.g=i(u),s.b=o(u),s+""}}}var E1=jc(Ec),I1=jc(Ic);h();h();function Vc(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),i;return function(o){for(i=0;i<r;++i)n[i]=e[i]*(1-o)+t[i]*o;return n}}function $c(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function Uc(e,t){var r=t?t.length:0,n=e?Math.min(r,e.length):0,i=new Array(n),o=new Array(r),a;for(a=0;a<n;++a)i[a]=Lt(e[a],t[a]);for(;a<r;++a)o[a]=t[a];return function(s){for(a=0;a<n;++a)o[a]=i[a](s);return o}}h();function _c(e,t){var r=new Date;return e=+e,t=+t,function(n){return r.setTime(e*(1-n)+t*n),r}}h();function bt(e,t){return e=+e,t=+t,function(r){return e*(1-r)+t*r}}h();function Gc(e,t){var r={},n={},i;(e===null||typeof e!="object")&&(e={}),(t===null||typeof t!="object")&&(t={});for(i in t)i in e?r[i]=Lt(e[i],t[i]):n[i]=t[i];return function(o){for(i in r)n[i]=r[i](o);return n}}h();var Na=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Da=new RegExp(Na.source,"g");function ih(e){return function(){return e}}function oh(e){return function(t){return e(t)+""}}function Wc(e,t){var r=Na.lastIndex=Da.lastIndex=0,n,i,o,a=-1,s=[],u=[];for(e=e+"",t=t+"";(n=Na.exec(e))&&(i=Da.exec(t));)(o=i.index)>r&&(o=t.slice(r,o),s[a]?s[a]+=o:s[++a]=o),(n=n[0])===(i=i[0])?s[a]?s[a]+=i:s[++a]=i:(s[++a]=null,u.push({i:a,x:bt(n,i)})),r=Da.lastIndex;return r<t.length&&(o=t.slice(r),s[a]?s[a]+=o:s[++a]=o),s.length<2?u[0]?oh(u[0].x):ih(t):(t=u.length,function(c){for(var m=0,d;m<t;++m)s[(d=u[m]).i]=d.x(c);return s.join("")})}function Lt(e,t){var r=typeof t,n;return t==null||r==="boolean"?nn(t):(r==="number"?bt:r==="string"?(n=gt(t))?(t=n,Aa):Wc:t instanceof gt?Aa:t instanceof Date?_c:$c(t)?Vc:Array.isArray(t)?Uc:typeof t.valueOf!="function"&&typeof t.toString!="function"||isNaN(t)?Gc:bt)(e,t)}h();function Oa(e,t){return e=+e,t=+t,function(r){return Math.round(e*(1-r)+t*r)}}h();function Ra(e){return function(){return e}}h();function Fa(e){return+e}var Hc=[0,1];function lr(e){return e}function Ba(e,t){return(t-=e=+e)?function(r){return(r-e)/t}:Ra(isNaN(t)?NaN:.5)}function ah(e,t){var r;return e>t&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function sh(e,t,r){var n=e[0],i=e[1],o=t[0],a=t[1];return i<n?(n=Ba(i,n),o=r(a,o)):(n=Ba(n,i),o=r(o,a)),function(s){return o(n(s))}}function uh(e,t,r){var n=Math.min(e.length,t.length)-1,i=new Array(n),o=new Array(n),a=-1;for(e[n]<e[0]&&(e=e.slice().reverse(),t=t.slice().reverse());++a<n;)i[a]=Ba(e[a],e[a+1]),o[a]=r(t[a],t[a+1]);return function(s){var u=Pa(e,s,1,n)-1;return o[u](i[u](s))}}function fi(e,t){return t.domain(e.domain()).range(e.range()).interpolate(e.interpolate()).clamp(e.clamp()).unknown(e.unknown())}function lh(){var e=Hc,t=Hc,r=Lt,n,i,o,a=lr,s,u,c;function m(){var p=Math.min(e.length,t.length);return a!==lr&&(a=ah(e[0],e[p-1])),s=p>2?uh:sh,u=c=null,d}function d(p){return p==null||isNaN(p=+p)?o:(u||(u=s(e.map(n),t,r)))(n(a(p)))}return d.invert=function(p){return a(i((c||(c=s(t,e.map(n),bt)))(p)))},d.domain=function(p){return arguments.length?(e=Array.from(p,Fa),m()):e.slice()},d.range=function(p){return arguments.length?(t=Array.from(p),m()):t.slice()},d.rangeRound=function(p){return t=Array.from(p),r=Oa,m()},d.clamp=function(p){return arguments.length?(a=p?!0:lr,m()):a!==lr},d.interpolate=function(p){return arguments.length?(r=p,m()):r},d.unknown=function(p){return arguments.length?(o=p,d):o},function(p,f){return n=p,i=f,m()}}function on(){return lh()(lr,lr)}h();function La(e,t,r,n){var i=ar(e,t,r),o;switch(n=ft(n??",f"),n.type){case"s":{var a=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=wa(i,a))&&(n.precision=o),ni(n,a)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=va(i,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=xa(i))&&(n.precision=o-(n.type==="%")*2);break}}return ir(n)}function ch(e){var t=e.domain;return e.ticks=function(r){var n=t();return oi(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var i=t();return La(i[0],i[i.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),i=0,o=n.length-1,a=n[i],s=n[o],u,c,m=10;for(s<a&&(c=a,a=s,s=c,c=i,i=o,o=c);m-- >0;){if(c=Qr(a,s,r),c===u)return n[i]=a,n[o]=s,t(n);if(c>0)a=Math.floor(a/c)*c,s=Math.ceil(s/c)*c;else if(c<0)a=Math.ceil(a*c)/c,s=Math.floor(s*c)/c;else break;u=c}return e},e}function cr(){var e=on();return e.copy=function(){return fi(e,cr())},ht.apply(e,arguments),ch(e)}h();function Ea(e,t){e=e.slice();var r=0,n=e.length-1,i=e[r],o=e[n],a;return o<i&&(a=r,r=n,n=a,a=i,i=o,o=a),e[r]=t.floor(i),e[n]=t.ceil(o),e}h();h();h();var Ia=new Date,za=new Date;function me(e,t,r,n){function i(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return i.floor=o=>(e(o=new Date(+o)),o),i.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),i.round=o=>{let a=i(o),s=i.ceil(o);return o-a<s-o?a:s},i.offset=(o,a)=>(t(o=new Date(+o),a==null?1:Math.floor(a)),o),i.range=(o,a,s)=>{let u=[];if(o=i.ceil(o),s=s==null?1:Math.floor(s),!(o<a)||!(s>0))return u;let c;do u.push(c=new Date(+o)),t(o,s),e(o);while(c<o&&o<a);return u},i.filter=o=>me(a=>{if(a>=a)for(;e(a),!o(a);)a.setTime(a-1)},(a,s)=>{if(a>=a)if(s<0)for(;++s<=0;)for(;t(a,-1),!o(a););else for(;--s>=0;)for(;t(a,1),!o(a););}),r&&(i.count=(o,a)=>(Ia.setTime(+o),za.setTime(+a),e(Ia),e(za),Math.floor(r(Ia,za))),i.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?i.filter(n?a=>n(a)%o===0:a=>i.count(0,a)%o===0):i)),i}h();var an=me(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);an.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?me(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):an);var Gk=an.range;h();var qe=me(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*1e3)},(e,t)=>(t-e)/1e3,e=>e.getUTCSeconds()),Yc=qe.range;h();var hi=me(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*1e3)},(e,t)=>{e.setTime(+e+t*6e4)},(e,t)=>(t-e)/6e4,e=>e.getMinutes()),mh=hi.range,mr=me(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*6e4)},(e,t)=>(t-e)/6e4,e=>e.getUTCMinutes()),dh=mr.range;h();var gi=me(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*1e3-e.getMinutes()*6e4)},(e,t)=>{e.setTime(+e+t*36e5)},(e,t)=>(t-e)/36e5,e=>e.getHours()),ph=gi.range,dr=me(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*36e5)},(e,t)=>(t-e)/36e5,e=>e.getUTCHours()),fh=dr.range;h();var zt=me(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/864e5,e=>e.getDate()-1),hh=zt.range,jt=me(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/864e5,e=>e.getUTCDate()-1),gh=jt.range,bi=me(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/864e5,e=>Math.floor(e/864e5)),bh=bi.range;h();function Vt(e){return me(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/6048e5)}var $t=Vt(0),pr=Vt(1),qc=Vt(2),Zc=Vt(3),yt=Vt(4),Kc=Vt(5),Qc=Vt(6),Jc=$t.range,yh=pr.range,xh=qc.range,wh=Zc.range,vh=yt.range,Sh=Kc.range,kh=Qc.range;function Ut(e){return me(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/6048e5)}var ot=Ut(0),fr=Ut(1),em=Ut(2),tm=Ut(3),xt=Ut(4),rm=Ut(5),nm=Ut(6),im=ot.range,Ph=fr.range,Mh=em.range,Th=tm.range,Ch=xt.range,Ah=rm.range,Dh=nm.range;h();var yi=me(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth()),Nh=yi.range,hr=me(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth()),Oh=hr.range;h();var _e=me(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());_e.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:me(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});var Rh=_e.range,je=me(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());je.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:me(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});var Fh=je.range;h();function am(e,t,r,n,i,o){let a=[[qe,1,1e3],[qe,5,5*1e3],[qe,15,15*1e3],[qe,30,30*1e3],[o,1,6e4],[o,5,5*6e4],[o,15,15*6e4],[o,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[t,1,2592e6],[t,3,3*2592e6],[e,1,31536e6]];function s(c,m,d){let p=m<c;p&&([c,m]=[m,c]);let f=d&&typeof d.range=="function"?d:u(c,m,d),b=f?f.range(c,+m+1):[];return p?b.reverse():b}function u(c,m,d){let p=Math.abs(m-c)/d,f=Rt(([,,y])=>y).right(a,p);if(f===a.length)return e.every(ar(c/31536e6,m/31536e6,d));if(f===0)return an.every(Math.max(ar(c,m,d),1));let[b,g]=a[p/a[f-1][2]<a[f][2]/p?f-1:f];return b.every(g)}return[s,u]}var[ja,Va]=am(je,hr,ot,bi,dr,mr),[Lh,Eh]=am(_e,yi,$t,zt,gi,hi);h();h();h();function $a(e){if(0<=e.y&&e.y<100){var t=new Date(-1,e.m,e.d,e.H,e.M,e.S,e.L);return t.setFullYear(e.y),t}return new Date(e.y,e.m,e.d,e.H,e.M,e.S,e.L)}function Ua(e){if(0<=e.y&&e.y<100){var t=new Date(Date.UTC(-1,e.m,e.d,e.H,e.M,e.S,e.L));return t.setUTCFullYear(e.y),t}return new Date(Date.UTC(e.y,e.m,e.d,e.H,e.M,e.S,e.L))}function un(e,t,r){return{y:e,m:t,d:r,H:0,M:0,S:0,L:0}}function _a(e){var t=e.dateTime,r=e.date,n=e.time,i=e.periods,o=e.days,a=e.shortDays,s=e.months,u=e.shortMonths,c=ln(i),m=cn(i),d=ln(o),p=cn(o),f=ln(a),b=cn(a),g=ln(s),y=cn(s),v=ln(u),T=cn(u),C={a:$,A:I,b:J,B:oe,c:null,d:dm,e:dm,f:og,g:hg,G:bg,H:rg,I:ng,j:ig,L:bm,m:ag,M:sg,p:he,q:le,Q:hm,s:gm,S:ug,u:lg,U:cg,V:mg,w:dg,W:pg,x:null,X:null,y:fg,Y:gg,Z:yg,"%":fm},w={a:L,A:j,b:H,B:K,c:null,d:pm,e:pm,f:Sg,g:Rg,G:Bg,H:xg,I:wg,j:vg,L:xm,m:kg,M:Pg,p:X,q:ee,Q:hm,s:gm,S:Mg,u:Tg,U:Cg,V:Ag,w:Dg,W:Ng,x:null,X:null,y:Og,Y:Fg,Z:Lg,"%":fm},A={a:W,A:z,b:B,B:k,c:P,d:cm,e:cm,f:Qh,g:lm,G:um,H:mm,I:mm,j:Xh,L:Kh,m:Yh,M:qh,p:V,q:Hh,Q:eg,s:tg,S:Zh,u:$h,U:Uh,V:_h,w:Vh,W:Gh,x:G,X:Y,y:lm,Y:um,Z:Wh,"%":Jh};C.x=S(r,C),C.X=S(n,C),C.c=S(t,C),w.x=S(r,w),w.X=S(n,w),w.c=S(t,w);function S(R,E){return function(q){var O=[],ve=-1,ce=0,Ae=R.length,De,Qe,Sn;for(q instanceof Date||(q=new Date(+q));++ve<Ae;)R.charCodeAt(ve)===37&&(O.push(R.slice(ce,ve)),(Qe=sm[De=R.charAt(++ve)])!=null?De=R.charAt(++ve):Qe=De==="e"?" ":"0",(Sn=E[De])&&(De=Sn(q,Qe)),O.push(De),ce=ve+1);return O.push(R.slice(ce,ve)),O.join("")}}function M(R,E){return function(q){var O=un(1900,void 0,1),ve=D(O,R,q+="",0),ce,Ae;if(ve!=q.length)return null;if("Q"in O)return new Date(O.Q);if("s"in O)return new Date(O.s*1e3+("L"in O?O.L:0));if(E&&!("Z"in O)&&(O.Z=0),"p"in O&&(O.H=O.H%12+O.p*12),O.m===void 0&&(O.m="q"in O?O.q:0),"V"in O){if(O.V<1||O.V>53)return null;"w"in O||(O.w=1),"Z"in O?(ce=Ua(un(O.y,0,1)),Ae=ce.getUTCDay(),ce=Ae>4||Ae===0?fr.ceil(ce):fr(ce),ce=jt.offset(ce,(O.V-1)*7),O.y=ce.getUTCFullYear(),O.m=ce.getUTCMonth(),O.d=ce.getUTCDate()+(O.w+6)%7):(ce=$a(un(O.y,0,1)),Ae=ce.getDay(),ce=Ae>4||Ae===0?pr.ceil(ce):pr(ce),ce=zt.offset(ce,(O.V-1)*7),O.y=ce.getFullYear(),O.m=ce.getMonth(),O.d=ce.getDate()+(O.w+6)%7)}else("W"in O||"U"in O)&&("w"in O||(O.w="u"in O?O.u%7:"W"in O?1:0),Ae="Z"in O?Ua(un(O.y,0,1)).getUTCDay():$a(un(O.y,0,1)).getDay(),O.m=0,O.d="W"in O?(O.w+6)%7+O.W*7-(Ae+5)%7:O.w+O.U*7-(Ae+6)%7);return"Z"in O?(O.H+=O.Z/100|0,O.M+=O.Z%100,Ua(O)):$a(O)}}function D(R,E,q,O){for(var ve=0,ce=E.length,Ae=q.length,De,Qe;ve<ce;){if(O>=Ae)return-1;if(De=E.charCodeAt(ve++),De===37){if(De=E.charAt(ve++),Qe=A[De in sm?E.charAt(ve++):De],!Qe||(O=Qe(R,q,O))<0)return-1}else if(De!=q.charCodeAt(O++))return-1}return O}function V(R,E,q){var O=c.exec(E.slice(q));return O?(R.p=m.get(O[0].toLowerCase()),q+O[0].length):-1}function W(R,E,q){var O=f.exec(E.slice(q));return O?(R.w=b.get(O[0].toLowerCase()),q+O[0].length):-1}function z(R,E,q){var O=d.exec(E.slice(q));return O?(R.w=p.get(O[0].toLowerCase()),q+O[0].length):-1}function B(R,E,q){var O=v.exec(E.slice(q));return O?(R.m=T.get(O[0].toLowerCase()),q+O[0].length):-1}function k(R,E,q){var O=g.exec(E.slice(q));return O?(R.m=y.get(O[0].toLowerCase()),q+O[0].length):-1}function P(R,E,q){return D(R,t,E,q)}function G(R,E,q){return D(R,r,E,q)}function Y(R,E,q){return D(R,n,E,q)}function $(R){return a[R.getDay()]}function I(R){return o[R.getDay()]}function J(R){return u[R.getMonth()]}function oe(R){return s[R.getMonth()]}function he(R){return i[+(R.getHours()>=12)]}function le(R){return 1+~~(R.getMonth()/3)}function L(R){return a[R.getUTCDay()]}function j(R){return o[R.getUTCDay()]}function H(R){return u[R.getUTCMonth()]}function K(R){return s[R.getUTCMonth()]}function X(R){return i[+(R.getUTCHours()>=12)]}function ee(R){return 1+~~(R.getUTCMonth()/3)}return{format:function(R){var E=S(R+="",C);return E.toString=function(){return R},E},parse:function(R){var E=M(R+="",!1);return E.toString=function(){return R},E},utcFormat:function(R){var E=S(R+="",w);return E.toString=function(){return R},E},utcParse:function(R){var E=M(R+="",!0);return E.toString=function(){return R},E}}}var sm={"-":"",_:" ",0:"0"},ke=/^\s*\d+/,Ih=/^%/,zh=/[\\^$*+?|[\]().{}]/g;function se(e,t,r){var n=e<0?"-":"",i=(n?-e:e)+"",o=i.length;return n+(o<r?new Array(r-o+1).join(t)+i:i)}function jh(e){return e.replace(zh,"\\$&")}function ln(e){return new RegExp("^(?:"+e.map(jh).join("|")+")","i")}function cn(e){return new Map(e.map((t,r)=>[t.toLowerCase(),r]))}function Vh(e,t,r){var n=ke.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function $h(e,t,r){var n=ke.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function Uh(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function _h(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function Gh(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function um(e,t,r){var n=ke.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function lm(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function Wh(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function Hh(e,t,r){var n=ke.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function Yh(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function cm(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function Xh(e,t,r){var n=ke.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function mm(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function qh(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function Zh(e,t,r){var n=ke.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function Kh(e,t,r){var n=ke.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function Qh(e,t,r){var n=ke.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function Jh(e,t,r){var n=Ih.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function eg(e,t,r){var n=ke.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function tg(e,t,r){var n=ke.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function dm(e,t){return se(e.getDate(),t,2)}function rg(e,t){return se(e.getHours(),t,2)}function ng(e,t){return se(e.getHours()%12||12,t,2)}function ig(e,t){return se(1+zt.count(_e(e),e),t,3)}function bm(e,t){return se(e.getMilliseconds(),t,3)}function og(e,t){return bm(e,t)+"000"}function ag(e,t){return se(e.getMonth()+1,t,2)}function sg(e,t){return se(e.getMinutes(),t,2)}function ug(e,t){return se(e.getSeconds(),t,2)}function lg(e){var t=e.getDay();return t===0?7:t}function cg(e,t){return se($t.count(_e(e)-1,e),t,2)}function ym(e){var t=e.getDay();return t>=4||t===0?yt(e):yt.ceil(e)}function mg(e,t){return e=ym(e),se(yt.count(_e(e),e)+(_e(e).getDay()===4),t,2)}function dg(e){return e.getDay()}function pg(e,t){return se(pr.count(_e(e)-1,e),t,2)}function fg(e,t){return se(e.getFullYear()%100,t,2)}function hg(e,t){return e=ym(e),se(e.getFullYear()%100,t,2)}function gg(e,t){return se(e.getFullYear()%1e4,t,4)}function bg(e,t){var r=e.getDay();return e=r>=4||r===0?yt(e):yt.ceil(e),se(e.getFullYear()%1e4,t,4)}function yg(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+se(t/60|0,"0",2)+se(t%60,"0",2)}function pm(e,t){return se(e.getUTCDate(),t,2)}function xg(e,t){return se(e.getUTCHours(),t,2)}function wg(e,t){return se(e.getUTCHours()%12||12,t,2)}function vg(e,t){return se(1+jt.count(je(e),e),t,3)}function xm(e,t){return se(e.getUTCMilliseconds(),t,3)}function Sg(e,t){return xm(e,t)+"000"}function kg(e,t){return se(e.getUTCMonth()+1,t,2)}function Pg(e,t){return se(e.getUTCMinutes(),t,2)}function Mg(e,t){return se(e.getUTCSeconds(),t,2)}function Tg(e){var t=e.getUTCDay();return t===0?7:t}function Cg(e,t){return se(ot.count(je(e)-1,e),t,2)}function wm(e){var t=e.getUTCDay();return t>=4||t===0?xt(e):xt.ceil(e)}function Ag(e,t){return e=wm(e),se(xt.count(je(e),e)+(je(e).getUTCDay()===4),t,2)}function Dg(e){return e.getUTCDay()}function Ng(e,t){return se(fr.count(je(e)-1,e),t,2)}function Og(e,t){return se(e.getUTCFullYear()%100,t,2)}function Rg(e,t){return e=wm(e),se(e.getUTCFullYear()%100,t,2)}function Fg(e,t){return se(e.getUTCFullYear()%1e4,t,4)}function Bg(e,t){var r=e.getUTCDay();return e=r>=4||r===0?xt(e):xt.ceil(e),se(e.getUTCFullYear()%1e4,t,4)}function Lg(){return"+0000"}function fm(){return"%"}function hm(e){return+e}function gm(e){return Math.floor(+e/1e3)}var gr,vm,Sm,xi,km;Ga({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function Ga(e){return gr=_a(e),vm=gr.format,Sm=gr.parse,xi=gr.utcFormat,km=gr.utcParse,gr}function Eg(e){return new Date(e)}function Ig(e){return e instanceof Date?+e:+new Date(+e)}function Wa(e,t,r,n,i,o,a,s,u,c){var m=on(),d=m.invert,p=m.domain,f=c(".%L"),b=c(":%S"),g=c("%I:%M"),y=c("%I %p"),v=c("%a %d"),T=c("%b %d"),C=c("%B"),w=c("%Y");function A(S){return(u(S)<S?f:s(S)<S?b:a(S)<S?g:o(S)<S?y:n(S)<S?i(S)<S?v:T:r(S)<S?C:w)(S)}return m.invert=function(S){return new Date(d(S))},m.domain=function(S){return arguments.length?p(Array.from(S,Ig)):p().map(Eg)},m.ticks=function(S){var M=p();return e(M[0],M[M.length-1],S??10)},m.tickFormat=function(S,M){return M==null?A:c(M)},m.nice=function(S){var M=p();return(!S||typeof S.range!="function")&&(S=t(M[0],M[M.length-1],S??10)),S?p(Ea(M,S)):m},m.copy=function(){return fi(m,Wa(e,t,r,n,i,o,a,s,u,c))},m}h();function wi(){return ht.apply(Wa(ja,Va,je,hr,ot,jt,dr,mr,qe,xi).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}h();h();h();function Q(e){return function(){return e}}h();var Ha=Math.abs,Te=Math.atan2,wt=Math.cos,Pm=Math.max,vi=Math.min,Ge=Math.sin,_t=Math.sqrt,Le=1e-12,br=Math.PI,mn=br/2,yr=2*br;function Mm(e){return e>1?0:e<-1?br:Math.acos(e)}function Ya(e){return e>=1?mn:e<=-1?-mn:Math.asin(e)}h();h();h();var Xa=Math.PI,qa=2*Xa,Gt=1e-6,zg=qa-Gt;function Tm(e){this._+=e[0];for(let t=1,r=e.length;t<r;++t)this._+=arguments[t]+e[t]}function jg(e){let t=Math.floor(e);if(!(t>=0))throw new Error(`invalid digits: ${e}`);if(t>15)return Tm;let r=10**t;return function(n){this._+=n[0];for(let i=1,o=n.length;i<o;++i)this._+=Math.round(arguments[i]*r)/r+n[i]}}var Wt=class{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=t==null?Tm:jg(t)}moveTo(t,r){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,r){this._append`L${this._x1=+t},${this._y1=+r}`}quadraticCurveTo(t,r,n,i){this._append`Q${+t},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,r,n,i,o,a){this._append`C${+t},${+r},${+n},${+i},${this._x1=+o},${this._y1=+a}`}arcTo(t,r,n,i,o){if(t=+t,r=+r,n=+n,i=+i,o=+o,o<0)throw new Error(`negative radius: ${o}`);let a=this._x1,s=this._y1,u=n-t,c=i-r,m=a-t,d=s-r,p=m*m+d*d;if(this._x1===null)this._append`M${this._x1=t},${this._y1=r}`;else if(p>Gt)if(!(Math.abs(d*u-c*m)>Gt)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let f=n-a,b=i-s,g=u*u+c*c,y=f*f+b*b,v=Math.sqrt(g),T=Math.sqrt(p),C=o*Math.tan((Xa-Math.acos((g+p-y)/(2*v*T)))/2),w=C/T,A=C/v;Math.abs(w-1)>Gt&&this._append`L${t+w*m},${r+w*d}`,this._append`A${o},${o},0,0,${+(d*f>m*b)},${this._x1=t+A*u},${this._y1=r+A*c}`}}arc(t,r,n,i,o,a){if(t=+t,r=+r,n=+n,a=!!a,n<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),u=n*Math.sin(i),c=t+s,m=r+u,d=1^a,p=a?i-o:o-i;this._x1===null?this._append`M${c},${m}`:(Math.abs(this._x1-c)>Gt||Math.abs(this._y1-m)>Gt)&&this._append`L${c},${m}`,n&&(p<0&&(p=p%qa+qa),p>zg?this._append`A${n},${n},0,1,${d},${t-s},${r-u}A${n},${n},0,1,${d},${this._x1=c},${this._y1=m}`:p>Gt&&this._append`A${n},${n},0,${+(p>=Xa)},${d},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};function Cm(){return new Wt}Cm.prototype=Wt.prototype;function xr(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new Wt(t)}function Vg(e){return e.innerRadius}function $g(e){return e.outerRadius}function Ug(e){return e.startAngle}function _g(e){return e.endAngle}function Gg(e){return e&&e.padAngle}function Wg(e,t,r,n,i,o,a,s){var u=r-e,c=n-t,m=a-i,d=s-o,p=d*u-m*c;if(!(p*p<Le))return p=(m*(t-o)-d*(e-i))/p,[e+p*u,t+p*c]}function Si(e,t,r,n,i,o,a){var s=e-r,u=t-n,c=(a?o:-o)/_t(s*s+u*u),m=c*u,d=-c*s,p=e+m,f=t+d,b=r+m,g=n+d,y=(p+b)/2,v=(f+g)/2,T=b-p,C=g-f,w=T*T+C*C,A=i-o,S=p*g-b*f,M=(C<0?-1:1)*_t(Pm(0,A*A*w-S*S)),D=(S*C-T*M)/w,V=(-S*T-C*M)/w,W=(S*C+T*M)/w,z=(-S*T+C*M)/w,B=D-y,k=V-v,P=W-y,G=z-v;return B*B+k*k>P*P+G*G&&(D=W,V=z),{cx:D,cy:V,x01:-m,y01:-d,x11:D*(i/A-1),y11:V*(i/A-1)}}function ki(){var e=Vg,t=$g,r=Q(0),n=null,i=Ug,o=_g,a=Gg,s=null,u=xr(c);function c(){var m,d,p=+e.apply(this,arguments),f=+t.apply(this,arguments),b=i.apply(this,arguments)-mn,g=o.apply(this,arguments)-mn,y=Ha(g-b),v=g>b;if(s||(s=m=u()),f<p&&(d=f,f=p,p=d),!(f>Le))s.moveTo(0,0);else if(y>yr-Le)s.moveTo(f*wt(b),f*Ge(b)),s.arc(0,0,f,b,g,!v),p>Le&&(s.moveTo(p*wt(g),p*Ge(g)),s.arc(0,0,p,g,b,v));else{var T=b,C=g,w=b,A=g,S=y,M=y,D=a.apply(this,arguments)/2,V=D>Le&&(n?+n.apply(this,arguments):_t(p*p+f*f)),W=vi(Ha(f-p)/2,+r.apply(this,arguments)),z=W,B=W,k,P;if(V>Le){var G=Ya(V/p*Ge(D)),Y=Ya(V/f*Ge(D));(S-=G*2)>Le?(G*=v?1:-1,w+=G,A-=G):(S=0,w=A=(b+g)/2),(M-=Y*2)>Le?(Y*=v?1:-1,T+=Y,C-=Y):(M=0,T=C=(b+g)/2)}var $=f*wt(T),I=f*Ge(T),J=p*wt(A),oe=p*Ge(A);if(W>Le){var he=f*wt(C),le=f*Ge(C),L=p*wt(w),j=p*Ge(w),H;if(y<br)if(H=Wg($,I,L,j,he,le,J,oe)){var K=$-H[0],X=I-H[1],ee=he-H[0],R=le-H[1],E=1/Ge(Mm((K*ee+X*R)/(_t(K*K+X*X)*_t(ee*ee+R*R)))/2),q=_t(H[0]*H[0]+H[1]*H[1]);z=vi(W,(p-q)/(E-1)),B=vi(W,(f-q)/(E+1))}else z=B=0}M>Le?B>Le?(k=Si(L,j,$,I,f,B,v),P=Si(he,le,J,oe,f,B,v),s.moveTo(k.cx+k.x01,k.cy+k.y01),B<W?s.arc(k.cx,k.cy,B,Te(k.y01,k.x01),Te(P.y01,P.x01),!v):(s.arc(k.cx,k.cy,B,Te(k.y01,k.x01),Te(k.y11,k.x11),!v),s.arc(0,0,f,Te(k.cy+k.y11,k.cx+k.x11),Te(P.cy+P.y11,P.cx+P.x11),!v),s.arc(P.cx,P.cy,B,Te(P.y11,P.x11),Te(P.y01,P.x01),!v))):(s.moveTo($,I),s.arc(0,0,f,T,C,!v)):s.moveTo($,I),!(p>Le)||!(S>Le)?s.lineTo(J,oe):z>Le?(k=Si(J,oe,he,le,p,-z,v),P=Si($,I,L,j,p,-z,v),s.lineTo(k.cx+k.x01,k.cy+k.y01),z<W?s.arc(k.cx,k.cy,z,Te(k.y01,k.x01),Te(P.y01,P.x01),!v):(s.arc(k.cx,k.cy,z,Te(k.y01,k.x01),Te(k.y11,k.x11),!v),s.arc(0,0,p,Te(k.cy+k.y11,k.cx+k.x11),Te(P.cy+P.y11,P.cx+P.x11),v),s.arc(P.cx,P.cy,z,Te(P.y11,P.x11),Te(P.y01,P.x01),!v))):s.arc(0,0,p,A,w,v)}if(s.closePath(),m)return s=null,m+""||null}return c.centroid=function(){var m=(+e.apply(this,arguments)+ +t.apply(this,arguments))/2,d=(+i.apply(this,arguments)+ +o.apply(this,arguments))/2-br/2;return[wt(d)*m,Ge(d)*m]},c.innerRadius=function(m){return arguments.length?(e=typeof m=="function"?m:Q(+m),c):e},c.outerRadius=function(m){return arguments.length?(t=typeof m=="function"?m:Q(+m),c):t},c.cornerRadius=function(m){return arguments.length?(r=typeof m=="function"?m:Q(+m),c):r},c.padRadius=function(m){return arguments.length?(n=m==null?null:typeof m=="function"?m:Q(+m),c):n},c.startAngle=function(m){return arguments.length?(i=typeof m=="function"?m:Q(+m),c):i},c.endAngle=function(m){return arguments.length?(o=typeof m=="function"?m:Q(+m),c):o},c.padAngle=function(m){return arguments.length?(a=typeof m=="function"?m:Q(+m),c):a},c.context=function(m){return arguments.length?(s=m??null,c):s},c}h();h();var P2=Array.prototype.slice;function vt(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}h();function Am(e){this._context=e}Am.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function Ht(e){return new Am(e)}h();h();function Pi(e){return e[0]}function Mi(e){return e[1]}function dn(e,t){var r=Q(!0),n=null,i=Ht,o=null,a=xr(s);e=typeof e=="function"?e:e===void 0?Pi:Q(e),t=typeof t=="function"?t:t===void 0?Mi:Q(t);function s(u){var c,m=(u=vt(u)).length,d,p=!1,f;for(n==null&&(o=i(f=a())),c=0;c<=m;++c)!(c<m&&r(d=u[c],c,u))===p&&((p=!p)?o.lineStart():o.lineEnd()),p&&o.point(+e(d,c,u),+t(d,c,u));if(f)return o=null,f+""||null}return s.x=function(u){return arguments.length?(e=typeof u=="function"?u:Q(+u),s):e},s.y=function(u){return arguments.length?(t=typeof u=="function"?u:Q(+u),s):t},s.defined=function(u){return arguments.length?(r=typeof u=="function"?u:Q(!!u),s):r},s.curve=function(u){return arguments.length?(i=u,n!=null&&(o=i(n)),s):i},s.context=function(u){return arguments.length?(u==null?n=o=null:o=i(n=u),s):n},s}function Za(e,t,r){var n=null,i=Q(!0),o=null,a=Ht,s=null,u=xr(c);e=typeof e=="function"?e:e===void 0?Pi:Q(+e),t=typeof t=="function"?t:t===void 0?Q(0):Q(+t),r=typeof r=="function"?r:r===void 0?Mi:Q(+r);function c(d){var p,f,b,g=(d=vt(d)).length,y,v=!1,T,C=new Array(g),w=new Array(g);for(o==null&&(s=a(T=u())),p=0;p<=g;++p){if(!(p<g&&i(y=d[p],p,d))===v)if(v=!v)f=p,s.areaStart(),s.lineStart();else{for(s.lineEnd(),s.lineStart(),b=p-1;b>=f;--b)s.point(C[b],w[b]);s.lineEnd(),s.areaEnd()}v&&(C[p]=+e(y,p,d),w[p]=+t(y,p,d),s.point(n?+n(y,p,d):C[p],r?+r(y,p,d):w[p]))}if(T)return s=null,T+""||null}function m(){return dn().defined(i).curve(a).context(o)}return c.x=function(d){return arguments.length?(e=typeof d=="function"?d:Q(+d),n=null,c):e},c.x0=function(d){return arguments.length?(e=typeof d=="function"?d:Q(+d),c):e},c.x1=function(d){return arguments.length?(n=d==null?null:typeof d=="function"?d:Q(+d),c):n},c.y=function(d){return arguments.length?(t=typeof d=="function"?d:Q(+d),r=null,c):t},c.y0=function(d){return arguments.length?(t=typeof d=="function"?d:Q(+d),c):t},c.y1=function(d){return arguments.length?(r=d==null?null:typeof d=="function"?d:Q(+d),c):r},c.lineX0=c.lineY0=function(){return m().x(e).y(t)},c.lineY1=function(){return m().x(e).y(r)},c.lineX1=function(){return m().x(n).y(t)},c.defined=function(d){return arguments.length?(i=typeof d=="function"?d:Q(!!d),c):i},c.curve=function(d){return arguments.length?(a=d,o!=null&&(s=a(o)),c):a},c.context=function(d){return arguments.length?(d==null?o=s=null:s=a(o=d),c):o},c}h();h();function Dm(e,t){return t<e?-1:t>e?1:t>=e?0:NaN}h();function Nm(e){return e}function Ka(){var e=Nm,t=Dm,r=null,n=Q(0),i=Q(yr),o=Q(0);function a(s){var u,c=(s=vt(s)).length,m,d,p=0,f=new Array(c),b=new Array(c),g=+n.apply(this,arguments),y=Math.min(yr,Math.max(-yr,i.apply(this,arguments)-g)),v,T=Math.min(Math.abs(y)/c,o.apply(this,arguments)),C=T*(y<0?-1:1),w;for(u=0;u<c;++u)(w=b[f[u]=u]=+e(s[u],u,s))>0&&(p+=w);for(t!=null?f.sort(function(A,S){return t(b[A],b[S])}):r!=null&&f.sort(function(A,S){return r(s[A],s[S])}),u=0,d=p?(y-c*C)/p:0;u<c;++u,g=v)m=f[u],w=b[m],v=g+(w>0?w*d:0)+C,b[m]={data:s[m],index:u,value:w,startAngle:g,endAngle:v,padAngle:T};return b}return a.value=function(s){return arguments.length?(e=typeof s=="function"?s:Q(+s),a):e},a.sortValues=function(s){return arguments.length?(t=s,r=null,a):t},a.sort=function(s){return arguments.length?(r=s,t=null,a):r},a.startAngle=function(s){return arguments.length?(n=typeof s=="function"?s:Q(+s),a):n},a.endAngle=function(s){return arguments.length?(i=typeof s=="function"?s:Q(+s),a):i},a.padAngle=function(s){return arguments.length?(o=typeof s=="function"?s:Q(+s),a):o},a}h();function Om(e){return e<0?-1:1}function Rm(e,t,r){var n=e._x1-e._x0,i=t-e._x1,o=(e._y1-e._y0)/(n||i<0&&-0),a=(r-e._y1)/(i||n<0&&-0),s=(o*i+a*n)/(n+i);return(Om(o)+Om(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(s))||0}function Fm(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function Qa(e,t,r){var n=e._x0,i=e._y0,o=e._x1,a=e._y1,s=(o-n)/3;e._context.bezierCurveTo(n+s,i+s*t,o-s,a-s*r,o,a)}function Ti(e){this._context=e}Ti.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Qa(this,this._t0,Fm(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,Qa(this,Fm(this,r=Rm(this,e,t)),r);break;default:Qa(this,this._t0,r=Rm(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function Hg(e){this._context=new Bm(e)}(Hg.prototype=Object.create(Ti.prototype)).point=function(e,t){Ti.prototype.point.call(this,t,e)};function Bm(e){this._context=e}Bm.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,o){this._context.bezierCurveTo(t,e,n,r,o,i)}};function Ja(e){return new Ti(e)}h();function Lm(e,t){this._context=e,this._t=t}Lm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function es(e){return new Lm(e,1)}h();h();function ts(e,t){if((a=e.length)>1)for(var r=1,n,i,o=e[t[0]],a,s=o.length;r<a;++r)for(i=o,o=e[t[r]],n=0;n<s;++n)o[n][1]+=o[n][0]=isNaN(i[n][1])?i[n][0]:i[n][1]}h();function rs(e){for(var t=e.length,r=new Array(t);--t>=0;)r[t]=t;return r}function Yg(e,t){return e[t]}function Xg(e){let t=[];return t.key=e,t}function ns(){var e=Q([]),t=rs,r=ts,n=Yg;function i(o){var a=Array.from(e.apply(this,arguments),Xg),s,u=a.length,c=-1,m;for(let d of o)for(s=0,++c;s<u;++s)(a[s][c]=[0,+n(d,a[s].key,c,o)]).data=d;for(s=0,m=vt(t(a));s<u;++s)a[m[s]].index=s;return r(a,m),a}return i.keys=function(o){return arguments.length?(e=typeof o=="function"?o:Q(Array.from(o)),i):e},i.value=function(o){return arguments.length?(n=typeof o=="function"?o:Q(+o),i):n},i.order=function(o){return arguments.length?(t=o==null?rs:typeof o=="function"?o:Q(Array.from(o)),i):t},i.offset=function(o){return arguments.length?(r=o??ts,i):r},i}h();function is(e,t){if((u=e.length)>0)for(var r,n=0,i,o,a,s,u,c=e[t[0]].length;n<c;++n)for(a=s=0,r=0;r<u;++r)(o=(i=e[t[r]][n])[1]-i[0])>0?(i[0]=a,i[1]=a+=o):o<0?(i[1]=s,i[0]=s+=o):(i[0]=0,i[1]=o)}var jm=["#6366f1","#22d3ee","#f59e0b","#ec4899","#10b981","#8b5cf6","#f97316","#3b82f6"],qg=e=>typeof e=="object"&&e!==null&&"open"in e&&"close"in e,Zg=e=>typeof e=="object"&&e!==null&&"label"in e&&"value"in e;function Kg(e){return e==="linear"?Ht:e==="step"?es:Ja}function os(e,t){let r=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!r)return e;let n=r[1];n.length===3&&(n=[...n].map(o=>o+o).join(""));let i=parseInt(n,16);return`rgba(${i>>16&255}, ${i>>8&255}, ${i&255}, ${t})`}function Em(e){if(!e?.format)return null;if(typeof e.format=="function")return e.format;let t=ir(e.format);return r=>typeof r=="number"?t(r):String(r)}function re(e){return Math.round(e*100)/100}function wr(e,t=0,r=e.duration){return te.create().fromTo("opacity",0,1,{start:e.start+t,end:e.start+t+Math.max(1,r),ease:"power2.out"})}function Vm(e,t,r){let n=t.id??Z("chart"),i=e.width??(typeof t.width=="number"?t.width:960),o=e.height??(typeof t.height=="number"?t.height:540),a=e.type??"line",s=e.fontSize??18,u=e.fontFamily??r,c=e.textColor??"#94a3b8",m=e.textColor??"#e2e8f0",d=e.gridColor??"rgba(148, 163, 184, 0.18)",p=e.colors?.length?e.colors:jm,f=e.cornerRadius??4,b=e.animate===!1?void 0:e.animate??{},g={enabled:b!==void 0,start:b?.start??0,duration:b?.duration??30,stagger:b?.stagger??-1,ease:b?.ease??"power3.out"},y=[],v=(k,P,G,Y={},$="")=>{let I=F.text(k,{id:`${n}-label-${$||y.length}`,position:"absolute",x:re(P.x),y:re(P.y),width:re(P.width),height:re(P.height),fontFamily:u,fontSize:s,fontWeight:Y.weight??500,fill:Y.color??c,align:G,verticalAlign:"middle"});g.enabled&&I.animate(wr(g,Y.delay??0)),y.push(I)},T=Math.ceil(s*1.4);a==="pie"||a==="donut"?C():A();for(let k of y)$m(k);return F.box({background:e.background??"transparent",...t,id:n,width:i,height:o,children:y});function C(){let k=w(),P=k.reduce((K,X)=>K+Math.max(0,X.value),0),G=e.legend??!0,Y=M({top:16,right:G?V(k.map(K=>K.label)):16,bottom:16,left:16}),$=D(Y),I=Math.max(1,Math.min($.width,$.height)/2),J=I*(e.innerRadius??(a==="donut"?.6:0)),oe=$.x+$.width/2,he=$.y+$.height/2,le=4,L=Ka().sort(null).value(K=>Math.max(0,K.value)).padAngle(k.length>1?.012:0)(k),j=ki().innerRadius(J).outerRadius(I).cornerRadius(Math.min(f,(I-J)/2)),H=S(L.length);L.forEach((K,X)=>{let ee=j(K);if(!ee)return;let R=k[X].color??p[X%p.length],E=F.shape("path",{id:`${n}-slice-${X}`,position:"absolute",x:re(oe-I-le),y:re(he-I-le),width:re(2*(I+le)),height:re(2*(I+le)),d:Qg(ee,I+le,I+le),fillColor:R,anchorX:.5,anchorY:.5});if(g.enabled){let q=g.start+X*H;E.animate(te.create().fromTo("opacity",0,1,{start:q,end:q+g.duration*.5}).fromTo("scale",.85,1,{start:q,end:q+g.duration,ease:g.ease}))}if(y.push(E),e.valueLabels&&P>0&&K.value>0){let[q,O]=ki().innerRadius(J||I*.55).outerRadius(I).centroid(K),ve=`${Math.round(K.value/P*100)}%`;v(ve,{x:oe+q-60,y:he+O-T/2,width:120,height:T},"center",{delay:X*H+g.duration*.5,color:"#ffffff",weight:700},`value-${X}`)}}),G&&W(k.map((K,X)=>({name:K.label,color:K.color??p[X%p.length]})),{x:$.x+$.width+24,y:$.y,height:$.height})}function w(){return(e.data??e.series?.[0]?.data??[]).map((P,G)=>{if(Zg(P))return P;let Y=typeof P=="number"?P:Array.isArray(P)?Number(P[1]):Number(P.y);return{label:e.categories?.[G]??(Array.isArray(P)?String(P[0]):typeof P=="object"&&P?String(P.x):`${G+1}`),value:Y}})}function A(){let k=e.series?.length?[...e.series]:e.data?[{data:e.data}]:[];if(k.length===0)return;let P=N=>N.type??a??"line",G=(N,U)=>N.color??p[U%p.length],Y=k.map(N=>N.data.map((U,ie)=>qg(U)?{x:U.x,y:U.close}:typeof U=="number"?{x:e.categories?.[ie]??ie,y:U}:Array.isArray(U)?{x:U[0],y:Number(U[1])}:{x:U.x,y:Number(U.y)})),$=k.some(N=>P(N)==="bar"||P(N)==="candlestick"),I=Y.flat().map(N=>N.x),J=$||I.some(N=>typeof N=="string")?"band":I.some(N=>N instanceof Date)?"time":"linear",oe=N=>P(N)==="bar"||P(N)==="area",he=!!e.stacked,le=J==="band"?[...new Set(I.map(String))]:[],L=new Map;if(he){let N=k.map((pe,Pe)=>Pe).filter(pe=>oe(k[pe])),U=le.length?le:[...new Set(I.map(pe=>+pe))].sort((pe,Pe)=>pe-Pe).map(String),ie=U.map(pe=>{let Pe={};for(let Ne of N){let Oe=Y[Ne].find(Se=>String(J==="band"?Se.x:+Se.x)===pe);Pe[Ne]=Oe?.y??0}return Pe});ns().keys(N.map(String)).offset(is)(ie).forEach(pe=>{let Pe=Number(pe.key);L.set(Pe,Y[Pe].map(Ne=>{let Oe=U.indexOf(String(J==="band"?Ne.x:+Ne.x));return[pe[Oe][0],pe[Oe][1]]}))})}let j=[0];k.forEach((N,U)=>{let ie=L.get(U);if(P(N)==="candlestick")for(let de of N.data)j.push(de.high,de.low);else if(ie)for(let[de,pe]of ie)j.push(de,pe);else for(let de of Y[U])j.push(de.y)}),k.every(N=>P(N)==="candlestick"||P(N)==="scatter"||P(N)==="line")&&j.shift();let H=e.yAxis??{},K=e.xAxis??{},X=H.ticks??5,ee=H.min??Math.min(...j),R=H.max??Math.max(...j);(!Number.isFinite(ee)||!Number.isFinite(R))&&([ee,R]=[0,1]),ee===R&&([ee,R]=[ee-1,R+1]);let E=cr().domain([ee,R]);(H.min===void 0||H.max===void 0)&&E.nice(X);let q=Em(H)??(N=>E.tickFormat(X)(N)),O=E.ticks(X),ve=k.map((N,U)=>({name:N.name??`Series ${U+1}`,color:G(N,U)})),ce=e.legend??k.length>1,Ae=H.show!==!1,De=K.show!==!1,Qe=Ae?Math.max(...O.map(N=>q(N).length))*s*.7+20:0,Sn=M({top:(ce?T+20:0)+Math.ceil(T/2),right:20,bottom:De?T+14:12,left:Math.max(16,Math.ceil(Qe))}),ae=D(Sn),Cs=T+6,As=e.valueLabels?k.flatMap((N,U)=>P(N)==="bar"?Y[U].map(ie=>ie.y):[]):[],Od=As.some(N=>N>0)?Cs:0,Rd=As.some(N=>N<0)?Cs:0;E.range([ae.height-Rd,Od]);let Je;if(J==="band")Je=Jr().domain(le).range([0,ae.width]).paddingInner($?.28:0).paddingOuter($?.14:.5);else if(J==="time"){let N=I.map(U=>+new Date(U));Je=wi().domain([Math.min(...N),Math.max(...N)]).range([0,ae.width])}else{let N=I.map(Number);Je=cr().domain([K.min??Math.min(...N),K.max??Math.max(...N)]).range([0,ae.width])}let Ds=N=>{if(J==="band"){let U=Je;return(U(String(N))??0)+U.bandwidth()/2}return Je(J==="time"?new Date(N):Number(N))},Ns=0;H.grid!==!1&&O.forEach((N,U)=>{let ie=F.box({id:`${n}-ygrid-${U}`,position:"absolute",x:ae.x,y:re(ae.y+E(N)-.5),width:ae.width,height:1,background:d});g.enabled&&ie.animate(wr(g,Ns,g.duration/2)),y.push(ie)}),Ae&&O.forEach((N,U)=>{v(q(N),{x:0,y:ae.y+E(N)-T/2,width:ae.x-12,height:T},"end",{},`y-${U}`)});let Mr=[],kn=Em(K);if(J==="band"){let N=Je,U=Math.max(1,Math.ceil(le.length/Math.max(1,Math.floor(ae.width/(s*4)))));le.forEach((ie,de)=>{de%U===0&&Mr.push({pos:(N(ie)??0)+N.bandwidth()/2,text:kn?kn(ie):ie})})}else{let N=Je,U=K.ticks??Math.max(2,Math.floor(ae.width/(s*6))),ie=N.tickFormat(U);for(let de of N.ticks(U))Mr.push({pos:N(de),text:kn?kn(J==="time"?new Date(de):de):ie(de)})}if(K.grid&&Mr.forEach((N,U)=>{let ie=F.box({id:`${n}-xgrid-${U}`,position:"absolute",x:re(ae.x+N.pos-.5),y:ae.y,width:1,height:ae.height,background:d});g.enabled&&ie.animate(wr(g,Ns,g.duration/2)),y.push(ie)}),De){let N=Math.max(s*3,ae.width/Math.max(1,Mr.length));Mr.forEach((U,ie)=>{v(U.text,{x:ae.x+U.pos-N/2,y:ae.y+ae.height+10,width:N,height:T},"center",{},`x-${ie}`)})}let[Fd,Bd]=E.domain();if(Fd<=0&&Bd>=0&&$){let N=F.box({id:`${n}-zero`,position:"absolute",x:ae.x,y:re(ae.y+E(0)-1),width:ae.width,height:2,background:os("#94a3b8",.45)});g.enabled&&N.animate(wr(g,0,g.duration/2)),y.push(N)}let Pn=k.map((N,U)=>U).filter(N=>P(k[N])==="bar"),Ld=[...Pn,...k.map((N,U)=>U).filter(N=>P(k[N])==="candlestick"),...k.map((N,U)=>U).filter(N=>P(k[N])==="area"),...k.map((N,U)=>U).filter(N=>P(k[N])==="line"),...k.map((N,U)=>U).filter(N=>P(k[N])==="scatter")],lt=J==="band"?Je:null,Os=lt?S(le.length):0,Rs=N=>lt?le.indexOf(String(N)):0;Ld.forEach((N,U)=>{let ie=k[N],de=G(ie,N),pe=P(ie),Pe=Y[N],Ne=L.get(N);if(pe==="bar"&&lt){let Oe=he?1:Pn.length,Se=he?0:Pn.indexOf(N),Re=lt.bandwidth()/Oe,fe=Oe>1?Math.min(4,Re*.12):0;Pe.forEach((Fe,We)=>{let[ct,Me]=Ne?Ne[We]:[0,Fe.y],ye=ae.y+E(Math.max(ct,Me)),Mn=ae.y+E(Math.min(ct,Me)),Be=Math.max(0,Mn-ye),Tr=ae.x+(lt(String(Fe.x))??0)+Se*Re+fe/2,Pt=Fe.y>=0?"up":"down",Tn=F.box({id:`${n}-bar-${N}-${We}`,position:"absolute",x:re(Tr),y:re(ye),width:re(Math.max(1,Re-fe)),height:re(Be),background:de,borderRadius:Math.min(f,(Re-fe)/2,Be/2)}),Bs=Rs(Fe.x)*Os+(he?Pn.indexOf(N)*g.duration*.6:0);if(g.enabled){let Cr=g.start+Bs,Cn=Cr+g.duration,Ls=te.create().fromTo("height",0,re(Be),{start:Cr,end:Cn,ease:g.ease});Pt==="up"&&Ls.fromTo("y",re(ye+Be),re(ye),{start:Cr,end:Cn,ease:g.ease}),Tn.animate(Ls)}if(y.push(Tn),e.valueLabels){let Cr=q(Fe.y),Cn=Pt==="up"?ye-T-4:ye+Be+4;v(Cr,{x:Tr-30,y:Cn,width:Re-fe+60,height:T},"center",{delay:Bs+g.duration*.6,color:m,weight:600},`value-${N}-${We}`)}});return}if(pe==="candlestick"&&lt){let Oe=e.upColor??"#22c55e",Se=e.downColor??"#ef4444",Re=lt.bandwidth();ie.data.forEach((fe,Fe)=>{let We=fe.close>=fe.open?Oe:Se,ct=ae.x+(lt(String(fe.x))??0)+Re/2,Me=Rs(fe.x)*Os,ye=[["wick",{x:ct-Math.max(1,Re*.06),y:ae.y+E(fe.high),width:Math.max(2,Re*.12),height:Math.max(1,E(fe.low)-E(fe.high))}],["body",{x:ct-Re/2,y:ae.y+E(Math.max(fe.open,fe.close)),width:Re,height:Math.max(2,Math.abs(E(fe.open)-E(fe.close)))}]];for(let[Mn,Be]of ye){let Tr=F.box({id:`${n}-candle-${N}-${Fe}-${Mn}`,position:"absolute",x:re(Be.x),y:re(Be.y),width:re(Be.width),height:re(Be.height),background:We,borderRadius:Mn==="body"?Math.min(f/2,Be.width/2):0});if(g.enabled){let Pt=g.start+Me,Tn=Be.y+Be.height/2;Tr.animate(te.create().fromTo("height",0,re(Be.height),{start:Pt,end:Pt+g.duration,ease:g.ease}).fromTo("y",re(Tn),re(Be.y),{start:Pt,end:Pt+g.duration,ease:g.ease}))}y.push(Tr)}});return}if(pe==="line"||pe==="area"){let Oe=ie.strokeWidth??3,Se=Math.ceil(Oe*2+(ie.pointRadius??0)+2),Re=Pe.map((Me,ye)=>({x:Ds(Me.x)+Se,top:E(Ne?Ne[ye][1]:Me.y)+Se,base:E(Ne?Ne[ye][0]:Math.max(E.domain()[0],Math.min(0,E.domain()[1])))+Se})),fe=Kg(ie.curve),Fe={x:ae.x-Se,y:ae.y-Se,width:ae.width+2*Se,height:ae.height+2*Se},We=U*(g.duration/3);if(pe==="area"){let Me=Za().x(ye=>ye.x).y0(ye=>ye.base).y1(ye=>ye.top).curve(fe)(Re);if(Me){let ye=F.shape("path",{id:`${n}-area-${N}`,position:"absolute",...Im(Fe),d:zm(Me),fillType:"linear",fillColor:os(de,.45),gradientEndColor:os(de,.02),gradientAngle:90});g.enabled&&ye.animate(wr(g,We+g.duration*.4,g.duration)),y.push(ye)}}let ct=dn().x(Me=>Me.x).y(Me=>Me.top).curve(fe)(Re);if(ct&&Oe>0){let Me=F.shape("path",{id:`${n}-line-${N}`,position:"absolute",...Im(Fe),d:zm(ct),fillType:"none",strokeColor:de,strokeWidth:Oe,strokeLineCap:"round",strokeLineJoin:"round"});g.enabled&&Me.animate(te.create().fromTo("trimEnd",0,1,{start:g.start+We,end:g.start+We+g.duration*1.5,ease:"power2.inOut"})),y.push(Me)}(ie.pointRadius??0)>0&&Fs(N,Pe,de,ie.pointRadius??0,We+g.duration*.5,Ne);return}pe==="scatter"&&Fs(N,Pe,de,ie.pointRadius??6,U*(g.duration/3),Ne)}),ce&&z(ve);function Fs(N,U,ie,de,pe,Pe){let Ne=S(U.length);U.forEach((Oe,Se)=>{let Re=E(Pe?Pe[Se][1]:Oe.y),fe=F.shape("circle",{id:`${n}-point-${N}-${Se}`,position:"absolute",x:re(ae.x+Ds(Oe.x)-de),y:re(ae.y+Re-de),width:re(de*2),height:re(de*2),fillColor:ie,anchorX:.5,anchorY:.5});if(g.enabled){let Fe=g.start+pe+Se*Ne;fe.animate(te.create().fromTo("scale",0,1,{start:Fe,end:Fe+g.duration*.6,ease:"back.out(2)"}).fromTo("opacity",0,1,{start:Fe,end:Fe+6}))}y.push(fe)})}}function S(k){return!g.enabled||k<=1?0:g.stagger>=0?g.stagger:Math.min(4,g.duration/k)}function M(k){let P=e.padding;return typeof P=="number"?{top:P,right:P,bottom:P,left:P}:{top:P?.top??k.top,right:P?.right??k.right,bottom:P?.bottom??k.bottom,left:P?.left??k.left}}function D(k){return{x:k.left,y:k.top,width:Math.max(1,i-k.left-k.right),height:Math.max(1,o-k.top-k.bottom)}}function V(k){let P=Math.max(0,...k.map(G=>G.length));return Math.min(i*.4,P*s*.6+s+48)}function W(k,P){let G=T+8,Y=P.y+Math.max(0,(P.height-k.length*G)/2);k.forEach(($,I)=>{B($,P.x,Y+I*G,I)})}function z(k){let P=k.map($=>$.name.length*s*.6+s+28),G=P.reduce(($,I)=>$+I,0),Y=Math.max(0,i-G-20);k.forEach(($,I)=>{B($,Y,4,I),Y+=P[I]})}function B(k,P,G,Y){let $=Math.round(s*.7),I=F.box({id:`${n}-legend-swatch-${Y}`,position:"absolute",x:re(P),y:re(G+(T-$)/2),width:$,height:$,borderRadius:Math.round($/4),background:k.color});g.enabled&&I.animate(wr(g,0,g.duration/2)),y.push(I),v(k.name,{x:P+$+8,y:G,width:k.name.length*s*.6+12,height:T},"start",{color:e.textColor??"#cbd5e1"},`legend-${Y}`)}}function $m(e){for(let t of e.animation?.tracks??[])for(let r of t.keyframes??[])r.frame=Math.round(r.frame);for(let t of e.children??[])$m(t)}function Im(e){return{x:re(e.x),y:re(e.y),width:re(e.width),height:re(e.height)}}function zm(e){return e.replace(/-?\d*\.\d{3,}(?:e-?\d+)?/gi,t=>String(re(Number(t))))}function Qg(e,t,r){let n=[],i=/([MLAZ])([^MLAZ]*)/gi;for(let[,o,a]of e.matchAll(i)){let s=(a.match(/-?\d*\.?\d+(?:e-?\d+)?/gi)??[]).map(Number);if(o.toUpperCase()==="A")for(let u=0;u+6<s.length;u+=7)s[u+5]+=t,s[u+6]+=r;else if(o.toUpperCase()!=="Z")for(let u=0;u+1<s.length;u+=2)s[u]+=t,s[u+1]+=r;n.push(o+s.map(re).join(","))}return n.join("")}h();var Um=24,Jg=1,as,eb=0;function tb(){return as??=import("./src-4IUYUKIZ.mjs").catch(e=>{throw as=void 0,new Error("Prompted sam2/sam3 tracking needs the optional @framefields/vision-sam package. Install it next to framefields.",{cause:e})}),as}var pn=class{source;fps;compositionFps;startFrame;trimStartSec;smoothing;options;results=new Map;sourceWidth=0;sourceHeight=0;cellW=0;cellH=0;cell;queue=Promise.resolve();runner;sam2Tracker;sam2Frame=-1;sam3Tracker;sam3Frame=-1;sam;decoderId=`clip-vision#${++eb}#`;signalBundle;publishedSignals=new Set;signalMaskFrame=-1;signalMasks=new Map;trackCounts=new Map;cacheLoaded;unsaved=0;unsavedSubjects=0;blurred=new Map;smoothed=new Map;personView;subjects=new Map;wantSubjects=!1;subjectsLoaded;constructor(t,r,n={}){if(this.source=t,n.sam2&&n.sam3)throw new Error("Choose one prompted backend: sam2 or sam3.");this.options=n.sam2?{...n,sam2:{...n.sam2,prompts:n.sam2.prompts.map(i=>({...i,points:i.points.map(o=>({...o}))}))}}:n.sam3?{...n,sam3:{...n.sam3,prompts:(n.sam3.prompts??(n.sam3.text?[{frame:0,text:n.sam3.text}]:[])).map(i=>({...i,...i.points?{points:i.points.map(o=>({...o}))}:{}}))}}:n,this.compositionFps=r,this.fps=n.fps??r,this.startFrame=Math.round(n.startFrame??0),this.trimStartSec=n.trimStartSec??0,this.smoothing=Math.max(0,Math.round(n.smoothing??(n.sam2||n.sam3?0:2))),this.cell=Math.max(1,Math.round(n.maskCell??8)),(n.sam2||n.sam3)&&(this.wantSubjects=!0)}get exact(){return this.options.sam2!==void 0||this.options.sam3!==void 0}get signals(){return this.keepSubjects(),this.signalBundle??=new Rr({fps:this.compositionFps,totalFrames:Number.MAX_SAFE_INTEGER,maskSource:t=>this.trackIds(t).flatMap(r=>{let n=this.maskAt(t,r);return n&&n.area>0?[n]:[]}),matteSource:t=>{let r=this.maskAt(t);return r?{mask:r.mask,width:r.width,height:r.height,coverage:r.coverage}:void 0}}),this.signalBundle}decoder(){return Or.getVideo(this.source,!0,this.decoderId)}release(){Or.clearNode(this.decoderId),this.sam2Tracker?.release(),this.sam2Tracker=void 0,this.sam2Frame=-1,this.sam3Tracker?.release(),this.sam3Tracker=void 0,this.sam3Frame=-1,this.runner?.close(),this.runner=void 0,this.signalMaskFrame=-1,this.signalMasks.clear(),this.publishedSignals.clear()}get person(){return this.personView??=new Ci(this),this.personView}ready(t,r=t){let[n,i]=this.window(t,r),o=this.queue.then(async()=>{try{await this.compute(n,i)}catch(a){throw this.release(),a}this.signalBundle&&this.publishSignals(Math.min(t,r),Math.max(t,r))});return this.queue=o.catch(()=>{}),o}isReady(t){let[r,n]=this.window(t,t);for(let i=r;i<=n;i++)if(!this.analysed(i))return!1;return!0}keepSubjects(){this.wantSubjects=!0}subject(t,r){let n=this.sourceFrame(t,r);if(n===void 0)return;let i=this.subjects.get(n);if(i===void 0)return i;if(i===null||!this.sourceWidth)return null;let o=this.sourceWidth,a=this.sourceHeight;return{category:i.category,mask:Wm(i,o*a),width:o,height:a,area:i.area,coverage:i.area/(o*a),detectionIndex:-1}}pose(t,r){let n=this.sourceFrame(t,r);if(n===void 0||!this.tracksPose||!this.sourceWidth)return;for(let a=n-this.smoothing;a<=n+this.smoothing;a++)if(!this.results.has(Math.max(0,a)))return;if(!this.results.get(n)?.kp)return null;let i=this.sourceWidth,o=this.sourceHeight;return{width:i,height:o,keypoints:Array.from({length:17},(a,s)=>{let[u,c,m]=this.keypoint(s,n);return{x:u/i,y:c/o,visibility:m}})}}get tracksPose(){return this.exact?this.options.pose===!0:this.options.pose??!0}sourceFrame(t,r){let n=t*this.fps/r;if(!(!this.exact&&!this.options.timeRemap&&Math.abs(n-Math.round(n))>1e-6))return this.options.timeRemap||this.exact?Math.floor(n+1e-6):Math.round(n)}clipFrame(t){return this.options.timeRemap?Us(this.options.timeRemap,this.localFrame(t),this.compositionFps)*this.fps:((t-this.startFrame)/this.compositionFps+this.trimStartSec)*this.fps}localFrame(t){let r=Math.max(0,t-this.startFrame);return this.options.durationFrames===void 0?r:Math.min(r,Math.max(0,this.options.durationFrames-1))}window(t,r){let n=this.options.timeRemap?Dn(this.options.timeRemap,this.localFrame(Math.min(t,r)),this.localFrame(Math.max(t,r)),this.compositionFps):void 0,i=Math.floor(n?n.min*this.fps:this.clipFrame(Math.min(t,r))),o=Math.ceil(n?n.max*this.fps:this.clipFrame(Math.max(t,r)));return[Math.max(0,i-Um-this.smoothing),Math.max(0,o+this.smoothing)]}analysed(t){return this.results.has(t)&&(!this.wantSubjects||this.subjects.has(t))}prompted(){return this.sam??=tb().then(t=>(this.options.sam2&&t.validateSam2Prompts(this.options.sam2.prompts),this.options.sam3&&t.validateSam3Prompts(this.options.sam3),t)),this.sam}async compute(t,r){this.exact&&await this.prompted(),this.cacheLoaded??=this.loadCache(),await this.cacheLoaded,this.wantSubjects&&(this.subjectsLoaded??=this.loadSubjects(),await this.subjectsLoaded);let n=!1;for(let s=t;s<=r;s++)this.analysed(s)||(n=!0);if(!n)return;if(this.options.sam2){await this.computeSam2(r);return}if(this.options.sam3){await this.computeSam3(r);return}let i=this.tracksPose,o=this.options.mask??!0;this.runner??=Qt.create({modelsDir:this.options.modelsDir,baseUrl:this.options.baseUrl,...this.options.confidence!==void 0&&{confidence:this.options.confidence},...this.options.variant!==void 0&&{variant:this.options.variant}});let a=this.decoder();for(let s=t;s<=r;s++){if(this.analysed(s))continue;let u=await ss(await a.getFrame(s/this.fps));if(!u){this.results.set(s,{kp:null,mask:null}),this.wantSubjects&&this.subjects.set(s,null);continue}this.sourceWidth||this.setSize(u.width,u.height);let c=this.results.get(s),m=c?.kp??null,d=c?.mask??null;if(i&&!c){let f=(await this.runner.pose(u)).people[0];if(f){m=new Float32Array(51);for(let[b,g]of f.keypoints.entries())m.set([g.x,g.y,g.visibility],b*3)}}let p=o&&!c||this.wantSubjects?await this.runner.segment(u):void 0;if(p&&this.wantSubjects){let f=eo(p.masks);this.subjects.set(s,f?{category:f.category,area:f.area,...Gm(f.mask)}:null),this.unsavedSubjects++}if(p&&o&&!c){let f=nb(p);f&&(d=new Uint8Array(this.cellW*this.cellH),_m(f,u.width,u.height,this.cell,d,this.cellW,this.cellH))}this.results.set(s,{kp:m,mask:d}),c||this.unsaved++,this.unsaved>=24&&await this.saveCache(),this.unsavedSubjects>=24&&await this.saveSubjects()}this.unsaved>0&&await this.saveCache(),this.unsavedSubjects>0&&await this.saveSubjects()}async computeSam2(t){let r=this.options.sam2;if(!r)return;let n=r.prompts[0]?.frame??0;for(let o=0;o<Math.min(n,t+1);o++)this.results.set(o,{kp:null,mask:null,score:0}),this.subjects.set(o,null);if(t<n)return;let i=this.decoder();if(!this.sam2Tracker){let o=Math.max(1,Math.ceil(await i.durationSec()*this.fps-1e-6));if(r.prompts.some(s=>s.frame>=o))throw new Error("SAM 2 prompt frames must be inside the source video.");let{Sam2Tracker:a}=await this.prompted();this.sam2Tracker=await a.create({modelsDir:this.options.modelsDir,baseUrl:this.options.baseUrl,frameCount:o,model:r.model}),this.sam2Frame=n-1}for(let o=this.sam2Frame+1;o<=t;o++){let a=await ss(await i.getFrame(o/this.fps));if(!a)throw new Error(`Cannot decode SAM 2 source frame ${o}.`);this.sourceWidth||this.setSize(a.width,a.height);let s=r.prompts.find(m=>m.frame===o),u=await this.sam2Tracker.process(a,o,s?.points),c=this.tracksPose?await this.matchedPose(a,u.mask):null;this.storeSamFrame(o,u.width,u.height,[u],c),this.unsaved>=24&&(await this.saveCache(),await this.saveSubjects())}await this.saveCache(),await this.saveSubjects()}async computeSam3(t){let r=this.options.sam3;if(!r)return;let n=r.prompts[0]?.frame??0;for(let o=0;o<Math.min(n,t+1);o++)this.results.set(o,{kp:null,mask:null,score:0}),this.subjects.set(o,null);if(t<n)return;let i=this.decoder();if(!this.sam3Tracker){let o=Math.max(1,Math.ceil(await i.durationSec()*this.fps-1e-6));if(r.prompts.some(s=>s.frame>=o))throw new Error("SAM 3 prompt frames must be inside the source video.");let{Sam3Tracker:a}=await this.prompted();this.sam3Tracker=await a.create({modelsDir:this.options.modelsDir,baseUrl:this.options.baseUrl,frameCount:o,textThreshold:r.textThreshold,maxObjects:r.maxObjects,merge:r.merge,redetect:r.redetect,precision:r.precision,acceptLicense:this.options.acceptSamLicense??this.options.sam3?.acceptLicense}),this.sam3Frame=n-1}for(let o=this.sam3Frame+1;o<=t;o++){let a=await ss(await i.getFrame(o/this.fps));if(!a)throw new Error(`Cannot decode SAM 3 source frame ${o}.`);this.sourceWidth||this.setSize(a.width,a.height);let s=r.prompts.find(m=>m.frame===o),u=await this.sam3Tracker.process(a,o,s),c=this.tracksPose?await this.matchedPose(a,sb(u.objects,a)):null;this.storeSamFrame(o,u.width,u.height,u.objects,c),this.unsaved>=24&&(await this.saveCache(),await this.saveSubjects())}await this.saveCache(),await this.saveSubjects()}storeSamFrame(t,r,n,i,o){let a=new Uint8Array(r*n),s=[...i.keys()].sort((p,f)=>(i[p]?.score??0)-(i[f]?.score??0));for(let p of s){let f=i[p]?.mask;if(f)for(let b=0;b<f.length;b++)(f[b]??0)>=128&&(a[b]=p+1)}let u=Uint8Array.from(a,p=>p?255:0),c=new Uint8Array(this.cellW*this.cellH);_m(u,r,n,this.cell,c,this.cellW,this.cellH);let m=0;for(let p of a)p&&m++;let d=i.map(p=>1/(1+Math.exp(-p.score)));this.results.set(t,{kp:o,mask:c,score:Math.max(0,...d)}),this.subjects.set(t,m>0?{category:this.samCategory(),area:m,scores:d,...Gm(a)}:null),this.trackCounts.set(t,i.length),this.blurred.delete(t),this.options.sam3?this.sam3Frame=t:this.sam2Frame=t,this.unsaved++,this.unsavedSubjects++}samCategory(){return this.options.sam2?.category??this.options.sam3?.category??"object"}async matchedPose(t,r){this.runner??=Qt.create({modelsDir:this.options.modelsDir,baseUrl:this.options.baseUrl,variant:this.options.variant});let{people:n}=await this.runner.pose(t),o=n.map(a=>({person:a,overlap:a.keypoints.reduce((s,u)=>{let c=Math.max(0,Math.min(t.width-1,Math.round(u.x))),m=Math.max(0,Math.min(t.height-1,Math.round(u.y)));return s+(r[m*t.width+c]??0)/255*u.visibility},0)})).sort((a,s)=>s.overlap-a.overlap)[0];return!o||o.overlap<2?null:Float32Array.from(o.person.keypoints.flatMap(a=>[a.x,a.y,a.visibility]))}trackIds(t){let r=Math.max(0,Math.floor(this.clipFrame(t))),n=this.subjects.get(r)?.scores?.length??this.trackCounts.get(r)??1;return Array.from({length:n},(i,o)=>o+1)}maskAt(t,r){let n=Math.max(0,Math.floor(this.clipFrame(t)));this.signalMaskFrame!==n&&(this.signalMaskFrame=n,this.signalMasks.clear());let i=this.signalMasks.get(r??0);if(i)return i;if(!this.results.has(n)||!this.sourceWidth)return;let o=this.subjects.get(n),a=this.sourceWidth*this.sourceHeight,s=o?Wm(o,a,r):new Uint8Array(a),u=o?.area??0;if(r!==void 0&&o?.scores){u=0;for(let m of s)m&&u++}let c={category:o?.category??this.samCategory(),mask:s,width:this.sourceWidth,height:this.sourceHeight,area:u,coverage:u/a,detectionIndex:(r??1)-1,trackId:r??1};return this.signalMasks.set(r??0,c),c}publishSignals(t,r){let n=this.signalBundle;if(!(!n||!this.sourceWidth)){n.setFrameSize(this.sourceWidth,this.sourceHeight);for(let i=t;i<=r;i++){if(this.publishedSignals.has(i))continue;this.publishedSignals.add(i);let o=Math.max(0,Math.floor(this.clipFrame(i))),a=this.maskAt(i);if(!a)continue;let s=n.getObjectResult(i-1).objects,u=this.subjects.get(o)?.scores,c=this.trackIds(i).flatMap(p=>{let f=this.maskAt(i,p);return f?[to(f,i,this.compositionFps,u?.[p-1]??this.results.get(o)?.score??1,s.find(b=>b.trackId===p))]:[]});n.setObjectResult(i,c);let m=c[0]??to(a,i,this.compositionFps,0),d=this.results.get(o)?.kp;n.setPoseResult(i,{people:d?[{score:m.score,boundingBox:m.boundingBox,trackId:1,keypoints:Array.from({length:17},(p,f)=>({x:(d[f*3]??0)/a.width,y:(d[f*3+1]??0)/a.height,visibility:d[f*3+2]??0}))}]:[]})}}}setSize(t,r){this.sourceWidth=t,this.sourceHeight=r,this.cellW=Math.ceil(t/this.cell),this.cellH=Math.ceil(r/this.cell)}size(){return{width:this.sourceWidth,height:this.sourceHeight}}result(t){return this.results.get(Math.max(0,t))}keypoint(t,r){r=Math.max(0,r);let n=`${t}:${r}`,i=this.smoothed.get(n);if(i)return i;let o=s=>{let u=0,c=0,m=0,d=0;for(let p=s-this.smoothing;p<=s+this.smoothing;p++){let f=this.mustHave(p<0?0:p);if(!f.kp)continue;let b=f.kp[t*3+2],g=(this.smoothing+1-Math.abs(p-s))*b*b;u+=f.kp[t*3]*g,c+=f.kp[t*3+1]*g,m+=b*g,d+=g}return d>1e-6?[u/d,c/d,m/d]:null},a=null;for(let s=0;s<=Um&&!a;s++)r-s>=0&&(a=o(r-s));return a??=[this.sourceWidth/2,this.sourceHeight/2,0],this.smoothed.set(n,a),a}blurredMask(t){if(t=Math.max(0,t),this.blurred.has(t))return this.blurred.get(t)??null;this.mustHave(t);let r=this.exact?this.results.get(t)?.mask??null:ib(this.results,t,this.smoothing),n=r?ab(r,this.cellW,this.cellH,2):null;return this.blurred.set(t,n),n}grid(){return{cell:this.cell,width:this.cellW,height:this.cellH}}mustHave(t){let r=this.results.get(t);if(r)return r;throw new Error(`ClipVision "${this.source}": frame ${t} is not analysed yet. Read it while rendering (the composition prepares each frame), in a live physics world, or after \`await clip.ready(frame)\`.`)}cacheFile;async cachePath(){if(this.cacheFile!==void 0)return this.cacheFile;if(this.cacheFile=null,this.options.cacheDir===!1||typeof x>"u"||!x.versions?.node)return null;try{let[t,r,n,i]=await Promise.all([import("./shims/fs.mjs"),import("./shims/path.mjs"),import("./shims/os.mjs"),import("./crypto-TRDUAUC5.mjs")]),o=t.statSync(this.source),a=this.options.cacheDir??x.env.FRAMEFIELDS_VISION_CACHE_DIR??r.join(n.homedir(),".cache","framefields","vision"),s=this.options,u=this.exact?await this.prompted():void 0,c=JSON.stringify([Jg,r.resolve(this.source),o.size,o.mtimeMs,this.fps,this.tracksPose,s.mask??!0,this.cell,s.variant??"s",s.confidence??null,...s.sam2?[[u?.sam2Revision(s.sam2.model),s.sam2,3]]:[],...s.sam3&&u?[[u.sam3Revision(await u.sam3Precision(void 0,s.sam3.precision)),s.sam3,3]]:[]]),m=i.createHash("sha256").update(c).digest("hex").slice(0,24);t.mkdirSync(a,{recursive:!0}),this.cacheFile=r.join(a,`${r.basename(this.source)}.${m}.json`)}catch{this.cacheFile=null}return this.cacheFile}async loadCache(){let t=await this.cachePath();if(t)try{let r=await import("./shims/fs.mjs");if(!r.existsSync(t))return;let n=JSON.parse(r.readFileSync(t,"utf8"));if(n.cell!==this.cell)return;this.setSize(n.width,n.height);for(let[i,o]of Object.entries(n.frames))this.results.set(Number(i),{kp:o.kp?Float32Array.from(o.kp):null,score:o.score,mask:o.mask?new Uint8Array(Buffer.from(o.mask,"base64")):null})}catch{}}async saveCache(){this.unsaved=0;let t=await this.cachePath();if(!t||!this.sourceWidth)return;let r={};for(let[o,a]of this.results)r[o]={kp:a.kp?Array.from(a.kp,s=>Math.round(s*100)/100):null,mask:a.mask?Buffer.from(a.mask).toString("base64"):null,score:a.score};let n=await import("./shims/fs.mjs"),i=`${t}.${x.pid}.tmp`;n.writeFileSync(i,JSON.stringify({width:this.sourceWidth,height:this.sourceHeight,cell:this.cell,frames:r})),n.renameSync(i,t)}async subjectsPath(){let t=await this.cachePath();return t?t.replace(/\.json$/,".subjects.json"):null}async loadSubjects(){let t=await this.subjectsPath();if(t)try{let r=await import("./shims/fs.mjs");if(!r.existsSync(t))return;let n=JSON.parse(r.readFileSync(t,"utf8"));if(this.sourceWidth&&n.width!==this.sourceWidth)return;this.sourceWidth||this.setSize(n.width,n.height);for(let[i,o]of Object.entries(n.frames)){let a=Buffer.from(o?.lengths??"","base64");this.subjects.set(Number(i),o&&{category:o.category,area:o.area,...o.scores&&{scores:o.scores},values:new Uint8Array(Buffer.from(o.values,"base64")),lengths:new Uint32Array(a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength))})}}catch{}}async saveSubjects(){this.unsavedSubjects=0;let t=await this.subjectsPath();if(!t||!this.sourceWidth)return;let r={};for(let[o,a]of this.subjects)r[o]=a&&{category:a.category,area:a.area,...a.scores&&{scores:a.scores},values:Buffer.from(a.values).toString("base64"),lengths:Buffer.from(a.lengths.buffer,a.lengths.byteOffset,a.lengths.byteLength).toString("base64")};let n=await import("./shims/fs.mjs"),i=`${t}.${x.pid}.tmp`;n.writeFileSync(i,JSON.stringify({width:this.sourceWidth,height:this.sourceHeight,frames:r})),n.renameSync(i,t)}},Ci=class e{constructor(t,r,n){this.clip=t;this.t=r;this.placement=n}clip;t;placement;place(t){return new e(this.clip,void 0,t)}transform(){if(this.t)return this.t;let t=this.placement,{width:r,height:n}=this.clip.size();if(!t||!r)return{sx:1,sy:1,ox:0,oy:0};let i=t.width/r,o=t.height/n;if(t.fit!=="fill"){let a=t.fit==="contain"?Math.min(i,o):Math.max(i,o);i=a,o=a}return{sx:i,sy:o,ox:(t.x??0)+(t.width-r*i)/2,oy:(t.y??0)+(t.height-n*o)/2}}point(t,r){let n=rb(t),i=this.clip.clipFrame(r),o=Math.floor(i),a=i-o,s=this.clip.keypoint(n,o),u=a>0?this.clip.keypoint(n,o+1):s,c=this.transform();return{x:(s[0]+(u[0]-s[0])*a)*c.sx+c.ox,y:(s[1]+(u[1]-s[1])*a)*c.sy+c.oy,visibility:s[2]+(u[2]-s[2])*a}}signals(t){let r=n=>Dr.builder({type:"custom",fn:i=>this.point(t,i.frame)[n]});return{x:r("x"),y:r("y"),visibility:r("visibility")}}silhouetteGrid(t){let r=this.clip.blurredMask(Math.round(this.clip.clipFrame(t)));if(!r)return null;let{cell:n,width:i,height:o}=this.clip.grid(),a=this.transform();return{data:r,width:i,height:o,originX:a.ox,originY:a.oy,scaleX:n*a.sx,scaleY:n*a.sy}}sample(t,r,n){let i=this.clip.blurredMask(Math.round(this.clip.clipFrame(t)));if(!i)return{alpha:0,gx:0,gy:0};let{cell:o,width:a,height:s}=this.clip.grid(),u=this.transform(),c=(r-u.ox)/u.sx/o-.5,m=(n-u.oy)/u.sy/o-.5,d=(f,b)=>f<0||b<0||f>=a||b>=s?0:i[b*a+f],p=(f,b)=>{let g=Math.floor(f),y=Math.floor(b),v=f-g,T=b-y,C=d(g,y)+(d(g+1,y)-d(g,y))*v,w=d(g,y+1)+(d(g+1,y+1)-d(g,y+1))*v;return C+(w-C)*T};return{alpha:p(c,m),gx:(p(c+1,m)-p(c-1,m))/(2*o*u.sx),gy:(p(c,m+1)-p(c,m-1))/(2*o*u.sy)}}};function rb(e){let t=Bn.indexOf(e);if(t<0)throw new Error(`Unknown keypoint "${e}". Use one of ${Bn.join(", ")}.`);return t}async function ss(e){if(!e||e.width<=0)return null;if(e.buffer)return{data:e.buffer,width:e.width,height:e.height};let r=e.canvas?.getContext("2d");return r?{data:r.getImageData(0,0,e.width,e.height).data,width:e.width,height:e.height}:null}function nb(e){return eo(e.masks,{classes:["person"],overlap:.2,maxGrowth:3.5})?.mask}function us(e){if(!e)return 0;let t=0;for(let r=0;r<e.length;r++)t+=e[r];return t}function ib(e,t,r){let n=e.get(t)?.mask??null;if(r<=0)return n;let i=us(n),o=-1,a=null,s=-1,u=null,c=Math.max(1e3,i*1.35);for(let p=1;p<=r+1;p++){if(o<0&&t-p>=0){let f=e.get(t-p)?.mask??null;us(f)>c&&(o=t-p,a=f)}if(s<0){let f=e.get(t+p)?.mask??null;us(f)>c&&(s=t+p,u=f)}}if(!a&&!u)return n;let m=a??u;if(!m)return n;let d=n?new Uint8Array(n):new Uint8Array(m.length);if(a&&u&&s>o){let p=(t-o)/(s-o);for(let f=0;f<d.length;f++){let b=Math.round(a[f]+(u[f]-a[f])*p);b>d[f]&&(d[f]=b)}}else for(let p=0;p<d.length;p++)m[p]>d[p]&&(d[p]=m[p]);return d}function _m(e,t,r,n,i,o,a){for(let s=0;s<a;s++)for(let u=0;u<o;u++){let c=0,m=0;for(let d=s*n;d<Math.min(r,(s+1)*n);d++)for(let p=u*n;p<Math.min(t,(u+1)*n);p++)c+=e[d*t+p],m++;i[s*o+u]=m?Math.round(c/m):0}}function Gm(e){let t=0;for(let a=1;a<=e.length;a++)(a===e.length||e[a]!==e[a-1])&&t++;let r=new Uint8Array(t),n=new Uint32Array(t),i=0,o=0;for(let a=1;a<=e.length;a++)(a===e.length||e[a]!==e[o])&&(r[i]=e[o],n[i++]=a-o,o=a);return{values:r,lengths:n}}function ob(e,t){let r=new Uint8Array(t),n=0;for(let i=0;i<e.values.length;i++){let o=Math.min(t,n+e.lengths[i]);e.values[i]!==0&&r.fill(e.values[i],n,o),n=o}return r}function ab(e,t,r,n){let i=new Float32Array(t*r),o=new Float32Array(t*r);for(let a=0;a<r;a++)for(let s=0;s<t;s++){let u=0,c=0;for(let m=-n;m<=n;m++){let d=s+m;d>=0&&d<t&&(u+=e[a*t+d],c++)}i[a*t+s]=u/c/255}for(let a=0;a<r;a++)for(let s=0;s<t;s++){let u=0,c=0;for(let m=-n;m<=n;m++){let d=a+m;d>=0&&d<r&&(u+=i[d*t+s],c++)}o[a*t+s]=u/c}return o}function Wm(e,t,r){let n=ob(e,t);return e.scores?n.map(i=>(r===void 0?i>0:i===r)?255:0):n}function sb(e,t){let r=new Uint8Array(t.width*t.height);for(let{mask:n}of e)for(let i=0;i<r.length;i++)r[i]=Math.max(r[i]??0,n[i]??0);return r}h();var Ai=class{constructor(t){this.fps=t}fps;entries=new Map;reached=-1;resolver(t){let{live:r,compositionDurationFrames:n}=t,i={fps:this.fps,compositionDurationFrames:n,signals:t.signals};return(o,a)=>{let s=`${a.id}\0${a.startFrame}\0${a.durationFrames}`,u=this.entries.get(s);if(u&&u.live===r&&u.compositionFrames===n&&ub(u.binding,o))return u.resolved;let c=r?{kind:"recorded",recorder:new js({mode:o.mode,fps:this.fps,startFrame:a.startFrame,durationFrames:a.durationFrames,sourceStartSec:o.sourceStartSec,sample:nu(o,i)})}:iu(o,a,i);return this.entries.set(s,{binding:o,live:r,compositionFrames:n,resolved:c}),c}}framesBefore(t){if(!this.recorders().some(i=>!i.complete&&i.nextFrame<t))return[];let n=[];for(let i=this.reached+1;i<t;i++)n.push(i);return n}advance(t){for(let r of this.recorders())r.advance(t)}reach(t){t>this.reached&&(this.reached=t);for(let[,r]of this.entries){if(r.resolved.kind!=="recorded")continue;let n=r.resolved.recorder;n.ensure(t),t>=r.compositionFrames-1&&!n.complete&&n.nextFrame>n.startFrame&&n.close()}}get pending(){return this.recorders().some(t=>!t.complete)}recorders(){let t=[];for(let{resolved:r}of this.entries.values())r.kind==="recorded"&&t.push(r.recorder);return t}};function ub(e,t){return e.signal===t.signal&&e.mode===t.mode&&e.sourceStartSec===t.sourceStartSec}function ls(e,t){let r=e.fps>0?t/e.fps:0;return{...e,frame:t,time:r,progress:e.duration>0?Math.max(0,Math.min(1,r/e.duration)):0}}var Hm=new WeakMap,lb=0;function Di(e){if(!e)return"";if(e.kind==="rate"||e.kind==="keyframes")return JSON.stringify(e);let t=e.kind==="sampled"?e.history:e.recorder,r=Hm.get(t);return r===void 0&&(r=++lb,Hm.set(t,r)),`${e.kind}:${r}`}h();h();var cb={rotation:.2,rotateX:.2,rotateY:.2,rotateZ:.2};function Ve(e,t,r){if(typeof e=="number")return e;if(typeof e=="function")return e(t);let n=t/r;return e.get({frame:t,fps:r,time:n,duration:0,durationMs:0,progress:0,deltaTime:1/r})}function Yt(e,t){let r=t-e;return r-=Math.round(r/360)*360,e+r}function mb(e,t){let r=e.length;if(r===0)return[];let n=new Uint8Array(r);n[0]=1,n[r-1]=1;let i=[[0,r-1]];for(;i.length>0;){let[a,s]=i.pop(),u=-1,c=t;for(let m=a+1;m<s;m++){let d=(m-a)/(s-a),p=e[a]+(e[s]-e[a])*d,f=Math.abs(e[m]-p);f>c&&(c=f,u=m)}u>=0&&(n[u]=1,i.push([a,u],[u,s]))}let o=[];for(let a=0;a<r;a++)n[a]&&o.push([a,db(e[a]),"none"]);return o.length===2&&o[0][1]===o[1][1]&&o.pop(),o}function db(e){return Math.round(e*1e4)/1e4}var cs=class{constructor(t,r,n){this.length=t;this.fps=r;this.ensure=n}length;fps;ensure;channels=new Map;signals=new Map;channel(t){let r=this.channels.get(t);return r||(r=new Float32Array(this.length),this.channels.set(t,r)),r}signal(t){let r=this.signals.get(t);if(!r){let n=this.channel(t),i=this.fps;r=Dr.builder({type:"custom",fn:o=>{this.ensure();let a=o.fps&&o.fps!==i?o.frame/o.fps*i:o.frame,s=Math.max(0,Math.min(n.length-1,Math.round(a)));return n[s]}}),this.signals.set(t,r)}return r}},vr=class{constructor(t,r,n){this.sim=t;this.gravity=r;if(!(n.fps>0))throw new Error("Physics: `fps` must be > 0.");if(!(n.frames>=1)||!Number.isInteger(n.frames))throw new Error("Physics: `frames` must be a positive integer.");this.fps=n.fps,this.frames=n.frames,this.startFrame=Math.max(0,Math.round(n.startFrame??0)),this.pixelsPerMeter=n.pixelsPerMeter??100,this.substeps=Math.max(1,Math.round(n.substeps??4)),this.impactDecay=Math.max(.5,n.impactDecay??8),this.impactReference=n.impactReference??1500,this.worldRecording=this.newRecording()}sim;gravity;fps;frames;startFrame;pixelsPerMeter;substeps;impactDecay;impactReference;bodies=[];forces=[];impulses=[];fields=[];worldRecording;allCollisions=[];locked=!1;liveMode=!1;stepper;chain=Promise.resolve();get collisions(){return this.ensureSimulated(),this.allCollisions}get impact(){return this.worldRecording.signal("impact")}simulate(){if(this.liveMode)throw new Error("Physics: this world is live; it steps as frames render.");return this.ensureSimulated(),this}bakeKeyframes(t={}){if(this.locked)throw new Error("Physics: bakeKeyframes() must come before simulate(), live() or reading any body signal.");return this.bakeDefault=t,this.ensureSimulated(),this}live(t,r={}){if(this.locked)throw new Error("Physics: live() must come before simulate() or reading any body signal.");this.locked=!0,this.liveMode=!0;let n=async i=>{await t.prepareVision?.(i);for(let o of r.inputs??[])await o.ready(i)};this.prepareInputs=n;for(let i of this.bodies)this.bind(i);return t.onPrepareFrame(i=>this.advanceTo(i.frame)),this}advanceTo(t){return this.chain=this.chain.then(async()=>{let r=Math.min(this.frames-1,Math.round(t)-this.startFrame);this.stepper||(await this.prepareInputs?.(this.startFrame),this.stepper=this.begin());let n=this.stepper;for(;n.current<r;){let i=n.current+1;await this.prepareInputs?.(this.startFrame+i),this.stepFrame(n,i)}n.current===this.frames-1&&!n.freed&&(n.freed=!0,this.sim.free())}),this.chain}prepareInputs;bakeDefault;newRecording(){return new cs(this.startFrame+this.frames,this.fps,()=>this.ensureSimulated())}assertOpen(){if(this.locked)throw new Error("Physics: the world has already started; add every body, joint and force before simulate(), live() or reading signals.")}addBody(t){return this.assertOpen(),this.bodies.push(t),t}addForce(t,r){this.assertOpen(),this.forces.push({body:t,accel:r})}addField(t,r){this.assertOpen(),this.fields.push({accel:t,...r&&{targets:new Set(r)}})}addImpulse(t,r,n){this.assertOpen(),this.impulses.push({body:t,frame:Math.round(r),dv:n})}ensureSimulated(){if(this.locked)return;this.locked=!0;let t=this.begin();for(let r=1;r<this.frames;r++)this.stepFrame(t,r);t.freed=!0,this.sim.free();for(let r of this.bodies)this.bind(r)}begin(){let{startFrame:t}=this,r=this.bodies,n=new Map;for(let o of r)n.set(o.sim,o);for(let o of r)o.startFrame>0&&o.sim.setEnabled(!1);let i=new Map;for(let o of r){o.record(t,-1),o.recording.channel("impact");let a=o.kinematicTarget?.(t);a&&i.set(o,a)}this.worldRecording.channel("impact");for(let o of[...r.map(a=>a.recording),this.worldRecording])for(let a of o.channels.values())a.fill(a[t]);return{current:0,freed:!1,bySim:n,kinematicFrom:i,level:new Map(r.map(o=>[o,0]))}}stepFrame(t,r){let{fps:n,startFrame:i,substeps:o}=this,a=1/(n*o),s=this.bodies,u=i+r,c=this.gravity.length,m=new Map;for(let w of s)w.startFrame>0&&r===w.startFrame+1&&w.sim.setEnabled(!0),m.set(w,w.sim.velocity());let d=w=>w.type==="dynamic"&&r>w.startFrame,p=new Map;for(let w of s)p.set(w,this.gravity.map(A=>d(w)?A*w.gravityScale/n:0));for(let w of this.impulses){if(w.frame!==r)continue;let A=w.body;if(!d(A))continue;let S=A.sim.mass();A.sim.applyImpulse(w.dv.map(D=>D*S));let M=p.get(A);for(let D=0;D<c;D++)M[D]+=w.dv[D]}let f=this.forces.filter(w=>d(w.body)).map(w=>{let A=w.body,S=w.accel(u),M=p.get(A);for(let D=0;D<c;D++)M[D]+=S[D]/n;return{body:A,a:S}}),b=new Map;for(let w of s){let A=w.kinematicTarget?.(u);A&&b.set(w,A)}let g=new Set,y=[];for(let w=1;w<=o;w++){for(let{body:A,a:S}of f){let M=A.sim.mass();A.sim.applyImpulse(S.map(D=>D*M*a))}for(let A of this.fields)for(let S of s){if(!d(S)||A.targets&&!A.targets.has(S))continue;let M=A.accel(S,u);if(!M)continue;let D=S.sim.mass();S.sim.applyImpulse(M.map(W=>W*D*a));let V=p.get(S);for(let W=0;W<c;W++)V[W]+=M[W]*a}for(let[A,S]of b){let M=t.kinematicFrom.get(A)??S,D=w/o;A.sim.setKinematicTarget(pb(M.position,S.position,D),this.lerpRotation(M.rotation,S.rotation,D))}this.sim.step(a);for(let[A,S]of this.sim.drainCollisionStarts()){let M=t.bySim.get(A),D=t.bySim.get(S);if(!M||!D)continue;let V=`${s.indexOf(M)}:${s.indexOf(D)}`;g.has(V)||(g.add(V),y.push([M,D]))}}t.kinematicFrom=b;for(let w of s)w.record(u,u-1);let v=new Map;if(y.length>0){let w=this.pixelsPerMeter,A=S=>{if(S.type!=="dynamic")return 0;let M=S.sim.velocity(),D=m.get(S),V=p.get(S),W=0;for(let z=0;z<c;z++){let B=M[z]-(D[z]+V[z]);W+=B*B}return Math.sqrt(W)*w};for(let[S,M]of y){let D=Math.max(A(S),A(M));for(let[V,W]of[[S,M],[M,S]]){v.set(V,Math.max(v.get(V)??0,D));let z={frame:u,with:W,speed:D};V.collisions.push(z),V===S&&this.allCollisions.push({...z,body:S})}}}let T=Math.exp(-1/this.impactDecay),C=0;for(let w of s){let A=Math.max((v.get(w)??0)/this.impactReference,(t.level.get(w)??0)*T);t.level.set(w,A),w.recording.channel("impact")[u]=A,A>C&&(C=A)}this.worldRecording.channel("impact")[u]=C,t.current=r}bind(t){let r=t.layer,n=t.output??(this.bakeDefault?"keyframes":"signals");if(typeof r?.animate!="function"||n==="none"||t.type==="fixed")return;let i=t.boundChannels();if(n==="keyframes"&&this.liveMode)throw new Error('Physics: live worlds bind signals; drop `output: "keyframes"` or use simulate().');if(n==="signals"){let s=te.create();for(let[u,c]of i)s.signal(u,t.recording.signal(c));r.animate(s);return}let o=this.bakeDefault?.tolerance??.25,a=te.create();for(let[s,u]of i){let m=t.recording.channel(u).subarray(this.startFrame),d=cb[s]??1;a.keys(s,mb(m,o*d))}r.animate(a)}};function pb(e,t,r){return e.map((n,i)=>n+(t[i]-n)*r)}var ms=(e,t)=>e===void 0?t:typeof e=="number"?[e,e]:e,fn=class extends qt{op="Particles";particleStatic;particleState;options;constructor(t){super({}),this.options=t;let r=t.emitter??{},n=s=>typeof s=="number"?s:void 0,i=t.width,o=t.height,a=(Array.isArray(t.color)?t.color:[t.color??"#ffffff"]).map(s=>{let u=Ys(s);return[u.r,u.g,u.b,u.a]});this.particleStatic={max:Math.max(1,Math.round(t.max??2e4)),seed:Math.round(t.seed??1)>>>0,layer:{x:t.x??0,y:t.y??0,width:i,height:o},emitter:{shape:r.shape??"rect",x:n(r.x)??(r.shape==="circle"||r.shape==="ring"||r.shape==="point"?i/2:0),y:n(r.y)??(r.shape==="circle"||r.shape==="ring"||r.shape==="point"?o/2:0),width:r.width??i,height:r.height??(r.shape==="line"?0:o),radius:r.radius??Math.min(i,o)/4,radial:r.radial??!1},lifetime:ms(t.lifetime,[2,4]),speed:ms(t.speed,[40,160]),direction:t.direction??-90,spread:t.spread??360,bounds:t.bounds??"none",floor:t.floor??null,bounce:t.bounce??.3,size:ms(t.size,[6,0]),sizeJitter:t.sizeJitter??.5,fade:t.fade??[.1,.3],shape:t.shape??"circle",stretch:t.stretch??.04,blend:t.blend??"normal",colors:a.slice(0,8),colorBySpeed:t.colorBySpeed??null,opacity:t.opacity??1,substeps:t.substeps??2,prewarm:t.prewarm??0}}particleFrame(t,r){let n=this.options,i=(g,y)=>g===void 0?y:Ve(g,t,r),o=t-(n.startFrame??0),a=(n.emitter?.bursts??[]).filter(g=>Math.round(g.frame)===o).reduce((g,y)=>g+y.count,0),s=n.gravity,u=Array.isArray(s)?[i(s[0],0),i(s[1],0)]:[0,i(s,0)],c=null;n.push&&(c={strength:i(n.push.strength,6e3),sweep:i(n.push.sweep,6e4),mask:n.push.person.silhouetteGrid(t),previous:n.push.person.silhouetteGrid(Math.max(0,t-1))});let m=n.emitter?.x,d=n.emitter?.y,p=m!==void 0&&typeof m!="number"||d!==void 0&&typeof d!="number",f=g=>({x:m===void 0?this.particleStatic.emitter.x:Ve(m,g,r),y:d===void 0?this.particleStatic.emitter.y:Ve(d,g,r)}),b;if(p){let g=f(t),y=f(Math.max(0,t-1));b={x:g.x,y:g.y,previousX:y.x,previousY:y.y}}return{...b&&{emitter:b},rate:i(n.emitter?.rate,1e3),burst:a,gravity:u,drag:i(n.drag,.4),noise:{strength:i(n.noise?.strength,0),scale:n.noise?.scale??300,speed:n.noise?.speed??.3},attractors:(n.attractors??[]).map(g=>({x:i(g.x,0),y:i(g.y,0),strength:i(g.strength,0),radius:g.radius??200})),push:c}}};h();var we=Ar(Xm(),1);h();var Oi=Ar(Ed(),1);function fb(e=64){if(!Number.isSafeInteger(e)||e<1)throw new Error("[FrameGrid] maxFrames must be a positive safe integer.");return Math.min(e,120)}function ds(e,t){if(e>t)throw new Error(`[FrameGrid] Requested frames exceeds the safety threshold of ${t}. Increase stepFrames/stepMs or narrow the start/end range.`)}function qm(e,t,r,n,i){if(!Number.isFinite(e)||!Number.isFinite(t)||e<0||t<e)throw new Error(`[FrameGrid] Invalid ${i} range: start${i==="frame"?"Frame":"Ms"} must be <= end${i==="frame"?"Frame":"Ms"}; bounds must be finite and nonnegative.`);if(!Number.isFinite(r)||r<=0)throw new Error(`[FrameGrid] Invalid ${i==="frame"?"stepFrames":"stepMs"}: ${r}. Must be > 0 and finite.`);if(i==="frame"&&![e,t,r].every(Number.isSafeInteger))throw new Error("[FrameGrid] Frame bounds and stepFrames must be safe integers.");let o=[];for(let a=0;;a++){let s=e+a*r;if(!Number.isFinite(s))throw new Error("[FrameGrid] Range arithmetic overflow.");if(a>0&&s<=o[a-1])throw new Error("[FrameGrid] Step does not advance the sampling range.");if(s>t)break;ds(a+1,n),o.push(s)}return o}function ps(e,t=24,r){let n=e.fps??t;An(n);let i=fb(e.maxFrames),o;if(e.frames?.length?(ds(e.frames.length,i),o=e.frames.map(a=>Mt({frame:a},n))):e.timesMs?.length?(ds(e.timesMs.length,i),o=e.timesMs.map(a=>Mt({atMs:a},n))):o=hb(e,n,r,i),!o.length)throw new Error("[FrameGrid] Zero frames were resolved for sampling.");return{samples:o,fps:n}}function hb(e,t,r,n){let i=r===void 0?void 0:zs(r,t)-1;if(e.startMs!==void 0||e.endMs!==void 0||e.stepMs!==void 0){let s=e.startMs??0,u=e.endMs??(i===void 0?s+1e3:i/t*1e3);return qm(s,u,e.stepMs??5e3/t,n,"millisecond").map(c=>Mt({atMs:c},t))}let o=e.startFrame??0,a=e.endFrame??Math.min(o+30,i??o+30);return qm(o,a,e.stepFrames??5,n,"frame").map(s=>Mt({frame:s},t))}function fs(e,t,r){let n=r.gap??12,i=r.padding??16,a=r.showHeader??!0?54:0,s=r.maxGridWidth??4096,u=r.maxGridHeight??4096,c=r.columns;(!c||c<=0)&&(e<=4?c=e:e<=9?c=3:e<=16?c=4:e<=25?c=5:c=6),c=Math.min(c,e);let m=Math.ceil(e/c),d=Math.max(120,Math.min(r.cellWidth??320,960)),p=r.cellHeight??Math.round(d/(t>0?t:16/9)),f=c*d+(c-1)*n+i*2,b=m*p+(m-1)*n+i*2+a;if(f>s||b>u){let g=Math.min((s-(c-1)*n-i*2)/(c*d),(u-(m-1)*n-i*2-a)/(m*p));if(g<.25)throw new Error(`[FrameGrid] Cannot fit ${e} cells (${c}x${m}) into max dimensions [${s}x${u}]. Reduce cell count or decrease cellWidth.`);d=Math.max(100,Math.floor(d*g)),p=Math.round(d/(t>0?t:16/9)),f=c*d+(c-1)*n+i*2,b=m*p+(m-1)*n+i*2+a}return{columns:c,rows:m,cellWidth:d,cellHeight:p,totalWidth:f,totalHeight:b,headerHeight:a,gap:n,padding:i}}async function hn(e,t={}){let r=e.fps??24,n=e.durationMs,{samples:i,fps:o}=ps(t,r,n),a=e.width??1920,s=e.height??1080,u=a>0&&s>0?a/s:16/9,c=fs(i.length,u,t),m=t.renderer??new we.HeadlessMediaRenderer,d=[];for(let y of i){let v=await e.renderFrame({frame:y.frame,fps:o,renderer:m});d.push(v)}let p=new Oi.Canvas(c.totalWidth,c.totalHeight),f=p.getContext("2d");if(f.fillStyle=t.backgroundColor??"#090a0f",f.fillRect(0,0,c.totalWidth,c.totalHeight),t.showHeader!==!1&&c.headerHeight>0){let y=t.headerText??`FrameGrid Conformance Review | Frames ${i[0].frame}\u2013${i[i.length-1].frame} (Count: ${i.length})`,v=`${a}\xD7${s} @ ${o} FPS | Cell: ${c.cellWidth}\xD7${c.cellHeight}px | Step: ${t.stepFrames?`${t.stepFrames}f`:t.stepMs?`${t.stepMs}ms`:"Custom"}`;f.fillStyle="#f8fafc",f.font="bold 15px sans-serif",f.fillText(y,c.padding,c.padding+18),f.fillStyle="#94a3b8",f.font="12px sans-serif",f.fillText(v,c.padding,c.padding+36),f.strokeStyle="#1e2433",f.lineWidth=1,f.beginPath(),f.moveTo(c.padding,c.padding+46),f.lineTo(c.totalWidth-c.padding,c.padding+46),f.stroke()}let b=t.showLabels??!0;for(let y=0;y<i.length;y++){let v=i[y],T=y%c.columns,C=Math.floor(y/c.columns),w=c.padding+T*(c.cellWidth+c.gap),A=c.padding+c.headerHeight+C*(c.cellHeight+c.gap),S=await(0,Oi.loadImage)(d[y]);if(f.drawImage(S,w,A,c.cellWidth,c.cellHeight),f.strokeStyle="#262b3d",f.lineWidth=1,f.strokeRect(w,A,c.cellWidth,c.cellHeight),b){let M=`F:${v.frame} \u2022 ${Math.round(v.timeMs)}ms`;f.font="bold 11px sans-serif";let V=f.measureText(M).width+14,W=20,z=w+6,B=A+6;f.fillStyle="#090a0fee",f.beginPath(),f.roundRect(z,B,V,W,4),f.fill(),f.strokeStyle="#6366f155",f.lineWidth=1,f.stroke(),f.fillStyle="#e2e8f0",f.fillText(M,z+7,B+14)}}let g=await p.toBuffer("png");return t.outputPath&&await Nr.writeFile(t.outputPath,g),g}h();h();function Zm(e){let t;if(Array.isArray(e.mesh))t=e.mesh;else if(e.mesh&&typeof e.mesh=="object"&&"kind"in e.mesh)t=[e.mesh];else if(e.mesh&&typeof e.mesh=="object"&&e.mesh.type==="shard"){let i=Math.max(1,e.mesh.variants??8);t=[];for(let o=0;o<i;o++)t.push(Ce.shard({radius:20,facets:e.mesh.facets??12+o%6,seed:(e.seed??1)*31+o*17,irregularity:e.mesh.irregularity??.35}))}else if(e.mesh==="sphere")t=[Ce.sphere({radius:20})];else if(e.mesh==="roundedBox")t=[Ce.roundedBox({size:[30,30,30]})];else if(e.mesh==="cylinder")t=[Ce.cylinder({radius:15,height:35})];else{t=[];for(let o=0;o<8;o++)t.push(Ce.shard({radius:20,facets:10+o%8*2,seed:(e.seed??42)+o*13,irregularity:.35+o%3*.1}))}let r={id:e.id??Z("swarm3d"),kind:"model3d",x:0,y:0,z:0,opacity:1,twoSided:!0,material:e.material??"lit",roughness:e.roughness??.35,metallic:e.metallic??.7,specularIntensity:e.specularIntensity??.5,ambientIntensity:e.ambientIntensity??1,startFrame:e.startFrame,durationFrames:e.durationFrames,swarm3d:{...e,meshVariants:t}},n=t[0];return n&&(n.modelData&&(r.modelData=n.modelData),n.primitive3d&&(r.primitive3d=n.primitive3d)),F.model(r)}var bb=["material","shininess","roughness","specularIntensity","metallic","ambientIntensity","ior","transmission","dispersion","fresnelPower","envIntensity","emissive","emissiveIntensity","castShadow"];function St(e){let t=e,r={};for(let n of bb)t[n]!==void 0&&(r[n]=t[n]);return r}function yb(e){return e==="lit"||e==="unlit"||e==="toon"?e:void 0}function hs(e){return e instanceof Wi?e.getPoints(96):e}function Ee(e,t,r){let n=Object.fromEntries(Object.entries({...t,color:r.color,material:yb(r.material),shininess:r.shininess,roughness:r.roughness,metallic:r.metallic}).filter(([,i])=>i!==void 0));return F.model({id:r.id??Z(e),modelData:eu(n),primitive3d:n,is3D:!0,x:r.x??0,y:r.y??0,z:r.z??0,rotateX:r.rotateX??0,rotateY:r.rotateY??0,rotateZ:r.rotateZ??0,scale:r.scale??1,scaleX:r.scaleX??1,scaleY:r.scaleY??1,scaleZ:r.scaleZ??1,opacity:r.opacity??1,color:r.tint,material:r.material,shininess:r.shininess??32,roughness:r.roughness,specularIntensity:r.specularIntensity??.5,ambientIntensity:r.ambientIntensity??1,metallic:r.metallic,...St(r),twoSided:r.twoSided??!1,wireframe:r.wireframe,startFrame:r.startFrame,durationFrames:r.durationFrames})}function gn(e,t){let r=t.faces??t.items??[];for(let[n,i]of Object.entries(t))Object.defineProperty(e,n,{value:i,enumerable:!1,configurable:!0});return Object.defineProperty(e,Symbol.iterator,{value:function*(){yield*r},enumerable:!1,configurable:!0}),e}function xb(e){let t=e.scale??1,r=Math.max(Math.abs(t*(e.scaleX??1)),Math.abs(t*(e.scaleY??1)));return r>0?r:1}var Ce={cube(e){let t=e.size,[r,n,i]=typeof t=="number"?[t,t,t]:t,o=e.twoSided??!0,a={front:"#3b82f6",back:"#1d4ed8",left:"#2563eb",right:"#1e40af",top:"#60a5fa",bottom:"#172554"},s=(f,b,g,y,v,T)=>{if(b&&typeof b=="object"&&"kind"in b){let w=b;return w.position="absolute",w.is3D=!0,w.twoSided=o,w.material=w.material??e.material??"lit",w.shininess=w.shininess??e.shininess??32,w.specularIntensity=w.specularIntensity??e.specularIntensity??.5,e.roughness!==void 0&&w.roughness===void 0&&(w.roughness=e.roughness),e.metallic!==void 0&&w.metallic===void 0&&(w.metallic=e.metallic),e.ambientIntensity!==void 0&&w.ambientIntensity===void 0&&(w.ambientIntensity=e.ambientIntensity),Object.assign(w,T),w}let C=typeof b=="string"?{background:b}:b??{background:g};return F.box({id:`${e.id??"cube"}-${f}`,position:"absolute",width:y,height:v,is3D:!0,twoSided:o,material:C.material??e.material??"lit",shininess:C.shininess??e.shininess??32,specularIntensity:C.specularIntensity??e.specularIntensity??.5,roughness:C.roughness??e.roughness,metallic:C.metallic??e.metallic,ambientIntensity:C.ambientIntensity??e.ambientIntensity??1,...St({...e,...C}),background:C.background??g,borderRadius:C.borderRadius??0,borderWidth:C.borderWidth,borderColor:C.borderColor,opacity:C.opacity??1,children:C.children??[],...T})},u=r/2,c=n/2,m=i/2,d=[s("front",e.faces?.front,a.front,r,n,{x:0,y:0,z:-m,rotateX:0,rotateY:0,rotateZ:0}),s("back",e.faces?.back,a.back,r,n,{x:0,y:0,z:m,rotateX:0,rotateY:180,rotateZ:0}),s("left",e.faces?.left,a.left,i,n,{x:-u,y:0,z:0,rotateX:0,rotateY:90,rotateZ:0}),s("right",e.faces?.right,a.right,i,n,{x:u,y:0,z:0,rotateX:0,rotateY:-90,rotateZ:0}),s("top",e.faces?.top,a.top,r,i,{x:0,y:-c,z:0,rotateX:-90,rotateY:0,rotateZ:0}),s("bottom",e.faces?.bottom,a.bottom,r,i,{x:0,y:c,z:0,rotateX:90,rotateY:0,rotateZ:0})],p=F.box({id:e.id??Z("cube"),position:"absolute",x:e.x??0,y:e.y??0,z:e.z??0,width:r,height:n,is3D:!0,transformStyle:"preserve-3d",rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,opacity:e.opacity??1,background:"transparent",children:d});return gn(p,{faces:d})},carousel(e){let{items:t,radius:r,faceInward:n=!1,twoSided:i=!0}=e,o=t.length,a=o>0?360/o:0,s=t.map((c,m)=>{let d=m*a,p=d*Math.PI/180,f=r*Math.sin(p),b=-r*Math.cos(p),g=n?180-d:-d,y=c;return y.position="absolute",y.is3D=!0,y.twoSided=i,y.x=f,y.y=0,y.z=b,y.rotateY=g,y}),u=F.box({id:e.id??Z("carousel"),position:"absolute",x:e.x??0,y:e.y??0,z:e.z??0,width:e.itemWidth??200,height:e.itemHeight??200,is3D:!0,transformStyle:"preserve-3d",rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,opacity:e.opacity??1,background:"transparent",children:s});return gn(u,{items:s})},prism(e){let t=Math.max(3,Math.round(e.sides));if(e.sideConfigs&&e.sideConfigs.length>0){let{radius:n,height:i,twoSided:o=!0}=e,a=2*n*Math.tan(Math.PI/t),s=360/t,u=[];for(let m=0;m<t;m++){let d=m*s,p=d*Math.PI/180,f=n*Math.sin(p),b=-n*Math.cos(p),g=e.sideConfigs[m],y=e.color??`hsl(${m*360/t}, 70%, 50%)`;if(g&&typeof g=="object"&&"kind"in g){let T=g;T.position="absolute",T.is3D=!0,T.twoSided=o,T.x=f,T.y=0,T.z=b,T.rotateY=-d,Object.assign(T,St(e)),u.push(T);continue}let v=typeof g=="string"?{background:g}:g??{background:y};u.push(F.box({id:`${e.id??"prism"}-panel-${m}`,position:"absolute",width:a,height:i,is3D:!0,twoSided:o,x:f,y:0,z:b,rotateY:-d,background:v.background??y,borderRadius:v.borderRadius??0,borderWidth:v.borderWidth,borderColor:v.borderColor,opacity:v.opacity??e.opacity??1,material:v.material??e.material??"lit",shininess:v.shininess??e.shininess??32,specularIntensity:v.specularIntensity??e.specularIntensity??.5,ambientIntensity:v.ambientIntensity??e.ambientIntensity??1,...St({...e,...v}),children:v.children??[]}))}let c=F.box({id:e.id??Z("prism"),position:"absolute",x:e.x??0,y:e.y??0,z:e.z??0,width:a,height:i,is3D:!0,transformStyle:"preserve-3d",rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,opacity:e.opacity??1,background:"transparent",children:u});return gn(c,{faces:u})}let r=Ee("prism",{type:"cylinder",radius:e.radius,radiusTop:e.radiusTop??e.radius,radiusBottom:e.radiusBottom??e.radius,height:e.height,segments:t,openEnded:e.openEnded??!1,flatShaded:e.flatShaded??!0},{...e,color:e.color??"#3b82f6",twoSided:e.twoSided??!!e.openEnded});return gn(r,{faces:[r],items:[r]})},pyramid(e){let t=Math.max(3,Math.round(e.sides??4));return Ee("pyramid",{type:"cylinder",radius:e.radius??60,radiusTop:e.radiusTop??0,radiusBottom:e.radius??60,height:e.height,segments:t,openEnded:e.openEnded??!1,flatShaded:e.flatShaded??!0},{...e,color:e.color??"#f59e0b",twoSided:e.twoSided??!!e.openEnded})},plane(e){return F.box({id:e.id??Z("plane"),position:"absolute",width:e.width,height:e.height,x:e.x??0,y:e.y??0,z:e.z??0,is3D:!0,twoSided:e.twoSided??!0,rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,background:e.background??"#3b82f6",borderRadius:e.borderRadius??0,opacity:e.opacity??1,...St(e),children:e.children??[]})},grid(e){let{width:t,height:r}=e,n=e.id??Z("grid"),i=Math.max(1,Math.round(e.divisions??10)),o=e.lineWidth??2,a=e.color??"rgba(59, 130, 246, 0.5)",s=(p,f,b,g,y)=>F.box({id:`${n}-${p}`,position:"absolute",x:f,y:b,z:0,width:g,height:y,is3D:!0,twoSided:!0,material:"unlit",background:a}),u=4096,c=[],m=Math.ceil(r/u),d=Math.ceil(t/u);for(let p=0;p<=i;p++){let f=p/i-.5;for(let b=0;b<m;b++){let g=r/m,y=-r/2+g*(b+.5);c.push(s(`v${p}-${b}`,f*t,y,o,g))}for(let b=0;b<d;b++){let g=t/d,y=-t/2+g*(b+.5);c.push(s(`h${p}-${b}`,y,f*r,g,o))}}return F.box({id:n,position:"absolute",width:t,height:r,x:e.x??0,y:e.y??0,z:e.z??0,is3D:!0,transformStyle:"preserve-3d",rotateX:e.rotateX??90,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,background:"transparent",opacity:e.opacity??1,children:c})},text(e){return e.extrusionDepth&&e.extrusionDepth>0?Ce.extrudedText({...e,depth:e.extrusionDepth}):F.text(e.text,{id:e.id??Z("text3d"),position:"absolute",x:e.x??0,y:e.y??0,z:e.z??0,is3D:!0,twoSided:e.twoSided??!0,rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,fontSize:e.fontSize??48,fontFamily:e.fontFamily,fontWeight:e.fontWeight??"bold",fontStyle:e.fontStyle,fill:e.fill??"#ffffff",align:e.align??"center",direction:e.direction,verticalAlign:e.verticalAlign??"middle",letterSpacing:e.letterSpacing,lineHeight:e.lineHeight,material:e.material??"lit",shininess:e.shininess??64,roughness:e.roughness,specularIntensity:e.specularIntensity??.8,ambientIntensity:e.ambientIntensity??1,metallic:e.metallic,...St(e),opacity:e.opacity??1,background:e.background,borderRadius:e.borderRadius,padding:e.padding,stroke:e.stroke,strokeWidth:e.strokeWidth})},extrudedText(e){let{depth:t,text:r,fill:n="#ffffff",bevelColor:i}=e,o,a=(e.curveTolerance??.1)/xb(e),s=(e.fontFamily?Kt.getParsed(e.fontFamily):null)??Kt.getParsed("Inter")??Kt.getParsed("Unbounded")??Kt.getFirstParsed();s&&(o=Js({text:r,font:s,fontSize:e.fontSize??48,depth:t,fill:n,bevelColor:i,curveSegments:e.curveSegments,curveTolerance:a,align:e.align,direction:e.direction,verticalAlign:e.verticalAlign,letterSpacing:e.letterSpacing,material:e.material==="lit"||e.material==="unlit"||e.material==="toon"?e.material:void 0,shininess:e.shininess,roughness:e.roughness,metallic:e.metallic}).modelData);let u=F.model({id:e.id??Z("extruded-text"),modelData:o,is3D:!0,x:e.x??0,y:e.y??0,z:e.z??0,rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,scale:e.scale??1,scaleX:e.scaleX??1,scaleY:e.scaleY??1,scaleZ:e.scaleZ??1,opacity:e.opacity??1,material:e.material,shininess:e.shininess??32,roughness:e.roughness,specularIntensity:e.specularIntensity??.8,ambientIntensity:e.ambientIntensity??1,metallic:e.metallic,...St(e),twoSided:e.twoSided??!0,text3dOptions:{...e,curveTolerance:a}});return gn(u,{faces:[u],items:[u]})},roundedBox(e){return Ee("rounded-box",{type:"roundedBox",width:e.width,height:e.height,depth:e.depth,radius:e.radius,segments:e.segments,taper:e.taper},e)},sphere(e){return Ee("sphere",{type:"sphere",radius:e.radius,segments:e.segments},e)},cylinder(e){return Ee("cylinder",{type:"cylinder",radius:e.radius,radiusTop:e.radiusTop,radiusBottom:e.radiusBottom,height:e.height,segments:e.segments,openEnded:e.openEnded,flatShaded:e.flatShaded},{...e,twoSided:e.twoSided??!!e.openEnded})},torus(e={}){return Ee("torus",{type:"torus",radius:e.radius,tube:e.tube,radialSegments:e.radialSegments,tubularSegments:e.tubularSegments,arc:e.arc},e)},capsule(e={}){return Ee("capsule",{type:"capsule",radius:e.radius,length:e.length,capSegments:e.capSegments,radialSegments:e.radialSegments},e)},ring(e={}){return Ee("ring",{type:"ring",innerRadius:e.innerRadius,outerRadius:e.outerRadius,depth:e.depth,thetaSegments:e.thetaSegments,phiSegments:e.phiSegments,thetaStart:e.thetaStart,thetaLength:e.thetaLength},e)},polyhedron(e={}){let t=e.shape??e.type??"icosahedron";return Ee(t,{type:"polyhedron",shape:t,radius:e.radius,detail:e.detail,flatShaded:e.flatShaded},e)},icosahedron(e={}){return Ce.polyhedron({...e,shape:"icosahedron"})},icosphere(e={}){return Ce.polyhedron({...e,shape:"icosphere",detail:e.detail??2,flatShaded:e.flatShaded??!1})},extrude(e){return Ee("extrude",{type:"extrude",shape:e.shape,d:e.d,contour:e.contour,holes:e.holes,depth:e.depth,bevelThickness:e.bevelThickness,bevelSize:e.bevelSize,bevelSegments:e.bevelSegments,bevelColor:e.bevelColor,curveSegments:e.curveSegments,curveTolerance:e.curveTolerance,center:e.center},e)},lathe(e){let t=e.capped??e.closed;return Ee("lathe",{type:"lathe",points:e.points,segments:e.segments,phiStart:e.phiStart,phiLength:e.phiLength,capped:t,closed:e.closed,flatShaded:e.flatShaded},{...e,twoSided:e.twoSided??!(t??!1)})},tube(e){let t=e.path??e.points;if(!t)throw new Error("Layer3D.tube requires `path` or `points`");return Ee("tube",{type:"tube",path:hs(t),radius:e.radius,innerRadius:e.innerRadius,radiusTaper:e.radiusTaper,tubularSegments:e.tubularSegments,radialSegments:e.radialSegments,closed:e.closed,capped:e.capped},{...e,twoSided:e.twoSided??e.capped===!1})},line(e){let t=e.points??e.path;if(!t)throw new Error("Layer3D.line requires `points` or `path`");return Ee("line3d",{type:"line3d",points:hs(t),colors:e.colors,mode:e.mode,closed:e.closed,dashSize:e.dashSize,gapSize:e.gapSize},{...e,material:e.material??"unlit",castShadow:e.castShadow??!1})},points(e){let t=(e.pointSize??0)<=0;return Ee("points3d",{type:"points3d",points:hs(e.points),colors:e.colors,pointSize:e.pointSize},{...e,material:e.material??(t?"unlit":"lit"),castShadow:e.castShadow??!t})},shard(e={}){return Ee("shard",{type:"shard",radius:e.radius,size:e.size,facets:e.facets,seed:e.seed,irregularity:e.irregularity},e)},instances(e){let t=Array.isArray(e.mesh)?e.mesh[0]:e.mesh,r={id:e.id??Z("instances3d"),kind:"model3d",x:e.x??0,y:e.y??0,z:e.z??0,rotateX:e.rotateX??0,rotateY:e.rotateY??0,rotateZ:e.rotateZ??0,scale:e.scale??1,color:e.color,colorTint:e.colorTint,opacity:e.opacity??1,twoSided:e.twoSided??!0,wireframe:e.wireframe??!1,material:e.material??"lit",roughness:e.roughness,metallic:e.metallic,specularIntensity:e.specularIntensity,ambientIntensity:e.ambientIntensity,startFrame:e.startFrame,durationFrames:e.durationFrames,instances3d:{...e},...St(e)};if(t){let n=t;n.modelData&&(r.modelData=n.modelData),n.primitive3d&&(r.primitive3d=n.primitive3d),n.src&&(r.src=n.src)}return F.model(r)},swarm(e={}){return Zm(e)},model(e={}){return F.model(e)},obj(e,t={}){return F.obj(e,t)},fbx(e,t={}){return F.fbx(e,t)},gltf(e,t={}){return F.gltf(e,t)},glb(e,t={}){return F.glb(e,t)},stl(e,t={}){return F.stl(e,t)},ply(e,t={}){return F.ply(e,t)},vox(e,t={}){return F.vox(e,t)},threeDS(e,t={}){return F.threeDS(e,t)},off(e,t={}){return F.off(e,t)}};h();var gs=(e,t,r)=>{switch(e){case"left":return{dx:-t,dy:0};case"right":return{dx:t,dy:0};case"up":return{dx:0,dy:-r};default:return{dx:0,dy:r}}};function at(e,t,r){return{kind:e,frames:Math.max(0,Math.round(t)),build:r}}var Km={cut:()=>at("cut",0,()=>({})),crossfade:(e=15,t="sine.inOut")=>at("crossfade",e,r=>({incoming:te.keys("opacity",[[0,0],[r.frames,1,t]])})),fadeThrough:(e=20,t="sine.inOut")=>at("fadeThrough",e,r=>{let n=Math.max(1,Math.floor(r.frames/2));return{outgoing:te.keys("opacity",[[r.outStart,1],[r.outStart+n,0,t]]),incoming:te.keys("opacity",[[0,0],[n,0],[r.frames,1,t]])}}),push:(e="left",t=18,r="power3.inOut")=>at("push",t,n=>{let{dx:i,dy:o}=gs(e,n.width,n.height),a=te.create(),s=te.create();return i!==0?(a.keys("x",[[n.outStart,n.outRest.x],[n.outStart+n.frames,n.outRest.x+i,r]]),s.keys("x",[[0,n.inRest.x-i],[n.frames,n.inRest.x,r]])):(a.keys("y",[[n.outStart,n.outRest.y],[n.outStart+n.frames,n.outRest.y+o,r]]),s.keys("y",[[0,n.inRest.y-o],[n.frames,n.inRest.y,r]])),{outgoing:a,incoming:s}}),slide:(e="left",t=18,r="power3.out")=>at("slide",t,n=>{let{dx:i,dy:o}=gs(e,n.width,n.height),a=i!==0?"x":"y",s=i!==0?n.inRest.x:n.inRest.y;return{outgoing:te.keys("opacity",[[n.outStart,1],[n.outStart+n.frames,.6,r]]),incoming:te.keys(a,[[0,s-(i||o)],[n.frames,s,r]])}}),zoom:(e=18,t="power2.inOut")=>at("zoom",e,r=>({outgoing:te.create().keys("scale",[[r.outStart,1],[r.outStart+r.frames,1.25,t]]).keys("opacity",[[r.outStart,1],[r.outStart+r.frames,0,t]]),incoming:te.create().keys("scale",[[0,.85],[r.frames,1,t]]).keys("opacity",[[0,0],[r.frames,1,t]])})),whip:(e="left",t=10)=>{let r=Km.push(e,t,"expo.inOut");return at("whip",t,n=>({...r.build(n),sceneProps:{motionBlurShutter:360}}))},wipe:(e="left",t=18,r="power2.inOut")=>at("wipe",t,n=>{let{dx:i,dy:o}=gs(e,n.width,n.height),a=i!==0?"x":"y",s=i!==0?n.inRest.x:n.inRest.y;return{incomingMatte:F.box({id:Z("wipe-matte"),position:"absolute",x:n.inRest.x,y:n.inRest.y,width:n.width,height:n.height,background:"#ffffff"}).animate(te.keys(a,[[0,s-(i||o)],[n.frames,s,r]]))}}),iris:(e=20,t={})=>at("iris",e,r=>{let[n,i]=t.at??[.5,.5],o=r.inRest.x+n*r.width,a=r.inRest.y+i*r.height,s=Math.hypot(Math.max(n,1-n)*r.width,Math.max(i,1-i)*r.height);return{incomingMatte:F.shape("circle",{id:Z("iris-matte"),position:"absolute",x:o-s,y:a-s,width:s*2,height:s*2,fillColor:"#ffffff"}).animate(te.keys("scale",[[0,0],[r.frames,1,t.ease??"power2.inOut"]]))}})};function Ri(e,t,r){let n=e[t];return typeof n=="number"?n:r}function Qm(e,t={}){let r=[],n=[],i=0;e.forEach((a,s)=>{let u=s===0?void 0:a.transition,c=Math.min(u?.frames??0,e[s-1]?.duration??0),m=Math.max(0,i-c),d=Math.max(1,Math.round(a.duration));n.push(m);let p=a.scene;(p.position===void 0||p.position==="relative")&&(p.position="absolute",p.x??=0,p.y??=0),p.startFrame=m,p.durationFrames=d,r.push(p),i=m+d}),e.forEach((a,s)=>{if(s===0||!a.transition||a.transition.frames===0)return;let u=r[s-1],c=r[s],m=Math.min(a.transition.frames,e[s-1].duration),d=t.width??Ri(c,"width",1920),p=t.height??Ri(c,"height",1080),f=a.transition.build({width:d,height:p,frames:m,outStart:e[s-1].duration-m,outRest:{x:typeof u.x=="number"?u.x:0,y:typeof u.y=="number"?u.y:0},inRest:{x:typeof c.x=="number"?c.x:0,y:typeof c.y=="number"?c.y:0}}),b=(g,y)=>{if(!y)return;let v=g.animation?.tracks??[];g.animation=te.merge({tracks:v},y).toSpec()};b(u,f.outgoing),b(c,f.incoming),f.sceneProps&&(Object.assign(u,f.sceneProps),Object.assign(c,f.sceneProps)),f.incomingMatte&&(c.matte={node:f.incomingMatte,mode:"alpha"})});let o=F.box({id:t.id??Z("sequence"),position:"absolute",x:0,y:0,width:t.width??Ri(r[0]??{},"width",1920),height:t.height??Ri(r[0]??{},"height",1080),startFrame:t.startFrame??0,durationFrames:Math.max(1,i),children:r});return Object.defineProperty(o,"totalFrames",{value:i,enumerable:!1}),Object.defineProperty(o,"sceneStarts",{value:n,enumerable:!1}),o}h();var wb={studio:{environment:"studio",envIntensity:1,key:{dir:[-.55,-1,-.7],color:"#fff6ec",intensity:1.1},rim:{dir:[.9,-.5,.9],color:"#dbe8ff",intensity:.9}},soft:{environment:"soft",envIntensity:1,key:{dir:[-.4,-1,-.8],color:"#ffffff",intensity:1}},sunset:{environment:"sunset",envIntensity:.9,key:{dir:[-1,-.35,-.3],color:"#ffb27a",intensity:2.2},fill:{dir:[.8,-.6,-.4],color:"#7f9cff",intensity:.35}},dramatic:{environment:"night",envIntensity:.8,key:{dir:[-.8,-1,-.35],color:"#ffffff",intensity:2.4},rim:{dir:[.7,-.4,1],color:"#8fb4ff",intensity:1.8}}};function vb([e,t,r],n){let i=n*Math.PI/180,o=Math.cos(i),a=Math.sin(i);return[o*e+a*r,t,-a*e+o*r]}function Jm(e,t,r,n){let[i,o,a]=vb(e,n),s=Math.hypot(i,o,a)||1;return{x:t[0]+i/s*r,y:t[1]+o/s*r,z:t[2]+a/s*r,targetX:t[0],targetY:t[1],targetZ:t[2]}}function Fi(e,t){let r=wb[e],n=t.target??[960,540,0],i=t.distance??1600,o=t.rotation??0,a=t.intensity??1,s=t.id??Z(`lighting-${e}`),u=[st.environment(r.environment,{id:`${s}-environment`,intensity:r.envIntensity*a,rotation:o,exposure:t.exposure,toneMapping:t.toneMapping,fog:t.fog,bloom:t.bloom}),st.directional({id:`${s}-key`,color:r.key.color,intensity:r.key.intensity*a,...Jm(r.key.dir,n,i,o),castShadow:t.shadows??!0,shadowSoftness:t.shadowSoftness??3})];for(let[c,m]of[["rim",r.rim],["fill",r.fill]])m&&u.push(st.directional({id:`${s}-${c}`,color:m.color,intensity:m.intensity*a,...Jm(m.dir,n,i,o)}));return u}var Sb={studio:(e={})=>Fi("studio",e),soft:(e={})=>Fi("soft",e),sunset:(e={})=>Fi("sunset",e),dramatic:(e={})=>Fi("dramatic",e)};h();h();var kb="@dimforge/rapier2d-deterministic-compat",Pb="@dimforge/rapier3d-deterministic-compat";async function ed(e,t){let r;try{r=await t()}catch(i){throw new Error(`Physics needs the optional dependency "${e}". Install it with \`npm i ${e}\`.`,{cause:i})}let n=r.default??r;return await n.init(),n}var td,rd;async function xs(e){if(e===2){td??=ed(kb,()=>import("./rapier-ZL2QGRPX.mjs"));let r=await td;return{createWorld2D:n=>new bs(r,n),createWorld3D:()=>{throw new Error("This backend was loaded for 2D.")}}}rd??=ed(Pb,()=>import("./rapier-EQTGTIYW.mjs"));let t=await rd;return{createWorld2D:()=>{throw new Error("This backend was loaded for 3D.")},createWorld3D:r=>new ys(t,r)}}var bs=class{constructor(t,r){this.R=t;this.world=new t.World({x:r[0],y:r[1]}),this.events=new t.EventQueue(!0)}R;world;events;byCollider=new Map;started=[];addBody(t){let r=this.R,n=nd(r,t.type).setTranslation(t.position[0],t.position[1]).setRotation(t.angle).setLinvel(t.velocity[0],t.velocity[1]).setAngvel(t.angularVelocity).setLinearDamping(t.linearDamping).setAngularDamping(t.angularDamping).setGravityScale(t.gravityScale).setCcdEnabled(t.ccd).setEnabled(t.enabled);t.lockRotation&&n.lockRotations();let i=this.world.createRigidBody(n),o=this.world.createCollider(Mb(r,t.shape).setDensity(t.density).setFriction(t.friction).setRestitution(t.restitution).setActiveEvents(r.ActiveEvents.COLLISION_EVENTS).setSensor(t.sensor??!1),i),a={raw:i,position:()=>{let s=i.translation();return[s.x,s.y]},rotation:()=>i.rotation(),velocity:()=>{let s=i.linvel();return[s.x,s.y]},angularVelocity:()=>i.angvel(),sleeping:()=>i.isSleeping(),mass:()=>i.mass(),setEnabled:s=>i.setEnabled(s),applyImpulse:([s,u])=>i.applyImpulse({x:s,y:u},!0),setKinematicTarget:([s,u],c)=>{i.setNextKinematicTranslation({x:s,y:u}),i.setNextKinematicRotation(c)}};return this.byCollider.set(o.handle,a),a}addJoint(t,r,n){let i=this.R,o={x:n.anchorA[0],y:n.anchorA[1]},a={x:n.anchorB[0],y:n.anchorB[1]},s;switch(n.type){case"revolute":case"spherical":s=i.JointData.revolute(o,a);break;case"fixed":s=i.JointData.fixed(o,0,a,0);break;case"rope":s=i.JointData.rope(n.length,o,a);break;case"spring":s=i.JointData.spring(n.restLength,n.stiffness,n.damping,o,a);break}this.world.createImpulseJoint(s,Bi(t),Bi(r),!0).setContactsEnabled(!1)}step(t){this.world.timestep=t,this.world.step(this.events),this.events.drainCollisionEvents((r,n,i)=>{if(!i)return;let o=this.byCollider.get(r),a=this.byCollider.get(n);o&&a&&this.started.push([o,a])})}drainCollisionStarts(){return this.started.splice(0)}free(){this.events.free(),this.world.free()}},ys=class{constructor(t,r){this.R=t;this.world=new t.World({x:r[0],y:r[1],z:r[2]}),this.events=new t.EventQueue(!0)}R;world;events;byCollider=new Map;started=[];addBody(t){let r=this.R,[n,i,o,a]=t.rotation,s=nd(r,t.type).setTranslation(t.position[0],t.position[1],t.position[2]).setRotation({x:n,y:i,z:o,w:a}).setLinvel(t.velocity[0],t.velocity[1],t.velocity[2]).setAngvel(Sr(t.lockRotation?[0,0,0]:t.angularVelocity.map((p,f)=>t.enabledRotations&&!t.enabledRotations[f]?0:p))).setLinearDamping(t.linearDamping).setAngularDamping(t.angularDamping).setGravityScale(t.gravityScale).setCcdEnabled(t.ccd).setEnabled(t.enabled);t.lockRotation?s.lockRotations():t.enabledRotations&&s.enabledRotations(...t.enabledRotations);let u=this.world.createRigidBody(s),c=Tb(r,t.shape),m=this.world.createCollider(c.setDensity(t.density).setFriction(t.friction).setRestitution(t.restitution).setActiveEvents(r.ActiveEvents.COLLISION_EVENTS).setSensor(t.sensor??!1),u),d={raw:u,position:()=>{let p=u.translation();return[p.x,p.y,p.z]},rotation:()=>{let p=u.rotation();return[p.x,p.y,p.z,p.w]},velocity:()=>{let p=u.linvel();return[p.x,p.y,p.z]},angularVelocity:()=>{let p=u.angvel();return[p.x,p.y,p.z]},sleeping:()=>u.isSleeping(),mass:()=>u.mass(),setEnabled:p=>u.setEnabled(p),applyImpulse:p=>u.applyImpulse(Sr(p),!0),setKinematicTarget:(p,[f,b,g,y])=>{u.setNextKinematicTranslation(Sr(p)),u.setNextKinematicRotation({x:f,y:b,z:g,w:y})}};return this.byCollider.set(m.handle,d),d}addJoint(t,r,n){let i=this.R,o=Sr(n.anchorA),a=Sr(n.anchorB),s;switch(n.type){case"revolute":s=i.JointData.revolute(o,a,Sr(n.axis??[0,0,1]));break;case"spherical":s=i.JointData.spherical(o,a);break;case"fixed":{let u={x:0,y:0,z:0,w:1};s=i.JointData.fixed(o,u,a,u);break}case"rope":s=i.JointData.rope(n.length,o,a);break;case"spring":s=i.JointData.spring(n.restLength,n.stiffness,n.damping,o,a);break}this.world.createImpulseJoint(s,Bi(t),Bi(r),!0).setContactsEnabled(!1)}step(t){this.world.timestep=t,this.world.step(this.events),this.events.drainCollisionEvents((r,n,i)=>{if(!i)return;let o=this.byCollider.get(r),a=this.byCollider.get(n);o&&a&&this.started.push([o,a])})}drainCollisionStarts(){return this.started.splice(0)}free(){this.events.free(),this.world.free()}};function Sr([e,t,r]){return{x:e,y:t,z:r}}function Bi(e){return e.raw}function nd(e,t){let r=e.RigidBodyDesc;return t==="fixed"?r.fixed():t==="kinematic"?r.kinematicPositionBased():r.dynamic()}function Mb(e,t){switch(t.kind){case"ball":return e.ColliderDesc.ball(t.radius);case"box":{let r=Math.min(t.radius??0,t.hx/2,t.hy/2);return r>0?e.ColliderDesc.roundCuboid(t.hx-r,t.hy-r,r):e.ColliderDesc.cuboid(t.hx,t.hy)}case"hull":{let r=e.ColliderDesc.convexHull(new Float32Array(t.points));if(!r)throw new Error("Physics: could not build a convex hull for this shape.");return r}}}function Tb(e,t){switch(t.kind){case"ball":return e.ColliderDesc.ball(t.radius);case"box":{let r=Math.min(t.radius??0,t.hx/2,t.hy/2,t.hz/2);return r>0?e.ColliderDesc.roundCuboid(t.hx-r,t.hy-r,t.hz-r,r):e.ColliderDesc.cuboid(t.hx,t.hy,t.hz)}case"cylinder":return e.ColliderDesc.cylinder(t.halfHeight,t.radius);case"hull":{let r=e.ColliderDesc.convexHull(new Float32Array(t.points));if(!r)throw new Error("Physics: could not build a convex hull for this shape.");return r}}}h();var bn=class{constructor(t,r,n,i,o,a,s){this.world=t;this.type=n;this.layer=i;this.frame=o;this.options=a;this.sim=r,this.recording=s}world;type;layer;frame;options;collisions=[];recording;sim;get startFrame(){return Math.max(0,Math.round(this.options.startFrame??0))}get gravityScale(){return this.options.gravityScale??1}get output(){return this.options.output}get x(){return this.recording.signal("x")}get y(){return this.recording.signal("y")}get rotation(){return this.recording.signal("rotation")}get centerX(){return this.recording.signal("centerX")}get centerY(){return this.recording.signal("centerY")}get vx(){return this.recording.signal("vx")}get vy(){return this.recording.signal("vy")}get speed(){return this.recording.signal("speed")}get angularVelocity(){return this.recording.signal("angularVelocity")}get impact(){return this.recording.signal("impact")}get sleeping(){return this.recording.signal("sleeping")}kinematicTarget(t){let r=this.options.follow;if(this.type!=="kinematic"||!r)return;let n=this.frame,i=this.world.fps,o=r.x===void 0?void 0:Ve(r.x,t,i),a=r.y===void 0?void 0:Ve(r.y,t,i),s=r.rotation===void 0?n.rotation:Ve(r.rotation,t,i),u=this.initialLayerXY(),c=ad(o??u[0],a??u[1],s,n),m=this.world.pixelsPerMeter;return{position:[c[0]/m,c[1]/m],rotation:s*Math.PI/180}}initialLayerXY(){let t=this.layer;return[Number(t?.x??0),Number(t?.y??0)]}record(t,r){let n=this.world.pixelsPerMeter,[i,o]=this.sim.position(),a=i*n,s=o*n,u=this.recording,c=u.channel("rotation"),m=this.sim.rotation()*180/Math.PI;c[t]=r<0?Yt(this.frame.rotation,m):Yt(c[r],m);let[d,p]=Ob(a,s,c[t],this.frame);u.channel("x")[t]=d,u.channel("y")[t]=p,u.channel("centerX")[t]=a,u.channel("centerY")[t]=s;let[f,b]=this.sim.velocity();u.channel("vx")[t]=f*n,u.channel("vy")[t]=b*n,u.channel("speed")[t]=Math.hypot(f,b)*n,u.channel("angularVelocity")[t]=this.sim.angularVelocity()*180/Math.PI,u.channel("sleeping")[t]=this.sim.sleeping()?1:0}boundChannels(){let t=[["x","x"],["y","y"]];return this.options.lockRotation||t.push(["rotation","rotation"]),t}localAnchor(t){if(!t)return[0,0];let r=this.world.pixelsPerMeter,[n,i]=this.sim.position(),o=-this.sim.rotation(),a=t[0]/r-n,s=t[1]/r-i;return[a*Math.cos(o)-s*Math.sin(o),a*Math.sin(o)+s*Math.cos(o)]}center(){let t=this.world.pixelsPerMeter,[r,n]=this.sim.position();return[r*t,n*t]}},kr=class extends vr{constructor(t,r){let n=r.pixelsPerMeter??100,i=r.gravity??2400,o=typeof i=="number"?[0,i/n]:[i[0]/n,i[1]/n],a=t.createWorld2D(o);super(a,o,r)}body(t,r={}){this.assertOpen();let i=typeof t.kind=="string"?t:void 0,o=Ab(t,r),a=this.pixelsPerMeter,s=r.type??"dynamic",[u,c]=ad(o.x,o.y,o.rotation,o),m=r.velocity??[0,0],d={type:s,position:[u/a,c/a],angle:o.rotation*Math.PI/180,velocity:[m[0]/a,m[1]/a],angularVelocity:(r.angularVelocity??0)*Math.PI/180,linearDamping:r.linearDamping??0,angularDamping:r.angularDamping??0,gravityScale:r.gravityScale??1,lockRotation:r.lockRotation??!1,ccd:r.ccd??!1,enabled:!0,sensor:r.sensor??!1,density:r.density??1,friction:r.friction??.6,restitution:r.restitution??.3,shape:id(o.shape,1/a)},p=this.sim.addBody(d),f=new bn(this,p,s,i,o,r,this.newRecording());return this.addBody(f)}ground(t){return this.body({x:-1e6/2,y:t.y,width:1e6,height:2e3},{type:"fixed",friction:t.friction,restitution:t.restitution??.2})}walls(t){let{width:r,height:n}=t,i=t.x??0,o=t.y??0,a=t.thickness??400,s={type:"fixed",friction:t.friction,restitution:t.restitution??.2},u=n*4+a,c={floor:this.body({x:i-a,y:o+n,width:r+2*a,height:a},s),left:this.body({x:i-a,y:o+n-u,width:a,height:u},s),right:this.body({x:i+r,y:o+n-u,width:a,height:u},s),ceiling:void 0};return t.ceiling&&(c.ceiling=this.body({x:i-a,y:o-a,width:r+2*a,height:a},s)),c}pin(t,r){let n=r??t.center(),i=this.anchorBody(n);return this.joint(t,i,{type:"revolute",anchorA:t.localAnchor(n),anchorB:[0,0]}),this}hinge(t,r,n){return this.joint(t,r,{type:"revolute",anchorA:t.localAnchor(n),anchorB:r.localAnchor(n)}),this}weld(t,r){let n=t.center();return this.joint(t,r,{type:"fixed",anchorA:[0,0],anchorB:r.localAnchor(n)}),this}spring(t,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(t,r,n.anchorA,n.anchorB),s=this.pixelsPerMeter,u=(n.length??Math.hypot(a[0]-o[0],a[1]-o[1]))/s,c=Cb(t,i),m=2*Math.PI*(n.frequency??2);return this.joint(t,i,{type:"spring",anchorA:t.localAnchor(o),anchorB:i.localAnchor(a),restLength:u,stiffness:c*m*m,damping:2*(n.dampingRatio??.2)*c*m}),this}rope(t,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(t,r,n.anchorA,n.anchorB),s=n.length??Math.hypot(a[0]-o[0],a[1]-o[1]);return this.joint(t,i,{type:"rope",anchorA:t.localAnchor(o),anchorB:i.localAnchor(a),length:s/this.pixelsPerMeter}),this}force(t,r){let n=this.pixelsPerMeter;return this.addForce(t,i=>[r.x===void 0?0:Ve(r.x,i,this.fps)/n,r.y===void 0?0:Ve(r.y,i,this.fps)/n]),this}field(t,r={}){let n=this.pixelsPerMeter;return this.addField((i,o)=>{let[a,s]=i.sim.position(),[u,c]=i.sim.velocity(),m=t({x:a*n,y:s*n,vx:u*n,vy:c*n,frame:o,body:i});return m?[m[0]/n,m[1]/n]:null},r.bodies),this}impulse(t,r,n){let i=this.pixelsPerMeter;return this.addImpulse(t,r,[n[0]/i,n[1]/i]),this}lerpRotation(t,r,n){return t+(r-t)*n}joint(t,r,n){this.assertOpen(),this.sim.addJoint(t.sim,r.sim,n)}anchorBody(t){return this.body({x:t[0]-.5,y:t[1]-.5,width:1,height:1},{type:"fixed",output:"none",sensor:!0})}endpoints(t,r,n,i){let o=n??t.center();if(Array.isArray(r)){let a=i??r;return{other:this.anchorBody(a),pa:o,pb:a}}return{other:r,pa:o,pb:i??r.center()}}};function Cb(e,t){let r=e.type==="dynamic"?e.sim.mass():0,n=t.type==="dynamic"?t.sim.mass():0;return r>0&&n>0?r*n/(r+n):Math.max(r,n,.001)}function Ke(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function Ab(e,t){let r=typeof e.id=="string"?` "${e.id}"`:"";if(typeof e.x!="number"||typeof e.y!="number")throw new Error(`Physics: layer${r} needs numeric \`x\` and \`y\` (absolute position) to become a body.`);let n=t.size?.[0]??(typeof e.width=="number"?e.width:void 0),i=t.size?.[1]??(typeof e.height=="number"?e.height:void 0);if((n===void 0||i===void 0)&&e.kind==="text"){let s=ze.measure(String(e.text??""),{fontFamily:String(e.fontFamily??"Inter"),fontSize:Ke(e.fontSize,48),fontWeight:e.fontWeight,letterSpacing:Ke(e.letterSpacing,0),lineHeight:typeof e.lineHeight=="number"?e.lineHeight:void 0});n??=s.width,i??=s.height}if(n===void 0||i===void 0||n<=0||i<=0)throw new Error(`Physics: layer${r} needs a numeric \`width\` and \`height\` (or the \`size\` option) to become a body.`);let o=Ke(e.scale,1);return{...{x:e.x,y:e.y,width:n,height:i,scale:o,anchorX:Ke(e.anchorX,.5),anchorY:Ke(e.anchorY,.5),rotation:Ke(e.rotation,0)},shape:id(Db(e,n,i,t.shape??"auto"),o)}}function Db(e,t,r,n){let o=e.kind==="shape"?String(e.shapeType??"rect"):"rect",a=Ke(e.borderRadius,Ke(e.cornerRadius,0)),s={kind:"box",hx:t/2,hy:r/2,radius:a};if(n==="box")return s;if(n==="circle"||n==="auto"&&o==="circle")return{kind:"ball",radius:Math.min(t,r)/2};if(n==="auto"&&o==="rect")return s;if(n==="hull"||n==="auto"){let u=Nb(e,o,t,r);return u.length>=6?{kind:"hull",points:u}:s}return s}function Nb(e,t,r,n){let i=t==="path"?String(e.d??""):Zs({shapeType:t,width:r,height:n,cornerRadius:Ke(e.cornerRadius,Ke(e.borderRadius,0)),polygonSides:e.polygonSides,starPoints:e.starPoints,starInnerRadiusRatio:e.starInnerRadiusRatio,arrowHeadWidth:e.arrowHeadWidth,arrowHeadLength:e.arrowHeadLength,arrowShaftWidth:e.arrowShaftWidth}),o=[];for(let a of qs(i))o.push(a.p0.x-r/2,a.p0.y-n/2,a.p1.x-r/2,a.p1.y-n/2);return o}function id(e,t){switch(e.kind){case"ball":return{kind:"ball",radius:e.radius*t};case"box":return{kind:"box",hx:e.hx*t,hy:e.hy*t,radius:(e.radius??0)*t};case"hull":return{kind:"hull",points:e.points.map(r=>r*t)}}}function od(e,t){let r=e*Math.PI/180,n=(.5-t.anchorX)*t.width*t.scale,i=(.5-t.anchorY)*t.height*t.scale;return[n*Math.cos(r)-i*Math.sin(r),n*Math.sin(r)+i*Math.cos(r)]}function ad(e,t,r,n){let[i,o]=od(r,n);return[e+n.anchorX*n.width+i,t+n.anchorY*n.height+o]}function Ob(e,t,r,n){let[i,o]=od(r,n);return[e-i-n.anchorX*n.width,t-o-n.anchorY*n.height]}h();var kt=Math.PI/180;function ud(e,t,r){let n=s=>s*kt/2,i=[Math.sin(n(e)),0,0,Math.cos(n(e))],o=[0,Math.sin(n(t)),0,Math.cos(n(t))],a=[0,0,Math.sin(n(r)),Math.cos(n(r))];return Li(Li(a,o),i)}function Li(e,t){let[r,n,i,o]=e,[a,s,u,c]=t;return[o*a+r*c+n*u-i*s,o*s-r*u+n*c+i*a,o*u+r*s-n*a+i*c,o*c-r*a-n*s-i*u]}function Rb(e,t){let[r,n,i,o]=e,a=1-2*(n*n+i*i),s=2*(r*n+o*i),u=2*(r*i-o*n),c=2*(n*i+o*r),m=1-2*(r*r+n*n),d=2*(r*n-o*i),p=1-2*(r*r+i*i),f=Math.max(-1,Math.min(1,-u)),b;if(Math.abs(f)>.999999){let A=Math.asin(f),S=t?t[0]*kt:0,M=Math.atan2(-d,p)+(f>0?S:-S);b=[S,A,M]}else b=[Math.atan2(c,m),Math.asin(f),Math.atan2(s,a)];let g=[b[0]/kt,b[1]/kt,b[2]/kt];if(!t)return g;let y=[g[0]+180,180-g[1],g[2]+180],v=A=>[Yt(t[0],A[0]),Yt(t[1],A[1]),Yt(t[2],A[2])],T=v(g),C=v(y),w=A=>Math.abs(A[0]-t[0])+Math.abs(A[1]-t[1])+Math.abs(A[2]-t[2]);return w(T)<=w(C)?T:C}var yn=class{constructor(t,r,n,i,o,a,s){this.world=t;this.type=n;this.layer=i;this.start=o;this.options=a;this.sim=r,this.recording=s}world;type;layer;start;options;collisions=[];recording;sim;get startFrame(){return Math.max(0,Math.round(this.options.startFrame??0))}get gravityScale(){return this.options.gravityScale??1}get output(){return this.options.output}get x(){return this.recording.signal("x")}get y(){return this.recording.signal("y")}get z(){return this.recording.signal("z")}get rotateX(){return this.recording.signal("rotateX")}get rotateY(){return this.recording.signal("rotateY")}get rotateZ(){return this.recording.signal("rotateZ")}get vx(){return this.recording.signal("vx")}get vy(){return this.recording.signal("vy")}get vz(){return this.recording.signal("vz")}get speed(){return this.recording.signal("speed")}get impact(){return this.recording.signal("impact")}get sleeping(){return this.recording.signal("sleeping")}kinematicTarget(t){let r=this.options.follow;if(this.type!=="kinematic"||!r)return;let n=this.world.fps,i=(u,c)=>u===void 0?c:Ve(u,t,n),o=this.start.position,a=this.start.rotation,s=this.world.pixelsPerMeter;return{position:[i(r.x,o[0])/s,i(r.y,o[1])/s,i(r.z,o[2])/s],rotation:ud(i(r.rotateX,a[0]),i(r.rotateY,a[1]),i(r.rotateZ,a[2]))}}record(t,r){let n=this.world.pixelsPerMeter,i=this.recording,[o,a,s]=this.sim.position();i.channel("x")[t]=o*n,i.channel("y")[t]=a*n,i.channel("z")[t]=s*n;let u=i.channel("rotateX"),c=i.channel("rotateY"),m=i.channel("rotateZ"),d=r<0?this.start.rotation:[u[r],c[r],m[r]],p=Rb(this.sim.rotation(),d);u[t]=p[0],c[t]=p[1],m[t]=p[2];let[f,b,g]=this.sim.velocity();i.channel("vx")[t]=f*n,i.channel("vy")[t]=b*n,i.channel("vz")[t]=g*n,i.channel("speed")[t]=Math.hypot(f,b,g)*n,i.channel("sleeping")[t]=this.sim.sleeping()?1:0}boundChannels(){let t=[["x","x"],["y","y"],["z","z"]];return this.options.lockRotation!==!0&&t.push(["rotateX","rotateX"],["rotateY","rotateY"],["rotateZ","rotateZ"]),t}localAnchor(t){if(!t)return[0,0,0];let r=this.world.pixelsPerMeter,n=this.sim.position(),[i,o,a,s]=this.sim.rotation(),u=[t[0]/r-n[0],t[1]/r-n[1],t[2]/r-n[2]];return Fb(u,[-i,-o,-a,s])}center(){let t=this.world.pixelsPerMeter,[r,n,i]=this.sim.position();return[r*t,n*t,i*t]}};function Fb(e,t){let r=Li(Li(t,[e[0],e[1],e[2],0]),[-t[0],-t[1],-t[2],t[3]]);return[r[0],r[1],r[2]]}var Pr=class extends vr{constructor(t,r){let n=r.pixelsPerMeter??100,i=r.gravity??2400,o=typeof i=="number"?[0,i/n,0]:[i[0]/n,i[1]/n,i[2]/n];super(t.createWorld3D(o),o,r)}body(t,r={}){this.assertOpen();let i=typeof t.kind=="string"?t:void 0,o=t,a=[ne(r.x??o.x,0),ne(r.y??o.y,0),ne(r.z??o.z,0)],s=[ne(r.rotateX??o.rotateX,0),ne(r.rotateY??o.rotateY,0),ne(r.rotateZ??o.rotateZ,0)],u=this.pixelsPerMeter,c=r.type??"dynamic",m=r.velocity??[0,0,0],d=r.angularVelocity??[0,0,0],p={type:c,position:[a[0]/u,a[1]/u,a[2]/u],rotation:ud(s[0],s[1],s[2]),velocity:[m[0]/u,m[1]/u,m[2]/u],angularVelocity:[d[0]*kt,d[1]*kt,d[2]*kt],linearDamping:r.linearDamping??0,angularDamping:r.angularDamping??0,gravityScale:r.gravityScale??1,lockRotation:r.lockRotation===!0,...typeof r.lockRotation=="object"&&{enabledRotations:[!r.lockRotation.x,!r.lockRotation.y,!r.lockRotation.z]},ccd:r.ccd??!1,enabled:!0,sensor:r.sensor??!1,density:r.density??1,friction:r.friction??.6,restitution:r.restitution??.3,shape:Eb(Bb(o,r),1/u)},f=this.sim.addBody(p),b=new yn(this,f,c,i,{position:a,rotation:s},r,this.newRecording());return this.addBody(b)}ground(t){return this.body({x:0,y:t.y+2e3/2,z:0,width:1e6,height:2e3,depth:1e6},{type:"fixed",friction:t.friction,restitution:t.restitution??.2})}walls(t){let{width:r,height:n,depth:i}=t,[o,a,s]=[t.x??0,t.y??0,t.z??0],u=t.thickness??400,c={type:"fixed",friction:t.friction,restitution:t.restitution??.2},m=n*4,d=a+n/2-m/2;return[this.body({x:o,y:a+n/2+u/2,z:s,width:r+2*u,height:u,depth:i+2*u},c),this.body({x:o-r/2-u/2,y:d,z:s,width:u,height:m,depth:i+2*u},c),this.body({x:o+r/2+u/2,y:d,z:s,width:u,height:m,depth:i+2*u},c),this.body({x:o,y:d,z:s-i/2-u/2,width:r,height:m,depth:u},c),this.body({x:o,y:d,z:s+i/2+u/2,width:r,height:m,depth:u},c)]}pin(t,r){let n=r??t.center(),i=this.anchorBody(n);return this.joint(t,i,{type:"spherical",anchorA:t.localAnchor(n),anchorB:[0,0,0]}),this}hinge(t,r,n,i=[0,0,1]){return this.joint(t,r,{type:"revolute",anchorA:t.localAnchor(n),anchorB:r.localAnchor(n),axis:i}),this}weld(t,r){return this.joint(t,r,{type:"fixed",anchorA:[0,0,0],anchorB:r.localAnchor(t.center())}),this}spring(t,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(t,r,n.anchorA,n.anchorB),s=this.pixelsPerMeter,u=(n.length??sd(o,a))/s,c=t.type==="dynamic"?t.sim.mass():0,m=i.type==="dynamic"?i.sim.mass():0,d=c>0&&m>0?c*m/(c+m):Math.max(c,m,.001),p=2*Math.PI*(n.frequency??2);return this.joint(t,i,{type:"spring",anchorA:t.localAnchor(o),anchorB:i.localAnchor(a),restLength:u,stiffness:d*p*p,damping:2*(n.dampingRatio??.2)*d*p}),this}rope(t,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(t,r,n.anchorA,n.anchorB);return this.joint(t,i,{type:"rope",anchorA:t.localAnchor(o),anchorB:i.localAnchor(a),length:(n.length??sd(o,a))/this.pixelsPerMeter}),this}force(t,r){let n=this.pixelsPerMeter,i=(o,a)=>o===void 0?0:Ve(o,a,this.fps)/n;return this.addForce(t,o=>[i(r.x,o),i(r.y,o),i(r.z,o)]),this}field(t,r={}){let n=this.pixelsPerMeter;return this.addField((i,o)=>{let[a,s,u]=i.sim.position(),[c,m,d]=i.sim.velocity(),p=t({x:a*n,y:s*n,z:u*n,vx:c*n,vy:m*n,vz:d*n,frame:o,body:i});return p?[p[0]/n,p[1]/n,p[2]/n]:null},r.bodies),this}impulse(t,r,n){let i=this.pixelsPerMeter;return this.addImpulse(t,r,[n[0]/i,n[1]/i,n[2]/i]),this}lerpRotation(t,r,n){let i=t[0]*r[0]+t[1]*r[1]+t[2]*r[2]+t[3]*r[3]<0?-1:1,o=t.map((s,u)=>s+(r[u]*i-s)*n),a=Math.hypot(...o)||1;return o.map(s=>s/a)}joint(t,r,n){this.assertOpen(),this.sim.addJoint(t.sim,r.sim,n)}anchorBody(t){return this.body({x:t[0],y:t[1],z:t[2],width:1,height:1,depth:1},{type:"fixed",output:"none",sensor:!0})}endpoints(t,r,n,i){let o=n??t.center();if(Array.isArray(r)){let a=i??r;return{other:this.anchorBody(a),pa:o,pb:a}}return{other:r,pa:o,pb:i??r.center()}}};function sd(e,t){return Math.hypot(t[0]-e[0],t[1]-e[1],t[2]-e[2])}function ne(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function Bb(e,t){let r=typeof e.id=="string"?` "${e.id}"`:"",n=ne(e.scale,1),i=[n*ne(e.scaleX,1),n*ne(e.scaleY,1),n*ne(e.scaleZ,1)],o=i[0]===i[1]&&i[1]===i[2],a=e.primitive3d??{},s=t.shape??"auto",u=()=>{let g=Lb(e.modelData);if(g)return{kind:"hull",points:g.map((y,v)=>y*i[v%3])}};if(t.size||s==="box"){let[g,y,v]=t.size??ws(e,a)??[0,0,0];if(g>0&&y>0&&v>0)return{kind:"box",hx:g*i[0]/2,hy:y*i[1]/2,hz:v*i[2]/2,radius:a.type==="roundedBox"?ne(a.radius,0)*Math.min(...i):0}}if(s==="hull"){let g=u();if(g)return g}if((s==="sphere"||s==="auto"&&(a.type==="sphere"||a.type==="polyhedron"&&a.shape==="icosphere"))&&(o||s==="sphere")){let g=ne(a.radius,0)||Math.max(...ws(e,a)??[0])/2;if(g>0)return{kind:"ball",radius:g*Math.max(...i)}}let m=ne(a.radiusTop,ne(a.radius,0)),d=ne(a.radiusBottom,ne(a.radius,0));if((s==="cylinder"||s==="auto"&&a.type==="cylinder")&&m===d&&m>0&&i[0]===i[2])return{kind:"cylinder",halfHeight:ne(a.height,0)*i[1]/2,radius:m*i[0]};if(s==="auto"&&a.type==="roundedBox"&&(a.taper??1)===1){let[g,y,v]=[ne(a.width,0),ne(a.height,0),ne(a.depth,0)];return{kind:"box",hx:g*i[0]/2,hy:y*i[1]/2,hz:v*i[2]/2,radius:ne(a.radius,0)*Math.min(...i)}}let f=u();if(f)return f;let b=ws(e,a);if(b)return{kind:"box",hx:b[0]*i[0]/2,hy:b[1]*i[1]/2,hz:b[2]*i[2]/2};throw new Error(`Physics: layer${r} has no mesh or size to build a 3D collider from; pass \`size: [w, h, d]\`.`)}function ws(e,t){if(t.type==="roundedBox")return[ne(t.width,0),ne(t.height,0),ne(t.depth,0)];if(t.type==="sphere"||t.type==="polyhedron"){let r=ne(t.radius,50)*2;return[r,r,r]}if(t.type==="capsule"){let r=ne(t.radius,30),n=ne(t.length,60);return[r*2,n+r*2,r*2]}if(t.type==="torus"){let r=ne(t.radius,60),n=ne(t.tube,20);return[(r+n)*2,(r+n)*2,n*2]}if(t.type==="ring"){let r=ne(t.outerRadius,60),n=Math.max(2,ne(t.depth,0));return[r*2,r*2,n]}if(t.type==="cylinder"){let r=Math.max(ne(t.radiusTop,ne(t.radius,0)),ne(t.radiusBottom,ne(t.radius,0)))*2;return[r,ne(t.height,0),r]}if(typeof e.width=="number"&&typeof e.height=="number"&&typeof e.depth=="number")return[e.width,e.height,e.depth]}function Lb(e){let t=e?.meshes;if(!t?.length)return;let r=0;for(let a of t)r+=(a.positions?.length??0)/3;if(r<4)return;let n=Math.max(1,Math.floor(r/4096)),i=[],o=0;for(let a of t){let s=a.positions;if(s)for(let u=0;u<s.length;u+=3,o++)o%n===0&&i.push(s[u],s[u+1],s[u+2])}return i}function Eb(e,t){switch(e.kind){case"ball":return{kind:"ball",radius:e.radius*t};case"box":return{kind:"box",hx:e.hx*t,hy:e.hy*t,hz:e.hz*t,radius:(e.radius??0)*t};case"cylinder":return{kind:"cylinder",halfHeight:e.halfHeight*t,radius:e.radius*t};case"hull":return{kind:"hull",points:e.points.map(r=>r*t)}}}var Ib={async world2d(e){return new kr(await xs(2),e)},async world3d(e){return new Pr(await xs(3),e)}};h();var be=(...e)=>e,zb={pixelArt:(e={})=>be(new Jt({palette:e.palette??"pico8",pixelSize:e.pixelSize??6,dither:.4})),gameBoy:(e={})=>be(new Jt({palette:"gameboy",pixelSize:e.pixelSize??4,dither:.6})),teletext:(e={})=>be(new Jt({palette:"teletext",pixelSize:e.pixelSize??10})),ledWall:(e={})=>be(new ho({size:e.size??14,shape:"circle",gap:.18})),ascii:(e={})=>be(new oo({cellSize:e.cellSize??10,colorMode:e.matrix?"green":"source",bg:e.matrix?"#020a04":"#0b0b0b"})),oneBit:(e={})=>be(new lo({mode:"bayer",scale:e.scale??2,dark:e.dark??"#111111",light:e.light??"#f2efe6"})),risograph:(e={})=>{let t=e.inkA??"#1d3fbb",r=e.inkB??"#ff5fa2",n=e.paper??"#f4efe4";return be(new Ct({stops:[{position:0,color:t},{position:.55,color:r},{position:1,color:n}]}),new Jt({palette:"custom",colors:[t,r,n],dither:.8,pixelSize:2}),new et({strength:.2}))},cartoon:(e={})=>be(new In({levels:e.levels??4,edgeColor:e.ink??"#111111",saturation:1.3})),comic:(e={})=>be(new In({levels:4,edgeWidth:1.5,saturation:1.4}),new Lr({frequency:e.dotFrequency??70,opacity:.35})),thermal:()=>be(new Ct({stops:[{position:0,color:"#000010"},{position:.25,color:"#3b0a7a"},{position:.5,color:"#c4205f"},{position:.75,color:"#ff9a1f"},{position:1,color:"#fffbe0"}]})),vhs:(e={})=>be(new Br({tracking:e.tracking??.5,chroma:4,curvature:.04,scanlines:.25,mask:.05,noise:.15}),new En({amount:3})),crt:(e={})=>be(new Br({curvature:e.curvature??.15,scanlines:.5,mask:.35})),glitch:(e={})=>be(new En({amount:e.amount??18}),new Br({tracking:1,chroma:6,curvature:0,scanlines:.1,mask:0,vignette:0})),oilPainting:(e={})=>be(new Ln({style:"oil",radius:e.brush??5})),watercolor:(e={})=>be(new Ln({style:"watercolor",radius:e.brush??6,paper:.5})),topographic:(e={})=>be(new uo({levels:e.levels??16,fill:"flat",lineColor:e.ink??"#5a3a1a",fillColor:e.paper??"#f3ead8"})),kaleidoscope:(e={})=>be(new mo({segments:e.segments??8,rotation:e.rotation??0})),opArt:(e={})=>be(new fo({pattern:e.pattern??"stripes",frequency:e.frequency??60})),holographic:(e={})=>be(new co({strength:e.strength??.7,shift:e.shift??0})),noir:()=>be(new Ct({stops:[{position:0,color:"#000000"},{position:.55,color:"#8a8a8a"},{position:1,color:"#ffffff"}]}),new et({strength:.35}),new er({strength:.6})),film:()=>be(new et({strength:.25}),new er({strength:.35}))};h();var Pd=Ar(Id(),1),Vi=Ar(zd(),1);_i();var Ms=Ar(cd(),1);h();_i();var xn=_.dirname(Nn(import.meta.url)),md=["import","meta","url"].join("."),jb=Hi(import.meta.url),wn="/@framefields/engine",pd={framefields:"index.ts","framefields/effects":"effects/index.ts","framefields/audio":"audio/index.ts","framefields/signals":"signals/index.ts","framefields/fonts":"fonts/index.ts","framefields/components":"components/index.ts"},vs={path:"path","path/posix":"path",url:"url",os:"os",fs:"fs","fs/promises":"fs-promises",module:"module"},dd=new Set(["sharp","skia-canvas","node-av","onnxruntime-node","@resvg/resvg-js","@napi-rs/webcodecs","@mediabunny/server","@mediabunny/mp3-encoder","webgpu","pino","pino-pretty","dotenv","esbuild","@framefields/renderer","framefields/renderer","framefields/preview"]),Vb=`
716
+ const stub = () => new Proxy(function () {}, {
717
+ get: (_t, k) => (k === "__esModule" ? true : k === Symbol.toPrimitive ? () => "" : stub()),
718
+ apply: () => stub(),
719
+ construct: () => stub(),
720
+ });
721
+ module.exports = stub();
722
+ `;async function $b(e){let{build:t}=await import("./esbuild-DZUM7TEX.mjs"),r=_.resolve(xn,".."),n=_.join(xn,"shims"),i={player:_.join(xn,"player.ts")};for(let[o,a]of Object.entries(pd))i[xd(o)]=_.join(r,a);for(let o of new Set(Object.values(vs)))i[`shims/${o}`]=_.join(n,`${o}.ts`);await ge.promises.rm(e,{recursive:!0,force:!0}),await t({...yd,entryPoints:i,outdir:e,outExtension:{".js":".mjs"},splitting:!0,minify:!0,conditions:["development","browser","import"],define:{"process.env.NODE_ENV":'"production"',global:"globalThis"},inject:[_.join(n,"process.ts")],plugins:[{name:"framefields-engine",setup(o){o.onResolve({filter:/^framefields-preview:renderers$/},()=>({path:Wb()})),wd(o,a=>({path:_.join(n,`${a}.ts`)}))}}]})}async function fd(e){let{build:t}=await import("./esbuild-DZUM7TEX.mjs"),r=_.resolve(e.entry),n=s=>({path:`${wn}/${s}.mjs`,external:!0}),i={modelsDir:e.modelsDir,ortBase:e.ortBase},o=await t({...yd,entryPoints:["framefields-preview:entry"],write:!1,metafile:!0,sourcemap:"inline",plugins:[{name:"framefields-project",setup(s){s.onResolve({filter:/^framefields-preview:entry$/},()=>({path:"entry",namespace:"framefields-preview"})),s.onLoad({filter:/.*/,namespace:"framefields-preview"},()=>({contents:[`import { startPlayer } from ${JSON.stringify(`${wn}/player.mjs`)};`,`import * as mod from ${JSON.stringify(r)};`,`startPlayer(mod, ${JSON.stringify(e.exportName)}, ${JSON.stringify(i)});`].join(`
723
+ `),resolveDir:_.dirname(r),loader:"js"})),s.onResolve({filter:/^\/@framefields\/engine\//},u=>({path:u.path,external:!0})),s.onResolve({filter:/^framefields(\/|$)/},u=>pd[u.path]?n(xd(u.path)):void 0),wd(s,u=>n(`shims/${u}`)),Gb(s)}}]}),a=Object.keys(o.metafile?.inputs??{}).filter(s=>!s.includes(":")&&!s.includes("node_modules")).map(s=>_.resolve(s));return{code:o.outputFiles[0].text,inputs:a}}var Ii;function Ub(e){return[e,_.join(e,"..")].map(t=>_.join(t,"preview-engine")).find(t=>ge.existsSync(_.join(t,"player.mjs")))}function hd(){let e=Ub(xn);return e?Promise.resolve(e):(Ii??=(async()=>{let t=_.join(Gi.tmpdir(),`framefields-preview-engine-${x.pid}`);return await $b(t),t})(),Ii.catch(()=>{Ii=void 0}),Ii)}function gd(){return x.env.FRAMEFIELDS_MODELS_DIR?_.resolve(x.env.FRAMEFIELDS_MODELS_DIR):_.join(Gi.homedir(),".cache","framefields","models")}var _b="1.30.0";function bd(e){for(let t of[e,xn])try{let r=Hi(_.join(t,"noop.js")).resolve("onnxruntime-web"),n=_.dirname(r);return{base:`/@fs${n}/`,dir:n}}catch{}return{base:`https://cdn.jsdelivr.net/npm/onnxruntime-web@${_b}/dist/`}}var yd={bundle:!0,format:"esm",platform:"browser",target:"es2022",mainFields:["browser","module","main"],logLevel:"silent"};function xd(e){return e==="framefields"?"framefields":e.slice(12)}function wd(e,t){e.onResolve({filter:/^(node:)?[a-z_/]+$/},r=>{let n=r.path.replace(/^node:/,"");if(vs[n])return t(vs[n]);if(r.path.startsWith("node:")||Xs(n))return{path:n,namespace:"framefields-stub"}}),e.onResolve({filter:/.*/},r=>{let n=Hb(r.path);if(n&&(dd.has(n)||dd.has(r.path)))return{path:r.path,namespace:"framefields-stub"}}),e.onLoad({filter:/.*/,namespace:"framefields-stub"},()=>({contents:Vb,loader:"js"}))}function Gb(e){e.onLoad({filter:/\.[cm]?[jt]sx?$/},async t=>{if(t.path.includes(`${_.sep}node_modules${_.sep}`))return;let r=await ge.promises.readFile(t.path,"utf8");if(r.includes(md))return{contents:`const __framefieldsFileUrl = ${JSON.stringify(On(t.path).href)};
724
+ ${r.replaceAll(md,"__framefieldsFileUrl")}`,loader:Yb(t.path)}})}function Wb(){let e=jb.resolve("@framefields/renderer"),t=_.join(_.dirname(e),"..","src","generated","node-renderers.ts");if(!ge.existsSync(t))throw new Error(`[framefields] node renderer list not found at ${t}`);return t}function Hb(e){if(e.startsWith(".")||e.startsWith("/"))return;let t=e.split("/");return e.startsWith("@")?t.slice(0,2).join("/"):t[0]}function Yb(e){return e.endsWith(".tsx")?"tsx":e.endsWith(".jsx")?"jsx":/\.[cm]?ts$/.test(e)?"ts":"js"}h();_i();var ji=class{constructor(t){this.dir=t;this.file=_.join(t,"notes.json")}dir;file;async list(){try{let t=JSON.parse(await ge.promises.readFile(this.file,"utf8"));return Array.isArray(t)?t:[]}catch{return[]}}async add(t){let r=await this.list(),n=r.reduce((a,s)=>Math.max(a,s.id),0)+1,i={id:n,frame:Math.max(0,Math.round(Number(t.frame)||0)),time:vn(Number(t.time)||0,3),x:vn(zi(t.x),4),y:vn(zi(t.y),4),...t.w!==void 0&&t.h!==void 0&&{w:vn(zi(t.w),4),h:vn(zi(t.h),4)},text:String(t.text??"").trim(),done:!1,created:new Date().toISOString()};await this.ensureDir();let o=/^data:image\/jpeg;base64,(.+)$/.exec(t.image??"");return o&&(i.image=_.join(this.dir,`note-${n}.jpg`),await ge.promises.writeFile(i.image,Buffer.from(o[1],"base64"))),await this.save([...r,i]),i}async update(t,r){let n=await this.list(),i=n.find(o=>o.id===t);if(i)return typeof r.done=="boolean"&&(i.done=r.done),typeof r.text=="string"&&r.text.trim()&&(i.text=r.text.trim()),await this.save(n),i}async remove(t){let r=await this.list(),n=r.find(i=>i.id===t);if(n)return n.image&&await ge.promises.rm(n.image,{force:!0}),await this.save(r.filter(i=>i!==n)),n}async save(t){await this.ensureDir();let r=`${this.file}.${x.pid}.tmp`;await ge.promises.writeFile(r,`${JSON.stringify(t,null," ")}
725
+ `),await ge.promises.rename(r,this.file)}async ensureDir(){await ge.promises.mkdir(this.dir,{recursive:!0});let t=_.join(_.dirname(this.dir),".gitignore");ge.existsSync(t)||await ge.promises.writeFile(t,`*
726
+ `)}};function vd(e,t){let r=i=>`${Math.round(i*100)}%`,n=e.w!==void 0&&e.h!==void 0?`area ${r(e.x)},${r(e.y)} to ${r(e.x+e.w)},${r(e.y+e.h)}`:`spot ${r(e.x)},${r(e.y)}`;return`note ${e.id} at ${Xb(e.frame,t)} (frame ${e.frame}), ${n}: ${e.text}`}function Xb(e,t){let r=e/t,n=Math.floor(r/60);return`${n}:${(r-n*60).toFixed(2).padStart(5,"0")}`}function zi(e){let t=Number(e);return Number.isFinite(t)?Math.min(1,Math.max(0,t)):0}function vn(e,t){return Number(e.toFixed(t))}h();var Sd=`<!doctype html>
727
+ <html lang="en">
728
+ <head>
729
+ <meta charset="utf-8">
730
+ <meta name="viewport" content="width=device-width, initial-scale=1">
731
+ <title>framefields preview</title>
732
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 512 512%22%3E%3Cg fill=%22none%22 stroke=%22%233B82F6%22 stroke-linecap=%22round%22%3E%3Cpath d=%22M184 56H86q-30 0-30 30v98M328 56h98q30 0 30 30v98M184 456H86q-30 0-30-30v-98M328 456h98q30 0 30-30v-98%22 stroke-width=%2234%22/%3E%3Cpath d=%22M176 182v148m0-148c0 74 60 74 100 74%22 stroke-width=%2228%22/%3E%3C/g%3E%3Cg fill=%22%233B82F6%22%3E%3Ccircle cx=%22176%22 cy=%22172%22 r=%2232%22/%3E%3Ccircle cx=%22176%22 cy=%22340%22 r=%2232%22/%3E%3Cpath d=%22M284 200l78 56-78 56z%22 stroke=%22%233B82F6%22 stroke-width=%2234%22 stroke-linejoin=%22round%22/%3E%3C/g%3E%3C/svg%3E">
733
+ <link rel="preconnect" href="https://fonts.googleapis.com">
734
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
735
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
736
+ <style>
737
+ :root {
738
+ --bg: #0e0f11; --surface: #16171a; --surface-2: #1d1e22; --surface-3: #26282d;
739
+ --line: #2a2c31; --line-2: #3a3c43;
740
+ --ink: #ededf0; --ink-2: #a6a8b0; --ink-3: #74777f;
741
+ --stage: #060607;
742
+ --primary-bg: #ededf0; --primary-ink: #0e0f11;
743
+ --brand: #3b82f6; --focus: #5eaefc; --ok: #4fbf7a; --bad: #f27d8d;
744
+ --wave: #4b4e57;
745
+ --radius: 10px;
746
+ --font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
747
+ color-scheme: dark;
748
+ }
749
+ @media (prefers-color-scheme: light) {
750
+ :root {
751
+ --bg: #f5f5f6; --surface: #ffffff; --surface-2: #f0f0f2; --surface-3: #e6e6e9;
752
+ --line: #e2e2e6; --line-2: #cfcfd5;
753
+ --ink: #15161a; --ink-2: #53555d; --ink-3: #85878f;
754
+ --stage: #0b0b0c;
755
+ --primary-bg: #15161a; --primary-ink: #ffffff;
756
+ --brand: #2563eb; --focus: #1c74cc; --ok: #23874a; --bad: #cf4057;
757
+ --wave: #c2c3ca;
758
+ color-scheme: light;
759
+ }
760
+ }
761
+ * { box-sizing: border-box; }
762
+ html, body { height: 100%; margin: 0; overflow: hidden; background: var(--bg); color: var(--ink); }
763
+ body {
764
+ display: flex; flex-direction: column; height: 100dvh;
765
+ font: 13.5px/1.45 var(--font); -webkit-font-smoothing: antialiased;
766
+ font-feature-settings: "cv11", "ss03";
767
+ }
768
+ button, input { font: inherit; color: inherit; }
769
+ button { cursor: pointer; }
770
+ button:focus-visible, input:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
771
+ .tnum { font-variant-numeric: tabular-nums; }
772
+ .grow { flex: 1; }
773
+ .spinner {
774
+ width: 12px; height: 12px; border-radius: 50%; flex: none;
775
+ border: 1.5px solid var(--line-2); border-top-color: var(--ink); animation: spin .8s linear infinite;
776
+ }
777
+ @keyframes spin { to { transform: rotate(360deg); } }
778
+ .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex: none; }
779
+
780
+ /* \u2500\u2500 Top bar \u2500\u2500 */
781
+ .top { flex: none; display: flex; align-items: center; gap: 10px; padding: 0 20px; height: 50px; border-bottom: 1px solid var(--line); min-width: 0; }
782
+ .logo { width: 22px; height: 22px; flex: none; color: var(--brand); }
783
+ .sep { width: 1px; height: 18px; background: var(--line-2); flex: none; margin: 0 2px; }
784
+ .top h1 { font-size: 14px; font-weight: 600; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
785
+ .spec { color: var(--ink-3); font-size: 12px; white-space: nowrap; }
786
+ @media (max-width: 640px) { .spec { display: none; } }
787
+ .chip {
788
+ display: inline-flex; align-items: center; gap: 8px; height: 26px; padding: 0 10px; white-space: nowrap;
789
+ border: 1px solid var(--line); border-radius: 999px; color: var(--ink-2); font-size: 12px; background: var(--surface);
790
+ }
791
+ .chip[data-state="ready"] .dot { color: var(--ok); }
792
+ .chip[data-state="none"] .dot, .chip[data-state="offline"] .dot { color: var(--ink-3); }
793
+ .chip[data-state="error"] { color: var(--bad); }
794
+
795
+ /* \u2500\u2500 Player: one screen, no page scroll; the picture takes the space left \u2500\u2500 */
796
+ .player {
797
+ flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 10px;
798
+ width: 100%; max-width: 1600px; margin: 0 auto; padding: 16px 20px 20px;
799
+ }
800
+ @media (max-width: 640px) { .player { padding: 12px; } }
801
+ .stage-wrap { flex: 1 1 0; min-height: 96px; container-type: size; display: grid; place-items: center; }
802
+ .stage {
803
+ position: relative; background: var(--stage); border-radius: var(--radius); overflow: hidden;
804
+ box-shadow: 0 0 0 1px var(--line); user-select: none; -webkit-user-select: none;
805
+ aspect-ratio: var(--ar, 16 / 9); width: min(100cqw, calc(100cqh * var(--ar-n, 1.7778)));
806
+ }
807
+ .stage canvas { display: block; width: 100%; height: 100%; }
808
+ .stage-msg {
809
+ position: absolute; inset: 0; display: none; place-items: center; padding: 24px; text-align: center;
810
+ color: #fff; background: rgb(0 0 0 / .72); font-size: 13px; line-height: 1.5; white-space: pre-wrap; overflow: auto;
811
+ }
812
+ .stage-msg.on { display: grid; }
813
+ /* Buffering: a centred spinning arc over the picture, like YouTube's. It
814
+ fades in after a beat so brief waits don't flash it. */
815
+ .buffering {
816
+ position: absolute; left: 50%; top: 50%; width: clamp(36px, 9cqmin, 64px); aspect-ratio: 1;
817
+ transform: translate(-50%, -50%); pointer-events: none; opacity: 0; visibility: hidden;
818
+ transition: opacity .15s, visibility 0s .15s; filter: drop-shadow(0 0 3px rgb(0 0 0 / .45));
819
+ }
820
+ .buffering.on { opacity: 1; visibility: visible; transition: opacity .2s .25s, visibility 0s .25s; }
821
+ .buffering svg { width: 100%; height: 100%; animation: yt-rotate 1.4s linear infinite; }
822
+ .buffering circle {
823
+ fill: none; stroke: #fff; stroke-width: 3.6; stroke-linecap: round;
824
+ stroke-dasharray: 1 150; stroke-dashoffset: 0; animation: yt-dash 1.4s ease-in-out infinite;
825
+ }
826
+ @keyframes yt-rotate { to { transform: rotate(360deg); } }
827
+ @keyframes yt-dash {
828
+ 0% { stroke-dasharray: 1 150; stroke-dashoffset: 0; }
829
+ 50% { stroke-dasharray: 90 150; stroke-dashoffset: -35; }
830
+ 100% { stroke-dasharray: 90 150; stroke-dashoffset: -124; }
831
+ }
832
+ @media (prefers-reduced-motion: reduce) { .buffering circle, .play-btn .spin circle { animation: none; stroke-dasharray: 70 150; } }
833
+
834
+ /* \u2500\u2500 Transport \u2500\u2500 */
835
+ .transport { flex: none; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; row-gap: 6px; }
836
+ .icon-btn {
837
+ width: 32px; height: 32px; display: inline-grid; place-items: center; border-radius: 8px;
838
+ border: 0; background: transparent; color: var(--ink-2); flex: none;
839
+ }
840
+ .icon-btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
841
+ .icon-btn:disabled { opacity: .35; cursor: default; }
842
+ .icon-btn svg { width: 16px; height: 16px; }
843
+ .play-btn {
844
+ width: 36px; height: 36px; border-radius: 50%; border: 0; display: inline-grid; place-items: center; flex: none;
845
+ background: var(--primary-bg); color: var(--primary-ink); margin: 0 2px;
846
+ }
847
+ .play-btn:hover:not(:disabled) { filter: brightness(.9); }
848
+ .play-btn:disabled { opacity: .4; cursor: default; }
849
+ .play-btn svg { width: 14px; height: 14px; }
850
+ .play-btn .spin { display: none; width: 20px; height: 20px; animation: yt-rotate 1.4s linear infinite; }
851
+ .play-btn .spin circle {
852
+ fill: none; stroke: currentColor; stroke-width: 5; stroke-linecap: round;
853
+ stroke-dasharray: 1 150; animation: yt-dash 1.4s ease-in-out infinite;
854
+ }
855
+ .play-btn.loading .spin { display: block; }
856
+ .play-btn.loading svg:not(.spin) { display: none !important; }
857
+ .timecode { display: flex; align-items: baseline; gap: 5px; margin-left: 8px; font-size: 13px; white-space: nowrap; }
858
+ .timecode .dim { color: var(--ink-3); }
859
+ .timecode .frame { color: var(--ink-3); font-size: 11.5px; margin-left: 6px; }
860
+ .fps { margin-left: 10px; color: var(--ink-3); font-size: 11.5px; white-space: nowrap; }
861
+ input[type="range"].slider { -webkit-appearance: none; appearance: none; width: 72px; height: 4px; border-radius: 2px; background: var(--line-2); margin: 0 8px 0 0; }
862
+ input[type="range"].slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; border-radius: 50%; background: var(--ink); border: 0; }
863
+ input[type="range"].slider::-moz-range-thumb { width: 12px; height: 12px; border-radius: 50%; background: var(--ink); border: 0; }
864
+ input[type="range"].slider:disabled { opacity: .35; }
865
+
866
+ /* \u2500\u2500 Timeline \u2500\u2500 */
867
+ .timeline {
868
+ flex: none; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface);
869
+ padding: 0 14px; user-select: none; -webkit-user-select: none; touch-action: none; cursor: pointer;
870
+ }
871
+ .tl-inner { position: relative; }
872
+ .ruler { position: relative; height: 22px; border-bottom: 1px solid var(--line); }
873
+ .tick { position: absolute; bottom: 0; width: 1px; height: 4px; background: var(--line-2); }
874
+ .tick.major { height: 8px; background: var(--ink-3); }
875
+ .tick span { position: absolute; bottom: 9px; left: 4px; font-size: 10.5px; line-height: 1; color: var(--ink-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
876
+ .wave-lane { position: relative; height: 48px; }
877
+ @media (max-height: 600px) { .wave-lane { height: 30px; } }
878
+ .wave-lane canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
879
+ .wave-state { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 8px; color: var(--ink-3); font-size: 12px; }
880
+ .wave-state.shimmer {
881
+ background: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--ink) 6%, transparent) 50%, transparent 100%);
882
+ background-size: 200% 100%; animation: shimmer 1.4s linear infinite;
883
+ }
884
+ @keyframes shimmer { from { background-position: 100% 0; } to { background-position: -100% 0; } }
885
+ .playhead { position: absolute; top: 0; bottom: 0; width: 0; pointer-events: none; z-index: 3; }
886
+ .playhead::before { content: ""; position: absolute; top: 0; bottom: 0; left: -0.5px; width: 1px; background: var(--ink); }
887
+ .playhead::after { content: ""; position: absolute; top: 0; left: -5px; width: 10px; height: 11px; background: var(--ink); clip-path: polygon(0 0, 100% 0, 100% 55%, 50% 100%, 0 55%); }
888
+ .hover-line { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--line-2); display: none; pointer-events: none; }
889
+ .hover-time {
890
+ position: absolute; top: -28px; transform: translateX(-50%); display: none; pointer-events: none;
891
+ font-size: 11px; line-height: 1; background: var(--surface-3); color: var(--ink); padding: 5px 7px; border-radius: 5px;
892
+ white-space: nowrap; z-index: 4; font-variant-numeric: tabular-nums;
893
+ }
894
+ /* \u2500\u2500 Notes: pinned to a spot (or an area) and a moment \u2500\u2500 */
895
+ .stage.can-note { cursor: crosshair; }
896
+ .overlay { position: absolute; inset: 0; pointer-events: none; }
897
+ .pin {
898
+ position: absolute; width: 22px; height: 22px; margin: -11px 0 0 -11px; padding: 0; border-radius: 50%;
899
+ display: grid; place-items: center; pointer-events: auto; cursor: pointer;
900
+ background: var(--brand); color: #fff; font-size: 11px; font-weight: 600; line-height: 1;
901
+ border: 2px solid #fff; box-shadow: 0 1px 5px rgb(0 0 0 / .55); transition: transform .12s;
902
+ }
903
+ .pin:hover, .pin.active { transform: scale(1.18); }
904
+ .pin.done { background: #6b6e76; }
905
+ .pin.draft { animation: pin-pulse 1.5s ease-out infinite; }
906
+ .pin svg { width: 11px; height: 11px; }
907
+ @keyframes pin-pulse {
908
+ from { box-shadow: 0 0 0 0 rgb(59 130 246 / .6), 0 1px 5px rgb(0 0 0 / .55); }
909
+ to { box-shadow: 0 0 0 14px rgb(59 130 246 / 0), 0 1px 5px rgb(0 0 0 / .55); }
910
+ }
911
+ .area {
912
+ position: absolute; border: 1.5px solid var(--brand); border-radius: 3px;
913
+ background: rgb(59 130 246 / .12); box-shadow: 0 0 0 1px rgb(0 0 0 / .35);
914
+ }
915
+ .area.done { border-color: #9a9da5; background: rgb(255 255 255 / .05); }
916
+ .marquee { position: absolute; display: none; border: 1.5px dashed #fff; background: rgb(59 130 246 / .16); border-radius: 3px; pointer-events: none; }
917
+ .stage-hint, .toast {
918
+ position: absolute; left: 50%; transform: translateX(-50%); pointer-events: none; white-space: nowrap;
919
+ padding: 6px 11px; border-radius: 999px; font-size: 12px; color: #fff; background: rgb(0 0 0 / .62);
920
+ backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); opacity: 0; transition: opacity .15s;
921
+ }
922
+ .stage-hint { top: 12px; }
923
+ .stage.can-note.hint:hover .stage-hint { opacity: 1; }
924
+ .toast { bottom: 14px; }
925
+ .toast.on { opacity: 1; }
926
+
927
+ .pop {
928
+ position: fixed; z-index: 20; width: 280px; display: none; padding: 10px 10px 8px;
929
+ background: var(--surface); border: 1px solid var(--line-2); border-radius: 12px;
930
+ box-shadow: 0 12px 32px rgb(0 0 0 / .35);
931
+ }
932
+ .pop.on { display: block; }
933
+ .pop-head { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--ink-3); margin-bottom: 6px; }
934
+ .badge {
935
+ min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; display: inline-grid; place-items: center; flex: none;
936
+ background: var(--brand); color: #fff; font-size: 10.5px; font-weight: 600;
937
+ }
938
+ .badge.done { background: var(--ink-3); }
939
+ .pop textarea {
940
+ display: block; width: 100%; min-height: 54px; max-height: 180px; resize: none; padding: 2px 2px 0;
941
+ border: 0; outline: none; background: transparent; color: var(--ink); font: inherit; line-height: 1.45;
942
+ }
943
+ .pop textarea::placeholder { color: var(--ink-3); }
944
+ .pop-text { white-space: pre-wrap; overflow-wrap: anywhere; padding: 0 2px; max-height: 200px; overflow: auto; }
945
+ .pop-foot { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 11.5px; color: var(--ink-3); }
946
+ .pop-foot .err { color: var(--bad); }
947
+ .btn {
948
+ height: 26px; padding: 0 10px; border-radius: 7px; border: 0; font-size: 12px; font-weight: 500;
949
+ display: inline-flex; align-items: center; gap: 6px; background: transparent; color: var(--ink-2); white-space: nowrap;
950
+ }
951
+ .btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
952
+ .btn.primary { background: var(--primary-bg); color: var(--primary-ink); }
953
+ .btn.primary:hover:not(:disabled) { background: var(--primary-bg); filter: brightness(.9); }
954
+ .btn.danger:hover:not(:disabled) { color: var(--bad); }
955
+ .btn:disabled { opacity: .4; cursor: default; }
956
+ .btn svg { width: 13px; height: 13px; }
957
+ .x-btn { width: 22px; height: 22px; padding: 0; justify-content: center; margin-right: -4px; }
958
+
959
+ .transport { position: relative; }
960
+ .notes-btn { height: 32px; padding: 0 9px 0 8px; margin-right: 6px; font-size: 12.5px; }
961
+ .notes-btn svg { width: 15px; height: 15px; }
962
+ .notes-btn .badge { background: var(--surface-3); color: var(--ink-2); }
963
+ .notes-btn .badge.open { background: var(--brand); color: #fff; }
964
+ .notes-panel {
965
+ position: absolute; right: 0; bottom: calc(100% + 8px); z-index: 15; width: min(360px, calc(100vw - 24px));
966
+ max-height: min(440px, 62vh); display: none; flex-direction: column; overflow: hidden;
967
+ background: var(--surface); border: 1px solid var(--line-2); border-radius: 12px; box-shadow: 0 12px 32px rgb(0 0 0 / .35);
968
+ }
969
+ .notes-panel.on { display: flex; }
970
+ .np-head { flex: none; display: flex; align-items: center; gap: 8px; padding: 8px 8px 8px 14px; border-bottom: 1px solid var(--line); }
971
+ .np-head h2 { margin: 0; font-size: 13px; font-weight: 600; }
972
+ .np-list { overflow: auto; padding: 4px; }
973
+ .np-empty { padding: 22px 18px; text-align: center; color: var(--ink-3); font-size: 12.5px; }
974
+ .np-foot { flex: none; padding: 8px 14px; border-top: 1px solid var(--line); color: var(--ink-3); font-size: 11.5px; overflow-wrap: anywhere; }
975
+ .note-row {
976
+ display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: start; padding: 8px 8px 8px 10px;
977
+ border-radius: 8px; cursor: pointer;
978
+ }
979
+ .note-row:hover { background: var(--surface-2); }
980
+ .note-row .badge { margin-top: 1px; }
981
+ .note-row .when { font-size: 11.5px; color: var(--ink-3); }
982
+ .note-row .text { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
983
+ .note-row.done .text { color: var(--ink-3); text-decoration: line-through; }
984
+ .check {
985
+ width: 20px; height: 20px; border-radius: 50%; padding: 0; display: grid; place-items: center; margin-top: 1px;
986
+ border: 1.5px solid var(--line-2); background: transparent; color: transparent;
987
+ }
988
+ .check:hover { border-color: var(--ok); color: var(--ok); }
989
+ .check.on { background: var(--ok); border-color: var(--ok); color: #fff; }
990
+ .check svg { width: 11px; height: 11px; }
991
+
992
+ .note-marks { position: absolute; left: 0; right: 0; top: 22px; bottom: 0; pointer-events: none; z-index: 2; }
993
+ .note-mark {
994
+ position: absolute; top: 5px; width: 14px; height: 14px; margin-left: -7px; padding: 0; border: 0; border-radius: 50%;
995
+ display: grid; place-items: center; pointer-events: auto; cursor: pointer;
996
+ background: var(--brand); color: #fff; font-size: 8.5px; font-weight: 700; box-shadow: 0 0 0 2px var(--surface);
997
+ }
998
+ .note-mark::after { content: ""; position: absolute; top: 14px; left: 6.5px; width: 1px; height: 30px; background: var(--brand); opacity: .45; }
999
+ .note-mark.done { background: var(--ink-3); }
1000
+ .note-mark.stacked::after { display: none; }
1001
+ .note-mark.done::after { background: var(--ink-3); }
1002
+ .note-mark:hover { transform: scale(1.2); }
1003
+ </style>
1004
+ </head>
1005
+ <body>
1006
+ <header class="top">
1007
+ <svg class="logo" viewBox="0 0 512 512" aria-label="framefields" role="img"><g fill="none" stroke="currentColor" stroke-linecap="round"><path d="M184 56H86q-30 0-30 30v98M328 56h98q30 0 30 30v98M184 456H86q-30 0-30-30v-98M328 456h98q30 0 30-30v-98" stroke-width="34" stroke-linejoin="round"/><path d="M176 182v148m0-148c0 74 60 74 100 74" stroke-width="28"/></g><g fill="currentColor"><circle cx="176" cy="172" r="32"/><circle cx="176" cy="340" r="32"/><path d="M284 200l78 56-78 56z" stroke="currentColor" stroke-width="34" stroke-linejoin="round"/></g></svg>
1008
+ <span class="sep" aria-hidden="true"></span>
1009
+ <h1 id="title">framefields preview</h1>
1010
+ <span class="grow"></span>
1011
+ <span class="spec tnum" id="spec"></span>
1012
+ <span class="chip" id="chip" data-state="mixing" role="status" aria-live="polite"><span class="spinner"></span><span>Mixing audio</span></span>
1013
+ </header>
1014
+
1015
+ <main class="player" aria-label="Player">
1016
+ <div class="stage-wrap">
1017
+ <div class="stage" id="stage">
1018
+ <canvas id="canvas" aria-label="Rendered frame"></canvas>
1019
+ <div class="stage-msg" id="stageMsg" role="alert"></div>
1020
+ <div class="overlay" id="pins"></div>
1021
+ <div class="marquee" id="marquee"></div>
1022
+ <div class="stage-hint" id="stageHint">Click to pin a note \xB7 drag to mark an area</div>
1023
+ <div class="toast" id="toast" role="status" aria-live="polite"></div>
1024
+ <div class="buffering" id="buffering" role="status" aria-label="Loading"><svg viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"/></svg></div>
1025
+ </div>
1026
+ </div>
1027
+
1028
+ <div class="transport">
1029
+ <button class="icon-btn" id="prev" title="Previous frame" aria-label="Previous frame">
1030
+ <svg viewBox="0 0 16 16" fill="currentColor"><path d="M3 3h1.6v10H3zM13 3.6v8.8a.6.6 0 0 1-.92.5L5.8 8.5a.6.6 0 0 1 0-1l6.28-4.4a.6.6 0 0 1 .92.5z"/></svg>
1031
+ </button>
1032
+ <button class="play-btn" id="play" title="Play" aria-label="Play" disabled>
1033
+ <svg id="playIcon" viewBox="0 0 16 16" fill="currentColor"><path d="M4.5 2.9v10.2a.7.7 0 0 0 1.06.6l8.1-5.1a.7.7 0 0 0 0-1.2l-8.1-5.1a.7.7 0 0 0-1.06.6z"/></svg>
1034
+ <svg class="spin" viewBox="0 0 50 50" aria-hidden="true"><circle cx="25" cy="25" r="18"/></svg>
1035
+ <svg id="pauseIcon" viewBox="0 0 16 16" fill="currentColor" style="display:none"><rect x="3.5" y="2.5" width="3.2" height="11" rx=".8"/><rect x="9.3" y="2.5" width="3.2" height="11" rx=".8"/></svg>
1036
+ </button>
1037
+ <button class="icon-btn" id="next" title="Next frame" aria-label="Next frame">
1038
+ <svg viewBox="0 0 16 16" fill="currentColor"><path d="M11.4 3H13v10h-1.6zM3 3.6v8.8a.6.6 0 0 0 .92.5l6.28-4.4a.6.6 0 0 0 0-1L3.92 3.1A.6.6 0 0 0 3 3.6z"/></svg>
1039
+ </button>
1040
+ <div class="timecode tnum">
1041
+ <span id="tcNow">0:00.00</span><span class="dim">/</span><span class="dim" id="tcDur">0:00.00</span>
1042
+ <span class="frame" id="tcFrame">frame 0</span>
1043
+ </div>
1044
+ <span class="fps tnum" id="fps" role="status" hidden></span>
1045
+ <span class="grow"></span>
1046
+ <button class="btn notes-btn" id="notesBtn" title="Notes" aria-haspopup="dialog" aria-expanded="false" hidden>
1047
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"><path d="M3 2.75h10a1.25 1.25 0 0 1 1.25 1.25v6.5A1.25 1.25 0 0 1 13 11.75H7.5L4.5 14v-2.25H3A1.25 1.25 0 0 1 1.75 10.5V4A1.25 1.25 0 0 1 3 2.75z"/></svg>
1048
+ Notes <span class="badge" id="notesCount">0</span>
1049
+ </button>
1050
+ <div class="notes-panel" id="notesPanel" role="dialog" aria-label="Notes">
1051
+ <div class="np-head">
1052
+ <h2>Notes</h2><span class="grow"></span>
1053
+ <button class="btn" id="notesCopy" title="Copy the open notes, to paste into a chat">
1054
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.25" y="5.25" width="8" height="8" rx="1.5"/><path d="M10.75 3.5V3.25a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5H4"/></svg>
1055
+ <span id="notesCopyLabel">Copy</span>
1056
+ </button>
1057
+ <button class="btn x-btn" id="notesClose" title="Close" aria-label="Close"><svg viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"/></svg></button>
1058
+ </div>
1059
+ <div class="np-list" id="notesList"></div>
1060
+ <div class="np-foot" id="notesFoot"></div>
1061
+ </div>
1062
+ <button class="icon-btn" id="mute" title="Mute" aria-label="Mute" disabled>
1063
+ <svg id="volIcon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6h2.2L8 3.2v9.6L4.7 10H2.5z" fill="currentColor" stroke="none"/><path d="M10.6 5.6a3.4 3.4 0 0 1 0 4.8M12.4 3.9a5.8 5.8 0 0 1 0 8.2"/></svg>
1064
+ <svg id="muteIcon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" style="display:none"><path d="M2.5 6h2.2L8 3.2v9.6L4.7 10H2.5z" fill="currentColor" stroke="none"/><path d="M10.5 6l3.5 4M14 6l-3.5 4"/></svg>
1065
+ </button>
1066
+ <input class="slider" type="range" id="volume" min="0" max="1" step="0.01" value="0.9" aria-label="Volume" disabled>
1067
+ </div>
1068
+
1069
+ <div class="timeline" id="timeline" aria-label="Timeline">
1070
+ <div class="tl-inner" id="tlInner">
1071
+ <div class="ruler" id="ruler"></div>
1072
+ <div class="note-marks" id="noteMarks"></div>
1073
+ <div class="wave-lane">
1074
+ <canvas id="wave"></canvas>
1075
+ <div class="wave-state shimmer" id="waveState"><span class="spinner"></span>Mixing audio</div>
1076
+ </div>
1077
+ <div class="hover-line" id="hoverLine"></div>
1078
+ <div class="hover-time" id="hoverTime"></div>
1079
+ <div class="playhead" id="playhead"></div>
1080
+ </div>
1081
+ </div>
1082
+ </main>
1083
+
1084
+ <div class="pop" id="pop" role="dialog" aria-label="Note"></div>
1085
+
1086
+ <script>
1087
+ (function () {
1088
+ var $ = function (id) { return document.getElementById(id); };
1089
+ var stage = $("stage"), timeline = $("timeline"), tlInner = $("tlInner");
1090
+
1091
+ var meta = null, session = null, frame = 0, shown = -1, playing = false, playToken = 0;
1092
+ var player = null;
1093
+
1094
+ // \u2500\u2500 Helpers \u2500\u2500
1095
+ function fmt(f) {
1096
+ var s = f / meta.fps, m = Math.floor(s / 60);
1097
+ return m + ":" + (s - m * 60).toFixed(2).padStart(5, "0");
1098
+ }
1099
+ function last() { return meta.frameCount - 1; }
1100
+ function clampFrame(f) { return Math.max(0, Math.min(last(), Math.round(f))); }
1101
+ function pct(f) { return meta.frameCount > 1 ? (f / last()) * 100 : 0; }
1102
+ function el(tag, cls, text) {
1103
+ var e = document.createElement(tag);
1104
+ if (cls) e.className = cls;
1105
+ if (text != null) e.textContent = text;
1106
+ return e;
1107
+ }
1108
+ function sleep(ms) { return new Promise(function (r) { setTimeout(r, ms); }); }
1109
+
1110
+ // \u2500\u2500 Reporting: errors and the engine's warnings go to the preview's
1111
+ // terminal too, so whoever runs it sees them without opening this tab.
1112
+ // Once each; frame numbers aside, playback repeats the same one per frame \u2500\u2500
1113
+ var reportedKeys = new Set();
1114
+ function errText(x) {
1115
+ if (x && x.message) return x.stack && x.stack.indexOf(x.message) >= 0 ? x.stack.split("\\n").slice(0, 4).join("\\n") : x.message;
1116
+ return typeof x === "string" ? x : String(x);
1117
+ }
1118
+ function report(level, parts) {
1119
+ var text = parts.map(errText).join(" ").trim(), key = level + text.replace(/\\d+/g, "#");
1120
+ if (!text || reportedKeys.has(key) || reportedKeys.size > 100) return;
1121
+ reportedKeys.add(key);
1122
+ fetch("/@framefields/log", {
1123
+ method: "POST",
1124
+ headers: { "content-type": "application/json" },
1125
+ body: JSON.stringify({ level: level, message: text.slice(0, 4000) }),
1126
+ keepalive: true
1127
+ }).catch(function () {});
1128
+ }
1129
+ ["error", "warn"].forEach(function (name) {
1130
+ var original = console[name].bind(console);
1131
+ console[name] = function () {
1132
+ original.apply(null, arguments);
1133
+ var args = Array.prototype.slice.call(arguments);
1134
+ // Errors from anywhere; warnings only from the engine (fonts, renderers).
1135
+ if (name === "error" || (typeof args[0] === "string" && args[0].indexOf("[framefields]") === 0)) {
1136
+ report(name === "error" ? "error" : "warning", args);
1137
+ }
1138
+ };
1139
+ });
1140
+
1141
+ // \u2500\u2500 Frames: drawn in this tab by the composition's own code \u2500\u2500
1142
+ function setTime(f) {
1143
+ frame = f;
1144
+ $("tcNow").textContent = fmt(f);
1145
+ $("tcFrame").textContent = "frame " + f;
1146
+ $("playhead").style.left = pct(f) + "%";
1147
+ if (!playing && notesOn) renderPins();
1148
+ }
1149
+ function show(f) {
1150
+ setTime(f);
1151
+ if (!player) return Promise.resolve();
1152
+ $("buffering").classList.add("on");
1153
+ // Calls made while a frame draws collapse to the latest.
1154
+ return player.render(f).then(function (drawn) {
1155
+ shown = drawn;
1156
+ if (!stalled) $("buffering").classList.remove("on");
1157
+ });
1158
+ }
1159
+ function seek(f) {
1160
+ stop();
1161
+ var done = show(clampFrame(f));
1162
+ keepPosition();
1163
+ scheduleWarm();
1164
+ return done;
1165
+ }
1166
+
1167
+ // \u2500\u2500 Position in the address: #t=12.5 opens there, and a reload (the next
1168
+ // preview taking over) comes back to the same moment \u2500\u2500
1169
+ function startFrame() {
1170
+ var m = /[#&]t=([\\d.]+)/.exec(location.hash), n = /[#&]frame=(\\d+)/.exec(location.hash);
1171
+ if (m) return clampFrame(Number(m[1]) * meta.fps);
1172
+ if (n) return clampFrame(Number(n[1]));
1173
+ return 0;
1174
+ }
1175
+ function keepPosition() {
1176
+ var at = frame > 0 ? "#t=" + Number((frame / meta.fps).toFixed(3)) : location.pathname;
1177
+ try { history.replaceState(null, "", at); } catch (e) {}
1178
+ }
1179
+
1180
+ // \u2500\u2500 Analysing ahead: while paused, frames after the playhead are drawn
1181
+ // off-screen so vision results are cached before they play \u2500\u2500
1182
+ var warmTimer = null, warmToken = 0, warmed = new Set();
1183
+ function scheduleWarm() {
1184
+ clearTimeout(warmTimer);
1185
+ warmToken++;
1186
+ if (!player || !player.hasVision || playing) return;
1187
+ warmTimer = setTimeout(warmAhead, 1000);
1188
+ }
1189
+ async function warmAhead() {
1190
+ var token = ++warmToken;
1191
+ var end = Math.min(last(), frame + Math.round(meta.fps * 20));
1192
+ for (var f = frame + 1; f <= end && token === warmToken && !playing; f++) {
1193
+ if (warmed.has(f)) continue;
1194
+ if (!(await player.warm(f))) { scheduleWarm(); return; }
1195
+ warmed.add(f);
1196
+ await sleep(0);
1197
+ }
1198
+ }
1199
+ function showError(err) {
1200
+ report("error", [err]);
1201
+ pageState = "error";
1202
+ $("buffering").classList.remove("on");
1203
+ $("stageMsg").textContent = String((err && err.message) || err);
1204
+ $("stageMsg").classList.add("on");
1205
+ }
1206
+
1207
+ // \u2500\u2500 Audio \u2500\u2500
1208
+ var audio = { state: "mixing", error: "", buffer: null, peaks: null, ctx: null, gain: null, src: null, muted: false, volume: 0.9 };
1209
+ var AUDIO_LABEL = { mixing: "Mixing audio", loading: "Loading audio", ready: "Audio ready", none: "No audio", error: "Audio failed" };
1210
+ var offline = false;
1211
+
1212
+ function renderChip() {
1213
+ var chip = $("chip"), state, label, busy;
1214
+ if (offline) { state = "offline"; label = "Preview stopped"; busy = false; }
1215
+ else { state = audio.state; label = AUDIO_LABEL[audio.state]; busy = state === "mixing" || state === "loading"; }
1216
+ chip.dataset.state = state;
1217
+ chip.title = offline ? "The preview command isn't running. This tab reconnects when it starts again." : audio.error || "";
1218
+ chip.replaceChildren(el("span", busy ? "spinner" : "dot"), el("span", null, label));
1219
+ }
1220
+ function setAudioStatus(state, error) {
1221
+ audio.state = state;
1222
+ audio.error = error || "";
1223
+ var busy = state === "mixing" || state === "loading", ws = $("waveState");
1224
+ ws.classList.toggle("shimmer", busy);
1225
+ ws.style.display = state === "ready" ? "none" : "flex";
1226
+ ws.replaceChildren();
1227
+ if (busy) ws.append(el("span", "spinner"));
1228
+ ws.append(document.createTextNode(state === "none" ? "No audio in this composition" : state === "error" ? "Audio could not be mixed" : AUDIO_LABEL[state]));
1229
+ var usable = state === "ready" && !!audio.buffer;
1230
+ $("mute").disabled = !usable;
1231
+ $("volume").disabled = !usable;
1232
+ renderChip();
1233
+ drawWave();
1234
+ }
1235
+ function loadAudio(status) {
1236
+ stopClock();
1237
+ audio.buffer = null;
1238
+ audio.peaks = null;
1239
+ if (!status || status.state !== "ready") { setAudioStatus(status ? status.state : "none", status && status.error); return; }
1240
+ audio.peaks = status.peaks;
1241
+ setAudioStatus("loading");
1242
+ if (!audio.ctx) {
1243
+ var Ctx = window.AudioContext || window.webkitAudioContext;
1244
+ audio.ctx = new Ctx();
1245
+ audio.gain = audio.ctx.createGain();
1246
+ audio.gain.connect(audio.ctx.destination);
1247
+ applyVolume();
1248
+ }
1249
+ fetch("/audio")
1250
+ .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.arrayBuffer(); })
1251
+ .then(function (data) { return audio.ctx.decodeAudioData(data); })
1252
+ .then(function (buf) { audio.buffer = buf; setAudioStatus("ready"); })
1253
+ .catch(function (err) { setAudioStatus("error", String((err && err.message) || err)); });
1254
+ }
1255
+ function applyVolume() {
1256
+ if (audio.gain) audio.gain.gain.value = audio.muted ? 0 : audio.volume;
1257
+ $("volIcon").style.display = audio.muted ? "none" : "";
1258
+ $("muteIcon").style.display = audio.muted ? "" : "none";
1259
+ $("mute").title = audio.muted ? "Unmute" : "Mute";
1260
+ $("mute").setAttribute("aria-label", audio.muted ? "Unmute" : "Mute");
1261
+ }
1262
+ // The clock for real-time playback: the soundtrack when there is one,
1263
+ // otherwise the wall clock. Audio as master keeps picture and sound in sync.
1264
+ function startClock(f0) {
1265
+ if (audio.buffer && audio.ctx) {
1266
+ audio.ctx.resume();
1267
+ var src = audio.ctx.createBufferSource();
1268
+ src.buffer = audio.buffer;
1269
+ src.connect(audio.gain);
1270
+ var startAt = audio.ctx.currentTime + 0.06, offset = f0 / meta.fps;
1271
+ if (offset < audio.buffer.duration) src.start(startAt, offset);
1272
+ audio.src = src;
1273
+ return function () { return Math.max(0, audio.ctx.currentTime - startAt); };
1274
+ }
1275
+ var t0 = performance.now();
1276
+ return function () { return (performance.now() - t0) / 1000; };
1277
+ }
1278
+ function stopClock() {
1279
+ if (!audio.src) return;
1280
+ try { audio.src.stop(); } catch (e) {}
1281
+ audio.src.disconnect();
1282
+ audio.src = null;
1283
+ }
1284
+
1285
+ // \u2500\u2500 Playback \u2500\u2500
1286
+ var stalled = false;
1287
+ // Waiting on frames mid-playback: the play button and the picture both spin.
1288
+ function setStalled(on) {
1289
+ stalled = on;
1290
+ $("play").classList.toggle("loading", on);
1291
+ $("buffering").classList.toggle("on", on);
1292
+ }
1293
+ function setPlayingUi(on) {
1294
+ $("playIcon").style.display = on ? "none" : "";
1295
+ $("pauseIcon").style.display = on ? "" : "none";
1296
+ $("play").title = on ? "Pause" : "Play";
1297
+ $("play").setAttribute("aria-label", on ? "Pause" : "Play");
1298
+ }
1299
+ function play() {
1300
+ if (playing || !player) return;
1301
+ playing = true;
1302
+ clearTimeout(warmTimer);
1303
+ warmToken++;
1304
+ var token = ++playToken;
1305
+ var alive = function () { return playing && token === playToken; };
1306
+ setPlayingUi(true);
1307
+ if (openId != null) closePop();
1308
+ if (draft && !draft.text.trim()) cancelDraft();
1309
+ if (notesOn) renderPins();
1310
+ if (frame >= last()) frame = 0;
1311
+ playFrames(alive).finally(function () { if (token === playToken && playing) pause(); });
1312
+ }
1313
+ function stop() {
1314
+ playing = false;
1315
+ stopClock();
1316
+ setStalled(false);
1317
+ setPlayingUi(false);
1318
+ meter.stop();
1319
+ renderFps();
1320
+ }
1321
+
1322
+ // \u2500\u2500 Frame rate reached: distinct frames shown per second while playing,
1323
+ // over the last 2 s, stalls included. The film's own rate is in meta \u2500\u2500
1324
+ var meter = (function () {
1325
+ var started = null, lastFrame = null, samples = [], lastFps = null;
1326
+ function read() {
1327
+ if (started === null) return { state: "paused", fps: lastFps };
1328
+ var now = performance.now(), elapsed = Math.min(2000, now - started);
1329
+ samples = samples.filter(function (t) { return t > now - 2000; });
1330
+ if (elapsed < 1000) return { state: "measuring", fps: null };
1331
+ // Counting whole frames in the window can overshoot the film's rate.
1332
+ return { state: "playing", fps: Math.min(meta ? meta.fps : Infinity, (samples.length * 1000) / elapsed) };
1333
+ }
1334
+ return {
1335
+ read: read,
1336
+ start: function () { started = performance.now(); lastFrame = null; samples = []; },
1337
+ stop: function () {
1338
+ if (started === null) return;
1339
+ // A playback too short to measure leaves no rate, not an older one.
1340
+ var r = read();
1341
+ lastFps = r.state === "playing" ? r.fps : null;
1342
+ started = null;
1343
+ samples = [];
1344
+ },
1345
+ record: function (f) {
1346
+ if (started === null || f === lastFrame) return;
1347
+ lastFrame = f;
1348
+ samples.push(performance.now());
1349
+ }
1350
+ };
1351
+ })();
1352
+ function renderFps() {
1353
+ var r = meter.read(), out = $("fps");
1354
+ out.hidden = r.state === "paused" && r.fps === null;
1355
+ if (out.hidden) return;
1356
+ out.textContent = r.state === "measuring" ? "\u2026 fps" : r.fps.toFixed(1) + " fps";
1357
+ out.title = (r.state === "paused" ? "Frame rate the last playback reached" : "Frame rate playback reaches") + (meta ? "; the film runs at " + meta.fps + " fps" : "");
1358
+ }
1359
+ setInterval(function () { if (playing) renderFps(); }, 500);
1360
+ // Pausing settles on exactly the frame the timecode shows.
1361
+ function pause() { stop(); keepPosition(); show(frame).then(scheduleWarm); }
1362
+ function togglePlay() { playing ? pause() : play(); }
1363
+
1364
+ // Real time: nothing is rendered ahead. Each turn draws the frame due on
1365
+ // the clock straight to the screen, and frames that drawing missed are
1366
+ // skipped. Playback starts at once and the sound keeps its speed; a device
1367
+ // that can't keep up shows fewer frames, and the frame rate says how many.
1368
+ async function playFrames(alive) {
1369
+ meter.start();
1370
+ renderFps();
1371
+ // A soundtrack still downloading would start late: wait for it.
1372
+ if (audio.state === "loading") {
1373
+ setStalled(true);
1374
+ while (alive() && audio.state === "loading") await sleep(50);
1375
+ // A newer playback may be waiting too: only this one's own stall ends here.
1376
+ if (!alive()) return;
1377
+ setStalled(false);
1378
+ }
1379
+ var f0 = frame, clock = startClock(f0), presented = -1;
1380
+ while (alive()) {
1381
+ var due = Math.min(last(), f0 + Math.floor(clock() * meta.fps));
1382
+ if (due === presented) { await sleep(4); continue; }
1383
+ setTime(due);
1384
+ // Each frame is drawn once; caching it would cost a texture and a copy per frame.
1385
+ var drawn = await player.render(due, { cache: false });
1386
+ if (!alive()) return;
1387
+ presented = shown = drawn;
1388
+ meter.record(drawn);
1389
+ if (drawn >= last()) return;
1390
+ }
1391
+ }
1392
+
1393
+ // \u2500\u2500 Timeline \u2500\u2500
1394
+ function frameAtX(clientX) {
1395
+ var r = tlInner.getBoundingClientRect();
1396
+ return clampFrame(Math.min(1, Math.max(0, (clientX - r.left) / r.width)) * last());
1397
+ }
1398
+ function renderRuler() {
1399
+ var ruler = $("ruler"), width = tlInner.clientWidth || 800, dur = last() / meta.fps;
1400
+ ruler.replaceChildren();
1401
+ if (dur <= 0) return;
1402
+ var steps = [0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300, 600];
1403
+ var major = steps.find(function (s) { return (s / dur) * width >= 80; }) || 1200, minor = major / 5;
1404
+ for (var i = 0; i * minor <= dur + 1e-6; i++) {
1405
+ var t = i * minor, isMajor = i % 5 === 0, x = (t / dur) * width;
1406
+ var tick = el("div", "tick" + (isMajor ? " major" : ""));
1407
+ tick.style.left = (t / dur) * 100 + "%";
1408
+ if (isMajor && x < width - 34) {
1409
+ var m = Math.floor(t / 60), s = Math.round((t - m * 60) * 10) / 10;
1410
+ tick.append(el("span", null, m + ":" + (s < 10 ? "0" : "") + s));
1411
+ }
1412
+ ruler.append(tick);
1413
+ }
1414
+ }
1415
+ function drawWave() {
1416
+ var canvas = $("wave"), dpr = window.devicePixelRatio || 1;
1417
+ var w = canvas.clientWidth, h = canvas.clientHeight;
1418
+ canvas.width = Math.round(w * dpr);
1419
+ canvas.height = Math.round(h * dpr);
1420
+ var ctx = canvas.getContext("2d");
1421
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
1422
+ ctx.clearRect(0, 0, w, h);
1423
+ var peaks = audio.peaks;
1424
+ if (!peaks || !peaks.length || !meta) return;
1425
+ var videoSec = Math.max(1e-6, last() / meta.fps);
1426
+ var audioSec = audio.buffer ? audio.buffer.duration : videoSec;
1427
+ var spanPx = Math.min(1, audioSec / videoSec) * w, mid = h / 2;
1428
+ ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue("--wave").trim();
1429
+ for (var x = 0; x < spanPx; x += 3) {
1430
+ var v = Math.max(peaks[Math.floor((x / spanPx) * peaks.length)] || 0, 0.015);
1431
+ var bh = Math.max(1, Math.sqrt(v) * (h - 8));
1432
+ ctx.fillRect(x, mid - bh / 2, 2, bh);
1433
+ }
1434
+ }
1435
+
1436
+ var dragging = false;
1437
+ timeline.addEventListener("pointerdown", function (e) {
1438
+ if (!meta || e.button !== 0) return;
1439
+ timeline.setPointerCapture(e.pointerId);
1440
+ dragging = true;
1441
+ seek(frameAtX(e.clientX));
1442
+ });
1443
+ timeline.addEventListener("pointermove", function (e) {
1444
+ if (!meta) return;
1445
+ var f = frameAtX(e.clientX), r = tlInner.getBoundingClientRect();
1446
+ var x = Math.min(r.width, Math.max(0, e.clientX - r.left));
1447
+ $("hoverLine").style.display = "block";
1448
+ $("hoverLine").style.left = x + "px";
1449
+ $("hoverTime").style.display = "block";
1450
+ $("hoverTime").style.left = x + "px";
1451
+ $("hoverTime").textContent = fmt(f);
1452
+ if (dragging && f !== frame) seek(f);
1453
+ });
1454
+ timeline.addEventListener("pointerleave", function () {
1455
+ $("hoverLine").style.display = "none";
1456
+ $("hoverTime").style.display = "none";
1457
+ });
1458
+ timeline.addEventListener("pointerup", function () { dragging = false; });
1459
+ timeline.addEventListener("pointercancel", function () { dragging = false; });
1460
+
1461
+ // \u2500\u2500 Notes: pause, click the picture (or drag an area) and say what should
1462
+ // change. Each is saved with its moment, its spot and a picture of the
1463
+ // frame with the spot marked, for whoever edits the film \u2500\u2500
1464
+ var notes = [], notesOn = false, draft = null, openId = null, saving = false, press = null;
1465
+ var pop = $("pop"), pins = $("pins"), NL = String.fromCharCode(10);
1466
+ var ICON_CHECK = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.5l3 3 6-7"/></svg>';
1467
+ var ICON_X = '<svg viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>';
1468
+
1469
+ function pct1(v) { return Math.round(v * 100) + "%"; }
1470
+ function whereText(n) {
1471
+ return n.w != null ? "area " + pct1(n.x) + "," + pct1(n.y) + " to " + pct1(n.x + n.w) + "," + pct1(n.y + n.h) : "spot " + pct1(n.x) + "," + pct1(n.y);
1472
+ }
1473
+ function noteById(id) { return notes.find(function (n) { return n.id === id; }); }
1474
+ function openCount() { return notes.filter(function (n) { return !n.done; }).length; }
1475
+
1476
+ function renderNotes() {
1477
+ renderPins();
1478
+ renderMarks();
1479
+ renderList();
1480
+ var open = openCount(), count = $("notesCount");
1481
+ count.textContent = String(open || notes.length);
1482
+ count.classList.toggle("open", open > 0);
1483
+ $("notesBtn").title = open + " open of " + notes.length;
1484
+ }
1485
+ function renderPins() {
1486
+ if (!meta) return;
1487
+ stage.classList.toggle("can-note", notesOn && !!player && !playing);
1488
+ stage.classList.toggle("hint", notes.length === 0 && !draft);
1489
+ pins.replaceChildren();
1490
+ if (playing) return;
1491
+ var here = notes.filter(function (n) { return n.frame === frame; });
1492
+ if (draft && draft.frame === frame) here.push(draft);
1493
+ here.forEach(function (n) {
1494
+ if (n.w != null) {
1495
+ var a = el("div", "area" + (n.done ? " done" : ""));
1496
+ a.style.left = n.x * 100 + "%"; a.style.top = n.y * 100 + "%";
1497
+ a.style.width = n.w * 100 + "%"; a.style.height = n.h * 100 + "%";
1498
+ pins.append(a);
1499
+ }
1500
+ var pin = el("button", "pin" + (n.done ? " done" : "") + (n === draft ? " draft" : "") + (n.id === openId ? " active" : ""));
1501
+ pin.style.left = n.x * 100 + "%"; pin.style.top = n.y * 100 + "%";
1502
+ if (n === draft) { pin.setAttribute("aria-label", "New note"); }
1503
+ else {
1504
+ if (n.done) pin.innerHTML = ICON_CHECK; else pin.textContent = String(n.id);
1505
+ pin.title = n.text;
1506
+ pin.setAttribute("aria-label", "Note " + n.id);
1507
+ pin.addEventListener("click", function (e) { e.stopPropagation(); openCard(n.id); });
1508
+ }
1509
+ pins.append(pin);
1510
+ });
1511
+ }
1512
+ function renderMarks() {
1513
+ var marks = $("noteMarks");
1514
+ marks.replaceChildren();
1515
+ if (!meta) return;
1516
+ // Notes close together stack, up to three high.
1517
+ var width = tlInner.clientWidth || 800, lanes = [];
1518
+ notes.slice().sort(function (a, b) { return a.frame - b.frame || a.id - b.id; }).forEach(function (n) {
1519
+ var x = (pct(n.frame) / 100) * width, lane = lanes.findIndex(function (end) { return x - end >= 16; });
1520
+ if (lane < 0) lane = lanes.length < 3 ? lanes.length : 2;
1521
+ lanes[lane] = x;
1522
+ var m = el("button", "note-mark" + (n.done ? " done" : "") + (lane ? " stacked" : ""), String(n.id));
1523
+ m.style.left = pct(n.frame) + "%";
1524
+ m.style.top = 4 + lane * 15 + "px";
1525
+ m.title = n.id + " \xB7 " + fmt(n.frame) + " \xB7 " + n.text;
1526
+ m.addEventListener("pointerdown", function (e) { e.stopPropagation(); });
1527
+ m.addEventListener("click", function (e) { e.stopPropagation(); goToNote(n.id); });
1528
+ marks.append(m);
1529
+ });
1530
+ }
1531
+ function renderList() {
1532
+ var list = $("notesList");
1533
+ list.replaceChildren();
1534
+ $("notesCopy").disabled = openCount() === 0;
1535
+ if (!notes.length) {
1536
+ list.append(el("div", "np-empty", "Pause and click the picture to pin a note to that spot and moment. Drag to mark an area."));
1537
+ }
1538
+ notes.slice().sort(function (a, b) { return a.frame - b.frame || a.id - b.id; }).forEach(function (n) {
1539
+ var row = el("div", "note-row" + (n.done ? " done" : ""));
1540
+ var body = el("div");
1541
+ body.append(el("div", "when tnum", fmt(n.frame) + " \xB7 frame " + n.frame), el("div", "text", n.text));
1542
+ var check = el("button", "check" + (n.done ? " on" : ""));
1543
+ check.innerHTML = ICON_CHECK;
1544
+ check.title = n.done ? "Reopen" : "Mark done";
1545
+ check.setAttribute("aria-label", check.title);
1546
+ check.addEventListener("click", function (e) { e.stopPropagation(); setDone(n.id, !n.done); });
1547
+ row.append(el("span", "badge" + (n.done ? " done" : ""), String(n.id)), body, check);
1548
+ row.addEventListener("click", function () { goToNote(n.id); });
1549
+ list.append(row);
1550
+ });
1551
+ var dir = meta && meta.notesDir ? meta.notesDir.split("/").slice(-2).join("/") : "";
1552
+ $("notesFoot").textContent = "Saved in " + dir + " with a picture of each spot. Ask your agent to go through them.";
1553
+ }
1554
+
1555
+ function notesRequest(body) {
1556
+ return fetch("/@framefields/notes", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) })
1557
+ .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); });
1558
+ }
1559
+ function upsert(note) {
1560
+ var i = notes.findIndex(function (n) { return n.id === note.id; });
1561
+ if (i >= 0) notes[i] = note; else notes.push(note);
1562
+ renderNotes();
1563
+ }
1564
+ function setDone(id, done) {
1565
+ notesRequest({ op: "update", id: id, done: done }).then(function (n) {
1566
+ upsert(n);
1567
+ if (openId === id) openCard(id);
1568
+ }, function () { toast("Couldn't save. Is the preview running?"); });
1569
+ }
1570
+ function removeNote(id) {
1571
+ notesRequest({ op: "remove", id: id }).then(function () {
1572
+ notes = notes.filter(function (n) { return n.id !== id; });
1573
+ closePop();
1574
+ renderNotes();
1575
+ }, function () { toast("Couldn't delete. Is the preview running?"); });
1576
+ }
1577
+ function goToNote(id) {
1578
+ var n = noteById(id);
1579
+ if (!n) return;
1580
+ $("notesPanel").classList.remove("on");
1581
+ $("notesBtn").setAttribute("aria-expanded", "false");
1582
+ seek(n.frame).then(function () { openCard(id); });
1583
+ }
1584
+
1585
+ var toastTimer = null;
1586
+ function toast(text) {
1587
+ var t = $("toast");
1588
+ t.textContent = text;
1589
+ t.classList.add("on");
1590
+ clearTimeout(toastTimer);
1591
+ toastTimer = setTimeout(function () { t.classList.remove("on"); }, 2200);
1592
+ }
1593
+
1594
+ // \u2500\u2500 Placing a note on the picture \u2500\u2500
1595
+ function fracAt(e) {
1596
+ var r = stage.getBoundingClientRect();
1597
+ return { x: Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)), y: Math.min(1, Math.max(0, (e.clientY - r.top) / r.height)), r: r };
1598
+ }
1599
+ stage.addEventListener("pointerdown", function (e) {
1600
+ if (e.button !== 0 || !player || e.target.closest(".pin")) return;
1601
+ if (playing) { pause(); return; }
1602
+ if (!notesOn) return;
1603
+ if (draft && pop.querySelector("textarea") && pop.querySelector("textarea").value.trim()) {
1604
+ pop.querySelector("textarea").focus();
1605
+ return;
1606
+ }
1607
+ cancelDraft();
1608
+ var p = fracAt(e);
1609
+ press = { x: p.x, y: p.y, cx: e.clientX, cy: e.clientY, area: null };
1610
+ stage.setPointerCapture(e.pointerId);
1611
+ e.preventDefault();
1612
+ });
1613
+ stage.addEventListener("pointermove", function (e) {
1614
+ if (!press) return;
1615
+ var p = fracAt(e);
1616
+ if (!press.area && Math.hypot(e.clientX - press.cx, e.clientY - press.cy) < 6) return;
1617
+ press.area = { x: Math.min(press.x, p.x), y: Math.min(press.y, p.y), w: Math.abs(p.x - press.x), h: Math.abs(p.y - press.y) };
1618
+ var m = $("marquee");
1619
+ m.style.display = "block";
1620
+ m.style.left = press.area.x * 100 + "%"; m.style.top = press.area.y * 100 + "%";
1621
+ m.style.width = press.area.w * 100 + "%"; m.style.height = press.area.h * 100 + "%";
1622
+ });
1623
+ function endPress() {
1624
+ if (!press) return;
1625
+ var a = press.area;
1626
+ $("marquee").style.display = "none";
1627
+ draft = a && a.w > 0.01 && a.h > 0.01
1628
+ ? { frame: frame, x: a.x, y: a.y, w: a.w, h: a.h, text: "" }
1629
+ : { frame: frame, x: press.x, y: press.y, text: "" };
1630
+ press = null;
1631
+ openComposer();
1632
+ }
1633
+ stage.addEventListener("pointerup", endPress);
1634
+ stage.addEventListener("pointercancel", function () { press = null; $("marquee").style.display = "none"; });
1635
+
1636
+ // \u2500\u2500 The popover: writing a note, or reading one \u2500\u2500
1637
+ var popAnchor = null;
1638
+ function placePop() {
1639
+ if (!popAnchor || !pop.classList.contains("on")) return;
1640
+ var r = stage.getBoundingClientRect(), n = popAnchor;
1641
+ var ax = r.left + (n.x + (n.w || 0)) * r.width, ay = r.top + (n.y + (n.h || 0)) * r.height;
1642
+ var w = pop.offsetWidth, h = pop.offsetHeight, gap = 16;
1643
+ var left = ax + gap + w <= innerWidth - 8 ? ax + gap : ax - gap - w - (n.w || 0) * r.width;
1644
+ var top = ay + gap + h <= innerHeight - 8 ? ay + gap / 2 : ay - h - gap / 2 - (n.h || 0) * r.height;
1645
+ pop.style.left = Math.max(8, Math.min(innerWidth - w - 8, left)) + "px";
1646
+ pop.style.top = Math.max(8, Math.min(innerHeight - h - 8, top)) + "px";
1647
+ }
1648
+ function showPop(anchor) {
1649
+ popAnchor = anchor;
1650
+ pop.classList.add("on");
1651
+ placePop();
1652
+ }
1653
+ function closePop() {
1654
+ pop.classList.remove("on");
1655
+ pop.replaceChildren();
1656
+ popAnchor = null;
1657
+ openId = null;
1658
+ renderPins();
1659
+ }
1660
+ function cancelDraft() {
1661
+ if (!draft) return;
1662
+ draft = null;
1663
+ closePop();
1664
+ }
1665
+ function openComposer() {
1666
+ openId = null;
1667
+ var head = el("div", "pop-head");
1668
+ head.append(el("span", "badge", "+"), el("span", "tnum", fmt(draft.frame) + " \xB7 " + (draft.w != null ? "area" : "spot")));
1669
+ var ta = document.createElement("textarea");
1670
+ ta.placeholder = "What should change here?";
1671
+ ta.rows = 2;
1672
+ ta.setAttribute("aria-label", "Note");
1673
+ var foot = el("div", "pop-foot"), status = el("span", "grow", "Enter to add");
1674
+ var cancel = el("button", "btn", "Cancel"), add = el("button", "btn primary", "Add note");
1675
+ add.disabled = true;
1676
+ foot.append(status, cancel, add);
1677
+ pop.replaceChildren(head, ta, foot);
1678
+ ta.addEventListener("input", function () {
1679
+ draft.text = ta.value;
1680
+ add.disabled = !ta.value.trim() || saving;
1681
+ ta.style.height = "auto";
1682
+ ta.style.height = Math.min(180, ta.scrollHeight) + "px";
1683
+ placePop();
1684
+ });
1685
+ ta.addEventListener("keydown", function (e) {
1686
+ if (e.key === "Enter" && !e.shiftKey && !e.isComposing) { e.preventDefault(); saveDraft(ta, add, status); }
1687
+ if (e.key === "Escape") { e.preventDefault(); cancelDraft(); }
1688
+ });
1689
+ cancel.addEventListener("click", cancelDraft);
1690
+ add.addEventListener("click", function () { saveDraft(ta, add, status); });
1691
+ renderPins();
1692
+ showPop(draft);
1693
+ ta.focus();
1694
+ }
1695
+ async function saveDraft(ta, add, status) {
1696
+ var d = draft, text = ta.value.trim();
1697
+ if (!d || !text || saving) return;
1698
+ saving = true;
1699
+ ta.readOnly = true;
1700
+ add.disabled = true;
1701
+ status.className = "grow";
1702
+ status.textContent = "Saving\u2026";
1703
+ try {
1704
+ var image = null;
1705
+ try { image = await capture(d); } catch (err) { report("warning", ["[framefields] no picture for the note:", err]); }
1706
+ var note = await notesRequest({ op: "add", note: { frame: d.frame, time: d.frame / meta.fps, x: d.x, y: d.y, w: d.w, h: d.h, text: text, image: image } });
1707
+ if (draft === d) draft = null;
1708
+ closePop();
1709
+ upsert(note);
1710
+ toast("Note " + note.id + " saved");
1711
+ } catch (err) {
1712
+ status.className = "grow err";
1713
+ status.textContent = "Couldn't save. Is the preview running?";
1714
+ ta.readOnly = false;
1715
+ add.disabled = false;
1716
+ } finally {
1717
+ saving = false;
1718
+ }
1719
+ }
1720
+ // The frame with the spot marked, small enough to read at a glance.
1721
+ async function capture(d) {
1722
+ var bmp = await player.snapshot(d.frame);
1723
+ var scale = Math.min(1, 1600 / bmp.width), w = Math.round(bmp.width * scale), h = Math.round(bmp.height * scale);
1724
+ var c = document.createElement("canvas");
1725
+ c.width = w; c.height = h;
1726
+ var g = c.getContext("2d");
1727
+ g.drawImage(bmp, 0, 0, w, h);
1728
+ bmp.close();
1729
+ var lw = Math.max(3, w / 400);
1730
+ function mark(draw) {
1731
+ // Dark, white, then blue: it reads on any picture.
1732
+ g.lineWidth = lw + 5; g.strokeStyle = "rgba(0,0,0,0.5)"; draw();
1733
+ g.lineWidth = lw + 2.5; g.strokeStyle = "#fff"; draw();
1734
+ g.lineWidth = lw; g.strokeStyle = "#3b82f6"; draw();
1735
+ }
1736
+ if (d.w != null) {
1737
+ mark(function () { g.strokeRect(d.x * w, d.y * h, d.w * w, d.h * h); });
1738
+ } else {
1739
+ var rad = Math.max(16, w / 40);
1740
+ mark(function () { g.beginPath(); g.arc(d.x * w, d.y * h, rad, 0, Math.PI * 2); g.stroke(); });
1741
+ g.fillStyle = "#3b82f6";
1742
+ g.beginPath(); g.arc(d.x * w, d.y * h, lw, 0, Math.PI * 2); g.fill();
1743
+ }
1744
+ return c.toDataURL("image/jpeg", 0.88);
1745
+ }
1746
+ function openCard(id) {
1747
+ var n = noteById(id);
1748
+ if (!n) return;
1749
+ if (draft) cancelDraft();
1750
+ openId = id;
1751
+ var head = el("div", "pop-head");
1752
+ var close = el("button", "btn x-btn");
1753
+ close.innerHTML = ICON_X;
1754
+ close.title = "Close";
1755
+ close.setAttribute("aria-label", "Close");
1756
+ close.addEventListener("click", closePop);
1757
+ head.append(el("span", "badge" + (n.done ? " done" : ""), String(n.id)), el("span", "tnum grow", fmt(n.frame) + " \xB7 frame " + n.frame), close);
1758
+ var foot = el("div", "pop-foot");
1759
+ var done = el("button", "btn");
1760
+ done.innerHTML = ICON_CHECK;
1761
+ done.append(document.createTextNode(n.done ? "Reopen" : "Mark done"));
1762
+ done.addEventListener("click", function () { setDone(n.id, !n.done); });
1763
+ var del = el("button", "btn danger", "Delete");
1764
+ del.addEventListener("click", function () { removeNote(n.id); });
1765
+ foot.append(done, el("span", "grow"), del);
1766
+ pop.replaceChildren(head, el("div", "pop-text", n.text), foot);
1767
+ renderPins();
1768
+ showPop(n);
1769
+ }
1770
+
1771
+ document.addEventListener("pointerdown", function (e) {
1772
+ if (pop.classList.contains("on") && !pop.contains(e.target) && !stage.contains(e.target) && !e.target.closest(".note-mark, .note-row")) {
1773
+ if (openId != null) closePop();
1774
+ else if (draft && !draft.text.trim()) cancelDraft();
1775
+ }
1776
+ var panel = $("notesPanel");
1777
+ if (panel.classList.contains("on") && !panel.contains(e.target) && !$("notesBtn").contains(e.target)) {
1778
+ panel.classList.remove("on");
1779
+ $("notesBtn").setAttribute("aria-expanded", "false");
1780
+ }
1781
+ });
1782
+ document.addEventListener("keydown", function (e) {
1783
+ if (e.key !== "Escape") return;
1784
+ if (openId != null) closePop();
1785
+ $("notesPanel").classList.remove("on");
1786
+ $("notesBtn").setAttribute("aria-expanded", "false");
1787
+ });
1788
+ window.addEventListener("resize", placePop);
1789
+ new ResizeObserver(placePop).observe(stage);
1790
+
1791
+ $("notesBtn").addEventListener("click", function () {
1792
+ var on = $("notesPanel").classList.toggle("on");
1793
+ $("notesBtn").setAttribute("aria-expanded", String(on));
1794
+ });
1795
+ $("notesClose").addEventListener("click", function () {
1796
+ $("notesPanel").classList.remove("on");
1797
+ $("notesBtn").setAttribute("aria-expanded", "false");
1798
+ });
1799
+ // The open notes as text, for a chat that can't read the notes folder.
1800
+ $("notesCopy").addEventListener("click", function () {
1801
+ var lines = ["Notes on the preview of " + JSON.stringify(meta.title) + ":"];
1802
+ notes.filter(function (n) { return !n.done; }).sort(function (a, b) { return a.frame - b.frame; }).forEach(function (n) {
1803
+ lines.push("- Note " + n.id + " at " + fmt(n.frame) + " (frame " + n.frame + "), " + whereText(n) + ": " + n.text + (n.image ? " [picture: " + n.image + "]" : ""));
1804
+ });
1805
+ var text = lines.join(NL), label = $("notesCopyLabel");
1806
+ var done = function () { label.textContent = "Copied"; setTimeout(function () { label.textContent = "Copy"; }, 1600); };
1807
+ (navigator.clipboard ? navigator.clipboard.writeText(text) : Promise.reject()).then(done, function () {
1808
+ var t = document.createElement("textarea");
1809
+ t.value = text;
1810
+ document.body.append(t);
1811
+ t.select();
1812
+ try { document.execCommand("copy"); done(); } catch (e) {}
1813
+ t.remove();
1814
+ });
1815
+ });
1816
+
1817
+ function loadNotes() {
1818
+ if (!notesOn) return;
1819
+ fetch("/@framefields/notes").then(function (r) { return r.json(); }).then(function (list) {
1820
+ notes = Array.isArray(list) ? list : [];
1821
+ renderNotes();
1822
+ }, function () {});
1823
+ }
1824
+
1825
+ // \u2500\u2500 Wiring \u2500\u2500
1826
+ $("play").addEventListener("click", togglePlay);
1827
+ $("prev").addEventListener("click", function () { seek(frame - 1); });
1828
+ $("next").addEventListener("click", function () { seek(frame + 1); });
1829
+ $("mute").addEventListener("click", function () { audio.muted = !audio.muted; applyVolume(); });
1830
+ $("volume").addEventListener("input", function (e) { audio.volume = Number(e.target.value); audio.muted = audio.volume === 0; applyVolume(); });
1831
+
1832
+ // A hidden tab's timers are throttled, so playback would stutter: pause.
1833
+ document.addEventListener("visibilitychange", function () {
1834
+ if (document.hidden && playing) pause();
1835
+ });
1836
+
1837
+ // \u2500\u2500 For scripts and agents driving the page: seek, play, and read the
1838
+ // state instead of clicking at coordinates \u2500\u2500
1839
+ var pageState = "loading";
1840
+ window.framefieldsPreview = {
1841
+ /** Shows the frame at a time in seconds; resolves once it is drawn. */
1842
+ seek: function (sec) { return ready().then(function () { return seek(Number(sec) * meta.fps); }); },
1843
+ /** Shows a frame by number; resolves once it is drawn. */
1844
+ seekFrame: function (f) { return ready().then(function () { return seek(f); }); },
1845
+ play: function () { return ready().then(play); },
1846
+ /** Notes pinned on the page, as saved in notes.json. */
1847
+ notes: function () { return notes.slice(); },
1848
+ pause: function () { if (playing) pause(); },
1849
+ /** Where the preview is: loading, ready or error, and what it shows. */
1850
+ state: function () {
1851
+ var rate = meter.read().fps;
1852
+ return {
1853
+ state: pageState,
1854
+ error: pageState === "error" ? $("stageMsg").textContent : null,
1855
+ frame: frame,
1856
+ time: meta ? Number((frame / meta.fps).toFixed(3)) : 0,
1857
+ playing: playing,
1858
+ buffering: stalled,
1859
+ audio: audio.state,
1860
+ connected: !offline,
1861
+ // Frames shown per second over the last 2 s of playback (the last
1862
+ // playback's while paused), and how long the last frame took to draw.
1863
+ playbackFps: rate == null ? null : Number(rate.toFixed(1)),
1864
+ renderMs: player ? Math.round(player.lastRenderMs) : null,
1865
+ meta: meta && { title: meta.title, width: meta.width, height: meta.height, fps: meta.fps, frameCount: meta.frameCount, duration: Number((last() / meta.fps).toFixed(3)) }
1866
+ };
1867
+ }
1868
+ };
1869
+ var readyWaiters = [];
1870
+ function ready() {
1871
+ if (player) return Promise.resolve();
1872
+ if (pageState === "error") return Promise.reject(new Error($("stageMsg").textContent));
1873
+ return new Promise(function (resolve, reject) { readyWaiters.push([resolve, reject]); });
1874
+ }
1875
+ function settleReady(err) {
1876
+ readyWaiters.splice(0).forEach(function (w) { err ? w[1](err) : w[0](); });
1877
+ }
1878
+
1879
+ function applyMeta(m) {
1880
+ meta = m;
1881
+ document.title = m.title + " \xB7 preview";
1882
+ $("title").textContent = m.title;
1883
+ $("spec").textContent = m.width + "\xD7" + m.height + " \xB7 " + m.fps + " fps \xB7 " + fmt(last());
1884
+ $("tcDur").textContent = fmt(last());
1885
+ stage.style.setProperty("--ar", m.width + " / " + m.height);
1886
+ stage.style.setProperty("--ar-n", String(m.width / m.height));
1887
+ renderRuler();
1888
+ }
1889
+
1890
+ new ResizeObserver(function () {
1891
+ if (!meta) return;
1892
+ renderRuler();
1893
+ drawWave();
1894
+ renderMarks();
1895
+ }).observe(tlInner);
1896
+
1897
+ // When the preview command ends the event stream drops and the browser keeps
1898
+ // retrying. The next preview of this project (same port) says hello with a
1899
+ // new session, and this tab reloads into it.
1900
+ var events = new EventSource("/events");
1901
+ events.addEventListener("hello", function (e) {
1902
+ var s = JSON.parse(e.data).session;
1903
+ if (session && s !== session) { location.reload(); return; }
1904
+ offline = false;
1905
+ renderChip();
1906
+ });
1907
+ events.addEventListener("error", function () {
1908
+ if (!meta) return;
1909
+ if (playing) { stop(); keepPosition(); }
1910
+ offline = true;
1911
+ renderChip();
1912
+ });
1913
+ events.addEventListener("notes", function (e) {
1914
+ notes = JSON.parse(e.data);
1915
+ if (openId != null && !noteById(openId)) closePop();
1916
+ renderNotes();
1917
+ });
1918
+ events.addEventListener("audio", function (e) {
1919
+ if (meta) loadAudio(JSON.parse(e.data));
1920
+ });
1921
+
1922
+ fetch("/meta").then(function (r) { return r.json(); }).then(function (m) {
1923
+ session = m.session;
1924
+ applyMeta(m);
1925
+ notesOn = !!m.notesDir;
1926
+ $("notesBtn").hidden = !notesOn;
1927
+ loadNotes();
1928
+ loadAudio(m.audio);
1929
+ setTime(startFrame());
1930
+ $("buffering").classList.add("on");
1931
+ whenPlayer();
1932
+ });
1933
+
1934
+ // The composition's bundle (loaded below) announces its player.
1935
+ function whenPlayer() {
1936
+ if (!window.framefieldsPlayer) return;
1937
+ window.framefieldsPlayer.then(function (p) {
1938
+ player = p;
1939
+ $("play").disabled = false;
1940
+ show(frame).then(function () {
1941
+ pageState = "ready";
1942
+ renderPins();
1943
+ document.documentElement.dataset.preview = "ready";
1944
+ settleReady();
1945
+ scheduleWarm();
1946
+ });
1947
+ }, function (err) {
1948
+ showError(err);
1949
+ document.documentElement.dataset.preview = "error";
1950
+ settleReady(err instanceof Error ? err : new Error(String(err)));
1951
+ });
1952
+ }
1953
+ window.addEventListener("framefields:player", function () { if (meta) whenPlayer(); });
1954
+ window.addEventListener("error", function (e) {
1955
+ if (!player) showError(e.error || e.message);
1956
+ else report("error", [e.error || e.message]);
1957
+ });
1958
+ window.addEventListener("unhandledrejection", function (e) { report("error", [e.reason]); });
1959
+ })();
1960
+ <\/script>
1961
+ <script type="module" src="/@framefields/player.js"><\/script>
1962
+ </body>
1963
+ </html>
1964
+ `;var qb=1200,Md="x-framefields-preview",Zb="/@framefields/player.js";async function Kb(e,t={}){let r=e.entry instanceof URL||String(e.entry).startsWith("file:")?Nn(e.entry):_.resolve(String(e.entry)),n=e.export??"default",i=gd(),o=bd(_.dirname(r)),a=[...t.root===void 0?[Jb(_.dirname(r))]:Array.isArray(t.root)?t.root:[t.root],i,o.dir].filter(L=>!!L).map(L=>_.resolve(L)),s=new Set,u=t.idleCloseMs??5e3,c,m=t.title??"framefields preview",d=(0,Vi.randomUUID)(),p=t.log===!1?()=>{}:t.log??(L=>console.error(L)),f=L=>p(`[framefields preview] ${L}`),b=new Set,g=!1,y=t.notesDir===!1?void 0:new ji(_.resolve(t.notesDir??_.join(x.cwd(),".framefields","preview-notes"))),v=Promise.resolve(),T=await Qb(r,n),C=await ny(T,m,d,y?.dir??null),w,A=()=>{if(!w){let L=fd({entry:r,exportName:n,modelsDir:i,ortBase:o.base}).then(j=>j.code);w=L,L.catch(j=>{f(`could not build ${_.relative(x.cwd(),r)}:
1965
+ ${ty(j)}`),w===L&&(w=void 0)})}return w},S=hd();S.catch(()=>{});let M={state:t.audio===!1?"none":"mixing"},D;function V(L,j){for(let H of s)H.write(`event: ${L}
1966
+ data: ${JSON.stringify(j)}
1967
+
1968
+ `)}function W(L){M=L,V("audio",M)}function z(){if(M.state!=="mixing")return;if(!T.toVirtualMediaAsync&&!T.toVirtualMedia){W({state:"none"});return}let L=t.renderer??new we.HeadlessMediaRenderer;(async()=>{let j=T.toVirtualMediaAsync?await T.toVirtualMediaAsync():T.toVirtualMedia();return await T.prepareMediaTime?.(),L.renderAudio(j,{fps:C.fps})})().then(({channels:j,sampleRate:H})=>{let K=j[0]??new Float32Array(0),X=j[1]??K,ee=ay(K,X,qb);if(K.length===0||Math.max(...ee)<.001){W({state:"none"});return}D=io([K,X],{sampleRate:H}),W({state:"ready",durationSec:K.length/H,peaks:ee.map(R=>Math.round(R*1e3)/1e3)})},j=>{W({state:"error",error:j instanceof Error?j.message:String(j)})})}let B,k=new Promise(L=>{B=L}),P;function G(L="closed"){return P??=new Promise(j=>{clearTimeout(c),L==="idle"&&f("stopped: its tab was closed"),L==="replaced"&&f("stopped: a newer preview took over");for(let H of s)H.end();s.clear(),Y.close(()=>{j(),B(L)}),Y.closeAllConnections()}),P}let Y=Ms.default.createServer(async(L,j)=>{let H=new URL(L.url??"/","http://localhost");j.setHeader("cross-origin-opener-policy","same-origin"),j.setHeader("cross-origin-embedder-policy","credentialless");try{if(L.method==="GET"&&H.pathname==="/"){j.writeHead(200,{"content-type":"text/html; charset=utf-8","cache-control":"no-store"}),j.end(Sd);return}if(L.method==="GET"&&H.pathname==="/meta"){ut(j,200,{...C,audio:M});return}if(L.method==="GET"&&H.pathname.startsWith(`${wn}/`)){let X=await S,ee=_.resolve(X,`.${H.pathname.slice(wn.length)}`);if(Ss(X,ee)&&await ks(ee)){await Ps(L,j,ee);return}ut(j,404,{error:"not found"});return}if(L.method==="GET"&&H.pathname===Zb){let X;try{await S,X=await A()}catch(ee){let R=ee instanceof Error?ee.message:String(ee);X=`throw new Error(${JSON.stringify(`Could not build the preview:
1969
+ ${R}`)});`}j.writeHead(200,{"content-type":"text/javascript; charset=utf-8","cache-control":"no-store"}),j.end(X);return}if(L.method==="GET"&&H.pathname==="/@framefields/stat"){let X=_.resolve(H.searchParams.get("path")??""),ee=-1;a.some(R=>Ss(R,X))&&(ee=await ge.promises.stat(X).then(R=>R.isFile()?R.size:-1,()=>-1)),ut(j,200,{exists:ee>=0,size:Math.max(0,ee)});return}if(L.method==="GET"&&H.pathname==="/events"){j.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-store",connection:"keep-alive"}),j.write(`retry: 1000
1970
+ `),j.write(`event: hello
1971
+ data: ${JSON.stringify({session:C.session})}
1972
+
1973
+ `),s.add(j),clearTimeout(c),g||(g=!0,f(u===!1?"page opened":`page opened; the server stops ${Number((u/1e3).toFixed(1))} s after its last tab closes`)),$?.(),L.on("close",()=>{s.delete(j),s.size===0&&u!==!1&&!P&&(c=setTimeout(()=>{s.size===0&&G("idle")},u))});return}if(L.method==="POST"&&H.pathname==="/takeover"&&L.headers[Md]==="1"){ut(j,200,{ok:!0}),setImmediate(()=>{G("replaced")});return}if(L.method==="POST"&&H.pathname==="/@framefields/log"&&L.headers["content-type"]==="application/json"){let X=await kd(L,16384),{message:ee,level:R}=JSON.parse(X),E=String(ee??"").trim();E&&!b.has(E)&&b.size<200&&(b.add(E),f(`${R==="warning"?"warning":"error"} in the page: ${E}`)),j.writeHead(204).end();return}if(y&&H.pathname==="/@framefields/notes"){if(L.method==="GET"){ut(j,200,await y.list());return}if(L.method==="POST"&&L.headers["content-type"]==="application/json"){let X=JSON.parse(await kd(L,16777216)),ee=v.then(()=>ey(y,X,C.fps,f));v=ee.catch(()=>{});let R=await ee;V("notes",await y.list()),ut(j,R?200:404,R??{error:"no such note"});return}}if(L.method==="GET"&&H.pathname==="/audio"){if(M.state!=="ready"||!D){ut(j,404,{error:`audio is ${M.state}`});return}j.writeHead(200,{"content-type":"audio/wav","content-length":D.length,"cache-control":"no-store"}),j.end(D);return}let K=/^\/assets\/fonts\/([^/]+)$/.exec(H.pathname);if(K&&(L.method==="GET"||L.method==="HEAD")){let X=_.join(x.cwd(),"assets","fonts",decodeURIComponent(K[1]));if(await ks(X)){await Ps(L,j,X);return}}if(L.method==="GET"||L.method==="HEAD"){let X=_.resolve(decodeURIComponent(H.pathname.replace(/^\/@fs(?=\/)/,"")));if(a.some(ee=>Ss(ee,X))&&await ks(X)){await Ps(L,j,X);return}}ut(j,404,{error:"not found"})}catch(K){j.headersSent?j.end():ut(j,500,{error:K instanceof Error?K.message:String(K)})}}),$,I=t.host??"127.0.0.1",J=t.port??iy(),oe=L=>new Promise((j,H)=>{let K=ee=>{Y.off("listening",X),H(ee)},X=()=>{Y.off("error",K),j()};Y.once("error",K),Y.once("listening",X),Y.listen(L,I)});try{await oe(J)}catch(L){if(L.code!=="EADDRINUSE")throw L;if(await oy(I,J))await oe(J).catch(()=>oe(0));else if(t.port===void 0)await oe(0);else throw L}let{port:he}=Y.address(),le=`http://${I.includes(":")?`[${I}]`:I}:${he}/`;if(A().catch(()=>{}),z(),t.open===!0){let L=await new Promise(j=>{let H=setTimeout(()=>j(!1),2e3);$=()=>{clearTimeout(H),j(!0)},s.size>0&&$()});$=void 0,L||sy(le)}return{url:le,closed:k,close:()=>G()}}async function Qb(e,t){let n=(await import(On(e).href))[t];if(n===void 0)throw new Error(`[framefields] ${e} has no export named "${t}" to preview.`);return typeof n=="function"?await n():n}function Jb(e){let t;for(let r=e;;r=_.dirname(r)){if(ge.existsSync(_.join(r,".git")))return r;if(!t&&ge.existsSync(_.join(r,"package.json"))&&(t=r),_.dirname(r)===r)return t??e}}async function ey(e,t,r,n){if(t.op==="add"&&t.note&&String(t.note.text).trim()){let o=await e.add(t.note),a=[o.image&&`frame with the spot marked: ${o.image}`,`all notes: ${e.file}`];return n(`${vd(o,r)}
1974
+ ${a.filter(Boolean).join(" \xB7 ")}`),o}let i=Number(t.id);if(t.op==="update"){let o=await e.update(i,t);return o&&typeof t.done=="boolean"&&n(`note ${i} marked ${o.done?"done":"open"}`),o}if(t.op==="remove"){let o=await e.remove(i);return o&&n(`note ${i} deleted`),o}}function ty(e){return e instanceof Error?e.message:String(e)}function kd(e,t){return new Promise((r,n)=>{let i="";e.setEncoding("utf8"),e.on("data",o=>{i+=o,i.length>t&&(n(new Error("request body too large")),e.destroy())}),e.on("end",()=>r(i)),e.on("error",n)})}function Ss(e,t){let r=_.relative(e,t);return!!r&&!r.startsWith("..")&&!_.isAbsolute(r)}async function ks(e){try{return(await ge.promises.stat(e)).isFile()}catch{return!1}}var ry={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".webm":"video/webm",".mp3":"audio/mpeg",".wav":"audio/wav",".m4a":"audio/mp4",".ogg":"audio/ogg",".ttf":"font/ttf",".otf":"font/otf",".woff":"font/woff",".woff2":"font/woff2",".json":"application/json",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".wasm":"application/wasm",".onnx":"application/octet-stream",".srt":"text/plain; charset=utf-8",".txt":"text/plain; charset=utf-8"};async function Ps(e,t,r){let{size:n}=await ge.promises.stat(r),i=ry[_.extname(r).toLowerCase()]??"application/octet-stream",o=/^bytes=(\d*)-(\d*)$/.exec(e.headers.range??""),a=0,s=n-1;if(o&&(o[1]||o[2])&&(o[1]?(a=Number(o[1]),o[2]&&(s=Math.min(s,Number(o[2])))):a=Math.max(0,n-Number(o[2])),a>s||a>=n)){t.writeHead(416,{"content-range":`bytes */${n}`}),t.end();return}if(t.writeHead(o?206:200,{"content-type":i,"content-length":s-a+1,"accept-ranges":"bytes","cache-control":"no-cache",...o&&{"content-range":`bytes ${a}-${s}/${n}`}}),e.method==="HEAD"){t.end();return}ge.createReadStream(r,{start:a,end:s}).pipe(t)}async function ny(e,t,r,n){let i=e.fps??24,o=e.durationMs??await e.computeDuration?.()??5e3;return{session:r,notesDir:n,title:t,fps:i,frameCount:Math.max(1,Math.round(o/1e3*i)),width:e.width??1920,height:e.height??1080}}function iy(){return 41e3+(0,Vi.createHash)("sha1").update(x.cwd()).digest().readUInt16BE(0)%900}async function oy(e,t){let r=await new Promise(n=>{let i=Ms.default.request({host:e,port:t,method:"POST",path:"/takeover",agent:!1,headers:{[Md]:"1"},timeout:1500},o=>{o.resume(),n(o.statusCode===200)});i.on("timeout",()=>i.destroy()),i.on("error",()=>n(!1)),i.end()});return r&&await new Promise(n=>setTimeout(n,150)),r}function ay(e,t,r){let n=new Array(r).fill(0);if(e.length===0)return n;let i=e.length/r;for(let o=0;o<r;o++){let a=Math.floor(o*i),s=Math.min(e.length,Math.floor((o+1)*i)),u=0;for(let c=a;c<s;c++){let m=Math.max(Math.abs(e[c]??0),Math.abs(t[c]??0));m>u&&(u=m)}n[o]=Math.min(1,u)}return n}function ut(e,t,r){e.writeHead(t,{"content-type":"application/json","cache-control":"no-store"}),e.end(JSON.stringify(r))}function sy(e){let[t,r]=x.platform==="darwin"?["open",[e]]:x.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];try{(0,Pd.spawn)(t,r,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}catch{}}function Ts(e,t){return e&&(t&&!e.source&&Object.defineProperty(e,"source",{value:t,enumerable:!0,writable:!0,configurable:!0}),typeof e.section!="function"&&Object.defineProperty(e,"section",{value:(r,n)=>{if(typeof r=="object"&&r!==null&&!("kind"in r)&&!("inputHandleId"in r)&&!("src"in r)){let o=r.source??e.source??t;return F.section(o,e,r)}let i=r??e.source??t;return F.section(i,e,n)},enumerable:!1,writable:!0,configurable:!0}),typeof e.blurEffect!="function"&&Object.defineProperty(e,"blurEffect",{value:r=>new Tt({track:e,...r}),enumerable:!1,writable:!0,configurable:!0}),typeof e.isolate!="function"&&Object.defineProperty(e,"isolate",{value:(r,n)=>F.section(r,e,n),enumerable:!1,writable:!0,configurable:!0}),e)}var ly=Fr.attach;Fr.attach=function(e,t,r){let n=ly.call(this,e,t,r);if(n?.objects){let i=e,o=n.objects.get.bind(n.objects);n.objects.get=s=>Ts(o(s),i);let a=n.objects.byCategory.bind(n.objects);n.objects.byCategory=(s,u)=>Ts(a(s,u),i),n.objects.primary&&Ts(n.objects.primary,i)}return n};var Td=class e{virtualMedia;constructor(t,r="Video"){this.virtualMedia=_s(t,r)}static video(t,r){let n=new e(t,"Video");return r&&Object.assign(n.virtualMedia.metadata,r),n}static image(t,r){let n=new e(t,"Image");return r&&Object.assign(n.virtualMedia.metadata,r),n}static lottie(t,r){let n=new e(t,"Lottie");return r&&Object.assign(n.virtualMedia.metadata,r),n}static audio(t,r){let n=new e(t,"Audio");return r&&Object.assign(n.virtualMedia.metadata,r),n}apply(t,r={}){let n;t instanceof cy||typeof t=="object"&&t!==null&&"op"in t?n=t.toOperation():n={op:t,...r};let i=Gs(this.virtualMedia,{...n,dataType:this.virtualMedia.operation.dataType});return new e(i)}toVirtualMedia(){return this.virtualMedia}async renderFrame(t={}){return(t.renderer??new we.HeadlessMediaRenderer).renderFrame(this.virtualMedia,t)}get fps(){return this.virtualMedia.metadata?.fps??void 0}get durationMs(){return this.virtualMedia.metadata?.durationMs??void 0}get width(){return this.virtualMedia.metadata?.width??void 0}get height(){return this.virtualMedia.metadata?.height??void 0}async renderFrameGrid(t={}){return hn(this,t)}async renderVideo(t={},r={}){let n=typeof t=="string"?{...r,outputPath:t}:t,o=await(n.renderer??new we.HeadlessMediaRenderer).renderVideo(this.virtualMedia,n);return Dd(o,n.outputPath)}};async function Dd(e,t){if(!t)return e;let r=_.resolve(t);return await Nr.mkdir(_.dirname(r),{recursive:!0}),await Nr.copyFile(e.filePath,r),await e.cleanup(),{...e,filePath:r,cleanup:async()=>{}}}var Cd=class e{width;height;fps;durationMs;backgroundColor;antialias3d;fonts;children=[];audioTracks=[];signals={};_frameHooks=[];_prepareHooks=[];_clipVision=new Map;_mediaSignals;_visionConfig;_visionBundle;_effects=[];apply(t){return t instanceof dt?(this.withVision(t),this):(this._effects.push(t),this)}withVision(t={}){this._visionBundle??=new Rr({width:this.width,height:this.height,fps:this.fps});let r=t instanceof dt?t.config:t;return this._visionConfig={...r,visionBundle:this._visionBundle},this._visionBundle}vision(t,r={}){let n=typeof t=="string"?t:t.src??t.inputHandleId;if(typeof t!="string"){let a=this.toVirtualMedia({resolveMediaSignal:this.mediaSignalResolver(!0)}),s=Fn(a.children).find(u=>u.operation.id===t.id);if(!s)throw new Error("Add the media layer to the composition before calling comp.vision(layer)");r={startFrame:s.operation.startFrame??t.startFrame,trimStartSec:t.trimStartSec,timeRemap:s.operation.timeRemap,durationFrames:t.durationFrames,...r}}let i=`${n}\0${JSON.stringify({...r,timeRemap:Di(r.timeRemap)})}`,o=this._clipVision.get(i);return o||(o=new pn(n,this.fps,r),this._clipVision.set(i,o)),o}async prepareVision(t){this.linkClipLayers(),await Promise.all([...this._clipVision.values()].map(r=>r.ready(0,t)))}linkClipLayers(){if(this._clipVision.size===0)return;let t,r=n=>{if(!n||typeof n!="object")return;let i=n;if(i.kind==="media"&&i.dataType==="Video"&&typeof i.inputHandleId=="string"&&i.vision instanceof dt&&!(Ji in i.vision)){t??=new Map(Fn(this.toVirtualMedia().children).map(s=>{let u=s.operation;return[u.id,u]}));let o=t.get(i.id),a=this.clipForLayer(i.src??i.inputHandleId,i.vision,{trimStartSec:i.trimStartSec,startFrame:o?.startFrame??i.startFrame,timeRemap:o?.timeRemap});a&&(i.vision.mode!=="skeleton"&&a.keepSubjects(),Object.defineProperty(i.vision,Ji,{value:a,enumerable:!1,configurable:!0}))}if(Array.isArray(i.children))for(let o of i.children)r(o)};for(let n of this.children)r(n)}clipForLayer(t,r,n){let i=r.mode??"passthrough",o=i==="skeleton";if(!(i!=="matte"&&i!=="mask"&&i!=="crop"&&!o)&&!(r.classes!==void 0||r.enableMatte===!0||r.visionBundle!==void 0||!o&&(r.matteSource==="selfie"||r.keyBackground===!0||r.enablePose===!0||(r.maskThreshold??.5)!==.5||r.featherRadius!==void 0)))for(let a of this._clipVision.values()){let s=a.options;if(a.source===t&&a.startFrame===(n.startFrame??0)&&a.trimStartSec===(n.trimStartSec??0)&&Di(s.timeRemap)===Di(n.timeRemap)&&(s.variant??"s")===(r.variant??"s")&&(s.confidence??.3)===(r.confidence??.3)){if(o&&!a.tracksPose){if(a.exact)throw new Error("A skeleton layer of a prompted comp.vision clip needs `pose: true` on that clip.");continue}return a}}}async analyzeVisionSequence(t,r={}){let n=r.fps??this.fps,i=this.durationMs??await this.computeDuration(),o=r.totalFrames??Math.max(1,Math.round(i/1e3*n)),a=Qt.create({modelsDir:r.modelsDir,baseUrl:r.baseUrl,...r.confidence!==void 0?{confidence:r.confidence}:{},...r.variant!==void 0?{variant:r.variant}:{}}),s=Or.getVideo(t,!0);async function*u(){for(let c=0;c<o;c++){let m=await s.getFrame(c/n);m?.buffer&&m.width>0&&m.height>0&&(yield{data:m.buffer,width:m.width,height:m.height})}}try{return await Qi(u(),{runner:a,source:t,fps:n,...r.tasks!==void 0?{tasks:r.tasks}:{},...r.categories!==void 0?{categories:r.categories}:{},...r.pathStride!==void 0?{pathStride:r.pathStride}:{},...r.includeMasks!==void 0?{includeMasks:r.includeMasks}:{},...r.iouThreshold!==void 0?{iouThreshold:r.iouThreshold}:{}})}finally{a.close(),s.destroy()}}onRequestFrame(t){return this._frameHooks.push(t),this}onPrepareFrame(t){return this._prepareHooks.push(t),this}notifyFrame(t){let r=this._mediaSignals?.framesBefore(t.frame)??[];return r.length===0?this.runFrame(t):(async()=>{for(let n of r)await this.runFrame(ls(t,n));await this.runFrame(t)})()}runFrame(t){for(let n of this._frameHooks)n(t);let r=this._mediaSignals;if(r?.advance(t.frame),this._clipVision.size===0&&this._prepareHooks.length===0){r?.reach(t.frame);return}return(async()=>{await this.prepareVision(t.frame);for(let n of this._prepareHooks)await n(t);r?.reach(t.frame)})()}async prepareMediaTime(){let t=this.durationMs??await this.computeDuration(),r=Math.round(t/1e3*this.fps)-1;!this._mediaSignals?.pending||r<0||await this.notifyFrame(ls({frame:0,fps:this.fps,time:0,duration:t/1e3,durationMs:t,progress:0,deltaTime:1/this.fps},r))}mediaSignalResolver(t=this.hasFrameHooks(),r=this.durationMs,n=this.signals){return this._mediaSignals??=new Ai(this.fps),this._mediaSignals.resolver({live:t,compositionDurationFrames:Math.round((r??0)/1e3*this.fps),signals:n})}hasFrameHooks(){return this._frameHooks.length>0||this._prepareHooks.length>0||this._clipVision.size>0}constructor(t){this.width=t.width,this.height=t.height,this.fps=t.fps??60,this.durationMs=t.durationMs??(t.durationFrames!==void 0?t.durationFrames/this.fps*1e3:void 0),this.backgroundColor=t.backgroundColor??"#000000",this.antialias3d=t.antialias3d,this.fonts=t.fonts??[],this.signals=t.signals??{}}static create(t){return new e(t)}addSignal(t,r){return this.signals[t]=r,this}add(t,...r){if(t instanceof nr)this.children.push(t.toNode());else if(t instanceof Fr)this.children.push(t.toNode());else{if(t&&typeof t=="object"&&"node"in t)return this.add(t.node,...r),this;if(Array.isArray(t))for(let n of t)this.add(n);else{let n=t,i=r[0];if(i&&!(i instanceof nr)&&!Array.isArray(i)&&(i instanceof te||"tracks"in i))return n.animation=i instanceof te?i.toSpec():i,this.children.push(n),this;this.children.push(n)}}for(let n of r)n&&!(n instanceof te)&&!("tracks"in n)&&this.add(n);return this}addAudio(t){return this.audioTracks.push(t),this}addSubjectSandwich(t){let r=typeof t.source=="string"?t.source:t.source.inputHandleId??"",n=t.fit??"cover",i=t.feather??4,o=i>1?i/100:i,a=t.variant??"s",s=F.video(r,{width:this.width,height:this.height,position:"absolute",x:0,y:0,fit:n,muted:t.muted??!1,volume:t.muted?0:t.volume??1});this.add(s);for(let c of t.behind)this.add(c);let u=F.video(r,{width:this.width,height:this.height,position:"absolute",x:0,y:0,fit:n,muted:!0,volume:0}).withVision({mode:"matte",enableSegmentation:!0,variant:a,confidence:t.confidence??.25,featherRadius:o,keyBackground:t.keyBackground??!0,backgroundKeyThreshold:t.backgroundKeyThreshold});return this.add(u),this}addSmartFraming(t){let r=typeof t.source=="string"?t.source:t.source.inputHandleId??"",n=Math.max(0,Math.min(.99,t.damping??.8)),i=t.leadHeadroom??.18,o=this.width,a=this.height,s=t.sourceAspect??16/9,u=o/a,c=u<s?Math.round(a*s):o,m=u<s?a:Math.round(o/s),d=o-c,p=a-m,f=t.target,b=new Xt(w=>{if(d>=0)return 0;let A=f.center?.x?f.center.x.get(w):f.bounds?.centerX?f.bounds.centerX.get(w)/o:f.center?.screenX?f.center.screenX.get(w)/o:.5,M=Math.max(0,Math.min(1,A))*c,D=o/2-M;return Math.max(d,Math.min(0,D))},{fps:this.fps,label:"smart_framing_pan_x"}),g=new Xt(w=>{if(p>=0)return 0;let A=f.center?.y?f.center.y.get(w):f.bounds?.centerY?f.bounds.centerY.get(w)/a:f.center?.screenY?f.center.screenY.get(w)/a:.5,M=Math.max(0,Math.min(1,A))*m,D=a*i-M;return Math.max(p,Math.min(0,D))},{fps:this.fps,label:"smart_framing_pan_y"}),y=new Xt(w=>{let A=w.frame;if(A<=0)return b.get(w);let S=b.get({...w,frame:0,time:0}),M=1-n;for(let D=1;D<=A;D++){let V=b.get({...w,frame:D,time:D/w.fps});S=S+M*(V-S)}return S},{fps:this.fps,label:"smart_framing_smooth_x"}),v=new Xt(w=>{let A=w.frame;if(A<=0)return g.get(w);let S=g.get({...w,frame:0,time:0}),M=1-n;for(let D=1;D<=A;D++){let V=g.get({...w,frame:D,time:D/w.fps});S=S+M*(V-S)}return S},{fps:this.fps,label:"smart_framing_smooth_y"}),T=F.box({width:o,height:a,overflow:"hidden",position:"relative"}),C=F.video(r,{width:c,height:m,position:"absolute",x:y,y:v,fit:t.fit??"cover",muted:t.muted??!1,volume:t.muted?0:t.volume??1});return T.children||(T.children=[]),T.children.push(C),this.add(T),this}addSubjectOutline(t,r={}){let n=r.blur??12,i=this.width,o=this.height,a=r.pulseSignal,s=a?new Xt(m=>Math.max(0,Math.min(1,Number(a.get(m))||0)),{fps:this.fps,label:"outline_pulse"}):1,u=typeof r.source=="string"?r.source:r.source?.inputHandleId??"",c=F.box({width:i,height:o,position:"absolute",x:0,y:0,opacity:s});if(u){let m=F.video(u,{width:i,height:o,position:"absolute",x:0,y:0,fit:"cover",muted:!0,volume:0}).withVision({mode:"mask",enableSegmentation:!0});c.children||(c.children=[]),c.children.push(m)}return c.apply(new Tt({strength:n,blurType:"Gaussian"})),this.add(c),this}section(t,r,n){let i,o,a={},s=t!==null&&typeof t=="object"&&"bounds"in t,u=typeof t=="string"||t!==null&&typeof t=="object"&&("kind"in t||"src"in t||"inputHandleId"in t);if(u&&r&&typeof r=="object"&&"bounds"in r?(i=t,o=r,a=n??{}):u&&r?(i=t,a=r):s?(o=t,a=r??{},i=a.source??o.source):t&&typeof t=="object"&&(a=t,i=a.source),!i){let c=this.children.find(m=>m.kind==="media"&&(m.dataType==="Video"||m.dataType==="Image"));c&&(i=c)}return F.section(i??"",o??a,{compositionWidth:this.width,compositionHeight:this.height,...a})}addSection(t,r,n){let i=this.section(t,r,n);return this.add(i),i}async computeDuration(){if(this.durationMs!==void 0)return this.durationMs;let t=0,r=[];for(let n of[...this.children,...this.audioTracks]){if(n.kind==="media"){let i=n.inputHandleId;typeof i=="string"&&(n.dataType==="Video"||n.dataType==="Audio")&&r.push(i)}if(typeof n.durationFrames=="number"){let o=((typeof n.startFrame=="number"?n.startFrame:0)+n.durationFrames)/this.fps*1e3;o>t&&(t=o)}}for(let n of r)try{let o=await(await Zt.acquire(n)).computeDuration();if(Number.isFinite(o)&&o>0){let a=Math.round(o*1e3);a>t&&(t=a)}}catch{}return t>0?t:5e3}async registerFont(t,r){let n=await ze.register(t,r);return n.filePath&&!this.fonts.includes(n.filePath)&&this.fonts.push(n.filePath),this}async registerEmojiFont(t){return await ze.registerEmojiFont(t),this}toSpec(){let t=[...this.children,...this.audioTracks],r=ze.getRegisteredFontPaths(),n=Array.from(new Set([...this.fonts,...r]));return{width:this.width,height:this.height,fps:this.fps,mode:"Video",backgroundColor:this.backgroundColor,...this.antialias3d!==void 0&&{antialias3d:this.antialias3d},layout:t,fonts:n,signals:this.signals,...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...this.hasFrameHooks()&&{onRequestFrame:i=>this.notifyFrame(i)}}}toVirtualMedia(t={}){let r=t.durationMs??this.durationMs,n=t.signals??this.signals;return Rn(this.toSpec(),{isVideoMode:!0,fps:this.fps,durationMs:r,signals:n,resolveMediaSignal:this.mediaSignalResolver(void 0,r,n),...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...t})}async toVirtualMediaAsync(t={}){let r=t.durationMs??this.durationMs??await this.computeDuration();this.durationMs=r;let n=t.signals??this.signals,i=Rn(this.toSpec(),{isVideoMode:!0,fps:this.fps,durationMs:r,signals:n,resolveMediaSignal:this.mediaSignalResolver(void 0,r,n),...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...t});return await Zl(i,this.fps),i}async renderFrame(t={}){let{frame:r}=Mt(t,this.fps);if(t.fps!==void 0&&t.fps!==this.fps)throw new Error(`Composition fps is ${this.fps}; cannot render at fps ${t.fps}.`);let n=this.toVirtualMedia();if(this.hasFrameHooks()){let o=r;await this.notifyFrame({frame:o,fps:this.fps,time:this.fps>0?o/this.fps:0,duration:(this.durationMs??0)/1e3,durationMs:this.durationMs??0,progress:this.durationMs&&this.durationMs>0?Math.max(0,Math.min(1,o/this.fps*1e3/this.durationMs)):0,deltaTime:this.fps>0?1/this.fps:0})}return(t.renderer??new we.HeadlessMediaRenderer).renderFrame(n,{fps:this.fps,frame:r})}async renderFrameGrid(t={}){return hn(this,t)}async renderVideo(t={},r={}){let n=typeof t=="string"?{...r,outputPath:t}:t,o=await(n.renderer??new we.HeadlessMediaRenderer).renderVideo(this.toVirtualMedia(),n);if(o.qa){let a=this.lint(),s=[...o.qa.issues,...a.map(u=>({severity:u.severity,code:u.code,message:u.message,...u.layerId!==void 0&&{layerId:u.layerId}}))];o.qa={...o.qa,issues:s,passed:o.qa.passed&&!a.some(u=>u.severity==="error")}}return Dd(o,n.outputPath)}lint(){return Yo(this.toSpec(),{emojiFont:ze.hasEmojiFont()})}};function xe(e){let t=e;t.animation instanceof te&&(t.animation=t.animation.toSpec()),Object.defineProperty(t,"animate",{value:(...n)=>{let i=n.flat().flatMap(u=>u instanceof te?u.tracks:u.tracks??[]),o=t.animation,a=o?.tracks??[],s=n.flat().map(u=>u.frameStep).filter(u=>u!==void 0).at(-1)??o?.frameStep;return t.animation={tracks:Ir([...a,...i]),...s!==void 0&&s>1&&{frameStep:s}},t},enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"pinToLandmark",{value:(n,i)=>(ro(t,n,i),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"pinToObject",{value:(n,i)=>(no(t,n,i),t),enumerable:!1,writable:!0,configurable:!0});let r=(n,i)=>(t.matte={node:n,...i&&{mode:i}},t);for(let n of["withMatte","withMask"])Object.defineProperty(t,n,{value:r,enumerable:!1,writable:!0,configurable:!0});return Object.defineProperty(t,"withPbrGlass",{value:n=>(t.glass=n??{},t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"deformWithAudio",{value:n=>(t.audioDeform=n??{},t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withCrop",{value:n=>(t.crop=n instanceof Er?n:new Er(n),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withVision",{value:n=>(t.vision=n instanceof dt?n:new dt(n),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withRelighting",{value:n=>(t.relighting=n??{},t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"relight",{value:n=>(t.relighting=n??{},t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withDeflicker",{value:n=>(t.deflicker=n??{},t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"apply",{value:n=>(t.effects||(t.effects=[]),t.effects.push(n),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withEffect",{value:n=>(t.effects||(t.effects=[]),t.effects.push(n),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withEffects",{value:n=>(t.effects||(t.effects=[]),t.effects.push(...n),t),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"section",{value:(n={},i)=>n!==null&&typeof n=="object"&&"bounds"in n?F.section(t,n,i):F.section(t,n),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"blurRegion",{value:(n,i)=>{let o=new Tt({track:n,strength:i?.strength??25,shape:i?.shape??"ellipse",...i});return t.effects||(t.effects=[]),t.effects.push(o),t},enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(t,"withBlurRegion",{value:(n,i)=>t.blurRegion(n,i),enumerable:!1,writable:!0,configurable:!0}),t}var F={video:(e,t={})=>xe({id:t.id??Z("video"),kind:"media",inputHandleId:e,dataType:"Video",fit:t.fit??"cover",...t}),image:(e,t={})=>(typeof e=="string"&&(/\.(json|lottie)(\?.*)?$/i.test(e)||e.startsWith("data:application/json")?console.warn(`[Layer.image] '${e}' is a Lottie vector animation, not a static image. Use Layer.lottie('${e}', options) instead.`):/\.(mp4|mov|webm|mkv)(\?.*)?$/i.test(e)?console.warn(`[Layer.image] '${e}' is a video file, not a static image. Use Layer.video('${e}', options) instead.`):/\.(mp3|wav|ogg|m4a|aac)(\?.*)?$/i.test(e)&&console.warn(`[Layer.image] '${e}' is an audio file, not a static image. Use Layer.audio('${e}', options) instead.`)),xe({id:t.id??Z("img"),kind:"media",inputHandleId:e,dataType:"Image",fit:t.fit??"cover",...t})),svg:(e,t={})=>xe({id:t.id??Z("svg"),kind:"media",inputHandleId:e,dataType:"SVG",fit:t.fit??"contain",...t}),lottie:(e,t={})=>xe({id:t.id??Z("lottie"),kind:"media",inputHandleId:e,dataType:"Lottie",fit:t.fit??"contain",...t}),audio:(e,t={})=>xe({id:t.id??Z("audio"),kind:"media",inputHandleId:e,dataType:"Audio",volume:t.volume??1,...t}),text:(e,t={})=>{let r=Array.isArray(e),n=!r&&typeof e=="object"&&e!==null,i=n?e:t,o="",a=i.spans;if(r){let s=ei(e);o=s.text,a=s.spans}else n?i.spans&&!i.text?o=ei(i.spans).text:o=i.text??"":o=typeof e=="string"?e:String(e??"");return xe({id:i.id??Z("text"),kind:"text",fontFamily:i.fontFamily??ze.getAll()[0]?.family??"Inter",fontSize:i.fontSize??48,fill:i.fill??"#ffffff",...i,text:i.text??o,spans:i.spans??a})},caption:(e,t={})=>xe({id:t.id??Z("caption"),kind:"media",inputHandleId:e,dataType:t.dataType??"Caption",fontFamily:t.fontFamily??ze.getAll()[0]?.family??"Inter",fontSize:t.fontSize??48,fill:t.fill??"#ffffff",...t}),shape:(e="rect",t={})=>{let{fill:r,...n}=t;return xe({id:n.id??Z("shape"),kind:"shape",shapeType:n.shapeType??e,...n,fillColor:n.fillColor??r??"#3b82f6"})},flex:(e={})=>xe({id:e.id??Z("flex"),kind:"flex",dir:e.dir??"column",children:e.children??[],...e}),box:(e={})=>xe({id:e.id??Z("box"),kind:"box",background:e.background??"transparent",children:e.children??[],...e}),particles:e=>{let t=new fn(e),r={metadata:{width:e.width,height:e.height},operation:{...t.toOperation(),effect:t,dataType:"Video"},children:[]};return xe({id:e.id??Z("particles"),kind:"media",dataType:"Video",src:r,position:"absolute",x:e.x??0,y:e.y??0,width:e.width,height:e.height,...e.startFrame!==void 0&&{startFrame:e.startFrame},...e.durationFrames!==void 0&&{durationFrames:e.durationFrames},...e.zIndex!==void 0&&{zIndex:e.zIndex}})},vfx:e=>{let{x:t,y:r,id:n,startFrame:i,durationFrames:o,zIndex:a,...s}=e,u=new go({outputType:"Video",...s}),c={metadata:{width:e.width,height:e.height},operation:{...u.toOperation(),effect:u,dataType:"Video"},children:[]};return xe({id:n??Z("vfx"),kind:"media",dataType:"Video",src:c,position:"absolute",x:t??0,y:r??0,width:e.width,height:e.height,...i!==void 0&&{startFrame:i},...o!==void 0&&{durationFrames:o},...a!==void 0&&{zIndex:a}})},section:(e,t={},r={})=>{let n=e;if(e&&typeof e=="object"&&"toSpec"in e&&"children"in e){let S=(e.children||[]).find(M=>M.kind==="media"&&(M.dataType==="Video"||M.dataType==="Image"));S&&(n=S)}let i=t!==null&&typeof t=="object"&&"bounds"in t,o=i?r:t,a=i?t:void 0,s=o.padding??0,u=typeof n=="string"?n:n?.inputHandleId??n?.src??"",c=typeof n=="object"&&n?.dataType?n.dataType:"Video",m=o.compositionWidth??o.compWidth??(i?o.width:void 0)??1920,d=o.compositionHeight??o.compHeight??(i?o.height:void 0)??1080,p=Array.isArray(o.effects)?[...o.effects]:o.effects?[o.effects]:[],f=a?a.bounds.screenX.multiply(-1).add(s):typeof o.x=="number"?-o.x:o.x&&typeof o.x.multiply=="function"?o.x.multiply(-1):0,b=a?a.bounds.screenY.multiply(-1).add(s):typeof o.y=="number"?-o.y:o.y&&typeof o.y.multiply=="function"?o.y.multiply(-1):0,g=(c==="Image"?F.image(u,{position:"absolute",width:m,height:d,fit:o.fit??"cover",x:f,y:b}):F.video(u,{position:"absolute",width:m,height:d,fit:o.fit??"cover",x:f,y:b})).withEffects(p),y=a?a.bounds.screenWidth.add(s*2):o.width!==void 0?o.width:m,v=a?a.bounds.screenHeight.add(s*2):o.height!==void 0?o.height:d,T=[g,...o.children??[]],C=o.id??(a?Z(`section-track-${a.trackId}`):Z("section")),w=F.box({id:C,position:o.position??"absolute",width:y,height:v,x:a?void 0:o.x,y:a?void 0:o.y,borderRadius:o.borderRadius??0,borderColor:o.borderColor,borderWidth:o.borderWidth,opacity:o.opacity??1,overflow:"hidden",children:T});a&&(w=w.pinToObject(a,{anchor:"topLeft",offsetX:-s,offsetY:-s,hideWhenLost:o.hideWhenLost??!0,smoothFrames:o.smoothFrames}));let A=w;return Object.defineProperty(A,"innerMedia",{value:g,enumerable:!0,writable:!1}),Object.defineProperty(A,"effects",{get:()=>p,enumerable:!0}),Object.defineProperty(A,"addEffect",{value:S=>(p.push(S),g.effects=p,A),enumerable:!0,writable:!1}),Object.defineProperty(A,"withEffect",{value:S=>A.addEffect(S),enumerable:!0,writable:!1}),Object.defineProperty(A,"withEffects",{value:S=>{for(let M of S)A.addEffect(M);return A},enumerable:!0,writable:!1}),A},trackedRegion:(e,t,r={})=>F.section(e,t,r),blurTrackedRegion:(e,t,r={})=>{let{padding:n,borderRadius:i,borderColor:o,borderWidth:a,...s}=r;return F.section(e,t,{padding:n??8,borderRadius:i??12,borderColor:o,borderWidth:a,effects:[new Tt({strength:s.strength??25,blurType:s.blurType??"Gaussian",...s})]})},chart:(e,t={})=>Vm(e,t,ze.getAll()[0]?.family??"Inter"),camera:(e={})=>xe({id:e.id??Z("camera"),kind:"camera",mode:e.mode??"lookAt",pitch:e.pitch??0,yaw:e.yaw??0,roll:e.roll??0,...e}),light:(e={})=>xe({id:e.id??Z("light"),kind:"light",lightType:e.lightType??"point",color:e.color??"#ffffff",intensity:e.intensity??1,...e}),ambientLight:(e="#ffffff",t=.5,r={})=>st.ambient(e,t,r),sequence:(e,t)=>Qm(e,t),environment:(e="studio",t={})=>st.environment(e,t),directionalLight:(e={})=>st.directional(e),pointLight:(e={})=>st.point(e),spotLight:(e={})=>st.spot(e),cube:e=>Ce.cube(e),carousel3d:e=>Ce.carousel(e),plane3d:e=>Ce.plane(e),prism3d:(e={})=>Ce.prism(e),model:(e={})=>xe({id:e.id??Z("model3d"),kind:"model3d",is3D:e.is3D??!0,modelFormat:e.modelFormat??"auto",loop:e.loop??!0,scale:e.scale??1,scaleX:e.scaleX??1,scaleY:e.scaleY??1,scaleZ:e.scaleZ??1,opacity:e.opacity??1,...e}),obj:(e,t={})=>F.model({src:e,modelFormat:"obj",...t}),fbx:(e,t={})=>F.model({src:e,modelFormat:"fbx",...t}),gltf:(e,t={})=>F.model({src:e,modelFormat:"gltf",...t}),glb:(e,t={})=>F.model({src:e,modelFormat:"glb",...t}),stl:(e,t={})=>F.model({src:e,modelFormat:"stl",...t}),ply:(e,t={})=>F.model({src:e,modelFormat:"ply",...t}),vox:(e,t={})=>F.model({src:e,modelFormat:"vox",...t}),threeDS:(e,t={})=>F.model({src:e,modelFormat:"3ds",...t}),off:(e,t={})=>F.model({src:e,modelFormat:"off",...t})},st={environment:(e="studio",t={})=>{let r=typeof e=="string"?{preset:e,...t}:{...e,...t};return xe({kind:"light",lightType:"environment",preset:"studio",intensity:1,...r,id:r.id??Z("environment")})},ambient:(e="#ffffff",t=.5,r={})=>xe({id:r.id??Z("light-ambient"),kind:"light",lightType:"ambient",color:typeof e=="string"?e:e.color??"#ffffff",intensity:t,...typeof e=="object"&&e,...r}),directional:(e={})=>xe({id:e.id??Z("light-directional"),kind:"light",lightType:"directional",color:e.color??"#ffffff",intensity:e.intensity??1,x:e.x??0,y:e.y??-1e3,z:e.z??-1e3,targetX:e.targetX??0,targetY:e.targetY??0,targetZ:e.targetZ??0,...e}),point:(e={})=>xe({id:e.id??Z("light-point"),kind:"light",lightType:"point",color:e.color??"#ffffff",intensity:e.intensity??1,x:e.x??0,y:e.y??0,z:e.z??-500,radius:e.radius??1e3,decay:e.decay??1,...e}),spot:(e={})=>xe({id:e.id??Z("light-spot"),kind:"light",lightType:"spot",color:e.color??"#ffffff",intensity:e.intensity??1,x:e.x??0,y:e.y??-500,z:e.z??-1e3,targetX:e.targetX??0,targetY:e.targetY??0,targetZ:e.targetZ??0,angle:e.angle??45,penumbra:e.penumbra??.2,radius:e.radius??2e3,decay:e.decay??1,...e})};function jA(e,t={},r={}){return F.section(e,t,r)}function VA(e,t,r={}){return typeof e=="object"&&"blurRegion"in e?e.blurRegion(t,r):F.blurTrackedRegion(e,t,r)}function $A(e,t,r={}){return F.section(e,t,r)}var cy=Object.assign(qt,bo,{blur:e=>new Tt(e),vignette:e=>new er(e),colorBalance:e=>new ao(e),colorKey:e=>new so(e),levels:e=>new yo(e),filmGrain:e=>new et(e),curves:e=>new wo(e),selectiveColor:e=>new vo(e),gradientMap:e=>new Ct(e),shadowsHighlights:e=>new So(e),applyLut:e=>new ko(e),unsharpMask:e=>new Po(e),highPass:e=>new Mo(e),halftoneScreen:e=>new Lr(e),tileOffset:e=>new To(e),motionBlur:e=>new Co(e),ssao:e=>new Ao(e),pbrGlass:e=>new Do(e),depthOfField:e=>new No(e),crop:e=>new Er(e),vision:e=>new dt(e),relight3d:e=>new Oo(e),modulate:e=>new Fo(e),deflicker:e=>new Ro(e),custom:(e,t={})=>new xo(e,t)});var my=/\.(png|jpe?g|webp|gif|avif|tiff?|bmp)(\?.*)?$/i,dy=/\.svg(\?.*)?$/i;function py(e){let t=r=>r?{...r,enabled:!0}:void 0;return new po({...e.dropShadow&&{dropShadow:t(e.dropShadow)},...e.outerGlow&&{outerGlow:t(e.outerGlow)},...e.innerShadow&&{innerShadow:t(e.innerShadow)},...e.stroke&&{stroke:t(e.stroke)}})}function fy(e,t){let r=Math.max(16,Math.round(e)),n=Math.max(16,Math.round(t));return`data:image/svg+xml;utf8,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${n}"><rect width="${r}" height="${n}" fill="#808080"/></svg>`)}`}var Nd={box:e=>F.box(e),flex:e=>F.flex(e),text:(e,t)=>F.text(e,t),shape:(e,t)=>F.shape(e,t),measure:(e,t)=>ze.measure(e,t),fonts:()=>ze.getAll().map(e=>e.family),autoId:Z,media:(e,t)=>dy.test(e)?F.svg(e,t):my.test(e)?F.image(e,t):F.video(e,{muted:!0,...t}),style:(e,t)=>(e.withEffect(py(t)),e),cutout:(e,{mode:t="person",...r})=>F.video(e,{muted:!0,volume:0,fit:"cover",...r}).withVision({mode:"matte",enableSegmentation:!0,variant:t==="subject"?"m":"s",confidence:.25,featherRadius:.04,keyBackground:!0}),particles:e=>F.particles(e),signal:(e,t)=>Is([...e],t),grain:({id:e,x:t,y:r,width:n,height:i,strength:o,size:a})=>F.svg(fy(n,i),{id:e,position:"absolute",x:t,y:r,width:n,height:i,fit:"fill",blendMode:"soft-light"}).withEffect(new et({strength:o,...a!==void 0&&{size:a},shadows:1,midtones:1,highlights:1})),extrudedText:({fontWeight:e,...t})=>Ce.extrudedText({...t,...e!==void 0&&{fontWeight:String(e)},align:"center",verticalAlign:"middle"}),matte:(e,t,r="alpha")=>(e.withMatte(t,r),e)};h();async function Ad(e,t={}){let r=await ru(e);if(!r||r.channels.length===0)throw new Error(`analyzeAudio: could not decode audio from ${e}`);return wl(r.channels,r.sampleRate,t)}function uy(e){return Fl(Nd,e)}export{Eo as a,su as b,uu as c,lu as d,Vd as e,$d as f,cu as g,Io as h,Ud as i,mu as j,_d as k,du as l,zo as m,pu as n,fu as o,hu as p,gu as q,bu as r,yu as s,jo as t,zr as u,xu as v,wu as w,tr as x,vu as y,Su as z,ku as A,Pu as B,zn as C,jn as D,Mu as E,Tu as F,Vn as G,Cu as H,Au as I,Du as J,Nu as K,Ou as L,Ru as M,Fu as N,rr as O,Gd as P,Vo as Q,$o as R,Uo as S,_o as T,Go as U,Wo as V,zw as W,jw as X,Uw as Y,Ir as Z,te as _,Lo as $,Yo as aa,Xo as ba,Wu as ca,Yu as da,up as ea,Xu as fa,qu as ga,Zu as ha,Ku as ia,Qu as ja,Ju as ka,el as la,tl as ma,rl as na,nl as oa,il as pa,ol as qa,al as ra,sl as sa,ul as ta,hp as ua,ll as va,Ko as wa,gp as xa,cl as ya,ml as za,dl as Aa,bp as Ba,pl as Ca,jr as Da,Qo as Ea,Hr as Fa,Yr as Ga,Xr as Ha,nr as Ia,$e as Ja,Zr as Ka,ca as La,Sf as Ma,kf as Na,Pf as Oa,Mf as Pa,Tf as Qa,Cf as Ra,Af as Sa,Df as Ta,Nf as Ua,Of as Va,Rf as Wa,Ff as Xa,ei as Ya,Bf as Za,jm as _a,pn as $a,Ci as ab,fn as bb,ps as cb,fs as db,hn as eb,we as fb,Ce as gb,Km as hb,Sb as ib,bn as jb,kr as kb,yn as lb,Pr as mb,Ib as nb,zb as ob,Kb as pb,Sp as qb,_n as rb,Vr as sb,Jo as tb,kp as ub,Pp as vb,f0 as wb,hl as xb,gl as yb,Dp as zb,wl as Ab,x0 as Bb,w0 as Cb,v0 as Db,vl as Eb,P0 as Fb,Wn as Gb,Op as Hb,M0 as Ib,T0 as Jb,$r as Kb,D0 as Lb,N0 as Mb,Sl as Nb,ea as Ob,Hn as Pb,kl as Qb,O0 as Rb,ra as Sb,Fp as Tb,Ur as Ub,I0 as Vb,z0 as Wb,j0 as Xb,V0 as Yb,Yn as Zb,$0 as _b,Bp as $b,Lp as ac,U0 as bc,_0 as cc,G0 as dc,_r as ec,ia as fc,Tl as gc,Cl as hc,Dl as ic,Gr as jc,J0 as kc,Ip as lc,zp as mc,Vp as nc,ax as oc,Up as pc,_p as qc,Fl as rc,la as sc,Bl as tc,Ll as uc,El as vc,lx as wc,rt as xc,cx as yc,hx as zc,Wr as Ac,gx as Bc,bx as Cc,yx as Dc,xx as Ec,wx as Fc,vx as Gc,qn as Hc,Mx as Ic,Tx as Jc,Cx as Kc,Ax as Lc,Dx as Mc,Nx as Nc,Ox as Oc,Zp as Pc,Bx as Qc,Ix as Rc,$x as Sc,Kp as Tc,Wx as Uc,Hx as Vc,qx as Wc,zl as Xc,Qp as Yc,jl as Zc,Jx as _c,tf as $c,of as ad,$l as bd,ew as cd,nw as dd,Ad as ed,uy as fd,Td as gd,Cd as hd,F as id,st as jd,jA as kd,VA as ld,$A as md,cy as nd};