framefields 2.14.0 → 2.16.0

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 (333) hide show
  1. package/NOTICE.md +5 -1
  2. package/dist/audio/index.d.mts +3 -3
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-DFwRbID_.mjs → audio-6TfPlfl4.mjs} +3 -3
  5. package/dist/{audio-DFwRbID_.mjs.map → audio-6TfPlfl4.mjs.map} +1 -1
  6. package/dist/{audio-CdCuGK5d.d.mts → audio-7oqTUi4G.d.mts} +2 -2
  7. package/dist/{audio-CdCuGK5d.d.mts.map → audio-7oqTUi4G.d.mts.map} +1 -1
  8. package/dist/cli/check-worker.mjs +44 -44
  9. package/dist/cli.mjs +1 -1
  10. package/dist/cloud/index.mjs +1 -1
  11. package/dist/{cloud-Cj1TIme8.mjs → cloud-jnk1hPYf.mjs} +2 -2
  12. package/dist/{cloud-Cj1TIme8.mjs.map → cloud-jnk1hPYf.mjs.map} +1 -1
  13. package/dist/components/index.d.mts +11 -11
  14. package/dist/components/index.mjs +43 -43
  15. package/dist/{dist-Kbf-JTry.mjs → dist-BtI6ukB5.mjs} +2 -2
  16. package/dist/{dist-Kbf-JTry.mjs.map → dist-BtI6ukB5.mjs.map} +1 -1
  17. package/dist/{dist-B8Nby2CU.mjs → dist-COOpgG9G.mjs} +4 -3
  18. package/dist/{dist-B8Nby2CU.mjs.map → dist-COOpgG9G.mjs.map} +1 -1
  19. package/dist/{dist--Uu5bQ_6.mjs → dist-XqlFM2a8.mjs} +13733 -5323
  20. package/dist/dist-XqlFM2a8.mjs.map +1 -0
  21. package/dist/{dist-CiTgmfUw.mjs → dist-f1zkl69f.mjs} +4 -4
  22. package/dist/dist-f1zkl69f.mjs.map +1 -0
  23. package/dist/{dist-B_rSWeOz.mjs → dist-umQOWz0a.mjs} +1 -1
  24. package/dist/effects/index.d.mts +4 -4
  25. package/dist/effects/index.mjs +35 -35
  26. package/dist/{effects-WMgv8ZaD.mjs → effects-DlRMovU5.mjs} +2 -2
  27. package/dist/{effects-WMgv8ZaD.mjs.map → effects-DlRMovU5.mjs.map} +1 -1
  28. package/dist/fonts/index.d.mts +1 -1
  29. package/dist/fonts/index.mjs +2 -2
  30. package/dist/{fonts-OW3yAfO5.mjs → fonts-BWYcXjyK.mjs} +3 -3
  31. package/dist/fonts-BWYcXjyK.mjs.map +1 -0
  32. package/dist/{gpu-R4T2Tndu.mjs → gpu-CH1PdM4T.mjs} +2 -2
  33. package/dist/{gpu-R4T2Tndu.mjs.map → gpu-CH1PdM4T.mjs.map} +1 -1
  34. package/dist/{index-CEKxvGY-.d.mts → index-BHTycml5.d.mts} +2 -2
  35. package/dist/{index-CEKxvGY-.d.mts.map → index-BHTycml5.d.mts.map} +1 -1
  36. package/dist/{index-DoP6EiHj.d.mts → index-BcxxxwhV.d.mts} +4 -4
  37. package/dist/{index-DoP6EiHj.d.mts.map → index-BcxxxwhV.d.mts.map} +1 -1
  38. package/dist/index-C-V6CAhP.d.mts.map +1 -1
  39. package/dist/{index-D1FqV1eu.d.mts → index-CMhkkc56.d.mts} +43 -11
  40. package/dist/index-CMhkkc56.d.mts.map +1 -0
  41. package/dist/{index-B0Vq8Bwf.d.mts → index-CYVpYGM-.d.mts} +2 -2
  42. package/dist/{index-B0Vq8Bwf.d.mts.map → index-CYVpYGM-.d.mts.map} +1 -1
  43. package/dist/{index-Bv7gxGK1.d.mts → index-Cq8jgdNY.d.mts} +90 -3
  44. package/dist/index-Cq8jgdNY.d.mts.map +1 -0
  45. package/dist/{index-9xte4JgL.d.mts → index-Dg5BAtDq.d.mts} +1446 -541
  46. package/dist/index-Dg5BAtDq.d.mts.map +1 -0
  47. package/dist/{index-C7-p9zwU.d.mts → index-DhL7ckvs.d.mts} +5 -5
  48. package/dist/index-DhL7ckvs.d.mts.map +1 -0
  49. package/dist/{index-GA9_Z8Fn.d.mts → index-RILu3ULT.d.mts} +2 -2
  50. package/dist/{index-GA9_Z8Fn.d.mts.map → index-RILu3ULT.d.mts.map} +1 -1
  51. package/dist/{index-C5sgRLlG.d.mts → index-TCtdSXd7.d.mts} +3 -1
  52. package/dist/index-TCtdSXd7.d.mts.map +1 -0
  53. package/dist/{index-CRaydvLi.d.mts → index-s2qQ8ifZ.d.mts} +886 -51
  54. package/dist/index-s2qQ8ifZ.d.mts.map +1 -0
  55. package/dist/index.d.mts +13 -13
  56. package/dist/index.mjs +52 -52
  57. package/dist/preview/index.d.mts +4 -4
  58. package/dist/preview/index.mjs +11 -11
  59. package/dist/preview-Dm912wly.mjs +1037 -0
  60. package/dist/preview-Dm912wly.mjs.map +1 -0
  61. package/dist/preview-engine/audio.mjs +1 -1
  62. package/dist/preview-engine/{chunk-64L4GUOF.mjs → chunk-4F3DG6YB.mjs} +2 -2
  63. package/dist/preview-engine/chunk-A2OTOW3B.mjs +4694 -0
  64. package/dist/preview-engine/{chunk-GNDE3OXQ.mjs → chunk-BR56TQBP.mjs} +1 -1
  65. package/dist/preview-engine/{chunk-ADLIF544.mjs → chunk-H2XKXXAU.mjs} +1 -1
  66. package/dist/preview-engine/chunk-NDUODAY2.mjs +3 -0
  67. package/dist/preview-engine/{chunk-FZ4RD7HV.mjs → chunk-QAQJSWUT.mjs} +1 -1
  68. package/dist/preview-engine/chunk-SWRGQTVC.mjs +138 -0
  69. package/dist/preview-engine/{chunk-52X7SURQ.mjs → chunk-TEA3GVBJ.mjs} +1 -1
  70. package/dist/preview-engine/chunk-VZUVB3BP.mjs +644 -0
  71. package/dist/preview-engine/{chunk-UBY2UYEL.mjs → chunk-XSHNQJ7L.mjs} +1 -1
  72. package/dist/preview-engine/components.mjs +1 -1
  73. package/dist/preview-engine/effects.mjs +1 -1
  74. package/dist/preview-engine/fonts.mjs +1 -1
  75. package/dist/preview-engine/framefields.mjs +1 -1
  76. package/dist/preview-engine/player.mjs +3 -3
  77. package/dist/preview-engine/{renderers-DU7KPFVV.mjs → renderers-6C7NWWDX.mjs} +1 -1
  78. package/dist/preview-engine/renderers-HHVGNMSJ.mjs +206 -0
  79. package/dist/preview-engine/{src-YXNX4MLK.mjs → src-RCNEKIRP.mjs} +1 -1
  80. package/dist/preview-page/index.html +19 -0
  81. package/dist/preview-page/main.css +1 -0
  82. package/dist/preview-page/main.js +326 -0
  83. package/dist/{program-tFKCWU2j.mjs → program-CMigyfso.mjs} +829 -52
  84. package/dist/program-CMigyfso.mjs.map +1 -0
  85. package/dist/renderer/index.d.mts +2 -2
  86. package/dist/renderer/index.mjs +2 -2
  87. package/dist/{renderer-DkOuQi84.mjs → renderer-0GMEL_Zi.mjs} +3 -3
  88. package/dist/{renderer-DkOuQi84.mjs.map → renderer-0GMEL_Zi.mjs.map} +1 -1
  89. package/dist/{renderer-BGp0An5A.mjs → renderer-3Wv2ZBJG.mjs} +3 -3
  90. package/dist/{renderer-BGp0An5A.mjs.map → renderer-3Wv2ZBJG.mjs.map} +1 -1
  91. package/dist/{renderer-BVIXKfbC.mjs → renderer-4nXkaAWu.mjs} +1178 -199
  92. package/dist/renderer-4nXkaAWu.mjs.map +1 -0
  93. package/dist/{renderer-Cw6_NL2i.mjs → renderer-6SnfLXeg.mjs} +3 -3
  94. package/dist/{renderer-Cw6_NL2i.mjs.map → renderer-6SnfLXeg.mjs.map} +1 -1
  95. package/dist/{renderer-BVU22lBS.mjs → renderer-8gHw3O0P.mjs} +2 -2
  96. package/dist/{renderer-BVU22lBS.mjs.map → renderer-8gHw3O0P.mjs.map} +1 -1
  97. package/dist/{renderer-BjDddtw9.mjs → renderer-AOBglZHC.mjs} +2 -2
  98. package/dist/{renderer-D-KHHWQD.mjs → renderer-B0bSARK3.mjs} +3 -3
  99. package/dist/{renderer-D-KHHWQD.mjs.map → renderer-B0bSARK3.mjs.map} +1 -1
  100. package/dist/{renderer-CCxk-RJR.mjs → renderer-B2_tuRfl.mjs} +2 -2
  101. package/dist/{renderer-CCxk-RJR.mjs.map → renderer-B2_tuRfl.mjs.map} +1 -1
  102. package/dist/{renderer-k5d7JSbs.mjs → renderer-B82FhkEr.mjs} +3 -3
  103. package/dist/{renderer-k5d7JSbs.mjs.map → renderer-B82FhkEr.mjs.map} +1 -1
  104. package/dist/{renderer-I0Hh9cLK.mjs → renderer-B9lzA0PY.mjs} +3 -3
  105. package/dist/{renderer-I0Hh9cLK.mjs.map → renderer-B9lzA0PY.mjs.map} +1 -1
  106. package/dist/{renderer-Dwwnx7Dk.mjs → renderer-BBSIWSry.mjs} +2 -2
  107. package/dist/{renderer-Dwwnx7Dk.mjs.map → renderer-BBSIWSry.mjs.map} +1 -1
  108. package/dist/{renderer-_pC-jB9O.mjs → renderer-BEKDMxbi.mjs} +2 -2
  109. package/dist/{renderer-_pC-jB9O.mjs.map → renderer-BEKDMxbi.mjs.map} +1 -1
  110. package/dist/renderer-BERGAxqA.mjs +5 -0
  111. package/dist/{renderer-raxwsiGI.mjs → renderer-BF960HY8.mjs} +3 -3
  112. package/dist/{renderer-raxwsiGI.mjs.map → renderer-BF960HY8.mjs.map} +1 -1
  113. package/dist/{renderer-Dr0tXA4k.mjs → renderer-BFwyVxCu.mjs} +3 -3
  114. package/dist/{renderer-Dr0tXA4k.mjs.map → renderer-BFwyVxCu.mjs.map} +1 -1
  115. package/dist/{renderer-DEjo6dw_.mjs → renderer-BNiwcI3-.mjs} +2 -2
  116. package/dist/{renderer-DEjo6dw_.mjs.map → renderer-BNiwcI3-.mjs.map} +1 -1
  117. package/dist/{renderer-DIEeHiQA.mjs → renderer-BPbVb2Q4.mjs} +2 -2
  118. package/dist/{renderer-DIEeHiQA.mjs.map → renderer-BPbVb2Q4.mjs.map} +1 -1
  119. package/dist/renderer-BQ_YkBMt.mjs +6 -0
  120. package/dist/{renderer-BBMtmxks.mjs → renderer-BUWxlA8T.mjs} +3 -3
  121. package/dist/{renderer-BBMtmxks.mjs.map → renderer-BUWxlA8T.mjs.map} +1 -1
  122. package/dist/renderer-BW0Tjsv9.mjs +5 -0
  123. package/dist/{renderer-Dgj46uEU.mjs → renderer-BX8liu-e.mjs} +2 -2
  124. package/dist/{renderer-ZnrEfkYh.mjs → renderer-BXIwDAr_.mjs} +2 -2
  125. package/dist/{renderer-ZnrEfkYh.mjs.map → renderer-BXIwDAr_.mjs.map} +1 -1
  126. package/dist/{renderer-DA8YEo_d.mjs → renderer-B_Hy1W-g.mjs} +3 -3
  127. package/dist/{renderer-DA8YEo_d.mjs.map → renderer-B_Hy1W-g.mjs.map} +1 -1
  128. package/dist/{renderer-iMiYStcW.mjs → renderer-Bb6cvSgh.mjs} +2 -2
  129. package/dist/{renderer-iMiYStcW.mjs.map → renderer-Bb6cvSgh.mjs.map} +1 -1
  130. package/dist/{renderer-BacY4nh8.mjs → renderer-BdppwWC9.mjs} +2 -2
  131. package/dist/{renderer-BacY4nh8.mjs.map → renderer-BdppwWC9.mjs.map} +1 -1
  132. package/dist/{renderer-CrxwW6VQ.mjs → renderer-Bhc24HVe.mjs} +3 -3
  133. package/dist/{renderer-CrxwW6VQ.mjs.map → renderer-Bhc24HVe.mjs.map} +1 -1
  134. package/dist/{renderer-BH7UCMPQ.mjs → renderer-BiNA2wF0.mjs} +2 -2
  135. package/dist/{renderer-BH7UCMPQ.mjs.map → renderer-BiNA2wF0.mjs.map} +1 -1
  136. package/dist/{renderer-DVPgWHZw.mjs → renderer-BmoBgTp5.mjs} +3 -3
  137. package/dist/{renderer-DVPgWHZw.mjs.map → renderer-BmoBgTp5.mjs.map} +1 -1
  138. package/dist/{renderer-C20efMI0.mjs → renderer-BmqFmCWS.mjs} +3 -3
  139. package/dist/{renderer-C20efMI0.mjs.map → renderer-BmqFmCWS.mjs.map} +1 -1
  140. package/dist/{renderer-B0yVUOPP.mjs → renderer-BnVwAObV.mjs} +2 -2
  141. package/dist/{renderer-B0yVUOPP.mjs.map → renderer-BnVwAObV.mjs.map} +1 -1
  142. package/dist/{renderer-CP8wLzTU.mjs → renderer-BxttZHme.mjs} +2 -2
  143. package/dist/{renderer-CP8wLzTU.mjs.map → renderer-BxttZHme.mjs.map} +1 -1
  144. package/dist/renderer-BzyPdUD1.mjs +5 -0
  145. package/dist/renderer-C0hM-mtY.mjs +5 -0
  146. package/dist/renderer-C6cyUTvk.mjs +5 -0
  147. package/dist/{renderer-BOSZAdgF.mjs → renderer-C8E4XsSg.mjs} +2 -2
  148. package/dist/{renderer-BOSZAdgF.mjs.map → renderer-C8E4XsSg.mjs.map} +1 -1
  149. package/dist/renderer-C8zY3pzk.mjs +5 -0
  150. package/dist/{renderer-DWq9gYRw.mjs → renderer-C9U-LY50.mjs} +3 -3
  151. package/dist/{renderer-DWq9gYRw.mjs.map → renderer-C9U-LY50.mjs.map} +1 -1
  152. package/dist/{renderer-Dj2H5JPR.mjs → renderer-CB2JVu5x.mjs} +3 -3
  153. package/dist/{renderer-Dj2H5JPR.mjs.map → renderer-CB2JVu5x.mjs.map} +1 -1
  154. package/dist/{renderer-Bcu3UrI-.mjs → renderer-CC4YBJ8Z.mjs} +3 -3
  155. package/dist/{renderer-Bcu3UrI-.mjs.map → renderer-CC4YBJ8Z.mjs.map} +1 -1
  156. package/dist/renderer-CEkSOyKu.mjs +5 -0
  157. package/dist/{renderer-DzLrvCB2.mjs → renderer-CIycc5O-.mjs} +2 -2
  158. package/dist/{renderer-DzLrvCB2.mjs.map → renderer-CIycc5O-.mjs.map} +1 -1
  159. package/dist/renderer-CJYtfa4x.mjs +5 -0
  160. package/dist/{renderer-BeNl_6EG.mjs → renderer-CJraQlV-.mjs} +2 -2
  161. package/dist/{renderer-BeNl_6EG.mjs.map → renderer-CJraQlV-.mjs.map} +1 -1
  162. package/dist/renderer-CKMtHGZh.mjs +5 -0
  163. package/dist/renderer-CLzicoiy.mjs +5 -0
  164. package/dist/renderer-CM2A4BHd.mjs +5 -0
  165. package/dist/{renderer-DtMVitEF.mjs → renderer-COWGWtob.mjs} +2 -2
  166. package/dist/{renderer-DtMVitEF.mjs.map → renderer-COWGWtob.mjs.map} +1 -1
  167. package/dist/{renderer-CT3zkfbf.mjs → renderer-COxG2XGf.mjs} +2 -2
  168. package/dist/{renderer-CT3zkfbf.mjs.map → renderer-COxG2XGf.mjs.map} +1 -1
  169. package/dist/{renderer-DNxWOz8Q.mjs → renderer-CQDCIsQm.mjs} +2 -2
  170. package/dist/{renderer-DNxWOz8Q.mjs.map → renderer-CQDCIsQm.mjs.map} +1 -1
  171. package/dist/{renderer-C5AoaymD.mjs → renderer-CRUeag8i.mjs} +3 -3
  172. package/dist/{renderer-C5AoaymD.mjs.map → renderer-CRUeag8i.mjs.map} +1 -1
  173. package/dist/{renderer-ngmYIIob.mjs → renderer-CWVput06.mjs} +3 -3
  174. package/dist/{renderer-ngmYIIob.mjs.map → renderer-CWVput06.mjs.map} +1 -1
  175. package/dist/renderer-CZlHjcxr.mjs +5 -0
  176. package/dist/{renderer-0rveCDm-.mjs → renderer-CbbnBLOB.mjs} +3 -3
  177. package/dist/{renderer-0rveCDm-.mjs.map → renderer-CbbnBLOB.mjs.map} +1 -1
  178. package/dist/renderer-CbimvSU8.mjs +5 -0
  179. package/dist/renderer-Ccvc63yd.mjs +5 -0
  180. package/dist/renderer-Cdp-SGfq.mjs +5 -0
  181. package/dist/renderer-CeTcSs3e.mjs +5 -0
  182. package/dist/{renderer-Brmbl12Y.mjs → renderer-CfLZein2.mjs} +3 -3
  183. package/dist/{renderer-Brmbl12Y.mjs.map → renderer-CfLZein2.mjs.map} +1 -1
  184. package/dist/{renderer-BJ8ea92W.mjs → renderer-Ch-q1O-q.mjs} +3 -3
  185. package/dist/{renderer-BJ8ea92W.mjs.map → renderer-Ch-q1O-q.mjs.map} +1 -1
  186. package/dist/{renderer-CP108ABB.mjs → renderer-Ch5JvJWl.mjs} +2 -2
  187. package/dist/{renderer-CP108ABB.mjs.map → renderer-Ch5JvJWl.mjs.map} +1 -1
  188. package/dist/{renderer-47y12Z37.mjs → renderer-ChtEzq-R.mjs} +2 -2
  189. package/dist/{renderer-47y12Z37.mjs.map → renderer-ChtEzq-R.mjs.map} +1 -1
  190. package/dist/{renderer-DhyMfG1v.mjs → renderer-Cj9nTC5l.mjs} +3 -3
  191. package/dist/{renderer-DhyMfG1v.mjs.map → renderer-Cj9nTC5l.mjs.map} +1 -1
  192. package/dist/{renderer-BDzn1AKF.mjs → renderer-CqT8HsSS.mjs} +2 -2
  193. package/dist/{renderer-BDzn1AKF.mjs.map → renderer-CqT8HsSS.mjs.map} +1 -1
  194. package/dist/{renderer-B7G1KohJ.mjs → renderer-CuQjMhdV.mjs} +2 -2
  195. package/dist/renderer-CvNuu52U.mjs +5 -0
  196. package/dist/renderer-CwciC0oI.mjs +5 -0
  197. package/dist/renderer-CysLUbIr.mjs +5 -0
  198. package/dist/{renderer-Cm0tsbQH.mjs → renderer-Cz30EVws.mjs} +2 -2
  199. package/dist/{renderer-Cm0tsbQH.mjs.map → renderer-Cz30EVws.mjs.map} +1 -1
  200. package/dist/renderer-D3A22Vxb.mjs +5 -0
  201. package/dist/renderer-D5SY9EmA.mjs +5 -0
  202. package/dist/renderer-D8h3ZvaE.mjs +5 -0
  203. package/dist/renderer-DE-B6N9n.mjs +5 -0
  204. package/dist/renderer-DETZTI7t.mjs +5 -0
  205. package/dist/{renderer-nHS3Sius.mjs → renderer-DHoX-5U_.mjs} +3 -3
  206. package/dist/{renderer-nHS3Sius.mjs.map → renderer-DHoX-5U_.mjs.map} +1 -1
  207. package/dist/{renderer-BWSRryIA.mjs → renderer-DOkm0Ycd.mjs} +2 -2
  208. package/dist/{renderer-BWSRryIA.mjs.map → renderer-DOkm0Ycd.mjs.map} +1 -1
  209. package/dist/{renderer-BHYJlK6H.d.mts → renderer-DU3f6ZrS.d.mts} +2 -2
  210. package/dist/{renderer-BHYJlK6H.d.mts.map → renderer-DU3f6ZrS.d.mts.map} +1 -1
  211. package/dist/{renderer-BpVOk9ux.mjs → renderer-DUzv-shq.mjs} +2 -2
  212. package/dist/{renderer-BpVOk9ux.mjs.map → renderer-DUzv-shq.mjs.map} +1 -1
  213. package/dist/renderer-DWnDj0IM.mjs +5 -0
  214. package/dist/renderer-DcGUIbQF.mjs +5 -0
  215. package/dist/renderer-Dfq6FoNO.mjs +5 -0
  216. package/dist/renderer-DhasXW6S.mjs +3 -0
  217. package/dist/{renderer-NRMlYkX6.mjs → renderer-DhnOWnEA.mjs} +3 -3
  218. package/dist/{renderer-NRMlYkX6.mjs.map → renderer-DhnOWnEA.mjs.map} +1 -1
  219. package/dist/{renderer-COgwYqev.mjs → renderer-Dhy1XHzz.mjs} +3 -3
  220. package/dist/{renderer-COgwYqev.mjs.map → renderer-Dhy1XHzz.mjs.map} +1 -1
  221. package/dist/renderer-DjCvpsV_.mjs +5 -0
  222. package/dist/{renderer-BfZNIiSv.mjs → renderer-DjJshz9Y.mjs} +2 -2
  223. package/dist/{renderer-BfZNIiSv.mjs.map → renderer-DjJshz9Y.mjs.map} +1 -1
  224. package/dist/{renderer-CKo7VR8x.mjs → renderer-DmTUIdus.mjs} +3 -3
  225. package/dist/{renderer-CKo7VR8x.mjs.map → renderer-DmTUIdus.mjs.map} +1 -1
  226. package/dist/{renderer-Baw6Utxi.mjs → renderer-Dq7AioJa.mjs} +2 -2
  227. package/dist/{renderer-Baw6Utxi.mjs.map → renderer-Dq7AioJa.mjs.map} +1 -1
  228. package/dist/renderer-DrAaM6JD.mjs +5 -0
  229. package/dist/{renderer-D-GWBoVT.mjs → renderer-Dt4sqNEu.mjs} +2 -2
  230. package/dist/{renderer-D-GWBoVT.mjs.map → renderer-Dt4sqNEu.mjs.map} +1 -1
  231. package/dist/{renderer-FYOL5Za6.mjs → renderer-Dtcs4idV.mjs} +3 -3
  232. package/dist/{renderer-FYOL5Za6.mjs.map → renderer-Dtcs4idV.mjs.map} +1 -1
  233. package/dist/renderer-Dxlv8LYm.mjs +5 -0
  234. package/dist/{renderer-D-RhYvVl.mjs → renderer-Gj8SrE2W.mjs} +2 -2
  235. package/dist/{renderer-D-RhYvVl.mjs.map → renderer-Gj8SrE2W.mjs.map} +1 -1
  236. package/dist/{renderer-D_j1WKMD.mjs → renderer-KfnXDJS0.mjs} +3 -3
  237. package/dist/{renderer-D_j1WKMD.mjs.map → renderer-KfnXDJS0.mjs.map} +1 -1
  238. package/dist/{renderer-Bpm145BW.mjs → renderer-MXVlg4p5.mjs} +3 -3
  239. package/dist/{renderer-Bpm145BW.mjs.map → renderer-MXVlg4p5.mjs.map} +1 -1
  240. package/dist/{renderer-Nnmi8Gt6.mjs → renderer-N2b6QZ1E.mjs} +3 -3
  241. package/dist/{renderer-Nnmi8Gt6.mjs.map → renderer-N2b6QZ1E.mjs.map} +1 -1
  242. package/dist/renderer-Pb43OO2t.mjs +5 -0
  243. package/dist/{renderer-Ca1KjNCO.mjs → renderer-Q7gDzm8c.mjs} +2 -2
  244. package/dist/{renderer-Ca1KjNCO.mjs.map → renderer-Q7gDzm8c.mjs.map} +1 -1
  245. package/dist/{renderer-D2wNFNRf.mjs → renderer-RCiANtRV.mjs} +2 -2
  246. package/dist/{renderer-D2wNFNRf.mjs.map → renderer-RCiANtRV.mjs.map} +1 -1
  247. package/dist/{renderer-Cqb7PGrI.mjs → renderer-Sig9nZcI.mjs} +2 -2
  248. package/dist/renderer-VQbm-cGr.mjs +5 -0
  249. package/dist/{renderer-W1bVNVR6.mjs → renderer-fabBgwQX.mjs} +3 -3
  250. package/dist/{renderer-W1bVNVR6.mjs.map → renderer-fabBgwQX.mjs.map} +1 -1
  251. package/dist/{renderer-zRq0j6Xy.mjs → renderer-g-0PCNoo.mjs} +3 -3
  252. package/dist/{renderer-zRq0j6Xy.mjs.map → renderer-g-0PCNoo.mjs.map} +1 -1
  253. package/dist/{renderer-2PjR3w-q.mjs → renderer-gmHKIbKI.mjs} +3 -3
  254. package/dist/{renderer-2PjR3w-q.mjs.map → renderer-gmHKIbKI.mjs.map} +1 -1
  255. package/dist/{renderer-03mYJLgX.mjs → renderer-kVZwiRoK.mjs} +3 -3
  256. package/dist/{renderer-03mYJLgX.mjs.map → renderer-kVZwiRoK.mjs.map} +1 -1
  257. package/dist/renderer-oPMypDM1.mjs +5 -0
  258. package/dist/{renderer-DcAKDAnS.mjs → renderer-p7tgxP-A.mjs} +3 -3
  259. package/dist/{renderer-DcAKDAnS.mjs.map → renderer-p7tgxP-A.mjs.map} +1 -1
  260. package/dist/{renderer-jUKdkmG5.mjs → renderer-tvYj306A.mjs} +81 -78
  261. package/dist/renderer-tvYj306A.mjs.map +1 -0
  262. package/dist/renderer-xvWGpVyp.mjs +5 -0
  263. package/dist/renderer-zafZbD6Q.mjs +5 -0
  264. package/dist/{renderers-CP8CFWDs-CshljORp.mjs → renderers-CP8CFWDs-DLjtjrwx.mjs} +2 -2
  265. package/dist/{renderers-CP8CFWDs-CshljORp.mjs.map → renderers-CP8CFWDs-DLjtjrwx.mjs.map} +1 -1
  266. package/dist/sam/index.d.mts +2 -2
  267. package/dist/sam/index.mjs +1 -1
  268. package/dist/signals/index.d.mts +4 -4
  269. package/dist/signals/index.mjs +4 -4
  270. package/dist/{src-BU6vm9sP-DdTHmCr4.mjs → src-B23p_eh7-Cj6-lvV6.mjs} +293 -6
  271. package/dist/src-B23p_eh7-Cj6-lvV6.mjs.map +1 -0
  272. package/dist/{src-Dy4gnc6w.mjs → src-CoHAjviq.mjs} +1349 -177
  273. package/dist/src-CoHAjviq.mjs.map +1 -0
  274. package/dist/storage/index.mjs +1 -1
  275. package/package.json +63 -60
  276. package/dist/dist--Uu5bQ_6.mjs.map +0 -1
  277. package/dist/dist-CiTgmfUw.mjs.map +0 -1
  278. package/dist/fonts-OW3yAfO5.mjs.map +0 -1
  279. package/dist/index-9xte4JgL.d.mts.map +0 -1
  280. package/dist/index-Bv7gxGK1.d.mts.map +0 -1
  281. package/dist/index-C5sgRLlG.d.mts.map +0 -1
  282. package/dist/index-C7-p9zwU.d.mts.map +0 -1
  283. package/dist/index-CRaydvLi.d.mts.map +0 -1
  284. package/dist/index-D1FqV1eu.d.mts.map +0 -1
  285. package/dist/preview-D7BGmE1E.mjs +0 -2446
  286. package/dist/preview-D7BGmE1E.mjs.map +0 -1
  287. package/dist/preview-engine/chunk-5DZTPUMH.mjs +0 -2568
  288. package/dist/preview-engine/chunk-NCQHOGZK.mjs +0 -3
  289. package/dist/preview-engine/chunk-PH3UUX6A.mjs +0 -138
  290. package/dist/preview-engine/chunk-UPZURPJY.mjs +0 -2227
  291. package/dist/preview-engine/renderers-DLJOA3BM.mjs +0 -228
  292. package/dist/program-tFKCWU2j.mjs.map +0 -1
  293. package/dist/renderer-6_bzbbXt.mjs +0 -5
  294. package/dist/renderer-8M-9G6F_.mjs +0 -5
  295. package/dist/renderer-B5OzKvF8.mjs +0 -5
  296. package/dist/renderer-BBCZ2qbE.mjs +0 -5
  297. package/dist/renderer-BChbxCux.mjs +0 -5
  298. package/dist/renderer-BGeMPr8C.mjs +0 -5
  299. package/dist/renderer-BPQ8Pkjb.mjs +0 -5
  300. package/dist/renderer-BTRpA3HD.mjs +0 -5
  301. package/dist/renderer-BVIXKfbC.mjs.map +0 -1
  302. package/dist/renderer-BVsECSn-.mjs +0 -5
  303. package/dist/renderer-Bgos68gc.mjs +0 -6
  304. package/dist/renderer-BjHOvoqO.mjs +0 -5
  305. package/dist/renderer-BjXMPPlV.mjs +0 -5
  306. package/dist/renderer-Byobxqkv.mjs +0 -5
  307. package/dist/renderer-CKrsg3EG.mjs +0 -5
  308. package/dist/renderer-Cj875NuH.mjs +0 -5
  309. package/dist/renderer-CnmzJoMv.mjs +0 -5
  310. package/dist/renderer-CtklDaMg.mjs +0 -5
  311. package/dist/renderer-D1tK3in_.mjs +0 -5
  312. package/dist/renderer-D2yc9P61.mjs +0 -5
  313. package/dist/renderer-D4v-JvSr.mjs +0 -5
  314. package/dist/renderer-D5yp74NL.mjs +0 -3
  315. package/dist/renderer-D7WRWDwB.mjs +0 -5
  316. package/dist/renderer-DGvA0tdB.mjs +0 -5
  317. package/dist/renderer-DO7v5Sdm.mjs +0 -5
  318. package/dist/renderer-DRVvt7-V.mjs +0 -5
  319. package/dist/renderer-DYMCd3jL.mjs +0 -5
  320. package/dist/renderer-DmHKw-MM.mjs +0 -5
  321. package/dist/renderer-DoDsuZ6G.mjs +0 -5
  322. package/dist/renderer-EpgclS70.mjs +0 -5
  323. package/dist/renderer-GroKiYyK.mjs +0 -5
  324. package/dist/renderer-MQ5K_xIS.mjs +0 -5
  325. package/dist/renderer-U43SflML.mjs +0 -5
  326. package/dist/renderer-UqOmBgCv.mjs +0 -5
  327. package/dist/renderer-XLULgJM0.mjs +0 -5
  328. package/dist/renderer-jUKdkmG5.mjs.map +0 -1
  329. package/dist/renderer-lNjxY1GG.mjs +0 -5
  330. package/dist/renderer-ukufL7pl.mjs +0 -5
  331. package/dist/renderer-wb0NCKdF.mjs +0 -5
  332. package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +0 -1
  333. package/dist/src-Dy4gnc6w.mjs.map +0 -1
@@ -0,0 +1,326 @@
1
+ async function Se(n,e){let t=await n.snapshot(e.frame),r=Math.min(1,1600/t.width),i=Math.round(t.width*r),s=Math.round(t.height*r),o=document.createElement("canvas");o.width=i,o.height=s;let a=o.getContext("2d");if(!a)throw new Error("no 2D canvas to draw the note's picture");a.drawImage(t,0,0,i,s),t.close();let l=Math.max(3,i/400),p=f=>{for(let[m,b]of[[l+5,"rgba(0,0,0,0.5)"],[l+2.5,"#fff"],[l,"#3b82f6"]])a.lineWidth=m,a.strokeStyle=b,f()},{x:h,y:d}=e;if(e.w!=null&&e.h!=null){let{w:f,h:m}=e;p(()=>a.strokeRect(h*i,d*s,f*i,m*s))}else{let f=Math.max(16,i/40);p(()=>{a.beginPath(),a.arc(h*i,d*s,f,0,Math.PI*2),a.stroke()}),a.fillStyle="#3b82f6",a.beginPath(),a.arc(h*i,d*s,l,0,Math.PI*2),a.fill()}return o.toDataURL("image/jpeg",.88)}function v(n,e){let t=n/e,r=Math.floor(t/60);return`${r}:${(t-r*60).toFixed(2).padStart(5,"0")}`}function _(n,e){return Math.max(0,Math.min(e-1,Math.round(n)))}function de(n,e){return e>1?n/(e-1)*100:0}function pe(n,e,t){let r=/[#&]t=([\d.]+)/.exec(n);if(r)return _(Number(r[1])*e,t);let i=/[#&]frame=(\d+)/.exec(n);return i?_(Number(i[1]),t):null}function _e(n,e){return n>0?`#t=${Number((n/e).toFixed(3))}`:""}var Ct=[.5,1,2,5,10,15,30,60,120,300,600];function Ce(n,e){if(n<=0)return[];let r=(Ct.find(s=>s/n*e>=80)??1200)/5,i=[];for(let s=0;s*r<=n+1e-6;s++){let o=s*r,a=s%5===0,l=o/n*e,p={left:o/n*100,major:a};if(a&&l<e-34){let h=Math.floor(o/60),d=Math.round((o-h*60)*10)/10;p.label=`${h}:${d<10?"0":""}${d}`}i.push(p)}return i}function z(n,e){return n.frame-e.frame||n.id-e.id}function Te(n,e,t){let r=[];return[...n].sort(z).map(i=>{let s=de(i.frame,e),o=s/100*t,a=r.findIndex(l=>o-l>=16);return a<0&&(a=r.length<3?r.length:2),r[a]=o,{note:i,lane:a,left:s}})}function S(n){return`${Math.round(n*100)}%`}function Tt(n){return n.w!=null&&n.h!=null?`area ${S(n.x)},${S(n.y)} to ${S(n.x+n.w)},${S(n.y+n.h)}`:`spot ${S(n.x)},${S(n.y)}`}function Ne(n,e,t){let r=[`Notes on the preview of ${JSON.stringify(n)}:`];for(let i of e.filter(s=>!s.done).sort(z))r.push(`- Note ${i.id} at ${v(i.frame,t)} (frame ${i.frame}), ${Tt(i)}: ${i.text}${i.image?` [picture: ${i.image}]`:""}`);return r.join(`
2
+ `)}function Re(n,e,t,r){return n==="frames"?{now:String(e),end:String(t)}:{now:v(e,r),end:v(t,r)}}var F=class{constructor(e=()=>Number.POSITIVE_INFINITY,t=()=>performance.now()){this.cap=e;this.now=t}cap;now;#e=null;#t=null;#i=[];#r=null;read(){if(this.#e===null)return{state:"paused",fps:this.#r};let e=this.now(),t=Math.min(2e3,e-this.#e);return this.#i=this.#i.filter(r=>r>e-2e3),t<1e3?{state:"measuring",fps:null}:{state:"playing",fps:Math.min(this.cap(),this.#i.length*1e3/t)}}start(){this.#e=this.now(),this.#t=null,this.#i=[]}stop(){if(this.#e===null)return;let e=this.read();this.#r=e.state==="playing"?e.fps:null,this.#e=null,this.#i=[]}record(e){this.#e===null||e===this.#t||(this.#t=e,this.#i.push(this.now()))}};function Nt(n){if(n instanceof Error||typeof n=="object"&&n&&"message"in n){let{message:e,stack:t}=n,r=String(e);if(typeof t=="string"&&t.includes(r))return t.split(`
3
+ `).slice(0,4).join(`
4
+ `);if(r)return r}return typeof n=="string"?n:String(n)}function Le(n){let e=new Set;return(t,r)=>{let i=r.map(Nt).join(" ").trim(),s=t+i.replace(/\d+/g,"#");!i||e.has(s)||e.size>100||(e.add(s),n({level:t,message:i.slice(0,4e3)}))}}function Oe(n,e){let t=n.error.bind(n),r=n.warn.bind(n);n.error=(...i)=>{t(...i),e("error",i)},n.warn=(...i)=>{r(...i),typeof i[0]=="string"&&i[0].startsWith("[framefields]")&&e("warning",i)}}var Be="/@framefields/player.js";async function he(n){let e=await n;if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}function Ie(n,e,t=!1){return fetch(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e),keepalive:t})}function je(){return{meta:()=>he(fetch("/meta")),listNotes:async()=>{let n=await he(fetch("/@framefields/notes"));return Array.isArray(n)?n:[]},changeNote:n=>he(Ie("/@framefields/notes",n)),log(n){Ie("/@framefields/log",n,!0).catch(()=>{})},mixAudio(){fetch("/audio/mix",{method:"POST"}).catch(()=>{})},async audio(){let n=await fetch("/audio");if(!n.ok)throw new Error(`HTTP ${n.status}`);return n.arrayBuffer()},events(n){let e=new EventSource("/events"),t=r=>JSON.parse(r.data);return e.addEventListener("hello",r=>n.hello(t(r).session)),e.addEventListener("error",()=>n.lost()),e.addEventListener("notes",r=>n.notes(t(r))),e.addEventListener("audio",r=>n.audio(t(r))),()=>e.close()}}}var C=1200,He=.001;var W={mixing:"Mixing audio",loading:"Loading audio",ready:"Audio ready",none:"No audio",error:"Audio failed"},w=2,Rt=4,Lt=64;function Ot(){let n;try{n=new Worker(Be,{type:"module"})}catch{return null}let e=new Map,t=0,r=null,i=o=>{r??=o;for(let a of e.values())a.reject(r);e.clear()},s=new Promise((o,a)=>{n.onmessage=l=>{let p=l.data;if("ready"in p){if(p.ready)o();else{let d=new Error(p.error);a(d),i(d)}return}let h=e.get(p.id);h&&(e.delete(p.id),"error"in p?h.reject(new Error(p.error)):h.resolve(p.mix))},n.onerror=l=>{let p=new Error(l.message||"the mixing worker failed");a(p),i(p)}});return s.catch(()=>{}),{async mix(o,a){if(await s,r)throw r;return new Promise((l,p)=>{let h=++t;e.set(h,{resolve:l,reject:p}),n.postMessage({id:h,range:o,chain:a})})},stop(){n.terminate(),i(new Error("stopped"))}}}var ce=class{constructor(e,t){this.player=e;this.total=Math.max(1,Math.ceil(t/w))}player;worker=Ot();blocks=new Map;order=[];pending=new Map;queue=[];busy=!1;seen=new Set;peak=0;gain=1;fill=0;filling=!1;total;mix(e,t){let r=this.worker;return r?r.mix(e,t).catch(i=>(this.worker&&(console.warn("The soundtrack's mixing worker failed, so the page mixes it:",i),this.worker.stop(),this.worker=null),this.player.mixAudio(e,t))):this.player.mixAudio(e,t)}};function De(n,e){let t=new Float32Array(n.length);for(let r=0;r<n.length;r++){let i=Math.tanh(n[r]*e);t[r]=Number.isNaN(i)?0:i}return t}var q=class{constructor(e){this.host=e}host;mode="browser";state="mixing";error="";buffer=null;peaks=null;peaksVersion=0;muted=!1;volume=.9;#e=null;#t=null;#i=null;#r=null;#s=null;#o=null;get usable(){return this.state==="ready"&&(!!this.buffer||!!this.#r)}get durationSec(){return this.buffer?this.buffer.duration:null}get mixed(){let e=this.#r;if(!e)return null;let t=0;for(let r of e.blocks.values())r.exact&&t++;return{blocks:e.seen.size,of:e.total,exact:t}}get mixer(){return this.#r?this.#r.worker?"worker":"page":this.mode==="server"?"server":null}attach(e,t){this.#o=e,this.mode==="browser"&&this.#p(e,t)}load(e,t){if(e?.state==="browser"){this.mode="browser",this.#n("mixing"),this.#o&&this.#p(this.#o,t);return}if(this.mode="server",this.stopClock(),this.buffer=null,this.#a(null),e?.state!=="ready"){this.#n(e?.state??"none",e?.state==="error"?e.error:"");return}this.#a(e.peaks),this.#n("loading");let r=this.#c();this.host.server.audio().then(i=>r.decodeAudioData(i)).then(i=>{this.buffer=i,this.#n("ready")},i=>this.#n("error",String(i?.message??i)))}async ready(e){let t=this.#r;!t||this.state==="none"||(await this.#d(t,this.#m(e),!0).catch(()=>{}),this.#r&&this.state==="mixing"&&this.#n("ready"))}get waitsBeforePlay(){return!!this.#r&&this.state!=="none"}setMuted(e){this.muted=e,this.#u()}setVolume(e){this.volume=e,this.muted=e===0,this.#u()}startClock(e,t){let r=this.#e;if(this.#r&&r&&this.state==="ready")return this.#f(this.#r,r,e/t);if(this.buffer&&r&&this.#t){r.resume();let s=r.createBufferSource();s.buffer=this.buffer,s.connect(this.#t);let o=r.currentTime+.06,a=e/t;return a<this.buffer.duration&&s.start(o,a),this.#i=s,()=>Math.max(0,r.currentTime-o)}let i=performance.now();return()=>(performance.now()-i)/1e3}stopClock(){this.#$();let e=this.#i;if(e){try{e.stop()}catch{}e.disconnect(),this.#i=null}}#n(e,t=""){this.state=e,this.error=t,this.host.changed()}#a(e){this.peaks=e,this.peaksVersion++}#l(){let e=this.host.film();return e?e.frameCount/e.fps:0}#m(e){let t=this.host.film()?.fps??30;return Math.floor(e/t/w)}#c(){if(this.#e)return this.#e;let e=window.AudioContext??window.webkitAudioContext,t=new e;return this.#t=t.createGain(),this.#t.connect(t.destination),this.#e=t,this.#u(),t}#u(){this.#t&&(this.#t.gain.value=this.muted?0:this.volume),this.host.changed()}#p(e,t){this.#r?.worker?.stop(),this.stopClock(),this.buffer=null,this.#a(new Array(C).fill(0));let r=new ce(e,this.#l());this.#r=r,this.#c(),this.#n("mixing"),this.#d(r,this.#m(t),!0).then(()=>{this.#r===r&&this.state==="mixing"&&this.#n("ready")},()=>{})}#d(e,t,r){let i=e.blocks.get(t);if(i)return Promise.resolve(i);let s=e.pending.get(t);if(s)return r&&It(e,t),s;let o=Ue(e,t,t===e.fill?"fill":"play",r,!0);return this.#h(e),o}#h(e){if(e.busy||this.#r!==e||!e.queue.length&&(!e.filling&&e.fill<e.total&&Ue(e,e.fill,"fill",!1,!e.pending.has(e.fill)),!e.queue.length))return;e.busy=!0;let t=e.queue.shift(),r=this.#l(),i={startSec:t.i*w,endSec:Math.min(r,(t.i+1)*w)};e.mix(i,t.chain).then(s=>{this.#r===e&&this.#v(e,t.i,s),t.chain==="fill"&&(e.fill=t.i+1,e.filling=!1),t.resolve(e.blocks.get(t.i))},s=>{t.chain==="fill"&&(e.filling=!1),t.reject(s),this.#g(e,s)}).then(()=>{t.own&&e.pending.delete(t.i),e.busy=!1,this.#h(e)})}#v(e,t,r){let i={left:r.left,right:r.right,sampleRate:r.sampleRate,exact:r.exact},s=e.blocks.get(t);if(!s||!s.exact||i.exact)for(e.blocks.set(t,i),e.order.push(t);e.order.length>Lt;)e.blocks.delete(e.order.shift());if(!e.seen.has(t)){if(e.seen.add(t),e.peak=Math.max(e.peak,r.peak),this.#b(t,i),e.seen.size<e.total){this.host.changed();return}e.gain=e.peak>.95?.92/e.peak:1,e.peak<He?this.#n("none"):this.host.changed()}}#b(e,t){let r=this.peaks;if(!r)return;let i=this.#l(),s=Math.floor(e*w/i*C),o=Math.min(C,Math.ceil(Math.min(i,(e+1)*w)/i*C)),a=i/C*t.sampleRate,l=e*w*t.sampleRate;for(let p=s;p<o;p++){let h=Math.max(0,Math.floor(p*a-l)),d=Math.min(t.left.length,Math.floor((p+1)*a-l)),f=r[p];for(let m=h;m<d;m++)f=Math.max(f,Math.abs(t.left[m]),Math.abs(t.right[m]));r[p]=Math.min(1,f)}this.peaksVersion++}#g(e,t){this.#r===e&&(e.worker?.stop(),this.#r=null,this.stopClock(),console.warn("Mixing the soundtrack in the browser failed, so the preview server mixes it:",t),this.mode="server",this.#n("mixing"),this.host.server.mixAudio())}#f(e,t,r){t.resume();let i={t0:r,startAt:t.currentTime+.08,next:Math.floor(r/w),sources:[],timer:void 0};this.#s=i;let s=()=>{if(this.#s!==i||this.#r!==e)return;let o=t.currentTime-i.startAt+i.t0;for(;i.next<e.total&&i.next*w<o+Rt;){let a=e.blocks.get(i.next);if(!a){this.#d(e,i.next,!0).then(s,()=>{});return}this.#k(t,i,i.next,a,e.gain),i.next++}};return i.timer=setInterval(s,250),s(),()=>Math.max(0,t.currentTime-i.startAt)}#k(e,t,r,i,s){if(!this.#t)return;let o=e.createBuffer(2,i.left.length,i.sampleRate);o.copyToChannel(De(i.left,s),0),o.copyToChannel(De(i.right,s),1);let a=e.createBufferSource();a.buffer=o,a.connect(this.#t);let l=t.startAt+(r*w-t.t0),p=Math.max(l,e.currentTime+.02),h=p-l;h>=o.duration||(a.start(p,h),t.sources.push(a),a.onended=()=>{t.sources=t.sources.filter(d=>d!==a)})}#$(){let e=this.#s;if(this.#s=null,!!e){clearInterval(e.timer);for(let t of e.sources){try{t.stop()}catch{}t.disconnect()}}}};function Ue(n,e,t,r,i){t==="fill"&&(n.filling=!0);let s=new Promise((o,a)=>{let l={i:e,chain:t,own:i,resolve:o,reject:a};r?n.queue.unshift(l):n.queue.push(l)});return i?n.pending.set(e,s):s.catch(()=>{}),s}function It(n,e){let t=n.queue.findIndex(r=>r.i===e);t>0&&n.queue.unshift(n.queue.splice(t,1)[0])}function Bt(n,e,t){return t&&t.w>.01&&t.h>.01?{frame:n,...t,text:""}:{frame:n,x:e.x,y:e.y,text:""}}var ue=n=>new Promise(e=>setTimeout(e,n)),V=class extends EventTarget{embedded;meta=null;player=null;pageState="loading";error=null;frame=0;playing=!1;stalled=!1;offline=!1;fps={state:"paused",fps:null};notesOn=!1;notes=[];draft=null;openId=null;saving=!1;saveError=!1;panelOpen=!1;toastText="";toastOn=!1;soundtrack;report;server;#e;#t;#i=null;#r=!1;#s=0;#o;#n=0;#a=new Set;#l=[];#m;#c;#u=new AbortController;#p=!1;constructor(e={}){super(),this.server=e.server??je(),this.#e=e.win??window,this.embedded=e.embedded??new URLSearchParams(this.#e.location.search).get("embed")==="1",this.report=Le(t=>this.server.log(t)),this.#t=new F(()=>this.meta?.fps??1/0),this.soundtrack=new q({server:this.server,film:()=>this.meta,changed:()=>this.changed()})}get lastFrame(){return(this.meta?.frameCount??1)-1}get buffering(){return this.pageState!=="error"&&(this.#r||this.stalled)}noteById(e){return this.notes.find(t=>t.id===e)}get openCount(){return this.notes.filter(e=>!e.done).length}get canNote(){return this.notesOn&&!!this.player&&!this.playing}changed(){this.#p||(this.#p=!0,queueMicrotask(()=>{this.#p=!1,this.dispatchEvent(new Event("change"))}))}subscribe(e){return this.addEventListener("change",e),()=>this.removeEventListener("change",e)}on(e,t){let r=i=>t(i.detail);return this.addEventListener(e,r),()=>this.removeEventListener(e,r)}#d(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t}))}get position(){let e=this.meta?.fps??30;return{frame:this.frame,time:Number((this.frame/e).toFixed(3)),playing:this.playing}}#h(){this.#d("position",this.position)}async start(){let e=this.#e,t=this.#u.signal,r=this.server.events({hello:l=>this.#$(l),lost:()=>this.#C(),notes:l=>this.#S(l),audio:l=>this.#T(l)});t.addEventListener("abort",r);let i={signal:t};e.addEventListener("framefields:player",()=>{this.meta&&this.#v()},i),e.addEventListener("error",l=>{this.player?this.report("error",[l.error??l.message]):this.showError(l.error??l.message)},i),e.addEventListener("unhandledrejection",l=>this.report("error",[l.reason]),i),e.addEventListener("hashchange",()=>this.#N(),i),e.document.addEventListener("visibilitychange",()=>{e.document.hidden&&this.playing&&this.pause()},i),e.framefieldsPreview=this.api();let s=await this.server.meta(),{audio:o,...a}=s;this.#i=a.session,this.meta=a,e.document.title=`${a.title} \xB7 preview`,this.notesOn=!!a.notesDir,this.#O(),this.soundtrack.load(o,this.frame),this.#P(pe(e.location.hash,a.fps,a.frameCount)??0),this.#r=!0,this.#v()}close(){this.#u.abort(),this.#y()}#v(){let e=this.#e.framefieldsPlayer;e&&e.then(t=>{this.player=t,t.onFrameError=(r,i)=>this.#k(r,i),this.soundtrack.attach(t,this.frame),this.changed(),this.#E(this.frame).then(()=>this.#b())},t=>{this.showError(t),this.#e.document.documentElement.dataset.preview="error",this.#g(t instanceof Error?t:new Error(String(t)))})}#b(){this.pageState="ready",this.#e.document.documentElement.dataset.preview="ready",this.#g(),this.#w(),this.changed(),this.#d("ready",void 0)}whenReady(){return this.player?Promise.resolve():this.pageState==="error"?Promise.reject(new Error(this.error??"the preview failed")):new Promise((e,t)=>this.#l.push([e,t]))}#g(e){for(let[t,r]of this.#l.splice(0))e?r(e):t()}showError(e){this.report("error",[e]),this.pageState="error",this.error=String(e?.message??e),this.changed(),this.#d("build",{status:"error",message:this.error})}#f=new Set;#k(e,t){let r=`frame ${e}: ${String(t?.message??t)}`,i=r.replace(/\d+/g,"#");this.#f.has(i)||this.#f.size>100||(this.#f.add(i),this.#d("build",{status:"error",message:r}))}#$(e){if(this.#i&&e!==this.#i){this.#d("build",{status:"building"}),this.#e.location.reload();return}this.offline=!1,this.changed()}#C(){this.meta&&(this.playing&&(this.#y(),this.#A()),this.offline=!0,this.changed())}#T(e){this.meta&&this.soundtrack.load(e,this.frame)}#P(e){this.frame=e,this.changed()}#E(e){this.#P(e);let t=this.player;return t?(this.#r=!0,t.render(e).then(()=>{this.#r=!1,this.changed()})):Promise.resolve()}seek(e){this.#y();let t=this.#E(_(e,this.meta?.frameCount??1));return this.#A(),this.#w(),t.then(()=>this.#h())}step(e){return this.seek(this.frame+e)}#A(){if(!this.meta)return;let{location:e,history:t}=this.#e,r=_e(this.frame,this.meta.fps)||e.pathname+e.search;try{t.replaceState(null,"",r)}catch{}}#N(){let e=this.meta;if(!e)return;let t=pe(this.#e.location.hash,e.fps,e.frameCount);t!==null&&(this.playing&&this.pause(),t!==this.frame&&this.seek(t))}#w(){clearTimeout(this.#o),this.#n++,!(!this.player?.hasVision||this.playing)&&(this.#o=setTimeout(()=>{this.#R()},1e3))}async#R(){let e=this.player,t=this.meta;if(!e||!t)return;let r=++this.#n,i=Math.min(this.lastFrame,this.frame+Math.round(t.fps*20));for(let s=this.frame+1;s<=i&&r===this.#n&&!this.playing;s++)if(!this.#a.has(s)){if(!await e.warm(s)){this.#w();return}this.#a.add(s),await ue(0)}}play(){if(this.playing||!this.player)return;this.playing=!0,clearTimeout(this.#o),this.#n++;let e=++this.#s,t=()=>this.playing&&e===this.#s;this.openId!=null&&this.closePop(),this.draft&&!this.draft.text.trim()&&this.cancelDraft(),this.frame>=this.lastFrame&&(this.frame=0),this.changed(),this.#h(),this.#L(this.player,t).catch(r=>this.report("error",[r])).finally(()=>{e===this.#s&&this.playing&&this.pause()})}pause(){this.#y(),this.#A(),this.#E(this.frame).then(()=>this.#w())}togglePlay(){this.playing?this.pause():this.play()}#y(){let e=this.playing;this.playing=!1,this.soundtrack.stopClock(),this.stalled=!1,this.#t.stop(),clearInterval(this.#c),this.#c=void 0,this.#M(),e&&this.#h()}#M(){this.fps=this.#t.read(),this.changed()}#x(e){this.stalled=e,this.changed()}async#L(e,t){let r=this.meta?.fps??30;if(this.#t.start(),this.#M(),this.#c=setInterval(()=>this.#M(),500),this.soundtrack.waitsBeforePlay){if(this.#x(!0),await this.soundtrack.ready(this.frame),!t())return;this.#x(!1)}if(this.soundtrack.state==="loading"){for(this.#x(!0);t()&&this.soundtrack.state==="loading";)await ue(50);if(!t())return;this.#x(!1)}let i=this.frame,s=this.soundtrack.startClock(i,r),o=-1;for(;t();){let a=Math.min(this.lastFrame,i+Math.floor(s()*r));if(a===o){await ue(4);continue}this.#P(a),this.#h();let l=await e.render(a,{cache:!1});if(!t()||(o=l,this.#t.record(l),l>=this.lastFrame))return}}#O(){this.notesOn&&this.server.listNotes().then(e=>this.#S(e),()=>{})}#S(e){this.notes=e,this.openId!=null&&!this.noteById(this.openId)&&this.closePop(),this.changed()}#_(e){let t=this.notes.findIndex(r=>r.id===e.id);t>=0?this.notes[t]=e:this.notes.push(e),this.changed()}beginDraft(e,t){this.openId=null,this.saveError=!1,this.draft=Bt(this.frame,e,t),this.changed()}setDraftText(e){this.draft&&(this.draft.text=e,this.changed())}cancelDraft(){this.draft&&(this.draft=null,this.closePop())}async saveDraft(){let e=this.draft,t=this.meta,r=e?.text.trim();if(!e||!t||!r||this.saving)return!1;this.saving=!0,this.saveError=!1,this.changed();try{let i;try{this.player&&(i=await Se(this.player,e))}catch(o){this.report("warning",["[framefields] no picture for the note:",o])}let s=await this.server.changeNote({op:"add",note:{frame:e.frame,time:e.frame/t.fps,x:e.x,y:e.y,w:e.w,h:e.h,text:r,image:i}});return this.draft===e&&(this.draft=null),this.closePop(),this.#_(s),this.toast(`Note ${s.id} saved`),!0}catch{return this.saveError=!0,!1}finally{this.saving=!1,this.changed()}}openCard(e){this.noteById(e)&&(this.draft&&this.cancelDraft(),this.openId=e,this.changed())}closePop(){this.openId=null,this.changed()}setDone(e,t){this.server.changeNote({op:"update",id:e,done:t}).then(r=>this.#_(r),()=>this.toast("Couldn't save. Is the preview running?"))}removeNote(e){this.server.changeNote({op:"remove",id:e}).then(()=>{this.notes=this.notes.filter(t=>t.id!==e),this.closePop()},()=>this.toast("Couldn't delete. Is the preview running?"))}goToNote(e){let t=this.noteById(e);t&&(this.panelOpen=!1,this.seek(t.frame).then(()=>this.openCard(e)))}setPanel(e){this.panelOpen=e,this.changed()}toast(e){this.toastText=e,this.toastOn=!0,clearTimeout(this.#m),this.#m=setTimeout(()=>{this.toastOn=!1,this.changed()},2200),this.changed()}key({key:e,shiftKey:t=!1}){if(!this.meta||!this.player)return!1;let r=Math.round(this.meta.fps);switch(e){case"ArrowLeft":case"ArrowRight":{let i=(t?r:1)*(e==="ArrowLeft"?-1:1);return this.step(i),!0}case" ":return this.togglePlay(),!0;case"Home":return this.seek(0),!0;case"End":return this.seek(this.lastFrame),!0;default:return!1}}api(){return{seek:async e=>(await this.whenReady(),this.seek(Number(e)*(this.meta?.fps??30))),seekFrame:async e=>(await this.whenReady(),this.seek(e)),play:async()=>{await this.whenReady(),this.play()},pause:()=>{this.playing&&this.pause()},notes:()=>this.notes.slice(),state:()=>this.snapshot()}}snapshot(){let e=this.meta,t=this.#t.read().fps;return{state:this.pageState,error:this.pageState==="error"?this.error:null,frame:this.frame,time:e?Number((this.frame/e.fps).toFixed(3)):0,playing:this.playing,buffering:this.stalled,audio:this.soundtrack.state,audioMixed:this.soundtrack.mixed,audioMixer:this.soundtrack.mixer,connected:!this.offline,playbackFps:t==null?null:Number(t.toFixed(1)),renderMs:this.player?Math.round(this.player.lastRenderMs):null,meta:e&&{title:e.title,width:e.width,height:e.height,fps:e.fps,frameCount:e.frameCount,duration:Number((this.lastFrame/e.fps).toFixed(3))}}}};var jt=new Set(["seek","seekFrame","play","pause","state"]);function ze(n){if(typeof n!="object"||n===null)return null;let e=n;return e.type!=="framefields-preview:command"||typeof e.id!="string"||typeof e.command!="string"||!jt.has(e.command)||e.command==="seek"&&!Number.isFinite(e.time)||e.command==="seekFrame"&&!Number.isFinite(e.frame)?null:e}var Dt=250;function Fe(n,e,{win:t=window,now:r=()=>performance.now()}={}){let i=d=>e.postMessage(d,"*"),s=null,o=Number.NEGATIVE_INFINITY,a=n.on("ready",()=>{let d=n.meta;d&&i({type:"framefields-preview:ready",protocol:1,seekByHash:!0,meta:{title:d.title,width:d.width,height:d.height,fps:d.fps,frames:d.frameCount,duration:Number(((d.frameCount-1)/d.fps).toFixed(3))}})}),l=n.on("position",d=>{let f=s&&s.frame===d.frame&&s.playing===d.playing,m=d.playing&&s?.playing&&r()-o<Dt;f||m||(s=d,o=r(),i({type:"framefields-preview:state",...d}))}),p=n.on("build",d=>i({type:"framefields-preview:build",...d})),h=d=>{if(d.source!==e)return;let f=ze(d.data);f&&Ut(n,f).then(i)};return t.addEventListener("message",h),()=>{a(),l(),p(),t.removeEventListener("message",h)}}async function Ut(n,e){let{id:t}=e;try{switch(e.command){case"seek":await n.whenReady(),await n.seek(e.time*(n.meta?.fps??30));break;case"seekFrame":await n.whenReady(),await n.seek(e.frame);break;case"play":await n.whenReady(),n.play();break;case"pause":n.playing&&n.pause();break;case"state":break}return{type:"framefields-preview:reply",id:t,ok:!0,state:n.position}}catch(r){return{type:"framefields-preview:reply",id:t,ok:!1,error:String(r?.message??r)}}}var K=globalThis,J=K.ShadowRoot&&(K.ShadyCSS===void 0||K.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,We=Symbol(),qe=new WeakMap,X=class{constructor(e,t,r){if(this._$cssResult$=!0,r!==We)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o,t=this.t;if(J&&e===void 0){let r=t!==void 0&&t.length===1;r&&(e=qe.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),r&&qe.set(t,e))}return e}toString(){return this.cssText}},Ve=n=>new X(typeof n=="string"?n:n+"",void 0,We);var Ke=(n,e)=>{if(J)n.adoptedStyleSheets=e.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(let t of e){let r=document.createElement("style"),i=K.litNonce;i!==void 0&&r.setAttribute("nonce",i),r.textContent=t.cssText,n.appendChild(r)}},fe=J?n=>n:n=>n instanceof CSSStyleSheet?(e=>{let t="";for(let r of e.cssRules)t+=r.cssText;return Ve(t)})(n):n;var{is:zt,defineProperty:Ft,getOwnPropertyDescriptor:qt,getOwnPropertyNames:Wt,getOwnPropertySymbols:Vt,getPrototypeOf:Kt}=Object,Y=globalThis,Xe=Y.trustedTypes,Xt=Xe?Xe.emptyScript:"",Jt=Y.reactiveElementPolyfillSupport,O=(n,e)=>n,me={toAttribute(n,e){switch(e){case Boolean:n=n?Xt:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,e){let t=n;switch(e){case Boolean:t=n!==null;break;case Number:t=n===null?null:Number(n);break;case Object:case Array:try{t=JSON.parse(n)}catch{t=null}}return t}},Ye=(n,e)=>!zt(n,e),Je={attribute:!0,type:String,converter:me,reflect:!1,useDefault:!1,hasChanged:Ye};Symbol.metadata??=Symbol("metadata"),Y.litPropertyMetadata??=new WeakMap;var y=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=Je){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){let r=Symbol(),i=this.getPropertyDescriptor(e,r,t);i!==void 0&&Ft(this.prototype,e,i)}}static getPropertyDescriptor(e,t,r){let{get:i,set:s}=qt(this.prototype,e)??{get(){return this[t]},set(o){this[t]=o}};return{get:i,set(o){let a=i?.call(this);s?.call(this,o),this.requestUpdate(e,a,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Je}static _$Ei(){if(this.hasOwnProperty(O("elementProperties")))return;let e=Kt(this);e.finalize(),e.l!==void 0&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(O("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(O("properties"))){let t=this.properties,r=[...Wt(t),...Vt(t)];for(let i of r)this.createProperty(i,t[i])}let e=this[Symbol.metadata];if(e!==null){let t=litPropertyMetadata.get(e);if(t!==void 0)for(let[r,i]of t)this.elementProperties.set(r,i)}this._$Eh=new Map;for(let[t,r]of this.elementProperties){let i=this._$Eu(t,r);i!==void 0&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){let t=[];if(Array.isArray(e)){let r=new Set(e.flat(1/0).reverse());for(let i of r)t.unshift(fe(i))}else e!==void 0&&t.push(fe(e));return t}static _$Eu(e,t){let r=t.attribute;return r===!1?void 0:typeof r=="string"?r:typeof e=="string"?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),this.renderRoot!==void 0&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){let e=new Map,t=this.constructor.elementProperties;for(let r of t.keys())this.hasOwnProperty(r)&&(e.set(r,this[r]),delete this[r]);e.size>0&&(this._$Ep=e)}createRenderRoot(){let e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Ke(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,r){this._$AK(e,r)}_$ET(e,t){let r=this.constructor.elementProperties.get(e),i=this.constructor._$Eu(e,r);if(i!==void 0&&r.reflect===!0){let s=(r.converter?.toAttribute!==void 0?r.converter:me).toAttribute(t,r.type);this._$Em=e,s==null?this.removeAttribute(i):this.setAttribute(i,s),this._$Em=null}}_$AK(e,t){let r=this.constructor,i=r._$Eh.get(e);if(i!==void 0&&this._$Em!==i){let s=r.getPropertyOptions(i),o=typeof s.converter=="function"?{fromAttribute:s.converter}:s.converter?.fromAttribute!==void 0?s.converter:me;this._$Em=i;let a=o.fromAttribute(t,s.type);this[i]=a??this._$Ej?.get(i)??a,this._$Em=null}}requestUpdate(e,t,r,i=!1,s){if(e!==void 0){let o=this.constructor;if(i===!1&&(s=this[e]),r??=o.getPropertyOptions(e),!((r.hasChanged??Ye)(s,t)||r.useDefault&&r.reflect&&s===this._$Ej?.get(e)&&!this.hasAttribute(o._$Eu(e,r))))return;this.C(e,t,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(e,t,{useDefault:r,reflect:i,wrapped:s},o){r&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),s!==!0||o!==void 0)||(this._$AL.has(e)||(this.hasUpdated||r||(t=void 0),this._$AL.set(e,t)),i===!0&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}let e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[i,s]of this._$Ep)this[i]=s;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[i,s]of r){let{wrapped:o}=s,a=this[i];o!==!0||this._$AL.has(i)||a===void 0||this.C(i,void 0,s,a)}}let e=!1,t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(t)):this._$EM()}catch(r){throw e=!1,this._$EM(),r}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(e){}firstUpdated(e){}};y.elementStyles=[],y.shadowRootOptions={mode:"open"},y[O("elementProperties")]=new Map,y[O("finalized")]=new Map,Jt?.({ReactiveElement:y}),(Y.reactiveElementVersions??=[]).push("2.1.2");var ke=globalThis,Ge=n=>n,G=ke.trustedTypes,Ze=G?G.createPolicy("lit-html",{createHTML:n=>n}):void 0,nt="$lit$",k=`lit$${Math.random().toFixed(9).slice(2)}$`,st="?"+k,Yt=`<${st}>`,M=document,B=()=>M.createComment(""),j=n=>n===null||typeof n!="object"&&typeof n!="function",$e=Array.isArray,Gt=n=>$e(n)||typeof n?.[Symbol.iterator]=="function",ve=`[
5
+ \f\r]`,I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Qe=/-->/g,et=/>/g,E=RegExp(`>|${ve}(?:([^\\s"'>=/]+)(${ve}*=${ve}*(?:[^
6
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),tt=/'/g,rt=/"/g,ot=/^(?:script|style|textarea|title)$/i,Pe=n=>(e,...t)=>({_$litType$:n,strings:e,values:t}),c=Pe(1),at=Pe(2),qr=Pe(3),x=Symbol.for("lit-noChange"),u=Symbol.for("lit-nothing"),it=new WeakMap,A=M.createTreeWalker(M,129);function lt(n,e){if(!$e(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return Ze!==void 0?Ze.createHTML(e):e}var Zt=(n,e)=>{let t=n.length-1,r=[],i,s=e===2?"<svg>":e===3?"<math>":"",o=I;for(let a=0;a<t;a++){let l=n[a],p,h,d=-1,f=0;for(;f<l.length&&(o.lastIndex=f,h=o.exec(l),h!==null);)f=o.lastIndex,o===I?h[1]==="!--"?o=Qe:h[1]!==void 0?o=et:h[2]!==void 0?(ot.test(h[2])&&(i=RegExp("</"+h[2],"g")),o=E):h[3]!==void 0&&(o=E):o===E?h[0]===">"?(o=i??I,d=-1):h[1]===void 0?d=-2:(d=o.lastIndex-h[2].length,p=h[1],o=h[3]===void 0?E:h[3]==='"'?rt:tt):o===rt||o===tt?o=E:o===Qe||o===et?o=I:(o=E,i=void 0);let m=o===E&&n[a+1].startsWith("/>")?" ":"";s+=o===I?l+Yt:d>=0?(r.push(p),l.slice(0,d)+nt+l.slice(d)+k+m):l+k+(d===-2?a:m)}return[lt(n,s+(n[t]||"<?>")+(e===2?"</svg>":e===3?"</math>":"")),r]},H=class n{constructor({strings:e,_$litType$:t},r){let i;this.parts=[];let s=0,o=0,a=e.length-1,l=this.parts,[p,h]=Zt(e,t);if(this.el=n.createElement(p,r),A.currentNode=this.el.content,t===2||t===3){let d=this.el.content.firstChild;d.replaceWith(...d.childNodes)}for(;(i=A.nextNode())!==null&&l.length<a;){if(i.nodeType===1){if(i.hasAttributes())for(let d of i.getAttributeNames())if(d.endsWith(nt)){let f=h[o++],m=i.getAttribute(d).split(k),b=/([.?@])?(.*)/.exec(f);l.push({type:1,index:s,name:b[2],strings:m,ctor:b[1]==="."?be:b[1]==="?"?we:b[1]==="@"?ye:N}),i.removeAttribute(d)}else d.startsWith(k)&&(l.push({type:6,index:s}),i.removeAttribute(d));if(ot.test(i.tagName)){let d=i.textContent.split(k),f=d.length-1;if(f>0){i.textContent=G?G.emptyScript:"";for(let m=0;m<f;m++)i.append(d[m],B()),A.nextNode(),l.push({type:2,index:++s});i.append(d[f],B())}}}else if(i.nodeType===8)if(i.data===st)l.push({type:2,index:s});else{let d=-1;for(;(d=i.data.indexOf(k,d+1))!==-1;)l.push({type:7,index:s}),d+=k.length-1}s++}}static createElement(e,t){let r=M.createElement("template");return r.innerHTML=e,r}};function T(n,e,t=n,r){if(e===x)return e;let i=r!==void 0?t._$Co?.[r]:t._$Cl,s=j(e)?void 0:e._$litDirective$;return i?.constructor!==s&&(i?._$AO?.(!1),s===void 0?i=void 0:(i=new s(n),i._$AT(n,t,r)),r!==void 0?(t._$Co??=[])[r]=i:t._$Cl=i),i!==void 0&&(e=T(n,i._$AS(n,e.values),i,r)),e}var ge=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:r}=this._$AD,i=(e?.creationScope??M).importNode(t,!0);A.currentNode=i;let s=A.nextNode(),o=0,a=0,l=r[0];for(;l!==void 0;){if(o===l.index){let p;l.type===2?p=new D(s,s.nextSibling,this,e):l.type===1?p=new l.ctor(s,l.name,l.strings,this,e):l.type===6&&(p=new xe(s,this,e)),this._$AV.push(p),l=r[++a]}o!==l?.index&&(s=A.nextNode(),o++)}return A.currentNode=M,i}p(e){let t=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(e,r,t),t+=r.strings.length-2):r._$AI(e[t])),t++}},D=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,r,i){this.type=2,this._$AH=u,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=r,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=T(this,e,t),j(e)?e===u||e==null||e===""?(this._$AH!==u&&this._$AR(),this._$AH=u):e!==this._$AH&&e!==x&&this._(e):e._$litType$!==void 0?this.$(e):e.nodeType!==void 0?this.T(e):Gt(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==u&&j(this._$AH)?this._$AA.nextSibling.data=e:this.T(M.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:r}=e,i=typeof r=="number"?this._$AC(e):(r.el===void 0&&(r.el=H.createElement(lt(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===i)this._$AH.p(t);else{let s=new ge(i,this),o=s.u(this.options);s.p(t),this.T(o),this._$AH=s}}_$AC(e){let t=it.get(e.strings);return t===void 0&&it.set(e.strings,t=new H(e)),t}k(e){$e(this._$AH)||(this._$AH=[],this._$AR());let t=this._$AH,r,i=0;for(let s of e)i===t.length?t.push(r=new n(this.O(B()),this.O(B()),this,this.options)):r=t[i],r._$AI(s),i++;i<t.length&&(this._$AR(r&&r._$AB.nextSibling,i),t.length=i)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e!==this._$AB;){let r=Ge(e).nextSibling;Ge(e).remove(),e=r}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},N=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,r,i,s){this.type=1,this._$AH=u,this._$AN=void 0,this.element=e,this.name=t,this._$AM=i,this.options=s,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=u}_$AI(e,t=this,r,i){let s=this.strings,o=!1;if(s===void 0)e=T(this,e,t,0),o=!j(e)||e!==this._$AH&&e!==x,o&&(this._$AH=e);else{let a=e,l,p;for(e=s[0],l=0;l<s.length-1;l++)p=T(this,a[r+l],t,l),p===x&&(p=this._$AH[l]),o||=!j(p)||p!==this._$AH[l],p===u?e=u:e!==u&&(e+=(p??"")+s[l+1]),this._$AH[l]=p}o&&!i&&this.j(e)}j(e){e===u?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??"")}},be=class extends N{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===u?void 0:e}},we=class extends N{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==u)}},ye=class extends N{constructor(e,t,r,i,s){super(e,t,r,i,s),this.type=5}_$AI(e,t=this){if((e=T(this,e,t,0)??u)===x)return;let r=this._$AH,i=e===u&&r!==u||e.capture!==r.capture||e.once!==r.once||e.passive!==r.passive,s=e!==u&&(r===u||i);i&&this.element.removeEventListener(this.name,this,r),s&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},xe=class{constructor(e,t,r){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(e){T(this,e)}};var Qt=ke.litHtmlPolyfillSupport;Qt?.(H,D),(ke.litHtmlVersions??=[]).push("3.3.3");var dt=(n,e,t)=>{let r=t?.renderBefore??e,i=r._$litPart$;if(i===void 0){let s=t?.renderBefore??null;r._$litPart$=i=new D(e.insertBefore(B(),s),s,void 0,t??{})}return i._$AI(n),i};var Ee=globalThis,$=class extends y{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){let t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=dt(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return x}};$._$litElement$=!0,$.finalized=!0,Ee.litElementHydrateSupport?.({LitElement:$});var er=Ee.litElementPolyfillSupport;er?.({LitElement:$});(Ee.litElementVersions??=[]).push("4.2.2");var g=class extends ${static properties={app:{attribute:!1}};#e;createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.#t()}disconnectedCallback(){super.disconnectedCallback(),this.#e?.(),this.#e=void 0}willUpdate(e){e.has("app")&&this.#t()}#t(){this.#e?.(),this.#e=this.app?.subscribe(()=>this.requestUpdate())}};var pt=at`<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>`,R=c`<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>`,Z=c`<svg viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>`,ht=c`<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>`,ct=c`<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>`,ut=c`<svg 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>`,ft=c`<svg viewBox="0 0 16 16" fill="currentColor"><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>`,mt=c`<svg class="spin" viewBox="0 0 50 50" aria-hidden="true"><circle cx="25" cy="25" r="18"/></svg>`,vt=c`<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>`,gt=c`<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>`,bt=c`<svg 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>`,wt=c`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><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>`,yt=c`<svg viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"/></svg>`;function Me(n){return n?.offline?c`<span
7
+ class="chip"
8
+ data-state="offline"
9
+ role="status"
10
+ aria-live="polite"
11
+ title="The preview command isn't running. This tab reconnects when it starts again."
12
+ ><span class="dot"></span><span>Preview stopped</span></span
13
+ >`:u}var Q=class extends g{render(){let e=this.app,t=e?.meta;return c`<header class="top">
14
+ <svg class="logo" viewBox="0 0 512 512" aria-label="framefields" role="img">${pt}</svg>
15
+ <h1>${t?.title??"framefields preview"}</h1>
16
+ <span class="grow"></span>
17
+ <span class="spec tnum"
18
+ >${t?`${t.width}\xD7${t.height} \xB7 ${t.fps} fps \xB7 ${v(t.frameCount-1,t.fps)}`:""}</span
19
+ >
20
+ ${Me(e)}
21
+ </header>`}};var ee=class extends g{#e=null;#t=new ResizeObserver(()=>this.#l());connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.#l)}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("resize",this.#l),this.#t.disconnect()}get#i(){let e=this.app;if(e)return e.draft?e.draft:e.openId==null?void 0:e.noteById(e.openId)}render(){let e=this.app,t=this.#i,r=e?.meta?e.draft?this.#r(e.draft,e.meta.fps):t?this.#s(t,e.meta.fps):u:u;return c`<div class="pop ${t?"on":""}" role="dialog" aria-label="Note">
22
+ ${r}
23
+ </div>`}updated(){let e=this.#a();e&&this.#t.observe(e),this.#l();let t=this.app?.draft??null;t&&t!==this.#e&&this.querySelector("textarea")?.focus(),this.#e=t}#r(e,t){let r=this.app;if(!r)return u;let i=r.saving?"Saving\u2026":r.saveError?"Couldn't save. Is the preview running?":"Enter to add";return c`<div class="pop-head">
24
+ <span class="badge new">+</span>
25
+ <span class="tnum"
26
+ >${v(e.frame,t)} · ${e.w!=null?"area":"spot"}</span
27
+ >
28
+ </div>
29
+ <textarea
30
+ placeholder="What should change here?"
31
+ rows="2"
32
+ aria-label="Note"
33
+ .value=${e.text}
34
+ ?readonly=${r.saving}
35
+ @input=${this.#o}
36
+ @keydown=${this.#n}
37
+ ></textarea>
38
+ <div class="pop-foot">
39
+ <span class="grow ${r.saveError?"err":""}">${i}</span>
40
+ <button class="btn" @click=${()=>r.cancelDraft()}>Cancel</button>
41
+ <button
42
+ class="btn primary"
43
+ ?disabled=${!e.text.trim()||r.saving}
44
+ @click=${()=>{r.saveDraft()}}
45
+ >
46
+ Add note
47
+ </button>
48
+ </div>`}#s(e,t){let r=this.app;return r?c`<div class="pop-head">
49
+ <span class="badge ${e.done?"done":""}">${e.id}</span>
50
+ <span class="tnum grow">${v(e.frame,t)} · frame ${e.frame}</span>
51
+ <button
52
+ class="btn x-btn"
53
+ title="Close"
54
+ aria-label="Close"
55
+ @click=${()=>r.closePop()}
56
+ >
57
+ ${Z}
58
+ </button>
59
+ </div>
60
+ <div class="pop-text">${e.text}</div>
61
+ <div class="pop-foot">
62
+ <button class="btn" @click=${()=>r.setDone(e.id,!e.done)}>
63
+ ${R}${e.done?"Reopen":"Mark done"}
64
+ </button>
65
+ <span class="grow"></span>
66
+ <button class="btn danger" @click=${()=>r.removeNote(e.id)}>
67
+ Delete
68
+ </button>
69
+ </div>`:u}#o=e=>{let t=e.target;this.app?.setDraftText(t.value),t.style.height="auto",t.style.height=`${Math.min(180,t.scrollHeight)}px`};#n=e=>{e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),this.app?.saveDraft()),e.key==="Escape"&&(e.preventDefault(),this.app?.cancelDraft())};#a(){return this.closest("ff-preview")?.querySelector("ff-stage .stage")??null}#l=()=>{let e=this.querySelector(".pop"),t=this.#a(),r=this.#i;if(!e||!t||!r)return;let i=t.getBoundingClientRect(),s=(r.w??0)*i.width,o=(r.h??0)*i.height,a=i.left+r.x*i.width+s,l=i.top+r.y*i.height+o,p=e.offsetWidth,h=e.offsetHeight,d=16,f=a+d+p<=innerWidth-8?a+d:a-d-p-s,m=l+d+h<=innerHeight-8?l+d/2:l-h-d/2-o;e.style.left=`${Math.max(8,Math.min(innerWidth-p-8,f))}px`,e.style.top=`${Math.max(8,Math.min(innerHeight-h-8,m))}px`}};var te=class extends g{#e=!1;render(){let e=this.app;if(!e)return c``;let t=e.meta?.fps??30,r=[...e.notes].sort(z);return c`<div
70
+ class="notes-panel ${e.panelOpen?"on":""}"
71
+ role="dialog"
72
+ aria-label="Notes"
73
+ >
74
+ <div class="np-head">
75
+ <h2>Notes</h2>
76
+ <span class="grow"></span>
77
+ <button
78
+ class="btn"
79
+ title="Copy the open notes, to paste into a chat"
80
+ ?disabled=${e.openCount===0}
81
+ @click=${this.#t}
82
+ >
83
+ ${gt}<span>${this.#e?"Copied":"Copy"}</span>
84
+ </button>
85
+ <button
86
+ class="btn x-btn"
87
+ title="Close"
88
+ aria-label="Close"
89
+ @click=${()=>e.setPanel(!1)}
90
+ >
91
+ ${Z}
92
+ </button>
93
+ </div>
94
+ <div class="np-list">
95
+ ${r.length?r.map(i=>{let s=i.done?"Reopen":"Mark done";return c`<div
96
+ class="note-row ${i.done?"done":""}"
97
+ @click=${()=>e.goToNote(i.id)}
98
+ >
99
+ <span class="badge ${i.done?"done":""}">${i.id}</span>
100
+ <div>
101
+ <div class="when tnum">
102
+ ${v(i.frame,t)} · frame ${i.frame}
103
+ </div>
104
+ <div class="text">${i.text}</div>
105
+ </div>
106
+ <button
107
+ class="check ${i.done?"on":""}"
108
+ title=${s}
109
+ aria-label=${s}
110
+ @click=${o=>{o.stopPropagation(),e.setDone(i.id,!i.done)}}
111
+ >
112
+ ${R}
113
+ </button>
114
+ </div>`}):c`<div class="np-empty">
115
+ Pause and click the picture to pin a note to that spot and
116
+ moment. Drag to mark an area.
117
+ </div>`}
118
+ </div>
119
+ </div>`}#t=async()=>{let e=this.app;if(!e?.meta)return;let t=Ne(e.meta.title,e.notes,e.meta.fps);try{await navigator.clipboard.writeText(t)}catch{let r=document.createElement("textarea");r.value=t,document.body.append(r),r.select();let i=document.execCommand("copy");if(r.remove(),!i)return}this.#e=!0,this.requestUpdate(),setTimeout(()=>{this.#e=!1,this.requestUpdate()},1600)}};var tr="input, textarea, select, [contenteditable]",re=class extends g{connectedCallback(){super.connectedCallback(),document.addEventListener("pointerdown",this.#e),document.addEventListener("keydown",this.#t)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("pointerdown",this.#e),document.removeEventListener("keydown",this.#t)}render(){let e=this.app;return document.documentElement.toggleAttribute("data-embed",!!e?.embedded),c`${e?.embedded?u:c`<ff-header .app=${e}></ff-header>`}
120
+ <main class="player" aria-label="Player">
121
+ <ff-stage .app=${e}></ff-stage>
122
+ <ff-transport .app=${e}></ff-transport>
123
+ <ff-timeline .app=${e}></ff-timeline>
124
+ </main>
125
+ <ff-note-editor .app=${e}></ff-note-editor>`}#e=e=>{let t=this.app,r=e.target;if(!t||!r)return;let i=this.querySelector(".pop"),s=this.querySelector("ff-stage"),o=!!i?.contains(r)||!!s?.contains(r);i?.classList.contains("on")&&!o&&!r.closest(".note-mark, .note-row")&&(t.openId!=null?t.closePop():t.draft&&!t.draft.text.trim()&&t.cancelDraft());let a=this.querySelector(".notes-panel"),l=this.querySelector(".notes-btn");t.panelOpen&&!a?.contains(r)&&!l?.contains(r)&&t.setPanel(!1)};#t=e=>{let t=this.app;if(!t)return;if(e.key==="Escape"){t.openId!=null&&t.closePop(),t.setPanel(!1);return}let r=e.target;e.metaKey||e.ctrlKey||e.altKey||r?.closest(tr)||r?.closest("button")&&(e.key===" "||e.key==="Enter")||t.key(e)&&e.preventDefault()}};var xt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},kt=n=>(...e)=>({_$litDirective$:n,values:e}),ie=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,r){this._$Ct=e,this._$AM=t,this._$Ci=r}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};var $t="important",rr=" !"+$t,ne=kt(class extends ie{constructor(n){if(super(n),n.type!==xt.ATTRIBUTE||n.name!=="style"||n.strings?.length>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(n){return Object.keys(n).reduce((e,t)=>{let r=n[t];return r==null?e:e+`${t=t.includes("-")?t:t.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${r};`},"")}update(n,[e]){let{style:t}=n.element;if(this.ft===void 0)return this.ft=new Set(Object.keys(e)),this.render(e);for(let r of this.ft)e[r]==null&&(this.ft.delete(r),r.includes("-")?t.removeProperty(r):t[r]=null);for(let r in e){let i=e[r];if(i!=null){this.ft.add(r);let s=typeof i=="string"&&i.endsWith(rr);r.includes("-")||s?t.setProperty(r,s?i.slice(0,-11):i,s?$t:""):t[r]=i}}return x}});var ir=6,se=n=>ne({left:`${n.x*100}%`,top:`${n.y*100}%`,width:n.w==null?void 0:`${n.w*100}%`,height:n.h==null?void 0:`${n.h*100}%`}),oe=class extends g{#e=null;render(){let e=this.app,t=e?.meta,r=["stage",e?.canNote?"can-note":"",e&&e.notes.length===0&&!e.draft?"hint":""].join(" "),i=t?{"--ar":`${t.width} / ${t.height}`,"--ar-n":String(t.width/t.height)}:{},s=this.#e?.area;return c`<div class="stage-wrap">
126
+ <div
127
+ class=${r}
128
+ style=${ne(i)}
129
+ @pointerdown=${this.#r}
130
+ @pointermove=${this.#s}
131
+ @pointerup=${this.#o}
132
+ @pointercancel=${this.#n}
133
+ >
134
+ <canvas id="canvas" aria-label="Rendered frame"></canvas>
135
+ <div class="stage-msg ${e?.pageState==="error"?"on":""}" role="alert">
136
+ ${e?.pageState==="error"?e.error:""}
137
+ </div>
138
+ <div class="overlay">${this.#t()}</div>
139
+ <div
140
+ class="marquee"
141
+ style=${s?se(s):ne({display:"none"})}
142
+ ></div>
143
+ <div class="stage-hint">Click to pin a note · drag to mark an area</div>
144
+ <div class="toast ${e?.toastOn?"on":""}" role="status" aria-live="polite">
145
+ ${e?.toastText}
146
+ </div>
147
+ <div
148
+ class="buffering ${e?.buffering?"on":""}"
149
+ role="status"
150
+ aria-label="Loading"
151
+ >
152
+ ${yt}
153
+ </div>
154
+ </div>
155
+ </div>`}get picture(){return this.querySelector(".stage")}#t(){let e=this.app;if(!e?.meta||e.playing)return u;let t=e.notes.filter(r=>r.frame===e.frame);return e.draft&&e.draft.frame===e.frame&&t.push(e.draft),t.map(r=>{let i="done"in r&&r.done,s=r.w!=null?c`<div class="area ${i?"done":""}" style=${se(r)}></div>`:u;if(!("id"in r))return c`${s}<button
156
+ class="pin draft"
157
+ style=${se({x:r.x,y:r.y})}
158
+ aria-label="New note"
159
+ ></button>`;let o=["pin",i?"done":"",r.id===e.openId?"active":""];return c`${s}<button
160
+ class=${o.join(" ")}
161
+ style=${se({x:r.x,y:r.y})}
162
+ title=${r.text}
163
+ aria-label="Note ${r.id}"
164
+ @click=${a=>{a.stopPropagation(),e.openCard(r.id)}}
165
+ >
166
+ ${i?R:String(r.id)}
167
+ </button>`})}#i(e){let t=e.currentTarget.getBoundingClientRect();return{x:Math.min(1,Math.max(0,(e.clientX-t.left)/t.width)),y:Math.min(1,Math.max(0,(e.clientY-t.top)/t.height))}}#r=e=>{let t=this.app,r=e.target;if(e.button!==0||!t?.player||r.closest(".pin"))return;if(t.playing){t.pause();return}if(!t.notesOn)return;if(t.draft?.text.trim()){this.closest("ff-preview")?.querySelector(".pop textarea")?.focus();return}t.cancelDraft();let i=this.#i(e);this.#e={...i,cx:e.clientX,cy:e.clientY,area:null},e.currentTarget.setPointerCapture(e.pointerId),e.preventDefault()};#s=e=>{let t=this.#e;if(!t||!t.area&&Math.hypot(e.clientX-t.cx,e.clientY-t.cy)<ir)return;let r=this.#i(e);t.area={x:Math.min(t.x,r.x),y:Math.min(t.y,r.y),w:Math.abs(r.x-t.x),h:Math.abs(r.y-t.y)},this.requestUpdate()};#o=()=>{let e=this.#e;e&&(this.#e=null,this.app?.beginDraft({x:e.x,y:e.y},e.area))};#n=()=>{this.#e=null,this.requestUpdate()}};function Pt(n,e,t,r=2){if(!n.length||e<=0||t<=0)return"";let i=t/2,s=Math.max(0,i-2),o=[];for(let h=0;h<e+r;h+=r){let d=Math.min(h,e),f=Math.floor(d/e*n.length),m=Math.max(f+1,Math.ceil(Math.min(e,d+r)/e*n.length)),b=0;for(let P=f;P<Math.min(m,n.length);P++)b=Math.max(b,n[P]??0);if(o.push([d,Math.max(.5,Math.min(1,b)*s)]),d===e)break}let a=h=>Math.round(h*100)/100,l=o.map(([h,d])=>`L${a(h)} ${a(i-d)}`).join(""),p=o.reverse().map(([h,d])=>`L${a(h)} ${a(i+d)}`).join("");return`M0 ${a(i)}${l}${p}Z`}var nr=64,ae=class extends g{#e=800;#t=null;#i=!1;#r="";#s=new ResizeObserver(()=>{let e=this.#a()?.clientWidth;e&&e!==this.#e&&(this.#e=e,this.requestUpdate()),this.#p(!0)});#o=window.matchMedia?.("(prefers-color-scheme: light)");#n=()=>this.#p(!0);connectedCallback(){super.connectedCallback(),this.#o?.addEventListener("change",this.#n),this.updateComplete.then(()=>{let e=this.#a();e&&this.#s.observe(e)})}disconnectedCallback(){super.disconnectedCallback(),this.#s.disconnect(),this.#o?.removeEventListener("change",this.#n)}render(){let e=this.app,t=e?.meta,r=t?.frameCount??1,i=t?.fps??30,s=e?.frame??0,o=de(s,r),a=(r-1)/i;return c`<div
168
+ class="timeline"
169
+ role="slider"
170
+ tabindex="0"
171
+ aria-label="Timeline"
172
+ aria-valuemin="0"
173
+ aria-valuemax=${a.toFixed(3)}
174
+ aria-valuenow=${(s/i).toFixed(3)}
175
+ aria-valuetext="${v(s,i)}, frame ${s}"
176
+ @pointerdown=${this.#v}
177
+ @pointermove=${this.#b}
178
+ @pointerleave=${this.#g}
179
+ @pointerup=${this.#f}
180
+ @pointercancel=${this.#f}
181
+ >
182
+ <div class="tl-inner" style="--track-w:${this.#e}px">
183
+ <div class="ruler">
184
+ ${t?Ce(a,this.#e).map(l=>c`<div
185
+ class="tick ${l.major?"major":""}"
186
+ style="left:${l.left}%"
187
+ >
188
+ ${l.label?c`<span>${l.label}</span>`:u}
189
+ </div>`):u}
190
+ </div>
191
+ ${this.#c()}
192
+ <div class="wave">
193
+ <canvas class="wave-base"></canvas>
194
+ <div class="wave-played" style="width:${o}%">
195
+ <canvas></canvas>
196
+ </div>
197
+ ${this.#u()}
198
+ </div>
199
+ ${this.#m(i)}
200
+ <div class="playhead" style="left:${o}%"></div>
201
+ <div class="playhead-time" style="left:${this.#l(o/100*this.#e)}px">
202
+ ${v(s,i)}
203
+ </div>
204
+ </div>
205
+ </div>`}updated(){this.#p(!1)}#a(){return this.querySelector(".tl-inner")}#l(e){let t=nr/2;return Math.max(t,Math.min(Math.max(t,this.#e-t),e))}#m(e){let t=this.#t;if(t===null||this.#i)return u;let r=this.#d(t/Math.max(1,this.#e));return c`<div class="hover-line" style="left:${t}px"></div>
206
+ <div class="hover-time" style="left:${this.#l(t)}px">
207
+ ${v(r,e)}
208
+ </div>`}#c(){let e=this.app,t=e?.meta;if(!e?.notesOn||!t)return u;let r=Te(e.notes,t.frameCount,this.#e),i=Math.max(1,...r.map(s=>s.lane+1));return c`<div class="marks" style="--lanes:${i}">
209
+ ${r.map(({note:s,lane:o,left:a})=>{let l=["note-mark",s.done?"done":"",s.id===e.openId?"active":""];return c`<button
210
+ class=${l.join(" ")}
211
+ style="left:${a}%;top:${o*20}px"
212
+ title="${s.id} · ${v(s.frame,t.fps)} · ${s.text}"
213
+ aria-label="Note ${s.id} at ${v(s.frame,t.fps)}"
214
+ @pointerdown=${p=>p.stopPropagation()}
215
+ @click=${p=>{p.stopPropagation(),e.goToNote(s.id)}}
216
+ >
217
+ ${s.id}
218
+ </button>`})}
219
+ </div>`}#u(){let e=this.app?.soundtrack.state??"mixing";if(e==="ready")return u;let t=e==="mixing"||e==="loading",r=e==="none"?"No audio in this composition":e==="error"?"Audio could not be mixed":W[e];return c`<div class="wave-state ${t?"shimmer":""}">
220
+ ${t?c`<span class="spinner"></span>`:u}${r}
221
+ </div>`}#p(e){let t=this.app,r=this.querySelector(".wave-base"),i=this.querySelector(".wave-played canvas");if(!t||!r||!i)return;let s=t.soundtrack,o=window.devicePixelRatio||1,a=this.#e,l=r.clientHeight,p=`${s.peaksVersion}:${a}x${l}@${o}:${t.meta?.frameCount}:${s.durationSec}`;if(!e&&p===this.#r)return;this.#r=p;let h=t.meta,d=s.peaks,f=h?Math.max(1e-6,(h.frameCount-1)/h.fps):1,m=Math.min(1,(s.durationSec??f)/f)*a,b=getComputedStyle(this);for(let[P,_t]of[[r,b.getPropertyValue("--wave")],[i,b.getPropertyValue("--wave-played")]]){P.width=Math.round(a*o),P.height=Math.round(l*o);let L=P.getContext("2d");L&&(L.setTransform(o,0,0,o,0,0),L.clearRect(0,0,a,l),!(!d?.length||!h)&&(L.fillStyle=_t.trim(),L.fill(new Path2D(Pt(d,m,l)))))}}#d(e){let t=this.app?.meta?.frameCount??1;return _(Math.min(1,Math.max(0,e))*(t-1),t)}#h(e){let t=this.#a()?.getBoundingClientRect();return t?(e-t.left)/t.width:0}#v=e=>{!this.app?.meta||e.button!==0||(e.currentTarget.setPointerCapture(e.pointerId),this.#i=!0,this.app.seek(this.#d(this.#h(e.clientX))))};#b=e=>{let t=this.app;if(!t?.meta)return;let r=this.#a()?.getBoundingClientRect();if(!r)return;this.#t=Math.min(r.width,Math.max(0,e.clientX-r.left));let i=this.#d(this.#h(e.clientX));this.#i&&i!==t.frame&&t.seek(i),this.requestUpdate()};#g=()=>{this.#t=null,this.requestUpdate()};#f=()=>{this.#i=!1,this.requestUpdate()}};var Et="framefields-preview:";function At(n,e,t){try{let r=localStorage.getItem(Et+n);return e.find(i=>i===r)??t}catch{return t}}function Mt(n,e){try{localStorage.setItem(Et+n,e)}catch{}}var sr=["time","frames"],le=class extends g{#e=At("position",sr,"time");render(){let e=this.app,t=!!e?.playing,r=t?"Pause":"Play";return c`<div class="transport">
222
+ <button
223
+ class="icon-btn"
224
+ title="Previous frame"
225
+ aria-label="Previous frame"
226
+ @click=${()=>e?.step(-1)}
227
+ >
228
+ ${ht}
229
+ </button>
230
+ <button
231
+ class="play-btn ${e?.stalled?"loading":""}"
232
+ title=${r}
233
+ aria-label=${r}
234
+ ?disabled=${!e?.player}
235
+ @click=${()=>e?.togglePlay()}
236
+ >
237
+ ${t?ft:ut}${mt}
238
+ </button>
239
+ <button
240
+ class="icon-btn"
241
+ title="Next frame"
242
+ aria-label="Next frame"
243
+ @click=${()=>e?.step(1)}
244
+ >
245
+ ${ct}
246
+ </button>
247
+ ${this.#t()} ${this.#i()}
248
+ <span class="grow"></span>
249
+ ${e?.embedded?Me(e):u}
250
+ ${e?.notesOn?this.#r():u}
251
+ <ff-notes-panel .app=${e}></ff-notes-panel>
252
+ ${this.#s()}
253
+ </div>`}get positionMode(){return this.#e}#t(){let e=this.app,t=e?.meta?.fps??30,r=e?.frame??0,i=e?.lastFrame??0,{now:s,end:o}=Re(this.#e,r,i,t),a=this.#e==="time"?"frames":"time",l=`${this.#e==="time"?`Time ${s} of ${o}`:`Frame ${s} of ${o}`}. Click to show ${a}.`;return c`<button
254
+ class="position tnum"
255
+ title="Click to show ${a}"
256
+ aria-label=${l}
257
+ @click=${()=>{this.#e=a,Mt("position",a),this.requestUpdate()}}
258
+ >
259
+ <span class="now">${s}</span><span class="dim"> / ${o}</span>
260
+ </button>`}#i(){let e=this.app,t=e?.fps;if(!t||t.state==="paused"&&t.fps===null)return u;let r=(t.state==="paused"?"Frame rate the last playback reached":"Frame rate playback reaches")+(e?.meta?`; the film runs at ${e.meta.fps} fps`:"");return c`<span class="fps tnum" role="status" title=${r}
261
+ >${t.fps===null?"\u2026 fps":`${t.fps.toFixed(1)} fps`}</span
262
+ >`}#r(){let e=this.app;if(!e)return u;let t=e.openCount,r=`Notes: ${t} open of ${e.notes.length}`;return c`<button
263
+ class="btn notes-btn"
264
+ title=${r}
265
+ aria-label=${r}
266
+ aria-haspopup="dialog"
267
+ aria-expanded=${String(e.panelOpen)}
268
+ @click=${()=>e.setPanel(!e.panelOpen)}
269
+ >
270
+ ${vt}
271
+ <span class="badge ${t>0?"open":""}">${t||e.notes.length}</span>
272
+ </button>`}#s(){let e=this.app?.soundtrack;if(!e)return u;let t=e.usable,r=e.muted,i=e.state==="none"?"No audio in this composition":e.state==="error"?`Audio failed${e.error?`: ${e.error}`:""}`:null,s=i??(t?r?"Unmute":"Mute":`${W[e.state]}\u2026`),o=(r?0:e.volume)*100;return c`<div class="volume ${t?"usable":""} ${i?"problem":""}">
273
+ <button
274
+ class="icon-btn"
275
+ title=${s}
276
+ aria-label=${s}
277
+ aria-disabled=${String(!t)}
278
+ @click=${()=>{t&&e.setMuted(!e.muted)}}
279
+ >
280
+ ${i||r?wt:bt}
281
+ </button>
282
+ ${t?c`<span class="slider-wrap"><input
283
+ class="slider"
284
+ type="range"
285
+ min="0"
286
+ max="1"
287
+ step="0.01"
288
+ .value=${String(e.volume)}
289
+ style="--level:${o}%"
290
+ aria-label="Volume"
291
+ @input=${a=>e.setVolume(Number(a.target.value))}
292
+ /></span>`:u}
293
+ </div>`}};var or={"ff-header":Q,"ff-stage":oe,"ff-transport":le,"ff-timeline":ae,"ff-notes-panel":te,"ff-note-editor":ee,"ff-preview":re};function St(n=customElements){for(let[e,t]of Object.entries(or))n.get(e)||n.define(e,t)}St();var U=new V;Oe(console,U.report);window.parent!==window&&Fe(U,window.parent);var ar=document.querySelector("ff-preview")??document.body.appendChild(document.createElement("ff-preview"));ar.app=U;U.start().catch(n=>U.showError(n));
294
+ /*! Bundled license information:
295
+
296
+ @lit/reactive-element/css-tag.js:
297
+ (**
298
+ * @license
299
+ * Copyright 2019 Google LLC
300
+ * SPDX-License-Identifier: BSD-3-Clause
301
+ *)
302
+
303
+ @lit/reactive-element/reactive-element.js:
304
+ lit-html/lit-html.js:
305
+ lit-element/lit-element.js:
306
+ lit-html/directive.js:
307
+ (**
308
+ * @license
309
+ * Copyright 2017 Google LLC
310
+ * SPDX-License-Identifier: BSD-3-Clause
311
+ *)
312
+
313
+ lit-html/is-server.js:
314
+ (**
315
+ * @license
316
+ * Copyright 2022 Google LLC
317
+ * SPDX-License-Identifier: BSD-3-Clause
318
+ *)
319
+
320
+ lit-html/directives/style-map.js:
321
+ (**
322
+ * @license
323
+ * Copyright 2018 Google LLC
324
+ * SPDX-License-Identifier: BSD-3-Clause
325
+ *)
326
+ */