@devmotion/cli 0.7.0 → 0.8.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 (1115) hide show
  1. package/README.md +13 -0
  2. package/dist/index.js +135 -348
  3. package/package.json +1 -1
  4. package/studio/client/_app/immutable/chunks/4QfhfUmj.js +1 -0
  5. package/studio/client/_app/immutable/chunks/4QfhfUmj.js.br +0 -0
  6. package/studio/client/_app/immutable/chunks/4QfhfUmj.js.gz +0 -0
  7. package/studio/client/_app/immutable/chunks/B4vsfLqj.js +1 -0
  8. package/studio/client/_app/immutable/chunks/B4vsfLqj.js.br +0 -0
  9. package/studio/client/_app/immutable/chunks/B4vsfLqj.js.gz +0 -0
  10. package/studio/client/_app/immutable/chunks/B7SJbUFX.js +1 -0
  11. package/studio/client/_app/immutable/chunks/B7SJbUFX.js.br +0 -0
  12. package/studio/client/_app/immutable/chunks/B7SJbUFX.js.gz +0 -0
  13. package/studio/client/_app/immutable/chunks/B9f32Zzc.js +1 -0
  14. package/studio/client/_app/immutable/chunks/B9f32Zzc.js.br +1 -0
  15. package/studio/client/_app/immutable/chunks/B9f32Zzc.js.gz +0 -0
  16. package/studio/client/_app/immutable/chunks/BHu0iPy_.js +1 -0
  17. package/studio/client/_app/immutable/chunks/BHu0iPy_.js.br +0 -0
  18. package/studio/client/_app/immutable/chunks/BHu0iPy_.js.gz +0 -0
  19. package/studio/client/_app/immutable/chunks/BVqaYHsk.js +1 -0
  20. package/studio/client/_app/immutable/chunks/BVqaYHsk.js.br +0 -0
  21. package/studio/client/_app/immutable/chunks/BVqaYHsk.js.gz +0 -0
  22. package/studio/client/_app/immutable/chunks/BcZVIP5f.js +1 -0
  23. package/studio/client/_app/immutable/chunks/BcZVIP5f.js.br +0 -0
  24. package/studio/client/_app/immutable/chunks/BcZVIP5f.js.gz +0 -0
  25. package/studio/client/_app/immutable/chunks/BcqGu5mG.js +1 -0
  26. package/studio/client/_app/immutable/chunks/BcqGu5mG.js.br +0 -0
  27. package/studio/client/_app/immutable/chunks/BcqGu5mG.js.gz +0 -0
  28. package/studio/client/_app/immutable/chunks/BfikHP7B.js +512 -0
  29. package/studio/client/_app/immutable/chunks/BfikHP7B.js.br +0 -0
  30. package/studio/client/_app/immutable/chunks/BfikHP7B.js.gz +0 -0
  31. package/studio/client/_app/immutable/chunks/BpSxDpO2.js +1 -0
  32. package/studio/client/_app/immutable/chunks/BpSxDpO2.js.br +0 -0
  33. package/studio/client/_app/immutable/chunks/BpSxDpO2.js.gz +0 -0
  34. package/studio/client/_app/immutable/chunks/BpuHE4_g.js +1 -0
  35. package/studio/client/_app/immutable/chunks/BpuHE4_g.js.br +0 -0
  36. package/studio/client/_app/immutable/chunks/BpuHE4_g.js.gz +0 -0
  37. package/studio/client/_app/immutable/chunks/Bs1PixFT.js +1 -0
  38. package/studio/client/_app/immutable/chunks/Bs1PixFT.js.br +0 -0
  39. package/studio/client/_app/immutable/chunks/Bs1PixFT.js.gz +0 -0
  40. package/studio/client/_app/immutable/chunks/Bu_5E1Sl.js +1 -0
  41. package/studio/client/_app/immutable/chunks/Bu_5E1Sl.js.br +0 -0
  42. package/studio/client/_app/immutable/chunks/Bu_5E1Sl.js.gz +0 -0
  43. package/studio/client/_app/immutable/chunks/C2XXotQj.js +1 -0
  44. package/studio/client/_app/immutable/chunks/C2XXotQj.js.br +0 -0
  45. package/studio/client/_app/immutable/chunks/C2XXotQj.js.gz +0 -0
  46. package/studio/client/_app/immutable/chunks/CAACQLfs.js +1 -0
  47. package/studio/client/_app/immutable/chunks/CAACQLfs.js.br +0 -0
  48. package/studio/client/_app/immutable/chunks/CAACQLfs.js.gz +0 -0
  49. package/studio/client/_app/immutable/chunks/CClcTVCL.js +1 -0
  50. package/studio/client/_app/immutable/chunks/CClcTVCL.js.br +2 -0
  51. package/studio/client/_app/immutable/chunks/CClcTVCL.js.gz +0 -0
  52. package/studio/client/_app/immutable/chunks/CDjRusee.js +1 -0
  53. package/studio/client/_app/immutable/chunks/CDjRusee.js.br +0 -0
  54. package/studio/client/_app/immutable/chunks/CDjRusee.js.gz +0 -0
  55. package/studio/client/_app/immutable/chunks/CU5enDwt.js +1 -0
  56. package/studio/client/_app/immutable/chunks/CU5enDwt.js.br +0 -0
  57. package/studio/client/_app/immutable/chunks/CU5enDwt.js.gz +0 -0
  58. package/studio/client/_app/immutable/chunks/CaaG7K_x.js +1 -0
  59. package/studio/client/_app/immutable/chunks/CaaG7K_x.js.br +0 -0
  60. package/studio/client/_app/immutable/chunks/CaaG7K_x.js.gz +0 -0
  61. package/studio/client/_app/immutable/chunks/Cd2UbfQ6.js +2 -0
  62. package/studio/client/_app/immutable/chunks/Cd2UbfQ6.js.br +0 -0
  63. package/studio/client/_app/immutable/chunks/Cd2UbfQ6.js.gz +0 -0
  64. package/studio/client/_app/immutable/chunks/Cf4-5HnP.js +1 -0
  65. package/studio/client/_app/immutable/chunks/Cf4-5HnP.js.br +0 -0
  66. package/studio/client/_app/immutable/chunks/Cf4-5HnP.js.gz +0 -0
  67. package/studio/client/_app/immutable/chunks/CqE47GI1.js +1 -0
  68. package/studio/client/_app/immutable/chunks/CqE47GI1.js.br +0 -0
  69. package/studio/client/_app/immutable/chunks/CqE47GI1.js.gz +0 -0
  70. package/studio/client/_app/immutable/chunks/CqaLkm1l.js +4 -0
  71. package/studio/client/_app/immutable/chunks/CqaLkm1l.js.br +0 -0
  72. package/studio/client/_app/immutable/chunks/CqaLkm1l.js.gz +0 -0
  73. package/studio/client/_app/immutable/chunks/CrnqEuwa.js +1 -0
  74. package/studio/client/_app/immutable/chunks/CrnqEuwa.js.br +0 -0
  75. package/studio/client/_app/immutable/chunks/CrnqEuwa.js.gz +0 -0
  76. package/studio/client/_app/immutable/chunks/Cv2_oVuk.js +1 -0
  77. package/studio/client/_app/immutable/chunks/Cv2_oVuk.js.br +0 -0
  78. package/studio/client/_app/immutable/chunks/Cv2_oVuk.js.gz +0 -0
  79. package/studio/client/_app/immutable/chunks/D0nqj3Uj.js +1 -0
  80. package/studio/client/_app/immutable/chunks/D0nqj3Uj.js.br +0 -0
  81. package/studio/client/_app/immutable/chunks/D0nqj3Uj.js.gz +0 -0
  82. package/studio/client/_app/immutable/chunks/D260PcBB.js +1 -0
  83. package/studio/client/_app/immutable/chunks/D260PcBB.js.br +0 -0
  84. package/studio/client/_app/immutable/chunks/D260PcBB.js.gz +0 -0
  85. package/studio/client/_app/immutable/chunks/DB8_8dee.js +2 -0
  86. package/studio/client/_app/immutable/chunks/DB8_8dee.js.br +0 -0
  87. package/studio/client/_app/immutable/chunks/DB8_8dee.js.gz +0 -0
  88. package/studio/client/_app/immutable/chunks/DBZQgiHq.js +4 -0
  89. package/studio/client/_app/immutable/chunks/DBZQgiHq.js.br +0 -0
  90. package/studio/client/_app/immutable/chunks/DBZQgiHq.js.gz +0 -0
  91. package/studio/client/_app/immutable/chunks/DMxd0pKL.js +96 -0
  92. package/studio/client/_app/immutable/chunks/DMxd0pKL.js.br +0 -0
  93. package/studio/client/_app/immutable/chunks/DMxd0pKL.js.gz +0 -0
  94. package/studio/client/_app/immutable/chunks/DXX6oqEY.js +1 -0
  95. package/studio/client/_app/immutable/chunks/DXX6oqEY.js.br +0 -0
  96. package/studio/client/_app/immutable/chunks/DXX6oqEY.js.gz +0 -0
  97. package/studio/client/_app/immutable/chunks/DYsdFO9i.js +1 -0
  98. package/studio/client/_app/immutable/chunks/DYsdFO9i.js.br +0 -0
  99. package/studio/client/_app/immutable/chunks/DYsdFO9i.js.gz +0 -0
  100. package/studio/client/_app/immutable/chunks/DgTYfJMu.js +5 -0
  101. package/studio/client/_app/immutable/chunks/DgTYfJMu.js.br +0 -0
  102. package/studio/client/_app/immutable/chunks/DgTYfJMu.js.gz +0 -0
  103. package/studio/client/_app/immutable/chunks/DjvvdYFY.js +1 -0
  104. package/studio/client/_app/immutable/chunks/DjvvdYFY.js.br +0 -0
  105. package/studio/client/_app/immutable/chunks/DjvvdYFY.js.gz +0 -0
  106. package/studio/client/_app/immutable/chunks/Dn_cJtKS.js +1 -0
  107. package/studio/client/_app/immutable/chunks/Dn_cJtKS.js.br +0 -0
  108. package/studio/client/_app/immutable/chunks/Dn_cJtKS.js.gz +0 -0
  109. package/studio/client/_app/immutable/chunks/Dx_nuQP5.js +1 -0
  110. package/studio/client/_app/immutable/chunks/Dx_nuQP5.js.br +0 -0
  111. package/studio/client/_app/immutable/chunks/Dx_nuQP5.js.gz +0 -0
  112. package/studio/client/_app/immutable/chunks/G4iiuHEo.js +1 -0
  113. package/studio/client/_app/immutable/chunks/G4iiuHEo.js.br +0 -0
  114. package/studio/client/_app/immutable/chunks/G4iiuHEo.js.gz +0 -0
  115. package/studio/client/_app/immutable/chunks/GODyLR7Y.js +1 -0
  116. package/studio/client/_app/immutable/chunks/GODyLR7Y.js.br +0 -0
  117. package/studio/client/_app/immutable/chunks/GODyLR7Y.js.gz +0 -0
  118. package/studio/client/_app/immutable/chunks/H5GgA2Hg.js +1 -0
  119. package/studio/client/_app/immutable/chunks/H5GgA2Hg.js.br +3 -0
  120. package/studio/client/_app/immutable/chunks/H5GgA2Hg.js.gz +0 -0
  121. package/studio/client/_app/immutable/chunks/KindPqpA.js +1 -0
  122. package/studio/client/_app/immutable/chunks/KindPqpA.js.br +0 -0
  123. package/studio/client/_app/immutable/chunks/KindPqpA.js.gz +0 -0
  124. package/studio/client/_app/immutable/chunks/MR-UHLyi.js +99 -0
  125. package/studio/client/_app/immutable/chunks/MR-UHLyi.js.br +0 -0
  126. package/studio/client/_app/immutable/chunks/MR-UHLyi.js.gz +0 -0
  127. package/studio/client/_app/immutable/chunks/PZ9NXo-7.js +1 -0
  128. package/studio/client/_app/immutable/chunks/PZ9NXo-7.js.br +0 -0
  129. package/studio/client/_app/immutable/chunks/PZ9NXo-7.js.gz +0 -0
  130. package/studio/client/_app/immutable/chunks/iTzoDmCj.js +1 -0
  131. package/studio/client/_app/immutable/chunks/iTzoDmCj.js.br +0 -0
  132. package/studio/client/_app/immutable/chunks/iTzoDmCj.js.gz +0 -0
  133. package/studio/client/_app/immutable/chunks/wHWYACQ6.js +16 -0
  134. package/studio/client/_app/immutable/chunks/wHWYACQ6.js.br +0 -0
  135. package/studio/client/_app/immutable/chunks/wHWYACQ6.js.gz +0 -0
  136. package/studio/client/_app/immutable/entry/app.D0e6CgLl.js +2 -0
  137. package/studio/client/_app/immutable/entry/app.D0e6CgLl.js.br +0 -0
  138. package/studio/client/_app/immutable/entry/app.D0e6CgLl.js.gz +0 -0
  139. package/studio/client/_app/immutable/entry/start.CXzKoAgP.js +1 -0
  140. package/studio/client/_app/immutable/entry/start.CXzKoAgP.js.br +0 -0
  141. package/studio/client/_app/immutable/entry/start.CXzKoAgP.js.gz +0 -0
  142. package/studio/client/_app/immutable/nodes/0.BfZbVR14.js +2 -0
  143. package/studio/client/_app/immutable/nodes/0.BfZbVR14.js.br +0 -0
  144. package/studio/client/_app/immutable/nodes/0.BfZbVR14.js.gz +0 -0
  145. package/studio/client/_app/immutable/nodes/1.BGxVZc_Z.js +1 -0
  146. package/studio/client/_app/immutable/nodes/1.BGxVZc_Z.js.br +0 -0
  147. package/studio/client/_app/immutable/nodes/1.BGxVZc_Z.js.gz +0 -0
  148. package/studio/client/_app/immutable/nodes/10.BmsU7Niv.js +1 -0
  149. package/studio/client/_app/immutable/nodes/10.BmsU7Niv.js.br +0 -0
  150. package/studio/client/_app/immutable/nodes/10.BmsU7Niv.js.gz +0 -0
  151. package/studio/client/_app/immutable/nodes/11.Bl10BIeh.js +1 -0
  152. package/studio/client/_app/immutable/nodes/11.Bl10BIeh.js.br +0 -0
  153. package/studio/client/_app/immutable/nodes/11.Bl10BIeh.js.gz +0 -0
  154. package/studio/client/_app/immutable/nodes/12.Di52Em2U.js +2 -0
  155. package/studio/client/_app/immutable/nodes/12.Di52Em2U.js.br +0 -0
  156. package/studio/client/_app/immutable/nodes/12.Di52Em2U.js.gz +0 -0
  157. package/studio/client/_app/immutable/nodes/13.D1KxkAvV.js +1 -0
  158. package/studio/client/_app/immutable/nodes/13.D1KxkAvV.js.br +0 -0
  159. package/studio/client/_app/immutable/nodes/13.D1KxkAvV.js.gz +0 -0
  160. package/studio/client/_app/immutable/nodes/14.Ba-ayQpO.js +1 -0
  161. package/studio/client/_app/immutable/nodes/14.Ba-ayQpO.js.br +0 -0
  162. package/studio/client/_app/immutable/nodes/14.Ba-ayQpO.js.gz +0 -0
  163. package/studio/client/_app/immutable/nodes/15.Bjs1ENL4.js +1 -0
  164. package/studio/client/_app/immutable/nodes/15.Bjs1ENL4.js.br +0 -0
  165. package/studio/client/_app/immutable/nodes/15.Bjs1ENL4.js.gz +0 -0
  166. package/studio/client/_app/immutable/nodes/16.Ca8aIyjV.js +8 -0
  167. package/studio/client/_app/immutable/nodes/16.Ca8aIyjV.js.br +0 -0
  168. package/studio/client/_app/immutable/nodes/16.Ca8aIyjV.js.gz +0 -0
  169. package/studio/client/_app/immutable/nodes/17.DR-c7BuD.js +1 -0
  170. package/studio/client/_app/immutable/nodes/17.DR-c7BuD.js.br +0 -0
  171. package/studio/client/_app/immutable/nodes/17.DR-c7BuD.js.gz +0 -0
  172. package/studio/client/_app/immutable/nodes/18.D3yl0Qok.js +1 -0
  173. package/studio/client/_app/immutable/nodes/18.D3yl0Qok.js.br +0 -0
  174. package/studio/client/_app/immutable/nodes/18.D3yl0Qok.js.gz +0 -0
  175. package/studio/client/_app/immutable/nodes/19.r0zsNF0J.js +1 -0
  176. package/studio/client/_app/immutable/nodes/19.r0zsNF0J.js.br +0 -0
  177. package/studio/client/_app/immutable/nodes/19.r0zsNF0J.js.gz +0 -0
  178. package/studio/client/_app/immutable/nodes/20.wKchvAGW.js +45 -0
  179. package/studio/client/_app/immutable/nodes/20.wKchvAGW.js.br +0 -0
  180. package/studio/client/_app/immutable/nodes/20.wKchvAGW.js.gz +0 -0
  181. package/studio/client/_app/immutable/nodes/21.CX28-f1P.js +16 -0
  182. package/studio/client/_app/immutable/nodes/21.CX28-f1P.js.br +0 -0
  183. package/studio/client/_app/immutable/nodes/21.CX28-f1P.js.gz +0 -0
  184. package/studio/client/_app/immutable/nodes/3.D1ljfi_V.js +1 -0
  185. package/studio/client/_app/immutable/nodes/3.D1ljfi_V.js.br +0 -0
  186. package/studio/client/_app/immutable/nodes/3.D1ljfi_V.js.gz +0 -0
  187. package/studio/client/_app/immutable/nodes/38.its7uZHe.js +1 -0
  188. package/studio/client/_app/immutable/nodes/38.its7uZHe.js.br +0 -0
  189. package/studio/client/_app/immutable/nodes/38.its7uZHe.js.gz +0 -0
  190. package/studio/client/_app/immutable/nodes/4.C-XTv_8D.js +1 -0
  191. package/studio/client/_app/immutable/nodes/4.C-XTv_8D.js.br +0 -0
  192. package/studio/client/_app/immutable/nodes/4.C-XTv_8D.js.gz +0 -0
  193. package/studio/client/_app/immutable/nodes/40.B0WM2OHu.js +17 -0
  194. package/studio/client/_app/immutable/nodes/40.B0WM2OHu.js.br +0 -0
  195. package/studio/client/_app/immutable/nodes/40.B0WM2OHu.js.gz +0 -0
  196. package/studio/client/_app/immutable/nodes/41.BZzYfCVE.js +1 -0
  197. package/studio/client/_app/immutable/nodes/41.BZzYfCVE.js.br +0 -0
  198. package/studio/client/_app/immutable/nodes/41.BZzYfCVE.js.gz +0 -0
  199. package/studio/client/_app/immutable/nodes/42.BP7aBc8V.js +1 -0
  200. package/studio/client/_app/immutable/nodes/42.BP7aBc8V.js.br +0 -0
  201. package/studio/client/_app/immutable/nodes/42.BP7aBc8V.js.gz +0 -0
  202. package/studio/client/_app/immutable/nodes/43.DYWNhvqm.js +1 -0
  203. package/studio/client/_app/immutable/nodes/43.DYWNhvqm.js.br +0 -0
  204. package/studio/client/_app/immutable/nodes/43.DYWNhvqm.js.gz +0 -0
  205. package/studio/client/_app/immutable/nodes/44.CsVF9aXe.js +1 -0
  206. package/studio/client/_app/immutable/nodes/44.CsVF9aXe.js.br +0 -0
  207. package/studio/client/_app/immutable/nodes/44.CsVF9aXe.js.gz +0 -0
  208. package/studio/client/_app/immutable/nodes/45.CeMReWED.js +2 -0
  209. package/studio/client/_app/immutable/nodes/45.CeMReWED.js.br +0 -0
  210. package/studio/client/_app/immutable/nodes/45.CeMReWED.js.gz +0 -0
  211. package/studio/client/_app/immutable/nodes/46.tPqAAZZF.js +1 -0
  212. package/studio/client/_app/immutable/nodes/46.tPqAAZZF.js.br +0 -0
  213. package/studio/client/_app/immutable/nodes/46.tPqAAZZF.js.gz +0 -0
  214. package/studio/client/_app/immutable/nodes/47.1pFnCvbM.js +1 -0
  215. package/studio/client/_app/immutable/nodes/47.1pFnCvbM.js.br +0 -0
  216. package/studio/client/_app/immutable/nodes/47.1pFnCvbM.js.gz +0 -0
  217. package/studio/client/_app/immutable/nodes/48.Cy1KgYAH.js +1 -0
  218. package/studio/client/_app/immutable/nodes/48.Cy1KgYAH.js.br +0 -0
  219. package/studio/client/_app/immutable/nodes/48.Cy1KgYAH.js.gz +0 -0
  220. package/studio/client/_app/immutable/nodes/49.Bh6bDdsT.js +7 -0
  221. package/studio/client/_app/immutable/nodes/49.Bh6bDdsT.js.br +0 -0
  222. package/studio/client/_app/immutable/nodes/49.Bh6bDdsT.js.gz +0 -0
  223. package/studio/client/_app/immutable/nodes/5.C-XTv_8D.js +1 -0
  224. package/studio/client/_app/immutable/nodes/5.C-XTv_8D.js.br +0 -0
  225. package/studio/client/_app/immutable/nodes/5.C-XTv_8D.js.gz +0 -0
  226. package/studio/client/_app/immutable/nodes/7.CS9X1kOu.js +1 -0
  227. package/studio/client/_app/immutable/nodes/7.CS9X1kOu.js.br +0 -0
  228. package/studio/client/_app/immutable/nodes/7.CS9X1kOu.js.gz +0 -0
  229. package/studio/client/_app/immutable/nodes/8.Cux2oyT5.js +1 -0
  230. package/studio/client/_app/immutable/nodes/8.Cux2oyT5.js.br +0 -0
  231. package/studio/client/_app/immutable/nodes/8.Cux2oyT5.js.gz +0 -0
  232. package/studio/client/_app/immutable/nodes/9.Dl65IEFD.js +1 -0
  233. package/studio/client/_app/immutable/nodes/9.Dl65IEFD.js.br +0 -0
  234. package/studio/client/_app/immutable/nodes/9.Dl65IEFD.js.gz +0 -0
  235. package/studio/client/_app/version.json +1 -1
  236. package/studio/client/_app/version.json.br +0 -0
  237. package/studio/client/_app/version.json.gz +0 -0
  238. package/studio/prerendered/docs/api/errors.html +36 -36
  239. package/studio/prerendered/docs/api/errors.html.br +0 -0
  240. package/studio/prerendered/docs/api/errors.html.gz +0 -0
  241. package/studio/prerendered/docs/api/projects.html +36 -36
  242. package/studio/prerendered/docs/api/projects.html.br +0 -0
  243. package/studio/prerendered/docs/api/projects.html.gz +0 -0
  244. package/studio/prerendered/docs/api/renders.html +36 -36
  245. package/studio/prerendered/docs/api/renders.html.br +0 -0
  246. package/studio/prerendered/docs/api/renders.html.gz +0 -0
  247. package/studio/prerendered/docs/api/templates.html +36 -36
  248. package/studio/prerendered/docs/api/templates.html.br +0 -0
  249. package/studio/prerendered/docs/api/templates.html.gz +0 -0
  250. package/studio/prerendered/docs/api/webhooks.html +36 -36
  251. package/studio/prerendered/docs/api/webhooks.html.br +0 -0
  252. package/studio/prerendered/docs/api/webhooks.html.gz +0 -0
  253. package/studio/prerendered/docs/api.html +36 -36
  254. package/studio/prerendered/docs/api.html.br +0 -0
  255. package/studio/prerendered/docs/api.html.gz +0 -0
  256. package/studio/prerendered/docs/mcp/integrations/autogen.html +36 -36
  257. package/studio/prerendered/docs/mcp/integrations/autogen.html.br +0 -0
  258. package/studio/prerendered/docs/mcp/integrations/autogen.html.gz +0 -0
  259. package/studio/prerendered/docs/mcp/integrations/crewai.html +36 -36
  260. package/studio/prerendered/docs/mcp/integrations/crewai.html.br +0 -0
  261. package/studio/prerendered/docs/mcp/integrations/crewai.html.gz +0 -0
  262. package/studio/prerendered/docs/mcp/integrations/dify.html +36 -36
  263. package/studio/prerendered/docs/mcp/integrations/dify.html.br +0 -0
  264. package/studio/prerendered/docs/mcp/integrations/dify.html.gz +0 -0
  265. package/studio/prerendered/docs/mcp/integrations/flowise.html +36 -36
  266. package/studio/prerendered/docs/mcp/integrations/flowise.html.br +0 -0
  267. package/studio/prerendered/docs/mcp/integrations/flowise.html.gz +0 -0
  268. package/studio/prerendered/docs/mcp/integrations/langchain.html +36 -36
  269. package/studio/prerendered/docs/mcp/integrations/langchain.html.br +0 -0
  270. package/studio/prerendered/docs/mcp/integrations/langchain.html.gz +0 -0
  271. package/studio/prerendered/docs/mcp/integrations/llamaindex.html +36 -36
  272. package/studio/prerendered/docs/mcp/integrations/llamaindex.html.br +0 -0
  273. package/studio/prerendered/docs/mcp/integrations/llamaindex.html.gz +0 -0
  274. package/studio/prerendered/docs/mcp/integrations/make.html +36 -36
  275. package/studio/prerendered/docs/mcp/integrations/make.html.br +0 -0
  276. package/studio/prerendered/docs/mcp/integrations/make.html.gz +0 -0
  277. package/studio/prerendered/docs/mcp/integrations/n8n.html +36 -36
  278. package/studio/prerendered/docs/mcp/integrations/n8n.html.br +0 -0
  279. package/studio/prerendered/docs/mcp/integrations/n8n.html.gz +0 -0
  280. package/studio/prerendered/docs/mcp/integrations.html +36 -36
  281. package/studio/prerendered/docs/mcp/integrations.html.br +0 -0
  282. package/studio/prerendered/docs/mcp/integrations.html.gz +0 -0
  283. package/studio/prerendered/docs/mcp/plans.html +37 -37
  284. package/studio/prerendered/docs/mcp/plans.html.br +0 -0
  285. package/studio/prerendered/docs/mcp/plans.html.gz +0 -0
  286. package/studio/prerendered/docs/mcp/reference.html +36 -36
  287. package/studio/prerendered/docs/mcp/reference.html.br +0 -0
  288. package/studio/prerendered/docs/mcp/reference.html.gz +0 -0
  289. package/studio/prerendered/docs/mcp/setup.html +42 -40
  290. package/studio/prerendered/docs/mcp/setup.html.br +0 -0
  291. package/studio/prerendered/docs/mcp/setup.html.gz +0 -0
  292. package/studio/prerendered/docs/mcp.html +36 -36
  293. package/studio/prerendered/docs/mcp.html.br +0 -0
  294. package/studio/prerendered/docs/mcp.html.gz +0 -0
  295. package/studio/prerendered/docs.html +35 -35
  296. package/studio/prerendered/docs.html.br +0 -0
  297. package/studio/prerendered/docs.html.gz +0 -0
  298. package/studio/prerendered/dub/arabic.html +34 -34
  299. package/studio/prerendered/dub/arabic.html.br +0 -0
  300. package/studio/prerendered/dub/arabic.html.gz +0 -0
  301. package/studio/prerendered/dub/chinese-simplified.html +34 -34
  302. package/studio/prerendered/dub/chinese-simplified.html.br +0 -0
  303. package/studio/prerendered/dub/chinese-simplified.html.gz +0 -0
  304. package/studio/prerendered/dub/dutch.html +34 -34
  305. package/studio/prerendered/dub/dutch.html.br +0 -0
  306. package/studio/prerendered/dub/dutch.html.gz +0 -0
  307. package/studio/prerendered/dub/french.html +34 -34
  308. package/studio/prerendered/dub/french.html.br +0 -0
  309. package/studio/prerendered/dub/french.html.gz +0 -0
  310. package/studio/prerendered/dub/german.html +34 -34
  311. package/studio/prerendered/dub/german.html.br +0 -0
  312. package/studio/prerendered/dub/german.html.gz +0 -0
  313. package/studio/prerendered/dub/hindi.html +34 -34
  314. package/studio/prerendered/dub/hindi.html.br +0 -0
  315. package/studio/prerendered/dub/hindi.html.gz +0 -0
  316. package/studio/prerendered/dub/italian.html +34 -34
  317. package/studio/prerendered/dub/italian.html.br +0 -0
  318. package/studio/prerendered/dub/italian.html.gz +0 -0
  319. package/studio/prerendered/dub/japanese.html +34 -34
  320. package/studio/prerendered/dub/japanese.html.br +0 -0
  321. package/studio/prerendered/dub/japanese.html.gz +0 -0
  322. package/studio/prerendered/dub/korean.html +34 -34
  323. package/studio/prerendered/dub/korean.html.br +0 -0
  324. package/studio/prerendered/dub/korean.html.gz +0 -0
  325. package/studio/prerendered/dub/polish.html +34 -34
  326. package/studio/prerendered/dub/polish.html.br +0 -0
  327. package/studio/prerendered/dub/polish.html.gz +0 -0
  328. package/studio/prerendered/dub/portuguese.html +34 -34
  329. package/studio/prerendered/dub/portuguese.html.br +0 -0
  330. package/studio/prerendered/dub/portuguese.html.gz +0 -0
  331. package/studio/prerendered/dub/spanish.html +34 -34
  332. package/studio/prerendered/dub/spanish.html.br +0 -0
  333. package/studio/prerendered/dub/spanish.html.gz +0 -0
  334. package/studio/prerendered/sitemap.xml +90 -90
  335. package/studio/prerendered/sitemap.xml.br +0 -0
  336. package/studio/prerendered/sitemap.xml.gz +0 -0
  337. package/studio/prerendered/tools/add-captions/instagram.html +34 -34
  338. package/studio/prerendered/tools/add-captions/instagram.html.br +0 -0
  339. package/studio/prerendered/tools/add-captions/instagram.html.gz +0 -0
  340. package/studio/prerendered/tools/add-captions/linkedin.html +34 -34
  341. package/studio/prerendered/tools/add-captions/linkedin.html.br +0 -0
  342. package/studio/prerendered/tools/add-captions/linkedin.html.gz +0 -0
  343. package/studio/prerendered/tools/add-captions/tiktok.html +34 -34
  344. package/studio/prerendered/tools/add-captions/tiktok.html.br +0 -0
  345. package/studio/prerendered/tools/add-captions/tiktok.html.gz +0 -0
  346. package/studio/prerendered/tools/add-captions/twitter-x.html +34 -34
  347. package/studio/prerendered/tools/add-captions/twitter-x.html.br +0 -0
  348. package/studio/prerendered/tools/add-captions/twitter-x.html.gz +0 -0
  349. package/studio/prerendered/tools/add-captions/youtube.html +34 -34
  350. package/studio/prerendered/tools/add-captions/youtube.html.br +0 -0
  351. package/studio/prerendered/tools/add-captions/youtube.html.gz +0 -0
  352. package/studio/prerendered/tools/add-captions.html +38 -38
  353. package/studio/prerendered/tools/add-captions.html.br +0 -0
  354. package/studio/prerendered/tools/add-captions.html.gz +0 -0
  355. package/studio/prerendered/tools/auto-cut/linkedin.html +34 -34
  356. package/studio/prerendered/tools/auto-cut/linkedin.html.br +0 -0
  357. package/studio/prerendered/tools/auto-cut/linkedin.html.gz +0 -0
  358. package/studio/prerendered/tools/auto-cut/podcast.html +34 -34
  359. package/studio/prerendered/tools/auto-cut/podcast.html.br +0 -0
  360. package/studio/prerendered/tools/auto-cut/podcast.html.gz +0 -0
  361. package/studio/prerendered/tools/auto-cut/tiktok.html +34 -34
  362. package/studio/prerendered/tools/auto-cut/tiktok.html.br +0 -0
  363. package/studio/prerendered/tools/auto-cut/tiktok.html.gz +0 -0
  364. package/studio/prerendered/tools/auto-cut/youtube.html +34 -34
  365. package/studio/prerendered/tools/auto-cut/youtube.html.br +0 -0
  366. package/studio/prerendered/tools/auto-cut/youtube.html.gz +0 -0
  367. package/studio/prerendered/tools/auto-cut.html +38 -38
  368. package/studio/prerendered/tools/auto-cut.html.br +0 -0
  369. package/studio/prerendered/tools/auto-cut.html.gz +0 -0
  370. package/studio/prerendered/tools/generate-video/instagram.html +34 -34
  371. package/studio/prerendered/tools/generate-video/instagram.html.br +0 -0
  372. package/studio/prerendered/tools/generate-video/instagram.html.gz +0 -0
  373. package/studio/prerendered/tools/generate-video/tiktok.html +34 -34
  374. package/studio/prerendered/tools/generate-video/tiktok.html.br +0 -0
  375. package/studio/prerendered/tools/generate-video/tiktok.html.gz +0 -0
  376. package/studio/prerendered/tools/generate-video/twitter-x.html +34 -34
  377. package/studio/prerendered/tools/generate-video/twitter-x.html.br +0 -0
  378. package/studio/prerendered/tools/generate-video/twitter-x.html.gz +0 -0
  379. package/studio/prerendered/tools/generate-video/youtube.html +34 -34
  380. package/studio/prerendered/tools/generate-video/youtube.html.br +0 -0
  381. package/studio/prerendered/tools/generate-video/youtube.html.gz +0 -0
  382. package/studio/prerendered/tools/generate-video.html +38 -38
  383. package/studio/prerendered/tools/generate-video.html.br +0 -0
  384. package/studio/prerendered/tools/generate-video.html.gz +0 -0
  385. package/studio/prerendered/tools/laptop-3d-intro/linkedin.html +34 -34
  386. package/studio/prerendered/tools/laptop-3d-intro/linkedin.html.br +0 -0
  387. package/studio/prerendered/tools/laptop-3d-intro/linkedin.html.gz +0 -0
  388. package/studio/prerendered/tools/laptop-3d-intro/saas.html +34 -34
  389. package/studio/prerendered/tools/laptop-3d-intro/saas.html.br +0 -0
  390. package/studio/prerendered/tools/laptop-3d-intro/saas.html.gz +0 -0
  391. package/studio/prerendered/tools/laptop-3d-intro/twitter-x.html +34 -34
  392. package/studio/prerendered/tools/laptop-3d-intro/twitter-x.html.br +0 -0
  393. package/studio/prerendered/tools/laptop-3d-intro/twitter-x.html.gz +0 -0
  394. package/studio/prerendered/tools/laptop-3d-intro/youtube.html +34 -34
  395. package/studio/prerendered/tools/laptop-3d-intro/youtube.html.br +0 -0
  396. package/studio/prerendered/tools/laptop-3d-intro/youtube.html.gz +0 -0
  397. package/studio/prerendered/tools/laptop-3d-intro.html +38 -38
  398. package/studio/prerendered/tools/laptop-3d-intro.html.br +0 -0
  399. package/studio/prerendered/tools/laptop-3d-intro.html.gz +0 -0
  400. package/studio/prerendered/tools/screen-webcam-demo/linkedin.html +34 -34
  401. package/studio/prerendered/tools/screen-webcam-demo/linkedin.html.br +0 -0
  402. package/studio/prerendered/tools/screen-webcam-demo/linkedin.html.gz +0 -0
  403. package/studio/prerendered/tools/screen-webcam-demo/saas.html +34 -34
  404. package/studio/prerendered/tools/screen-webcam-demo/saas.html.br +0 -0
  405. package/studio/prerendered/tools/screen-webcam-demo/saas.html.gz +0 -0
  406. package/studio/prerendered/tools/screen-webcam-demo/twitter-x.html +34 -34
  407. package/studio/prerendered/tools/screen-webcam-demo/twitter-x.html.br +0 -0
  408. package/studio/prerendered/tools/screen-webcam-demo/twitter-x.html.gz +0 -0
  409. package/studio/prerendered/tools/screen-webcam-demo/youtube.html +34 -34
  410. package/studio/prerendered/tools/screen-webcam-demo/youtube.html.br +0 -0
  411. package/studio/prerendered/tools/screen-webcam-demo/youtube.html.gz +0 -0
  412. package/studio/prerendered/tools/screen-webcam-demo.html +38 -38
  413. package/studio/prerendered/tools/screen-webcam-demo.html.br +0 -0
  414. package/studio/prerendered/tools/screen-webcam-demo.html.gz +0 -0
  415. package/studio/prerendered/tools/screenshot-to-social/facebook.html +34 -34
  416. package/studio/prerendered/tools/screenshot-to-social/facebook.html.br +0 -0
  417. package/studio/prerendered/tools/screenshot-to-social/facebook.html.gz +0 -0
  418. package/studio/prerendered/tools/screenshot-to-social/instagram.html +34 -34
  419. package/studio/prerendered/tools/screenshot-to-social/instagram.html.br +0 -0
  420. package/studio/prerendered/tools/screenshot-to-social/instagram.html.gz +0 -0
  421. package/studio/prerendered/tools/screenshot-to-social/linkedin.html +34 -34
  422. package/studio/prerendered/tools/screenshot-to-social/linkedin.html.br +0 -0
  423. package/studio/prerendered/tools/screenshot-to-social/linkedin.html.gz +0 -0
  424. package/studio/prerendered/tools/screenshot-to-social/twitter-x.html +34 -34
  425. package/studio/prerendered/tools/screenshot-to-social/twitter-x.html.br +0 -0
  426. package/studio/prerendered/tools/screenshot-to-social/twitter-x.html.gz +0 -0
  427. package/studio/prerendered/tools/screenshot-to-social.html +38 -38
  428. package/studio/prerendered/tools/screenshot-to-social.html.br +0 -0
  429. package/studio/prerendered/tools/screenshot-to-social.html.gz +0 -0
  430. package/studio/prerendered/tools/translate-video/instagram.html +34 -34
  431. package/studio/prerendered/tools/translate-video/instagram.html.br +0 -0
  432. package/studio/prerendered/tools/translate-video/instagram.html.gz +0 -0
  433. package/studio/prerendered/tools/translate-video/linkedin.html +34 -34
  434. package/studio/prerendered/tools/translate-video/linkedin.html.br +0 -0
  435. package/studio/prerendered/tools/translate-video/linkedin.html.gz +0 -0
  436. package/studio/prerendered/tools/translate-video/tiktok.html +34 -34
  437. package/studio/prerendered/tools/translate-video/tiktok.html.br +0 -0
  438. package/studio/prerendered/tools/translate-video/tiktok.html.gz +0 -0
  439. package/studio/prerendered/tools/translate-video/youtube.html +34 -34
  440. package/studio/prerendered/tools/translate-video/youtube.html.br +0 -0
  441. package/studio/prerendered/tools/translate-video/youtube.html.gz +0 -0
  442. package/studio/prerendered/tools/translate-video.html +38 -38
  443. package/studio/prerendered/tools/translate-video.html.br +0 -0
  444. package/studio/prerendered/tools/translate-video.html.gz +0 -0
  445. package/studio/prerendered/tools/video-beautifier.html +38 -38
  446. package/studio/prerendered/tools/video-beautifier.html.br +0 -0
  447. package/studio/prerendered/tools/video-beautifier.html.gz +0 -0
  448. package/studio/prerendered/tools/video-to-browser/linkedin.html +34 -34
  449. package/studio/prerendered/tools/video-to-browser/linkedin.html.br +0 -0
  450. package/studio/prerendered/tools/video-to-browser/linkedin.html.gz +0 -0
  451. package/studio/prerendered/tools/video-to-browser/saas.html +34 -34
  452. package/studio/prerendered/tools/video-to-browser/saas.html.br +0 -0
  453. package/studio/prerendered/tools/video-to-browser/saas.html.gz +0 -0
  454. package/studio/prerendered/tools/video-to-browser/twitter-x.html +34 -34
  455. package/studio/prerendered/tools/video-to-browser/twitter-x.html.br +0 -0
  456. package/studio/prerendered/tools/video-to-browser/twitter-x.html.gz +0 -0
  457. package/studio/prerendered/tools/video-to-browser/youtube.html +34 -34
  458. package/studio/prerendered/tools/video-to-browser/youtube.html.br +0 -0
  459. package/studio/prerendered/tools/video-to-browser/youtube.html.gz +0 -0
  460. package/studio/prerendered/tools/video-to-browser.html +38 -38
  461. package/studio/prerendered/tools/video-to-browser.html.br +0 -0
  462. package/studio/prerendered/tools/video-to-browser.html.gz +0 -0
  463. package/studio/prerendered/tools/video-to-phone.html +38 -38
  464. package/studio/prerendered/tools/video-to-phone.html.br +0 -0
  465. package/studio/prerendered/tools/video-to-phone.html.gz +0 -0
  466. package/studio/prerendered/vs/canva.html +34 -34
  467. package/studio/prerendered/vs/canva.html.br +0 -0
  468. package/studio/prerendered/vs/canva.html.gz +0 -0
  469. package/studio/prerendered/vs/captions-ai.html +34 -34
  470. package/studio/prerendered/vs/captions-ai.html.br +0 -0
  471. package/studio/prerendered/vs/captions-ai.html.gz +0 -0
  472. package/studio/prerendered/vs/clipchamp.html +34 -34
  473. package/studio/prerendered/vs/clipchamp.html.br +0 -0
  474. package/studio/prerendered/vs/clipchamp.html.gz +0 -0
  475. package/studio/prerendered/vs/descript.html +34 -34
  476. package/studio/prerendered/vs/descript.html.br +0 -0
  477. package/studio/prerendered/vs/descript.html.gz +0 -0
  478. package/studio/prerendered/vs/kapwing.html +34 -34
  479. package/studio/prerendered/vs/kapwing.html.br +0 -0
  480. package/studio/prerendered/vs/kapwing.html.gz +0 -0
  481. package/studio/prerendered/vs/runway.html +34 -34
  482. package/studio/prerendered/vs/runway.html.br +0 -0
  483. package/studio/prerendered/vs/runway.html.gz +0 -0
  484. package/studio/prerendered/vs/submagic.html +34 -34
  485. package/studio/prerendered/vs/submagic.html.br +0 -0
  486. package/studio/prerendered/vs/submagic.html.gz +0 -0
  487. package/studio/prerendered/vs/veed.html +34 -34
  488. package/studio/prerendered/vs/veed.html.br +0 -0
  489. package/studio/prerendered/vs/veed.html.gz +0 -0
  490. package/studio/server/chunks/0-CwPSUJ3w.js +32 -0
  491. package/studio/server/chunks/0-CwPSUJ3w.js.map +1 -0
  492. package/studio/server/chunks/1-CbeNzLl-.js +9 -0
  493. package/studio/server/chunks/1-CbeNzLl-.js.map +1 -0
  494. package/studio/server/chunks/11-C0QAn-bF.js +9 -0
  495. package/studio/server/chunks/11-C0QAn-bF.js.map +1 -0
  496. package/studio/server/chunks/12-DCnPHABd.js +9 -0
  497. package/studio/server/chunks/12-DCnPHABd.js.map +1 -0
  498. package/studio/server/chunks/13-Cyy-P3vn.js +59 -0
  499. package/studio/server/chunks/13-Cyy-P3vn.js.map +1 -0
  500. package/studio/server/chunks/14-Dbdob-lm.js +60 -0
  501. package/studio/server/chunks/14-Dbdob-lm.js.map +1 -0
  502. package/studio/server/chunks/15-DyZbzGI-.js +9 -0
  503. package/studio/server/chunks/15-DyZbzGI-.js.map +1 -0
  504. package/studio/server/chunks/16-Qb7izz2W.js +72 -0
  505. package/studio/server/chunks/16-Qb7izz2W.js.map +1 -0
  506. package/studio/server/chunks/17-B5pMxn3Z.js +9 -0
  507. package/studio/server/chunks/17-B5pMxn3Z.js.map +1 -0
  508. package/studio/server/chunks/18-Dui1aDnz.js +9 -0
  509. package/studio/server/chunks/18-Dui1aDnz.js.map +1 -0
  510. package/studio/server/chunks/19-DgrfAbAy.js +9 -0
  511. package/studio/server/chunks/19-DgrfAbAy.js.map +1 -0
  512. package/studio/server/chunks/20-pRv7XuMf.js +139 -0
  513. package/studio/server/chunks/20-pRv7XuMf.js.map +1 -0
  514. package/studio/server/chunks/3-9IZCenAI.js +9 -0
  515. package/studio/server/chunks/3-9IZCenAI.js.map +1 -0
  516. package/studio/server/chunks/4-CsffFQv4.js +9 -0
  517. package/studio/server/chunks/4-CsffFQv4.js.map +1 -0
  518. package/studio/server/chunks/42-NP9_BFi5.js +56 -0
  519. package/studio/server/chunks/42-NP9_BFi5.js.map +1 -0
  520. package/studio/server/chunks/43-B0_JG7rx.js +9 -0
  521. package/studio/server/chunks/43-B0_JG7rx.js.map +1 -0
  522. package/studio/server/chunks/44-DRZom9oK.js +9 -0
  523. package/studio/server/chunks/44-DRZom9oK.js.map +1 -0
  524. package/studio/server/chunks/45-llvANtsn.js +115 -0
  525. package/studio/server/chunks/45-llvANtsn.js.map +1 -0
  526. package/studio/server/chunks/49-Bm394lLC.js +14 -0
  527. package/studio/server/chunks/49-Bm394lLC.js.map +1 -0
  528. package/studio/server/chunks/5-oazbOi9H.js +9 -0
  529. package/studio/server/chunks/5-oazbOi9H.js.map +1 -0
  530. package/studio/server/chunks/7-DHJzqCHK.js +215 -0
  531. package/studio/server/chunks/7-DHJzqCHK.js.map +1 -0
  532. package/studio/server/chunks/_error.svelte-BkTnhnxP.js +98 -0
  533. package/studio/server/chunks/_error.svelte-BkTnhnxP.js.map +1 -0
  534. package/studio/server/chunks/_error.svelte-CQzFToj8.js +98 -0
  535. package/studio/server/chunks/_error.svelte-CQzFToj8.js.map +1 -0
  536. package/studio/server/chunks/_layout.svelte-BY0hGh-H.js +64 -0
  537. package/studio/server/chunks/_layout.svelte-BY0hGh-H.js.map +1 -0
  538. package/studio/server/chunks/_layout.svelte-CMzss-C2.js +400 -0
  539. package/studio/server/chunks/_layout.svelte-CMzss-C2.js.map +1 -0
  540. package/studio/server/chunks/_layout.svelte-Cn4p7o4q.js +64 -0
  541. package/studio/server/chunks/_layout.svelte-Cn4p7o4q.js.map +1 -0
  542. package/studio/server/chunks/_layout.svelte-DL1DYuzO.js +1054 -0
  543. package/studio/server/chunks/_layout.svelte-DL1DYuzO.js.map +1 -0
  544. package/studio/server/chunks/_page.svelte-B8XqicVW.js +79 -0
  545. package/studio/server/chunks/_page.svelte-B8XqicVW.js.map +1 -0
  546. package/studio/server/chunks/_page.svelte-BF0kq_DA.js +418 -0
  547. package/studio/server/chunks/_page.svelte-BF0kq_DA.js.map +1 -0
  548. package/studio/server/chunks/_page.svelte-BFwMGeqy.js +111 -0
  549. package/studio/server/chunks/_page.svelte-BFwMGeqy.js.map +1 -0
  550. package/studio/server/chunks/_page.svelte-BGPhyNuC.js +192 -0
  551. package/studio/server/chunks/_page.svelte-BGPhyNuC.js.map +1 -0
  552. package/studio/server/chunks/_page.svelte-BdmhHvtc.js +113 -0
  553. package/studio/server/chunks/_page.svelte-BdmhHvtc.js.map +1 -0
  554. package/studio/server/chunks/_page.svelte-CU4XjUEe.js +11350 -0
  555. package/studio/server/chunks/_page.svelte-CU4XjUEe.js.map +1 -0
  556. package/studio/server/chunks/_page.svelte-D74PqaNq.js +256 -0
  557. package/studio/server/chunks/_page.svelte-D74PqaNq.js.map +1 -0
  558. package/studio/server/chunks/_page.svelte-DC9-8nEf.js +1021 -0
  559. package/studio/server/chunks/_page.svelte-DC9-8nEf.js.map +1 -0
  560. package/studio/server/chunks/_page.svelte-DgqoNyxe.js +1732 -0
  561. package/studio/server/chunks/_page.svelte-DgqoNyxe.js.map +1 -0
  562. package/studio/server/chunks/_page.svelte-DhLeBJD_.js +319 -0
  563. package/studio/server/chunks/_page.svelte-DhLeBJD_.js.map +1 -0
  564. package/studio/server/chunks/_page.svelte-uvKsK6Vw.js +506 -0
  565. package/studio/server/chunks/_page.svelte-uvKsK6Vw.js.map +1 -0
  566. package/studio/server/chunks/_server.ts-BHRR6T63.js +48 -0
  567. package/studio/server/chunks/_server.ts-BHRR6T63.js.map +1 -0
  568. package/studio/server/chunks/_server.ts-BHnpcEVo.js +52 -0
  569. package/studio/server/chunks/_server.ts-BHnpcEVo.js.map +1 -0
  570. package/studio/server/chunks/_server.ts-Bj0V1FXs.js +722 -0
  571. package/studio/server/chunks/_server.ts-Bj0V1FXs.js.map +1 -0
  572. package/studio/server/chunks/_server.ts-CGs8hOo6.js +760 -0
  573. package/studio/server/chunks/_server.ts-CGs8hOo6.js.map +1 -0
  574. package/studio/server/chunks/_server.ts-CXuYytLK.js +118 -0
  575. package/studio/server/chunks/_server.ts-CXuYytLK.js.map +1 -0
  576. package/studio/server/chunks/_server.ts-C_njIfbT.js +122 -0
  577. package/studio/server/chunks/_server.ts-C_njIfbT.js.map +1 -0
  578. package/studio/server/chunks/_server.ts-Dg9C9Iih.js +70 -0
  579. package/studio/server/chunks/_server.ts-Dg9C9Iih.js.map +1 -0
  580. package/studio/server/chunks/_server.ts-Dji1nGrU.js +91 -0
  581. package/studio/server/chunks/_server.ts-Dji1nGrU.js.map +1 -0
  582. package/studio/server/chunks/_server.ts-f6EVRY82.js +79 -0
  583. package/studio/server/chunks/_server.ts-f6EVRY82.js.map +1 -0
  584. package/studio/server/chunks/_server.ts-p_1efpqn.js +109 -0
  585. package/studio/server/chunks/_server.ts-p_1efpqn.js.map +1 -0
  586. package/studio/server/chunks/_server.ts-xAAnOaCl.js +303 -0
  587. package/studio/server/chunks/_server.ts-xAAnOaCl.js.map +1 -0
  588. package/studio/server/chunks/admin.remote-Dc0snX5Q.js +105 -0
  589. package/studio/server/chunks/admin.remote-Dc0snX5Q.js.map +1 -0
  590. package/studio/server/chunks/ai-access-bDlOKhrS.js +299 -0
  591. package/studio/server/chunks/ai-access-bDlOKhrS.js.map +1 -0
  592. package/studio/server/chunks/ai.remote-6DyE05J7.js +37 -0
  593. package/studio/server/chunks/ai.remote-6DyE05J7.js.map +1 -0
  594. package/studio/server/chunks/alert-dialog-description-BhZkDj31.js +578 -0
  595. package/studio/server/chunks/alert-dialog-description-BhZkDj31.js.map +1 -0
  596. package/studio/server/chunks/app-header-BZw6FnXs.js +96 -0
  597. package/studio/server/chunks/app-header-BZw6FnXs.js.map +1 -0
  598. package/studio/server/chunks/auth-CdmLkVO-.js +22472 -0
  599. package/studio/server/chunks/auth-CdmLkVO-.js.map +1 -0
  600. package/studio/server/chunks/auth.remote-DgcD7hjY.js +351 -0
  601. package/studio/server/chunks/auth.remote-DgcD7hjY.js.map +1 -0
  602. package/studio/server/chunks/bun-sqlite-dialect-C8OaCWSL-CfYOKJsa.js +197 -0
  603. package/studio/server/chunks/bun-sqlite-dialect-C8OaCWSL-CfYOKJsa.js.map +1 -0
  604. package/studio/server/chunks/captions.remote-B5ErNQXV.js +184 -0
  605. package/studio/server/chunks/captions.remote-B5ErNQXV.js.map +1 -0
  606. package/studio/server/chunks/client2-vVBd4CsE.js +66 -0
  607. package/studio/server/chunks/client2-vVBd4CsE.js.map +1 -0
  608. package/studio/server/chunks/d1-sqlite-dialect-sYHNqBte-D3F4ZSZP.js +160 -0
  609. package/studio/server/chunks/d1-sqlite-dialect-sYHNqBte-D3F4ZSZP.js.map +1 -0
  610. package/studio/server/chunks/desktop-bootstrap-Z0_g_8r3.js +67 -0
  611. package/studio/server/chunks/desktop-bootstrap-Z0_g_8r3.js.map +1 -0
  612. package/studio/server/chunks/dubbing.remote-tYalz3IA.js +153 -0
  613. package/studio/server/chunks/dubbing.remote-tYalz3IA.js.map +1 -0
  614. package/studio/server/chunks/editor.svelte-Bdv5LaOt.js +21026 -0
  615. package/studio/server/chunks/editor.svelte-Bdv5LaOt.js.map +1 -0
  616. package/studio/server/chunks/find-stock-image-Cwkwf5gV.js +709 -0
  617. package/studio/server/chunks/find-stock-image-Cwkwf5gV.js.map +1 -0
  618. package/studio/server/chunks/hooks.server-DNzGN0kv.js +309 -0
  619. package/studio/server/chunks/hooks.server-DNzGN0kv.js.map +1 -0
  620. package/studio/server/chunks/image-generation.remote-omBcspXi.js +140 -0
  621. package/studio/server/chunks/image-generation.remote-omBcspXi.js.map +1 -0
  622. package/studio/server/chunks/index-D-agccNM.js +4578 -0
  623. package/studio/server/chunks/index-D-agccNM.js.map +1 -0
  624. package/studio/server/chunks/index12-B6IiEYAz.js +265 -0
  625. package/studio/server/chunks/index12-B6IiEYAz.js.map +1 -0
  626. package/studio/server/chunks/index2-By5vPQD_.js +23 -0
  627. package/studio/server/chunks/index2-By5vPQD_.js.map +1 -0
  628. package/studio/server/chunks/index3-DS_3EH31.js +8 -0
  629. package/studio/server/chunks/index3-DS_3EH31.js.map +1 -0
  630. package/studio/server/chunks/index4-CgVJCMu8.js +48 -0
  631. package/studio/server/chunks/index4-CgVJCMu8.js.map +1 -0
  632. package/studio/server/chunks/layout-template-BhL4-5tM.js +1371 -0
  633. package/studio/server/chunks/layout-template-BhL4-5tM.js.map +1 -0
  634. package/studio/server/chunks/media-analysis-DXUN3NUM.js +229 -0
  635. package/studio/server/chunks/media-analysis-DXUN3NUM.js.map +1 -0
  636. package/studio/server/chunks/media-analysis.remote-BVdRHeP8.js +63 -0
  637. package/studio/server/chunks/media-analysis.remote-BVdRHeP8.js.map +1 -0
  638. package/studio/server/chunks/mutations-BlgZViQj.js +551 -0
  639. package/studio/server/chunks/mutations-BlgZViQj.js.map +1 -0
  640. package/studio/server/chunks/node-sqlite-dialect-BYaBkSm1.js +197 -0
  641. package/studio/server/chunks/node-sqlite-dialect-BYaBkSm1.js.map +1 -0
  642. package/studio/server/chunks/onboarding-email-CCv_cZ-_.js +311 -0
  643. package/studio/server/chunks/onboarding-email-CCv_cZ-_.js.map +1 -0
  644. package/studio/server/chunks/projects.remote-BevbcBv4.js +297 -0
  645. package/studio/server/chunks/projects.remote-BevbcBv4.js.map +1 -0
  646. package/studio/server/chunks/queue-init-CcgYZbeV.js +38 -0
  647. package/studio/server/chunks/queue-init-CcgYZbeV.js.map +1 -0
  648. package/studio/server/chunks/registry-DcyeMfNZ.js +18 -0
  649. package/studio/server/chunks/registry-DcyeMfNZ.js.map +1 -0
  650. package/studio/server/chunks/registry2-DJC1cBxe.js +4851 -0
  651. package/studio/server/chunks/registry2-DJC1cBxe.js.map +1 -0
  652. package/studio/server/chunks/remote-1ez0sx-BWvDnL9q.js +34 -0
  653. package/studio/server/chunks/remote-1ez0sx-BWvDnL9q.js.map +1 -0
  654. package/studio/server/chunks/remote-1mi3j6d-Cg0pK35v.js +21 -0
  655. package/studio/server/chunks/remote-1mi3j6d-Cg0pK35v.js.map +1 -0
  656. package/studio/server/chunks/remote-1web5fy-BcJGUGtw.js +35 -0
  657. package/studio/server/chunks/remote-1web5fy-BcJGUGtw.js.map +1 -0
  658. package/studio/server/chunks/remote-5mu9ty-CGtbs6nv.js +31 -0
  659. package/studio/server/chunks/remote-5mu9ty-CGtbs6nv.js.map +1 -0
  660. package/studio/server/chunks/remote-gezfls-DWj4X0qA.js +21 -0
  661. package/studio/server/chunks/remote-gezfls-DWj4X0qA.js.map +1 -0
  662. package/studio/server/chunks/remote-sy19x7-SCvG1tDD.js +29 -0
  663. package/studio/server/chunks/remote-sy19x7-SCvG1tDD.js.map +1 -0
  664. package/studio/server/chunks/remote-tisyb0-Ct_sfSGt.js +31 -0
  665. package/studio/server/chunks/remote-tisyb0-Ct_sfSGt.js.map +1 -0
  666. package/studio/server/chunks/remote-xj8myv-tYWgOBub.js +31 -0
  667. package/studio/server/chunks/remote-xj8myv-tYWgOBub.js.map +1 -0
  668. package/studio/server/chunks/remote-z7lvth-BxO_zBV5.js +23 -0
  669. package/studio/server/chunks/remote-z7lvth-BxO_zBV5.js.map +1 -0
  670. package/studio/server/chunks/remote-zjib3m-Dcyw4Y6L.js +24 -0
  671. package/studio/server/chunks/remote-zjib3m-Dcyw4Y6L.js.map +1 -0
  672. package/studio/server/chunks/scrub-xyz.svelte_svelte_type_style_lang-BuQqzLLy.js +4752 -0
  673. package/studio/server/chunks/scrub-xyz.svelte_svelte_type_style_lang-BuQqzLLy.js.map +1 -0
  674. package/studio/server/chunks/tooltip-provider-D6ZF3H34.js +30 -0
  675. package/studio/server/chunks/tooltip-provider-D6ZF3H34.js.map +1 -0
  676. package/studio/server/chunks/tooltip.svelte-DRe72lD-.js +658 -0
  677. package/studio/server/chunks/tooltip.svelte-DRe72lD-.js.map +1 -0
  678. package/studio/server/chunks/tts.remote-Btrg7DBL.js +194 -0
  679. package/studio/server/chunks/tts.remote-Btrg7DBL.js.map +1 -0
  680. package/studio/server/chunks/ui.svelte-FJio-gZM.js +88 -0
  681. package/studio/server/chunks/ui.svelte-FJio-gZM.js.map +1 -0
  682. package/studio/server/chunks/video-generation.remote-CBblzjAk.js +197 -0
  683. package/studio/server/chunks/video-generation.remote-CBblzjAk.js.map +1 -0
  684. package/studio/server/chunks/watermark-DJiyRHwX.js +164 -0
  685. package/studio/server/chunks/watermark-DJiyRHwX.js.map +1 -0
  686. package/studio/server/index.js +1 -1
  687. package/studio/server/manifest.js +44 -44
  688. package/studio/server/manifest.js.map +1 -1
  689. package/studio/client/_app/immutable/chunks/0jm3sjlg.js +0 -1
  690. package/studio/client/_app/immutable/chunks/0jm3sjlg.js.br +0 -2
  691. package/studio/client/_app/immutable/chunks/0jm3sjlg.js.gz +0 -0
  692. package/studio/client/_app/immutable/chunks/5L1qzVZj.js +0 -1
  693. package/studio/client/_app/immutable/chunks/5L1qzVZj.js.br +0 -0
  694. package/studio/client/_app/immutable/chunks/5L1qzVZj.js.gz +0 -0
  695. package/studio/client/_app/immutable/chunks/8kx1slbN.js +0 -1
  696. package/studio/client/_app/immutable/chunks/8kx1slbN.js.br +0 -0
  697. package/studio/client/_app/immutable/chunks/8kx1slbN.js.gz +0 -0
  698. package/studio/client/_app/immutable/chunks/8vtb60R1.js +0 -1
  699. package/studio/client/_app/immutable/chunks/8vtb60R1.js.br +0 -0
  700. package/studio/client/_app/immutable/chunks/8vtb60R1.js.gz +0 -0
  701. package/studio/client/_app/immutable/chunks/B1Kon8VR.js +0 -1
  702. package/studio/client/_app/immutable/chunks/B1Kon8VR.js.br +0 -0
  703. package/studio/client/_app/immutable/chunks/B1Kon8VR.js.gz +0 -0
  704. package/studio/client/_app/immutable/chunks/B4dMvZH-.js +0 -1
  705. package/studio/client/_app/immutable/chunks/B4dMvZH-.js.br +0 -0
  706. package/studio/client/_app/immutable/chunks/B4dMvZH-.js.gz +0 -0
  707. package/studio/client/_app/immutable/chunks/B7fQzRev.js +0 -1
  708. package/studio/client/_app/immutable/chunks/B7fQzRev.js.br +0 -0
  709. package/studio/client/_app/immutable/chunks/B7fQzRev.js.gz +0 -0
  710. package/studio/client/_app/immutable/chunks/BAYadMNA.js +0 -1
  711. package/studio/client/_app/immutable/chunks/BAYadMNA.js.br +0 -0
  712. package/studio/client/_app/immutable/chunks/BAYadMNA.js.gz +0 -0
  713. package/studio/client/_app/immutable/chunks/BMGFIROs.js +0 -1
  714. package/studio/client/_app/immutable/chunks/BMGFIROs.js.br +0 -0
  715. package/studio/client/_app/immutable/chunks/BMGFIROs.js.gz +0 -0
  716. package/studio/client/_app/immutable/chunks/BYo4Jpme.js +0 -16
  717. package/studio/client/_app/immutable/chunks/BYo4Jpme.js.br +0 -0
  718. package/studio/client/_app/immutable/chunks/BYo4Jpme.js.gz +0 -0
  719. package/studio/client/_app/immutable/chunks/BeTUgF4S.js +0 -1
  720. package/studio/client/_app/immutable/chunks/BeTUgF4S.js.br +0 -0
  721. package/studio/client/_app/immutable/chunks/BeTUgF4S.js.gz +0 -0
  722. package/studio/client/_app/immutable/chunks/BidNKR6p.js +0 -5
  723. package/studio/client/_app/immutable/chunks/BidNKR6p.js.br +0 -0
  724. package/studio/client/_app/immutable/chunks/BidNKR6p.js.gz +0 -0
  725. package/studio/client/_app/immutable/chunks/BujAtXXM.js +0 -1
  726. package/studio/client/_app/immutable/chunks/BujAtXXM.js.br +0 -0
  727. package/studio/client/_app/immutable/chunks/BujAtXXM.js.gz +0 -0
  728. package/studio/client/_app/immutable/chunks/BvpaRDa_.js +0 -1
  729. package/studio/client/_app/immutable/chunks/BvpaRDa_.js.br +0 -0
  730. package/studio/client/_app/immutable/chunks/BvpaRDa_.js.gz +0 -0
  731. package/studio/client/_app/immutable/chunks/C4dDhPtf.js +0 -1
  732. package/studio/client/_app/immutable/chunks/C4dDhPtf.js.br +0 -0
  733. package/studio/client/_app/immutable/chunks/C4dDhPtf.js.gz +0 -0
  734. package/studio/client/_app/immutable/chunks/C9qsOfWE.js +0 -1
  735. package/studio/client/_app/immutable/chunks/C9qsOfWE.js.br +0 -0
  736. package/studio/client/_app/immutable/chunks/C9qsOfWE.js.gz +0 -0
  737. package/studio/client/_app/immutable/chunks/CNNzQrlb.js +0 -1
  738. package/studio/client/_app/immutable/chunks/CNNzQrlb.js.br +0 -0
  739. package/studio/client/_app/immutable/chunks/CNNzQrlb.js.gz +0 -0
  740. package/studio/client/_app/immutable/chunks/CP2t8wzc.js +0 -1
  741. package/studio/client/_app/immutable/chunks/CP2t8wzc.js.br +0 -0
  742. package/studio/client/_app/immutable/chunks/CP2t8wzc.js.gz +0 -0
  743. package/studio/client/_app/immutable/chunks/Ccg49IMO.js +0 -96
  744. package/studio/client/_app/immutable/chunks/Ccg49IMO.js.br +0 -0
  745. package/studio/client/_app/immutable/chunks/Ccg49IMO.js.gz +0 -0
  746. package/studio/client/_app/immutable/chunks/CidmzZr_.js +0 -99
  747. package/studio/client/_app/immutable/chunks/CidmzZr_.js.br +0 -0
  748. package/studio/client/_app/immutable/chunks/CidmzZr_.js.gz +0 -0
  749. package/studio/client/_app/immutable/chunks/CmzRa5tW.js +0 -1
  750. package/studio/client/_app/immutable/chunks/CmzRa5tW.js.br +0 -0
  751. package/studio/client/_app/immutable/chunks/CmzRa5tW.js.gz +0 -0
  752. package/studio/client/_app/immutable/chunks/Cu3vhtIm.js +0 -1
  753. package/studio/client/_app/immutable/chunks/Cu3vhtIm.js.br +0 -3
  754. package/studio/client/_app/immutable/chunks/Cu3vhtIm.js.gz +0 -0
  755. package/studio/client/_app/immutable/chunks/D1jFvxj0.js +0 -1
  756. package/studio/client/_app/immutable/chunks/D1jFvxj0.js.br +0 -0
  757. package/studio/client/_app/immutable/chunks/D1jFvxj0.js.gz +0 -0
  758. package/studio/client/_app/immutable/chunks/DGsO816A.js +0 -1
  759. package/studio/client/_app/immutable/chunks/DGsO816A.js.br +0 -1
  760. package/studio/client/_app/immutable/chunks/DGsO816A.js.gz +0 -0
  761. package/studio/client/_app/immutable/chunks/DKZDxza2.js +0 -1
  762. package/studio/client/_app/immutable/chunks/DKZDxza2.js.br +0 -0
  763. package/studio/client/_app/immutable/chunks/DKZDxza2.js.gz +0 -0
  764. package/studio/client/_app/immutable/chunks/DWycBSvS.js +0 -1
  765. package/studio/client/_app/immutable/chunks/DWycBSvS.js.br +0 -0
  766. package/studio/client/_app/immutable/chunks/DWycBSvS.js.gz +0 -0
  767. package/studio/client/_app/immutable/chunks/DaYfM_aT.js +0 -512
  768. package/studio/client/_app/immutable/chunks/DaYfM_aT.js.br +0 -0
  769. package/studio/client/_app/immutable/chunks/DaYfM_aT.js.gz +0 -0
  770. package/studio/client/_app/immutable/chunks/Dgdpq5VR.js +0 -1
  771. package/studio/client/_app/immutable/chunks/Dgdpq5VR.js.br +0 -0
  772. package/studio/client/_app/immutable/chunks/Dgdpq5VR.js.gz +0 -0
  773. package/studio/client/_app/immutable/chunks/DlBik49G.js +0 -1
  774. package/studio/client/_app/immutable/chunks/DlBik49G.js.br +0 -0
  775. package/studio/client/_app/immutable/chunks/DlBik49G.js.gz +0 -0
  776. package/studio/client/_app/immutable/chunks/DnZvuu1V.js +0 -1
  777. package/studio/client/_app/immutable/chunks/DnZvuu1V.js.br +0 -0
  778. package/studio/client/_app/immutable/chunks/DnZvuu1V.js.gz +0 -0
  779. package/studio/client/_app/immutable/chunks/Dru5mrF1.js +0 -1
  780. package/studio/client/_app/immutable/chunks/Dru5mrF1.js.br +0 -0
  781. package/studio/client/_app/immutable/chunks/Dru5mrF1.js.gz +0 -0
  782. package/studio/client/_app/immutable/chunks/DtOmmgoM.js +0 -4
  783. package/studio/client/_app/immutable/chunks/DtOmmgoM.js.br +0 -0
  784. package/studio/client/_app/immutable/chunks/DtOmmgoM.js.gz +0 -0
  785. package/studio/client/_app/immutable/chunks/DvcCXeL2.js +0 -1
  786. package/studio/client/_app/immutable/chunks/DvcCXeL2.js.br +0 -0
  787. package/studio/client/_app/immutable/chunks/DvcCXeL2.js.gz +0 -0
  788. package/studio/client/_app/immutable/chunks/DvvYiUNt.js +0 -4
  789. package/studio/client/_app/immutable/chunks/DvvYiUNt.js.br +0 -0
  790. package/studio/client/_app/immutable/chunks/DvvYiUNt.js.gz +0 -0
  791. package/studio/client/_app/immutable/chunks/DzAxJut6.js +0 -1
  792. package/studio/client/_app/immutable/chunks/DzAxJut6.js.br +0 -0
  793. package/studio/client/_app/immutable/chunks/DzAxJut6.js.gz +0 -0
  794. package/studio/client/_app/immutable/chunks/FKE3oSoF.js +0 -2
  795. package/studio/client/_app/immutable/chunks/FKE3oSoF.js.br +0 -0
  796. package/studio/client/_app/immutable/chunks/FKE3oSoF.js.gz +0 -0
  797. package/studio/client/_app/immutable/chunks/GL0yz1Mp.js +0 -1
  798. package/studio/client/_app/immutable/chunks/GL0yz1Mp.js.br +0 -0
  799. package/studio/client/_app/immutable/chunks/GL0yz1Mp.js.gz +0 -0
  800. package/studio/client/_app/immutable/chunks/IIGX7hY5.js +0 -1
  801. package/studio/client/_app/immutable/chunks/IIGX7hY5.js.br +0 -0
  802. package/studio/client/_app/immutable/chunks/IIGX7hY5.js.gz +0 -0
  803. package/studio/client/_app/immutable/chunks/KMhWafV2.js +0 -1
  804. package/studio/client/_app/immutable/chunks/KMhWafV2.js.br +0 -0
  805. package/studio/client/_app/immutable/chunks/KMhWafV2.js.gz +0 -0
  806. package/studio/client/_app/immutable/chunks/R0PS9H7p.js +0 -1
  807. package/studio/client/_app/immutable/chunks/R0PS9H7p.js.br +0 -0
  808. package/studio/client/_app/immutable/chunks/R0PS9H7p.js.gz +0 -0
  809. package/studio/client/_app/immutable/chunks/_y8Y_bWZ.js +0 -2
  810. package/studio/client/_app/immutable/chunks/_y8Y_bWZ.js.br +0 -0
  811. package/studio/client/_app/immutable/chunks/_y8Y_bWZ.js.gz +0 -0
  812. package/studio/client/_app/immutable/chunks/a4b4Uis3.js +0 -1
  813. package/studio/client/_app/immutable/chunks/a4b4Uis3.js.br +0 -0
  814. package/studio/client/_app/immutable/chunks/a4b4Uis3.js.gz +0 -0
  815. package/studio/client/_app/immutable/chunks/bGtUFIGQ.js +0 -1
  816. package/studio/client/_app/immutable/chunks/bGtUFIGQ.js.br +0 -0
  817. package/studio/client/_app/immutable/chunks/bGtUFIGQ.js.gz +0 -0
  818. package/studio/client/_app/immutable/chunks/nTtOQUuo.js +0 -1
  819. package/studio/client/_app/immutable/chunks/nTtOQUuo.js.br +0 -0
  820. package/studio/client/_app/immutable/chunks/nTtOQUuo.js.gz +0 -0
  821. package/studio/client/_app/immutable/entry/app.BlMsBed_.js +0 -2
  822. package/studio/client/_app/immutable/entry/app.BlMsBed_.js.br +0 -0
  823. package/studio/client/_app/immutable/entry/app.BlMsBed_.js.gz +0 -0
  824. package/studio/client/_app/immutable/entry/start.Br1JKkZD.js +0 -1
  825. package/studio/client/_app/immutable/entry/start.Br1JKkZD.js.br +0 -0
  826. package/studio/client/_app/immutable/entry/start.Br1JKkZD.js.gz +0 -0
  827. package/studio/client/_app/immutable/nodes/0.CH4rtrFP.js +0 -2
  828. package/studio/client/_app/immutable/nodes/0.CH4rtrFP.js.br +0 -0
  829. package/studio/client/_app/immutable/nodes/0.CH4rtrFP.js.gz +0 -0
  830. package/studio/client/_app/immutable/nodes/1.BA5TTBGM.js +0 -1
  831. package/studio/client/_app/immutable/nodes/1.BA5TTBGM.js.br +0 -0
  832. package/studio/client/_app/immutable/nodes/1.BA5TTBGM.js.gz +0 -0
  833. package/studio/client/_app/immutable/nodes/10.DjmeS5CE.js +0 -1
  834. package/studio/client/_app/immutable/nodes/10.DjmeS5CE.js.br +0 -0
  835. package/studio/client/_app/immutable/nodes/10.DjmeS5CE.js.gz +0 -0
  836. package/studio/client/_app/immutable/nodes/11.B5lOMsv4.js +0 -1
  837. package/studio/client/_app/immutable/nodes/11.B5lOMsv4.js.br +0 -0
  838. package/studio/client/_app/immutable/nodes/11.B5lOMsv4.js.gz +0 -0
  839. package/studio/client/_app/immutable/nodes/12.Bdh67hUI.js +0 -2
  840. package/studio/client/_app/immutable/nodes/12.Bdh67hUI.js.br +0 -0
  841. package/studio/client/_app/immutable/nodes/12.Bdh67hUI.js.gz +0 -0
  842. package/studio/client/_app/immutable/nodes/13.DeCCmCaZ.js +0 -1
  843. package/studio/client/_app/immutable/nodes/13.DeCCmCaZ.js.br +0 -0
  844. package/studio/client/_app/immutable/nodes/13.DeCCmCaZ.js.gz +0 -0
  845. package/studio/client/_app/immutable/nodes/14.BK_MYNTB.js +0 -1
  846. package/studio/client/_app/immutable/nodes/14.BK_MYNTB.js.br +0 -0
  847. package/studio/client/_app/immutable/nodes/14.BK_MYNTB.js.gz +0 -0
  848. package/studio/client/_app/immutable/nodes/15.DTOUruaa.js +0 -1
  849. package/studio/client/_app/immutable/nodes/15.DTOUruaa.js.br +0 -0
  850. package/studio/client/_app/immutable/nodes/15.DTOUruaa.js.gz +0 -0
  851. package/studio/client/_app/immutable/nodes/16.4YmSrppF.js +0 -8
  852. package/studio/client/_app/immutable/nodes/16.4YmSrppF.js.br +0 -0
  853. package/studio/client/_app/immutable/nodes/16.4YmSrppF.js.gz +0 -0
  854. package/studio/client/_app/immutable/nodes/17.DUeNi0aB.js +0 -1
  855. package/studio/client/_app/immutable/nodes/17.DUeNi0aB.js.br +0 -0
  856. package/studio/client/_app/immutable/nodes/17.DUeNi0aB.js.gz +0 -0
  857. package/studio/client/_app/immutable/nodes/18.DilqYUUv.js +0 -1
  858. package/studio/client/_app/immutable/nodes/18.DilqYUUv.js.br +0 -0
  859. package/studio/client/_app/immutable/nodes/18.DilqYUUv.js.gz +0 -0
  860. package/studio/client/_app/immutable/nodes/19.QEH9WR1D.js +0 -1
  861. package/studio/client/_app/immutable/nodes/19.QEH9WR1D.js.br +0 -0
  862. package/studio/client/_app/immutable/nodes/19.QEH9WR1D.js.gz +0 -0
  863. package/studio/client/_app/immutable/nodes/20.DIa-6Wtj.js +0 -45
  864. package/studio/client/_app/immutable/nodes/20.DIa-6Wtj.js.br +0 -0
  865. package/studio/client/_app/immutable/nodes/20.DIa-6Wtj.js.gz +0 -0
  866. package/studio/client/_app/immutable/nodes/21.C7plrZc8.js +0 -16
  867. package/studio/client/_app/immutable/nodes/21.C7plrZc8.js.br +0 -0
  868. package/studio/client/_app/immutable/nodes/21.C7plrZc8.js.gz +0 -0
  869. package/studio/client/_app/immutable/nodes/3._qhjdqhg.js +0 -1
  870. package/studio/client/_app/immutable/nodes/3._qhjdqhg.js.br +0 -0
  871. package/studio/client/_app/immutable/nodes/3._qhjdqhg.js.gz +0 -0
  872. package/studio/client/_app/immutable/nodes/38.DwvBsnGj.js +0 -1
  873. package/studio/client/_app/immutable/nodes/38.DwvBsnGj.js.br +0 -0
  874. package/studio/client/_app/immutable/nodes/38.DwvBsnGj.js.gz +0 -0
  875. package/studio/client/_app/immutable/nodes/4.R0oJOWD_.js +0 -1
  876. package/studio/client/_app/immutable/nodes/4.R0oJOWD_.js.br +0 -0
  877. package/studio/client/_app/immutable/nodes/4.R0oJOWD_.js.gz +0 -0
  878. package/studio/client/_app/immutable/nodes/40.BVTwXIYj.js +0 -15
  879. package/studio/client/_app/immutable/nodes/40.BVTwXIYj.js.br +0 -0
  880. package/studio/client/_app/immutable/nodes/40.BVTwXIYj.js.gz +0 -0
  881. package/studio/client/_app/immutable/nodes/41.Dmbm2Egz.js +0 -1
  882. package/studio/client/_app/immutable/nodes/41.Dmbm2Egz.js.br +0 -0
  883. package/studio/client/_app/immutable/nodes/41.Dmbm2Egz.js.gz +0 -0
  884. package/studio/client/_app/immutable/nodes/42.D205SuZX.js +0 -1
  885. package/studio/client/_app/immutable/nodes/42.D205SuZX.js.br +0 -0
  886. package/studio/client/_app/immutable/nodes/42.D205SuZX.js.gz +0 -0
  887. package/studio/client/_app/immutable/nodes/43.Bg1auisF.js +0 -1
  888. package/studio/client/_app/immutable/nodes/43.Bg1auisF.js.br +0 -0
  889. package/studio/client/_app/immutable/nodes/43.Bg1auisF.js.gz +0 -0
  890. package/studio/client/_app/immutable/nodes/44.CPLxW4El.js +0 -1
  891. package/studio/client/_app/immutable/nodes/44.CPLxW4El.js.br +0 -0
  892. package/studio/client/_app/immutable/nodes/44.CPLxW4El.js.gz +0 -0
  893. package/studio/client/_app/immutable/nodes/45.DSssrLbd.js +0 -2
  894. package/studio/client/_app/immutable/nodes/45.DSssrLbd.js.br +0 -0
  895. package/studio/client/_app/immutable/nodes/45.DSssrLbd.js.gz +0 -0
  896. package/studio/client/_app/immutable/nodes/46.CmYGMWb4.js +0 -1
  897. package/studio/client/_app/immutable/nodes/46.CmYGMWb4.js.br +0 -0
  898. package/studio/client/_app/immutable/nodes/46.CmYGMWb4.js.gz +0 -0
  899. package/studio/client/_app/immutable/nodes/47.DJ6V3A94.js +0 -1
  900. package/studio/client/_app/immutable/nodes/47.DJ6V3A94.js.br +0 -0
  901. package/studio/client/_app/immutable/nodes/47.DJ6V3A94.js.gz +0 -0
  902. package/studio/client/_app/immutable/nodes/48.BOPN4KRW.js +0 -1
  903. package/studio/client/_app/immutable/nodes/48.BOPN4KRW.js.br +0 -0
  904. package/studio/client/_app/immutable/nodes/48.BOPN4KRW.js.gz +0 -0
  905. package/studio/client/_app/immutable/nodes/49.7I6h2rM6.js +0 -7
  906. package/studio/client/_app/immutable/nodes/49.7I6h2rM6.js.br +0 -0
  907. package/studio/client/_app/immutable/nodes/49.7I6h2rM6.js.gz +0 -0
  908. package/studio/client/_app/immutable/nodes/5.R0oJOWD_.js +0 -1
  909. package/studio/client/_app/immutable/nodes/5.R0oJOWD_.js.br +0 -0
  910. package/studio/client/_app/immutable/nodes/5.R0oJOWD_.js.gz +0 -0
  911. package/studio/client/_app/immutable/nodes/7.VcgX8ZgJ.js +0 -1
  912. package/studio/client/_app/immutable/nodes/7.VcgX8ZgJ.js.br +0 -0
  913. package/studio/client/_app/immutable/nodes/7.VcgX8ZgJ.js.gz +0 -0
  914. package/studio/client/_app/immutable/nodes/8.ZwVfexZ0.js +0 -1
  915. package/studio/client/_app/immutable/nodes/8.ZwVfexZ0.js.br +0 -0
  916. package/studio/client/_app/immutable/nodes/8.ZwVfexZ0.js.gz +0 -0
  917. package/studio/client/_app/immutable/nodes/9.DPwqLu6G.js +0 -1
  918. package/studio/client/_app/immutable/nodes/9.DPwqLu6G.js.br +0 -0
  919. package/studio/client/_app/immutable/nodes/9.DPwqLu6G.js.gz +0 -0
  920. package/studio/server/chunks/0-DrCbOn_U.js +0 -32
  921. package/studio/server/chunks/0-DrCbOn_U.js.map +0 -1
  922. package/studio/server/chunks/1-BHuYqaGp.js +0 -9
  923. package/studio/server/chunks/1-BHuYqaGp.js.map +0 -1
  924. package/studio/server/chunks/11-DcT9eofp.js +0 -9
  925. package/studio/server/chunks/11-DcT9eofp.js.map +0 -1
  926. package/studio/server/chunks/12-Br9qZR1c.js +0 -9
  927. package/studio/server/chunks/12-Br9qZR1c.js.map +0 -1
  928. package/studio/server/chunks/13-CXLQr4dU.js +0 -59
  929. package/studio/server/chunks/13-CXLQr4dU.js.map +0 -1
  930. package/studio/server/chunks/14-BcReNzGU.js +0 -60
  931. package/studio/server/chunks/14-BcReNzGU.js.map +0 -1
  932. package/studio/server/chunks/15-BR8pxyN_.js +0 -9
  933. package/studio/server/chunks/15-BR8pxyN_.js.map +0 -1
  934. package/studio/server/chunks/16-B-CvhSUs.js +0 -72
  935. package/studio/server/chunks/16-B-CvhSUs.js.map +0 -1
  936. package/studio/server/chunks/17-BLykPSq7.js +0 -9
  937. package/studio/server/chunks/17-BLykPSq7.js.map +0 -1
  938. package/studio/server/chunks/18-C7DjU0t5.js +0 -9
  939. package/studio/server/chunks/18-C7DjU0t5.js.map +0 -1
  940. package/studio/server/chunks/19-Cq0Qyivk.js +0 -9
  941. package/studio/server/chunks/19-Cq0Qyivk.js.map +0 -1
  942. package/studio/server/chunks/20-CRk87lvq.js +0 -139
  943. package/studio/server/chunks/20-CRk87lvq.js.map +0 -1
  944. package/studio/server/chunks/3-ChhTSXfT.js +0 -9
  945. package/studio/server/chunks/3-ChhTSXfT.js.map +0 -1
  946. package/studio/server/chunks/4-B9vyTnuL.js +0 -9
  947. package/studio/server/chunks/4-B9vyTnuL.js.map +0 -1
  948. package/studio/server/chunks/42-DOBpFqDR.js +0 -56
  949. package/studio/server/chunks/42-DOBpFqDR.js.map +0 -1
  950. package/studio/server/chunks/43-DRw-2-GS.js +0 -9
  951. package/studio/server/chunks/43-DRw-2-GS.js.map +0 -1
  952. package/studio/server/chunks/44-DLxClkX_.js +0 -9
  953. package/studio/server/chunks/44-DLxClkX_.js.map +0 -1
  954. package/studio/server/chunks/45-wVQw8tBx.js +0 -115
  955. package/studio/server/chunks/45-wVQw8tBx.js.map +0 -1
  956. package/studio/server/chunks/49-CSfj1Xtu.js +0 -14
  957. package/studio/server/chunks/49-CSfj1Xtu.js.map +0 -1
  958. package/studio/server/chunks/5-8UA2oVVT.js +0 -9
  959. package/studio/server/chunks/5-8UA2oVVT.js.map +0 -1
  960. package/studio/server/chunks/7-judL9OYr.js +0 -215
  961. package/studio/server/chunks/7-judL9OYr.js.map +0 -1
  962. package/studio/server/chunks/_error.svelte-C3N4FEB2.js +0 -98
  963. package/studio/server/chunks/_error.svelte-C3N4FEB2.js.map +0 -1
  964. package/studio/server/chunks/_error.svelte-C7sYQCnM.js +0 -98
  965. package/studio/server/chunks/_error.svelte-C7sYQCnM.js.map +0 -1
  966. package/studio/server/chunks/_layout.svelte-B7vWmRFJ.js +0 -64
  967. package/studio/server/chunks/_layout.svelte-B7vWmRFJ.js.map +0 -1
  968. package/studio/server/chunks/_layout.svelte-BIVwEY2g.js +0 -1054
  969. package/studio/server/chunks/_layout.svelte-BIVwEY2g.js.map +0 -1
  970. package/studio/server/chunks/_layout.svelte-CDrHT5wt.js +0 -400
  971. package/studio/server/chunks/_layout.svelte-CDrHT5wt.js.map +0 -1
  972. package/studio/server/chunks/_layout.svelte-DAYtUucm.js +0 -64
  973. package/studio/server/chunks/_layout.svelte-DAYtUucm.js.map +0 -1
  974. package/studio/server/chunks/_page.svelte-B1cMW63M.js +0 -79
  975. package/studio/server/chunks/_page.svelte-B1cMW63M.js.map +0 -1
  976. package/studio/server/chunks/_page.svelte-BL2j2QYJ.js +0 -192
  977. package/studio/server/chunks/_page.svelte-BL2j2QYJ.js.map +0 -1
  978. package/studio/server/chunks/_page.svelte-BiTflcHr.js +0 -111
  979. package/studio/server/chunks/_page.svelte-BiTflcHr.js.map +0 -1
  980. package/studio/server/chunks/_page.svelte-BwEzxkCN.js +0 -418
  981. package/studio/server/chunks/_page.svelte-BwEzxkCN.js.map +0 -1
  982. package/studio/server/chunks/_page.svelte-ByzdoeDB.js +0 -11350
  983. package/studio/server/chunks/_page.svelte-ByzdoeDB.js.map +0 -1
  984. package/studio/server/chunks/_page.svelte-CSU5TGt6.js +0 -1732
  985. package/studio/server/chunks/_page.svelte-CSU5TGt6.js.map +0 -1
  986. package/studio/server/chunks/_page.svelte-Ch08b7on.js +0 -256
  987. package/studio/server/chunks/_page.svelte-Ch08b7on.js.map +0 -1
  988. package/studio/server/chunks/_page.svelte-CyAzKzS1.js +0 -506
  989. package/studio/server/chunks/_page.svelte-CyAzKzS1.js.map +0 -1
  990. package/studio/server/chunks/_page.svelte-D3NFENjP.js +0 -113
  991. package/studio/server/chunks/_page.svelte-D3NFENjP.js.map +0 -1
  992. package/studio/server/chunks/_page.svelte-DoI4FMeA.js +0 -319
  993. package/studio/server/chunks/_page.svelte-DoI4FMeA.js.map +0 -1
  994. package/studio/server/chunks/_page.svelte-az4tVjJ_.js +0 -1021
  995. package/studio/server/chunks/_page.svelte-az4tVjJ_.js.map +0 -1
  996. package/studio/server/chunks/_server.ts-BsgeMvN0.js +0 -722
  997. package/studio/server/chunks/_server.ts-BsgeMvN0.js.map +0 -1
  998. package/studio/server/chunks/_server.ts-CBlNBm5s.js +0 -70
  999. package/studio/server/chunks/_server.ts-CBlNBm5s.js.map +0 -1
  1000. package/studio/server/chunks/_server.ts-CLHP8Zrh.js +0 -109
  1001. package/studio/server/chunks/_server.ts-CLHP8Zrh.js.map +0 -1
  1002. package/studio/server/chunks/_server.ts-Cd1TmSSo.js +0 -303
  1003. package/studio/server/chunks/_server.ts-Cd1TmSSo.js.map +0 -1
  1004. package/studio/server/chunks/_server.ts-CkVDrj32.js +0 -79
  1005. package/studio/server/chunks/_server.ts-CkVDrj32.js.map +0 -1
  1006. package/studio/server/chunks/_server.ts-DA3zdbWI.js +0 -48
  1007. package/studio/server/chunks/_server.ts-DA3zdbWI.js.map +0 -1
  1008. package/studio/server/chunks/_server.ts-Da8qrASe.js +0 -118
  1009. package/studio/server/chunks/_server.ts-Da8qrASe.js.map +0 -1
  1010. package/studio/server/chunks/_server.ts-Dcr0g4Vq.js +0 -52
  1011. package/studio/server/chunks/_server.ts-Dcr0g4Vq.js.map +0 -1
  1012. package/studio/server/chunks/_server.ts-DxwlzaT7.js +0 -122
  1013. package/studio/server/chunks/_server.ts-DxwlzaT7.js.map +0 -1
  1014. package/studio/server/chunks/_server.ts-KHs6y_Wc.js +0 -760
  1015. package/studio/server/chunks/_server.ts-KHs6y_Wc.js.map +0 -1
  1016. package/studio/server/chunks/_server.ts-_eJk5Eiu.js +0 -91
  1017. package/studio/server/chunks/_server.ts-_eJk5Eiu.js.map +0 -1
  1018. package/studio/server/chunks/admin.remote-C-MAmmW-.js +0 -105
  1019. package/studio/server/chunks/admin.remote-C-MAmmW-.js.map +0 -1
  1020. package/studio/server/chunks/ai-access-Cm_VC4xc.js +0 -299
  1021. package/studio/server/chunks/ai-access-Cm_VC4xc.js.map +0 -1
  1022. package/studio/server/chunks/ai.remote-waQUpsLn.js +0 -37
  1023. package/studio/server/chunks/ai.remote-waQUpsLn.js.map +0 -1
  1024. package/studio/server/chunks/alert-dialog-description-B4VfiJRT.js +0 -578
  1025. package/studio/server/chunks/alert-dialog-description-B4VfiJRT.js.map +0 -1
  1026. package/studio/server/chunks/app-header-Ck_YeZr5.js +0 -96
  1027. package/studio/server/chunks/app-header-Ck_YeZr5.js.map +0 -1
  1028. package/studio/server/chunks/auth-mx1dhuCn.js +0 -22472
  1029. package/studio/server/chunks/auth-mx1dhuCn.js.map +0 -1
  1030. package/studio/server/chunks/auth.remote-CN4se14K.js +0 -351
  1031. package/studio/server/chunks/auth.remote-CN4se14K.js.map +0 -1
  1032. package/studio/server/chunks/bun-sqlite-dialect-C8OaCWSL-BNevlRD6.js +0 -197
  1033. package/studio/server/chunks/bun-sqlite-dialect-C8OaCWSL-BNevlRD6.js.map +0 -1
  1034. package/studio/server/chunks/captions.remote-Pp1JQnfB.js +0 -184
  1035. package/studio/server/chunks/captions.remote-Pp1JQnfB.js.map +0 -1
  1036. package/studio/server/chunks/client2-DNrSxzuu.js +0 -66
  1037. package/studio/server/chunks/client2-DNrSxzuu.js.map +0 -1
  1038. package/studio/server/chunks/d1-sqlite-dialect-sYHNqBte-D67tOo2R.js +0 -160
  1039. package/studio/server/chunks/d1-sqlite-dialect-sYHNqBte-D67tOo2R.js.map +0 -1
  1040. package/studio/server/chunks/desktop-bootstrap-IVK9LbDz.js +0 -67
  1041. package/studio/server/chunks/desktop-bootstrap-IVK9LbDz.js.map +0 -1
  1042. package/studio/server/chunks/dubbing.remote-CZkC5M_a.js +0 -153
  1043. package/studio/server/chunks/dubbing.remote-CZkC5M_a.js.map +0 -1
  1044. package/studio/server/chunks/editor.svelte-Dd-2ZfWO.js +0 -21027
  1045. package/studio/server/chunks/editor.svelte-Dd-2ZfWO.js.map +0 -1
  1046. package/studio/server/chunks/find-stock-image-DDfrK_rA.js +0 -709
  1047. package/studio/server/chunks/find-stock-image-DDfrK_rA.js.map +0 -1
  1048. package/studio/server/chunks/hooks.server-DcXHGCUQ.js +0 -309
  1049. package/studio/server/chunks/hooks.server-DcXHGCUQ.js.map +0 -1
  1050. package/studio/server/chunks/image-generation.remote-GIIJ69ro.js +0 -140
  1051. package/studio/server/chunks/image-generation.remote-GIIJ69ro.js.map +0 -1
  1052. package/studio/server/chunks/index-Bz4Ugmn7.js +0 -4578
  1053. package/studio/server/chunks/index-Bz4Ugmn7.js.map +0 -1
  1054. package/studio/server/chunks/index12-CP2lVQd1.js +0 -265
  1055. package/studio/server/chunks/index12-CP2lVQd1.js.map +0 -1
  1056. package/studio/server/chunks/index2-BvzNGjoj.js +0 -23
  1057. package/studio/server/chunks/index2-BvzNGjoj.js.map +0 -1
  1058. package/studio/server/chunks/index3-B3arCRqx.js +0 -8
  1059. package/studio/server/chunks/index3-B3arCRqx.js.map +0 -1
  1060. package/studio/server/chunks/index4-ByfR32IV.js +0 -48
  1061. package/studio/server/chunks/index4-ByfR32IV.js.map +0 -1
  1062. package/studio/server/chunks/layout-template-DRFNZLVI.js +0 -1371
  1063. package/studio/server/chunks/layout-template-DRFNZLVI.js.map +0 -1
  1064. package/studio/server/chunks/media-analysis-Ch1fmDUt.js +0 -229
  1065. package/studio/server/chunks/media-analysis-Ch1fmDUt.js.map +0 -1
  1066. package/studio/server/chunks/media-analysis.remote-yI6aCZ78.js +0 -63
  1067. package/studio/server/chunks/media-analysis.remote-yI6aCZ78.js.map +0 -1
  1068. package/studio/server/chunks/mutations-CkUdOAoa.js +0 -551
  1069. package/studio/server/chunks/mutations-CkUdOAoa.js.map +0 -1
  1070. package/studio/server/chunks/node-sqlite-dialect-Di8ZYXD0.js +0 -197
  1071. package/studio/server/chunks/node-sqlite-dialect-Di8ZYXD0.js.map +0 -1
  1072. package/studio/server/chunks/onboarding-email-BvuCl7dz.js +0 -311
  1073. package/studio/server/chunks/onboarding-email-BvuCl7dz.js.map +0 -1
  1074. package/studio/server/chunks/projects.remote-ipNnrM1d.js +0 -297
  1075. package/studio/server/chunks/projects.remote-ipNnrM1d.js.map +0 -1
  1076. package/studio/server/chunks/queue-init-C_8i6pyv.js +0 -38
  1077. package/studio/server/chunks/queue-init-C_8i6pyv.js.map +0 -1
  1078. package/studio/server/chunks/registry-z2-pQ1Jw.js +0 -18
  1079. package/studio/server/chunks/registry-z2-pQ1Jw.js.map +0 -1
  1080. package/studio/server/chunks/registry2-BhwPna1F.js +0 -4851
  1081. package/studio/server/chunks/registry2-BhwPna1F.js.map +0 -1
  1082. package/studio/server/chunks/remote-1ez0sx-DKZ6ubnB.js +0 -34
  1083. package/studio/server/chunks/remote-1ez0sx-DKZ6ubnB.js.map +0 -1
  1084. package/studio/server/chunks/remote-1mi3j6d-4ClkS6sd.js +0 -21
  1085. package/studio/server/chunks/remote-1mi3j6d-4ClkS6sd.js.map +0 -1
  1086. package/studio/server/chunks/remote-1web5fy-Bw0AJHlD.js +0 -35
  1087. package/studio/server/chunks/remote-1web5fy-Bw0AJHlD.js.map +0 -1
  1088. package/studio/server/chunks/remote-5mu9ty-DKqUPY8s.js +0 -31
  1089. package/studio/server/chunks/remote-5mu9ty-DKqUPY8s.js.map +0 -1
  1090. package/studio/server/chunks/remote-gezfls-CbSTOGmI.js +0 -21
  1091. package/studio/server/chunks/remote-gezfls-CbSTOGmI.js.map +0 -1
  1092. package/studio/server/chunks/remote-sy19x7-BZ5ceu8t.js +0 -29
  1093. package/studio/server/chunks/remote-sy19x7-BZ5ceu8t.js.map +0 -1
  1094. package/studio/server/chunks/remote-tisyb0-ChggPTNB.js +0 -31
  1095. package/studio/server/chunks/remote-tisyb0-ChggPTNB.js.map +0 -1
  1096. package/studio/server/chunks/remote-xj8myv-DruftVtE.js +0 -31
  1097. package/studio/server/chunks/remote-xj8myv-DruftVtE.js.map +0 -1
  1098. package/studio/server/chunks/remote-z7lvth-D_9BqgW_.js +0 -23
  1099. package/studio/server/chunks/remote-z7lvth-D_9BqgW_.js.map +0 -1
  1100. package/studio/server/chunks/remote-zjib3m-DnAqo6l6.js +0 -24
  1101. package/studio/server/chunks/remote-zjib3m-DnAqo6l6.js.map +0 -1
  1102. package/studio/server/chunks/scrub-xyz.svelte_svelte_type_style_lang-D5bzSlf5.js +0 -4752
  1103. package/studio/server/chunks/scrub-xyz.svelte_svelte_type_style_lang-D5bzSlf5.js.map +0 -1
  1104. package/studio/server/chunks/tooltip-provider-Y8-pmG0D.js +0 -30
  1105. package/studio/server/chunks/tooltip-provider-Y8-pmG0D.js.map +0 -1
  1106. package/studio/server/chunks/tooltip.svelte-CMQZQZ-r.js +0 -658
  1107. package/studio/server/chunks/tooltip.svelte-CMQZQZ-r.js.map +0 -1
  1108. package/studio/server/chunks/tts.remote-BERCmX-n.js +0 -194
  1109. package/studio/server/chunks/tts.remote-BERCmX-n.js.map +0 -1
  1110. package/studio/server/chunks/ui.svelte-DSRn4LdL.js +0 -88
  1111. package/studio/server/chunks/ui.svelte-DSRn4LdL.js.map +0 -1
  1112. package/studio/server/chunks/video-generation.remote-DkDf_BYp.js +0 -197
  1113. package/studio/server/chunks/video-generation.remote-DkDf_BYp.js.map +0 -1
  1114. package/studio/server/chunks/watermark-u8k4sZA3.js +0 -164
  1115. package/studio/server/chunks/watermark-u8k4sZA3.js.map +0 -1
@@ -0,0 +1,4851 @@
1
+ import { G as GenerateVideoSchema, p as pxToPct, h as createLayer, m as runAction, b as generateVideoAction, t as toPct, k as round1, d as dubAudioAction, c as generateCaptionsAction, n as dubLanguages, j as deviceSize } from './find-stock-image-Cwkwf5gV.js';
2
+ import './async-lVJA8xJZ.js';
3
+ import { d as spread_props, w as attr_class, o as stringify, t as attr, i as escape_html, h as derived, f as bind_props, p as props_id, a as attributes, e as ensure_array_like, c as clsx } from './index9-D9BBZH26.js';
4
+ import { B as Button, L as Loader_circle, c as cn } from './button-EIkCOf5j.js';
5
+ import { r as requestUpload, c as confirmUpload } from './upload.remote-Bhhj6ZvH.js';
6
+ import { e as extractMediaMetadataFromUrl, f as formatDuration$1, b as formatFileSize } from './media-v9Bq2kuR.js';
7
+ import { I as Icon } from './Icon-DbEXclx7.js';
8
+ import { b4 as Smartphone, u as Sparkles, b5 as Languages, b6 as Captions, b7 as Laptop, b8 as defaultBackground, b9 as meta$d, ba as Camera, bb as Image, bc as Mic, bd as Video, ao as Popover, a9 as Square, ap as Popover_trigger, aq as Popover_content, q as Debounced, r as Search, s as Select_1, B as getEditorState, be as useId, bf as Previous, bg as isFunction$1, n as noop$1, aM as Floating_layer, C as Check, bh as Music, e as Portal$1, aT as Popper_layer_force_mount, aU as Popper_layer, aV as getFloatingContentCSSVars, bi as FloatingArrowState, bj as External_link } from './editor.svelte-Bdv5LaOt.js';
9
+ import { j as BackgroundValueSchema, f as fieldRegistry, i as createFromSchema } from './animation-sOd5R1cE.js';
10
+ import { z } from 'zod';
11
+ import { u as uiStore } from './ui.svelte-FJio-gZM.js';
12
+ import { M as MAX_FILE_SIZES, R as RECORDER_STOP_THRESHOLD } from './index6-BwFC1GDh.js';
13
+ import { G as Globe, X } from './x-dSB6BXUp.js';
14
+ import { c as createBitsAttrs, I as Input, e as createId, b as boxWith, a as attachRef, m as mergeProps, s as simpleBox, i as executeCallbacks } from './input-C1z0Nn4U.js';
15
+ import { a as watch, C as Context, D as DOMContext, w as watch$1 } from './copy-gHAQZ-hc.js';
16
+ import { o as on } from './root-DjEsp22s.js';
17
+ import { a as TooltipRootState, b as TooltipTriggerState, c as TooltipContentState } from './tooltip.svelte-DRe72lD-.js';
18
+ import { s as searchLummiImages } from './lummi.remote-BMN4XopC.js';
19
+ import { g as getUserAssets } from './assets.remote-CX2FvnlZ.js';
20
+ import { C as Chevron_left, a as Chevron_right } from './arrow-right-Ba81Wr45.js';
21
+ import './event-DmhHnWT5.js';
22
+ import './exports-5qhW9hr2.js';
23
+ import './client3-6wS0pbKv.js';
24
+ import './base-qepI6vHK.js';
25
+ import { formatStorage } from './plans-BAwNKt6H.js';
26
+ import { R as Refresh_cw } from './refresh-cw-2Dwais_j.js';
27
+ import { nanoid } from 'nanoid';
28
+ import { a as analyzeMediaAsset } from './media-analysis.remote-BVdRHeP8.js';
29
+
30
+ function Monitor($$renderer, $$props) {
31
+ $$renderer.component(($$renderer2) => {
32
+ let { $$slots, $$events, ...props } = $$props;
33
+ const iconNode = [
34
+ [
35
+ "rect",
36
+ { "width": "20", "height": "14", "x": "2", "y": "3", "rx": "2" }
37
+ ],
38
+ ["line", { "x1": "8", "x2": "16", "y1": "21", "y2": "21" }],
39
+ ["line", { "x1": "12", "x2": "12", "y1": "17", "y2": "21" }]
40
+ ];
41
+ Icon($$renderer2, spread_props([
42
+ { name: "monitor" },
43
+ /**
44
+ * @component @name Monitor
45
+ * @description Lucide SVG icon component, renders SVG Element with children.
46
+ *
47
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor
48
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
49
+ *
50
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
51
+ * @returns {FunctionalComponent} Svelte component
52
+ *
53
+ */
54
+ props,
55
+ {
56
+ iconNode,
57
+ children: ($$renderer3) => {
58
+ props.children?.($$renderer3);
59
+ $$renderer3.push(`<!---->`);
60
+ },
61
+ $$slots: { default: true }
62
+ }
63
+ ]));
64
+ });
65
+ }
66
+ function Scissors($$renderer, $$props) {
67
+ $$renderer.component(($$renderer2) => {
68
+ let { $$slots, $$events, ...props } = $$props;
69
+ const iconNode = [
70
+ ["circle", { "cx": "6", "cy": "6", "r": "3" }],
71
+ ["path", { "d": "M8.12 8.12 12 12" }],
72
+ ["path", { "d": "M20 4 8.12 15.88" }],
73
+ ["circle", { "cx": "6", "cy": "18", "r": "3" }],
74
+ ["path", { "d": "M14.8 14.8 20 20" }]
75
+ ];
76
+ Icon($$renderer2, spread_props([
77
+ { name: "scissors" },
78
+ /**
79
+ * @component @name Scissors
80
+ * @description Lucide SVG icon component, renders SVG Element with children.
81
+ *
82
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI2IiBjeT0iNiIgcj0iMyIgLz4KICA8cGF0aCBkPSJNOC4xMiA4LjEyIDEyIDEyIiAvPgogIDxwYXRoIGQ9Ik0yMCA0IDguMTIgMTUuODgiIC8+CiAgPGNpcmNsZSBjeD0iNiIgY3k9IjE4IiByPSIzIiAvPgogIDxwYXRoIGQ9Ik0xNC44IDE0LjggMjAgMjAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scissors
83
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
84
+ *
85
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
86
+ * @returns {FunctionalComponent} Svelte component
87
+ *
88
+ */
89
+ props,
90
+ {
91
+ iconNode,
92
+ children: ($$renderer3) => {
93
+ props.children?.($$renderer3);
94
+ $$renderer3.push(`<!---->`);
95
+ },
96
+ $$slots: { default: true }
97
+ }
98
+ ]));
99
+ });
100
+ }
101
+
102
+ function Monitor_play($$renderer, $$props) {
103
+ $$renderer.component(($$renderer2) => {
104
+ let { $$slots, $$events, ...props } = $$props;
105
+ const iconNode = [
106
+ [
107
+ "path",
108
+ {
109
+ "d": "M15.033 9.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56V7.648a.645.645 0 0 1 .967-.56z"
110
+ }
111
+ ],
112
+ ["path", { "d": "M12 17v4" }],
113
+ ["path", { "d": "M8 21h8" }],
114
+ [
115
+ "rect",
116
+ { "x": "2", "y": "3", "width": "20", "height": "14", "rx": "2" }
117
+ ]
118
+ ];
119
+ Icon($$renderer2, spread_props([
120
+ { name: "monitor-play" },
121
+ /**
122
+ * @component @name MonitorPlay
123
+ * @description Lucide SVG icon component, renders SVG Element with children.
124
+ *
125
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUuMDMzIDkuNDRhLjY0Ny42NDcgMCAwIDEgMCAxLjEybC00LjA2NSAyLjM1MmEuNjQ1LjY0NSAwIDAgMS0uOTY4LS41NlY3LjY0OGEuNjQ1LjY0NSAwIDAgMSAuOTY3LS41NnoiIC8+CiAgPHBhdGggZD0iTTEyIDE3djQiIC8+CiAgPHBhdGggZD0iTTggMjFoOCIgLz4KICA8cmVjdCB4PSIyIiB5PSIzIiB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/monitor-play
126
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
127
+ *
128
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
129
+ * @returns {FunctionalComponent} Svelte component
130
+ *
131
+ */
132
+ props,
133
+ {
134
+ iconNode,
135
+ children: ($$renderer3) => {
136
+ props.children?.($$renderer3);
137
+ $$renderer3.push(`<!---->`);
138
+ },
139
+ $$slots: { default: true }
140
+ }
141
+ ]));
142
+ });
143
+ }
144
+
145
+ function File($$renderer, $$props) {
146
+ $$renderer.component(($$renderer2) => {
147
+ let { $$slots, $$events, ...props } = $$props;
148
+ const iconNode = [
149
+ [
150
+ "path",
151
+ {
152
+ "d": "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"
153
+ }
154
+ ],
155
+ ["path", { "d": "M14 2v5a1 1 0 0 0 1 1h5" }]
156
+ ];
157
+ Icon($$renderer2, spread_props([
158
+ { name: "file" },
159
+ /**
160
+ * @component @name File
161
+ * @description Lucide SVG icon component, renders SVG Element with children.
162
+ *
163
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file
164
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
165
+ *
166
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
167
+ * @returns {FunctionalComponent} Svelte component
168
+ *
169
+ */
170
+ props,
171
+ {
172
+ iconNode,
173
+ children: ($$renderer3) => {
174
+ props.children?.($$renderer3);
175
+ $$renderer3.push(`<!---->`);
176
+ },
177
+ $$slots: { default: true }
178
+ }
179
+ ]));
180
+ });
181
+ }
182
+ function Folder_open($$renderer, $$props) {
183
+ $$renderer.component(($$renderer2) => {
184
+ let { $$slots, $$events, ...props } = $$props;
185
+ const iconNode = [
186
+ [
187
+ "path",
188
+ {
189
+ "d": "m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"
190
+ }
191
+ ]
192
+ ];
193
+ Icon($$renderer2, spread_props([
194
+ { name: "folder-open" },
195
+ /**
196
+ * @component @name FolderOpen
197
+ * @description Lucide SVG icon component, renders SVG Element with children.
198
+ *
199
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiAxNCAxLjUtMi45QTIgMiAwIDAgMSA5LjI0IDEwSDIwYTIgMiAwIDAgMSAxLjk0IDIuNWwtMS41NCA2YTIgMiAwIDAgMS0xLjk1IDEuNUg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgxOGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-open
200
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
201
+ *
202
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
203
+ * @returns {FunctionalComponent} Svelte component
204
+ *
205
+ */
206
+ props,
207
+ {
208
+ iconNode,
209
+ children: ($$renderer3) => {
210
+ props.children?.($$renderer3);
211
+ $$renderer3.push(`<!---->`);
212
+ },
213
+ $$slots: { default: true }
214
+ }
215
+ ]));
216
+ });
217
+ }
218
+ function Image_play($$renderer, $$props) {
219
+ $$renderer.component(($$renderer2) => {
220
+ let { $$slots, $$events, ...props } = $$props;
221
+ const iconNode = [
222
+ [
223
+ "path",
224
+ {
225
+ "d": "M15 15.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997a1 1 0 0 1-1.517-.86z"
226
+ }
227
+ ],
228
+ [
229
+ "path",
230
+ {
231
+ "d": "M21 12.17V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6"
232
+ }
233
+ ],
234
+ ["path", { "d": "m6 21 5-5" }],
235
+ ["circle", { "cx": "9", "cy": "9", "r": "2" }]
236
+ ];
237
+ Icon($$renderer2, spread_props([
238
+ { name: "image-play" },
239
+ /**
240
+ * @component @name ImagePlay
241
+ * @description Lucide SVG icon component, renders SVG Element with children.
242
+ *
243
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTUuMDAzYTEgMSAwIDAgMSAxLjUxNy0uODU5bDQuOTk3IDIuOTk3YTEgMSAwIDAgMSAwIDEuNzE4bC00Ljk5NyAyLjk5N2ExIDEgMCAwIDEtMS41MTctLjg2eiIgLz4KICA8cGF0aCBkPSJNMjEgMTIuMTdWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDYiIC8+CiAgPHBhdGggZD0ibTYgMjEgNS01IiAvPgogIDxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/image-play
244
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
245
+ *
246
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
247
+ * @returns {FunctionalComponent} Svelte component
248
+ *
249
+ */
250
+ props,
251
+ {
252
+ iconNode,
253
+ children: ($$renderer3) => {
254
+ props.children?.($$renderer3);
255
+ $$renderer3.push(`<!---->`);
256
+ },
257
+ $$slots: { default: true }
258
+ }
259
+ ]));
260
+ });
261
+ }
262
+ function Info($$renderer, $$props) {
263
+ $$renderer.component(($$renderer2) => {
264
+ let { $$slots, $$events, ...props } = $$props;
265
+ const iconNode = [
266
+ ["circle", { "cx": "12", "cy": "12", "r": "10" }],
267
+ ["path", { "d": "M12 16v-4" }],
268
+ ["path", { "d": "M12 8h.01" }]
269
+ ];
270
+ Icon($$renderer2, spread_props([
271
+ { name: "info" },
272
+ /**
273
+ * @component @name Info
274
+ * @description Lucide SVG icon component, renders SVG Element with children.
275
+ *
276
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMTZ2LTQiIC8+CiAgPHBhdGggZD0iTTEyIDhoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/info
277
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
278
+ *
279
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
280
+ * @returns {FunctionalComponent} Svelte component
281
+ *
282
+ */
283
+ props,
284
+ {
285
+ iconNode,
286
+ children: ($$renderer3) => {
287
+ props.children?.($$renderer3);
288
+ $$renderer3.push(`<!---->`);
289
+ },
290
+ $$slots: { default: true }
291
+ }
292
+ ]));
293
+ });
294
+ }
295
+ function Rotate_cw($$renderer, $$props) {
296
+ $$renderer.component(($$renderer2) => {
297
+ let { $$slots, $$events, ...props } = $$props;
298
+ const iconNode = [
299
+ [
300
+ "path",
301
+ { "d": "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }
302
+ ],
303
+ ["path", { "d": "M21 3v5h-5" }]
304
+ ];
305
+ Icon($$renderer2, spread_props([
306
+ { name: "rotate-cw" },
307
+ /**
308
+ * @component @name RotateCw
309
+ * @description Lucide SVG icon component, renders SVG Element with children.
310
+ *
311
+ * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTktOWMyLjUyIDAgNC45MyAxIDYuNzQgMi43NEwyMSA4IiAvPgogIDxwYXRoIGQ9Ik0yMSAzdjVoLTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/rotate-cw
312
+ * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation
313
+ *
314
+ * @param {Object} props - Lucide icons props and any valid SVG attribute
315
+ * @returns {FunctionalComponent} Svelte component
316
+ *
317
+ */
318
+ props,
319
+ {
320
+ iconNode,
321
+ children: ($$renderer3) => {
322
+ props.children?.($$renderer3);
323
+ $$renderer3.push(`<!---->`);
324
+ },
325
+ $$slots: { default: true }
326
+ }
327
+ ]));
328
+ });
329
+ }
330
+ async function uploadMediaBlob(blob, fileName, mediaType, _projectId, duration) {
331
+ const reqResult = await requestUpload({
332
+ fileName,
333
+ mimeType: blob.type,
334
+ size: blob.size,
335
+ mediaTypeHint: mediaType,
336
+ duration
337
+ });
338
+ if (!reqResult.success) {
339
+ throw new Error(reqResult.error);
340
+ }
341
+ const {
342
+ uploadUrl,
343
+ key,
344
+ fileUrl,
345
+ assetId,
346
+ originalName,
347
+ mediaType: resolvedMediaType
348
+ } = reqResult.data;
349
+ const putRes = await fetch(uploadUrl, {
350
+ method: "PUT",
351
+ headers: { "Content-Type": blob.type },
352
+ body: blob
353
+ });
354
+ if (!putRes.ok) {
355
+ throw new Error(`Upload failed (${putRes.status})`);
356
+ }
357
+ const confirmResult = await confirmUpload({
358
+ assetId,
359
+ key,
360
+ fileUrl,
361
+ originalName,
362
+ mimeType: blob.type,
363
+ mediaType: resolvedMediaType,
364
+ duration: duration && isFinite(duration) ? Math.floor(duration) : null
365
+ });
366
+ if (!confirmResult.success) {
367
+ throw new Error(confirmResult.error);
368
+ }
369
+ return {
370
+ url: fileUrl,
371
+ key,
372
+ fileName: originalName,
373
+ duration
374
+ };
375
+ }
376
+ function generateTimestampedFileName(prefix, extension) {
377
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
378
+ return `${prefix}-${timestamp}.${extension}`;
379
+ }
380
+ function formatDuration(seconds) {
381
+ const mins = Math.floor(seconds / 60);
382
+ const secs = seconds % 60;
383
+ return `${mins}:${secs.toString().padStart(2, "0")}`;
384
+ }
385
+ function handleMediaError(err) {
386
+ if (err instanceof DOMException) {
387
+ if (err.name === "NotAllowedError" || err.name === "PermissionDeniedError") {
388
+ return {
389
+ type: "permission",
390
+ message: "Permission denied. Please allow camera/microphone access in your browser settings."
391
+ };
392
+ }
393
+ if (err.name === "NotFoundError") {
394
+ return {
395
+ type: "unsupported",
396
+ message: "No camera or microphone found on this device."
397
+ };
398
+ }
399
+ if (err.name === "NotSupportedError") {
400
+ return {
401
+ type: "unsupported",
402
+ message: "Your browser does not support this feature. Please use Chrome, Firefox, or Safari."
403
+ };
404
+ }
405
+ }
406
+ if (err instanceof Error) {
407
+ return {
408
+ type: "unknown",
409
+ message: err.message
410
+ };
411
+ }
412
+ return {
413
+ type: "unknown",
414
+ message: "An unknown error occurred"
415
+ };
416
+ }
417
+ function stopMediaStream(stream) {
418
+ if (stream) {
419
+ stream.getTracks().forEach((track) => track.stop());
420
+ }
421
+ }
422
+ function Dual_recorder($$renderer, $$props) {
423
+ $$renderer.component(($$renderer2) => {
424
+ let { ctx, onComplete } = $$props;
425
+ let recorderState = "idle";
426
+ let error = "";
427
+ let displayDuration = 0;
428
+ let screenStream = null;
429
+ let webcamStream = null;
430
+ let screenRecorder = null;
431
+ let webcamRecorder = null;
432
+ let screenChunks = [];
433
+ let webcamChunks = [];
434
+ let recordingInterval = null;
435
+ let recordingStartTime = 0;
436
+ const MAX_DURATION = 300;
437
+ async function startRecording() {
438
+ try {
439
+ error = "";
440
+ screenStream = await navigator.mediaDevices.getDisplayMedia({
441
+ video: { width: { ideal: 1920 }, height: { ideal: 1080 } },
442
+ audio: true
443
+ });
444
+ webcamStream = await navigator.mediaDevices.getUserMedia({
445
+ video: {
446
+ width: { ideal: 640 },
447
+ height: { ideal: 640 },
448
+ facingMode: "user"
449
+ },
450
+ audio: true
451
+ });
452
+ const mimeType = "video/mp4";
453
+ if (!MediaRecorder.isTypeSupported(mimeType)) {
454
+ throw new Error("Your browser does not support MP4 recording. Please use Safari.");
455
+ }
456
+ screenChunks = [];
457
+ webcamChunks = [];
458
+ screenRecorder = new MediaRecorder(screenStream, { mimeType, videoBitsPerSecond: 5e6 });
459
+ webcamRecorder = new MediaRecorder(webcamStream, { mimeType, videoBitsPerSecond: 25e5 });
460
+ screenRecorder.ondataavailable = (e) => {
461
+ if (e.data.size > 0) screenChunks.push(e.data);
462
+ };
463
+ webcamRecorder.ondataavailable = (e) => {
464
+ if (e.data.size > 0) webcamChunks.push(e.data);
465
+ };
466
+ screenStream.getVideoTracks()[0].onended = () => stopRecording();
467
+ let stoppedCount = 0;
468
+ const onRecorderStop = () => {
469
+ stoppedCount++;
470
+ if (stoppedCount === 2) uploadBoth();
471
+ };
472
+ screenRecorder.onstop = onRecorderStop;
473
+ webcamRecorder.onstop = onRecorderStop;
474
+ screenRecorder.start(1e3);
475
+ webcamRecorder.start(1e3);
476
+ recorderState = "recording";
477
+ displayDuration = 0;
478
+ recordingStartTime = Date.now();
479
+ recordingInterval = setInterval(
480
+ () => {
481
+ displayDuration = (Date.now() - recordingStartTime) / 1e3;
482
+ if (displayDuration >= MAX_DURATION) stopRecording();
483
+ },
484
+ 100
485
+ );
486
+ } catch (err) {
487
+ error = handleMediaError(err).message;
488
+ cleanup();
489
+ }
490
+ }
491
+ function stopRecording() {
492
+ if (recorderState !== "recording") return;
493
+ if (recordingInterval) {
494
+ clearInterval(recordingInterval);
495
+ recordingInterval = null;
496
+ }
497
+ screenRecorder?.stop();
498
+ webcamRecorder?.stop();
499
+ stopMediaStream(screenStream);
500
+ stopMediaStream(webcamStream);
501
+ screenStream = null;
502
+ webcamStream = null;
503
+ recorderState = "uploading";
504
+ }
505
+ async function uploadBoth() {
506
+ recorderState = "uploading";
507
+ error = "";
508
+ const projectId = ctx.project.id;
509
+ try {
510
+ const screenBlob = new Blob(screenChunks, { type: "video/mp4" });
511
+ const webcamBlob = new Blob(webcamChunks, { type: "video/mp4" });
512
+ const screenUrl = URL.createObjectURL(screenBlob);
513
+ const webcamUrl = URL.createObjectURL(webcamBlob);
514
+ const [screenMeta, webcamMeta] = await Promise.all([
515
+ extractMediaMetadataFromUrl(screenUrl, "video"),
516
+ extractMediaMetadataFromUrl(webcamUrl, "video")
517
+ ]);
518
+ URL.revokeObjectURL(screenUrl);
519
+ URL.revokeObjectURL(webcamUrl);
520
+ const screenDuration = screenMeta.duration && screenMeta.duration > 0 ? screenMeta.duration : 1;
521
+ const webcamDuration = webcamMeta.duration && webcamMeta.duration > 0 ? webcamMeta.duration : 1;
522
+ const [screenResult, webcamResult] = await Promise.all([
523
+ uploadMediaBlob(screenBlob, generateTimestampedFileName("screen", "mp4"), "video", projectId, screenDuration),
524
+ uploadMediaBlob(webcamBlob, generateTimestampedFileName("webcam", "mp4"), "video", projectId, webcamDuration)
525
+ ]);
526
+ onComplete({
527
+ screenSrc: screenResult.url,
528
+ screenKey: screenResult.key,
529
+ screenDuration,
530
+ webcamSrc: webcamResult.url,
531
+ webcamKey: webcamResult.key,
532
+ webcamDuration
533
+ });
534
+ } catch (err) {
535
+ error = err instanceof Error ? err.message : "Upload failed";
536
+ recorderState = "idle";
537
+ }
538
+ }
539
+ function cleanup() {
540
+ if (recordingInterval) clearInterval(recordingInterval);
541
+ stopMediaStream(screenStream);
542
+ stopMediaStream(webcamStream);
543
+ screenStream = null;
544
+ webcamStream = null;
545
+ recorderState = "idle";
546
+ }
547
+ $$renderer2.push(`<div class="space-y-3">`);
548
+ if (
549
+ // Wire up video preview elements
550
+ // Cleanup on destroy
551
+ recorderState === "recording"
552
+ ) {
553
+ $$renderer2.push("<!--[0-->");
554
+ $$renderer2.push(`<div class="rounded border-2 border-destructive bg-destructive/10 p-3"><div class="relative mb-2 overflow-hidden rounded bg-black"><video autoplay="" muted="" playsinline="" class="h-auto w-full" style="max-height: 150px; aspect-ratio: 16/9;"></video> <div class="absolute top-2 left-2 flex items-center gap-2 rounded bg-black/50 px-2 py-1"><div class="h-2 w-2 animate-pulse rounded-full bg-destructive"></div> `);
555
+ Monitor($$renderer2, { class: "h-3 w-3 text-white" });
556
+ $$renderer2.push(`<!----> <span class="text-[10px] text-white">Screen</span></div> <div class="absolute top-2 right-2 rounded bg-black/50 px-2 py-1"><span class="font-mono text-xs text-white tabular-nums">${escape_html(formatDuration$1(Math.floor(displayDuration)))}</span></div> <div class="absolute right-2 bottom-2 h-16 w-16 overflow-hidden rounded-full border-2 border-white/50 shadow-lg"><video autoplay="" muted="" playsinline="" class="h-full w-full object-cover"></video></div></div> `);
557
+ Button($$renderer2, {
558
+ variant: "destructive",
559
+ size: "sm",
560
+ class: "w-full",
561
+ onclick: stopRecording,
562
+ children: ($$renderer3) => {
563
+ Square($$renderer3, { class: "mr-1 size-3" });
564
+ $$renderer3.push(`<!----> Stop Recording`);
565
+ },
566
+ $$slots: { default: true }
567
+ });
568
+ $$renderer2.push(`<!----> `);
569
+ if (displayDuration >= MAX_DURATION - 10) {
570
+ $$renderer2.push("<!--[0-->");
571
+ $$renderer2.push(`<p class="mt-1 text-center text-xs text-destructive">${escape_html(Math.round(MAX_DURATION - displayDuration))}s remaining</p>`);
572
+ } else {
573
+ $$renderer2.push("<!--[-1-->");
574
+ }
575
+ $$renderer2.push(`<!--]--></div>`);
576
+ } else if (recorderState === "uploading") {
577
+ $$renderer2.push("<!--[1-->");
578
+ $$renderer2.push(`<div class="rounded border bg-muted/30 p-6 text-center">`);
579
+ Loader_circle($$renderer2, { class: "mx-auto mb-2 size-6 animate-spin text-primary" });
580
+ $$renderer2.push(`<!----> <span class="text-sm">Uploading both recordings...</span></div>`);
581
+ } else {
582
+ $$renderer2.push("<!--[-1-->");
583
+ $$renderer2.push(`<div class="rounded border bg-muted/30 p-4 text-center"><div class="mx-auto mb-3 flex items-center justify-center gap-3"><div class="flex items-center gap-1.5 rounded bg-background px-3 py-2 shadow-sm">`);
584
+ Monitor($$renderer2, { class: "size-4 text-muted-foreground" });
585
+ $$renderer2.push(`<!----> <span class="text-xs">Screen</span></div> <span class="text-xs text-muted-foreground">+</span> <div class="flex items-center gap-1.5 rounded bg-background px-3 py-2 shadow-sm">`);
586
+ Camera($$renderer2, { class: "size-4 text-muted-foreground" });
587
+ $$renderer2.push(`<!----> <span class="text-xs">Webcam</span></div></div> <p class="mb-3 text-[10px] text-muted-foreground">Records your screen and webcam simultaneously. The webcam will appear as a circular overlay
588
+ in the corner.</p> `);
589
+ Button($$renderer2, {
590
+ variant: "default",
591
+ size: "sm",
592
+ class: "w-full",
593
+ onclick: startRecording,
594
+ children: ($$renderer3) => {
595
+ $$renderer3.push(`<!---->Start Recording`);
596
+ },
597
+ $$slots: { default: true }
598
+ });
599
+ $$renderer2.push(`<!----></div>`);
600
+ }
601
+ $$renderer2.push(`<!--]--> `);
602
+ if (error) {
603
+ $$renderer2.push("<!--[0-->");
604
+ $$renderer2.push(`<p class="text-xs text-destructive">${escape_html(error)}</p>`);
605
+ } else {
606
+ $$renderer2.push("<!--[-1-->");
607
+ }
608
+ $$renderer2.push(`<!--]--></div>`);
609
+ });
610
+ }
611
+ const template$9 = {
612
+ id: "screen-webcam-demo",
613
+ name: "Screen + Webcam Recorder",
614
+ description: "Record screen and webcam together for product demos, with auto-captions",
615
+ thumbnail: "/templates/screen-webcam-demo.svg",
616
+ icon: Monitor_play,
617
+ category: "recording",
618
+ seoTitle: "Free Screen and Webcam Recorder with Auto Captions",
619
+ seoDescription: "Record your screen and webcam simultaneously, then get automatic captions generated in seconds. Free online tool — no install required.",
620
+ keywords: [
621
+ "screen recorder",
622
+ "webcam recorder",
623
+ "screen and webcam",
624
+ "auto captions",
625
+ "product demo recorder",
626
+ "loom alternative"
627
+ ],
628
+ steps: [
629
+ {
630
+ title: "Record Screen & Webcam",
631
+ description: "Record your screen and webcam at the same time",
632
+ component: Dual_recorder
633
+ }
634
+ ],
635
+ async apply(values, ctx) {
636
+ const { screenSrc, screenKey, screenDuration, webcamSrc, webcamKey, webcamDuration } = values;
637
+ const { width, height } = ctx.project;
638
+ const ar = height / width;
639
+ const maxDuration = Math.max(screenDuration, webcamDuration);
640
+ const enterTime = ctx.currentTime;
641
+ const screenExitTime = enterTime + screenDuration;
642
+ const webcamExitTime = enterTime + webcamDuration;
643
+ const screenPadPct = 4 * Math.min(1, ar);
644
+ const screenLayer = createLayer("video", {
645
+ props: {
646
+ src: screenSrc,
647
+ fileKey: screenKey,
648
+ width: round1(100 - screenPadPct * 2),
649
+ height: round1(toPct(ar) - screenPadPct * 2),
650
+ borderRadius: 1.2,
651
+ objectFit: "cover"
652
+ },
653
+ style: {
654
+ opacity: 1,
655
+ blur: 0,
656
+ brightness: 1,
657
+ contrast: 1,
658
+ saturate: 1,
659
+ dropShadowX: 0,
660
+ dropShadowY: 8,
661
+ dropShadowBlur: 32,
662
+ dropShadowColor: "rgba(0,0,0,0.4)"
663
+ },
664
+ projectDimensions: { width, height },
665
+ layer: {
666
+ name: "Screen Recording",
667
+ enterTime,
668
+ exitTime: screenExitTime,
669
+ contentDuration: screenDuration
670
+ }
671
+ });
672
+ const minFrac = Math.min(1, ar);
673
+ const webcamSizePct = round1(minFrac * 22);
674
+ const webcamPaddingPct = round1(minFrac * 5);
675
+ const webcamLayer = createLayer("video", {
676
+ props: {
677
+ src: webcamSrc,
678
+ fileKey: webcamKey,
679
+ width: webcamSizePct,
680
+ height: webcamSizePct,
681
+ borderRadius: webcamSizePct,
682
+ objectFit: "cover",
683
+ frame: "none"
684
+ },
685
+ transform: {
686
+ position: {
687
+ x: round1(50 - webcamSizePct / 2 - webcamPaddingPct),
688
+ y: round1(ar * 50 - webcamSizePct / 2 - webcamPaddingPct),
689
+ z: 0
690
+ },
691
+ rotation: { x: 0, y: 0, z: 0 },
692
+ scale: { x: 1, y: 1 },
693
+ anchor: "center"
694
+ },
695
+ style: {
696
+ opacity: 1,
697
+ blur: 0,
698
+ brightness: 1,
699
+ contrast: 1,
700
+ saturate: 1,
701
+ dropShadowX: 0,
702
+ dropShadowY: 4,
703
+ dropShadowBlur: 16,
704
+ dropShadowColor: "rgba(0,0,0,0.5)"
705
+ },
706
+ projectDimensions: { width, height },
707
+ layer: {
708
+ name: "Webcam",
709
+ enterTime,
710
+ exitTime: webcamExitTime,
711
+ contentDuration: webcamDuration
712
+ }
713
+ });
714
+ const input = createFromSchema(generateCaptionsAction.inputSchema, {});
715
+ const {
716
+ layersToAdd: generatedLayersToAdd,
717
+ layersToUpdate,
718
+ projectUpdates
719
+ } = await runAction({
720
+ action: generateCaptionsAction,
721
+ input,
722
+ sourceLayer: webcamLayer,
723
+ project: ctx.project
724
+ });
725
+ return {
726
+ layersToAdd: [
727
+ { layer: screenLayer, presets: [{ id: "fade-in", startTime: enterTime, duration: 0.3 }] },
728
+ {
729
+ layer: webcamLayer,
730
+ presets: [{ id: "scale-in", startTime: enterTime + 0.2, duration: 0.4 }]
731
+ },
732
+ ...generatedLayersToAdd ?? []
733
+ ],
734
+ layersToUpdate: [...layersToUpdate ?? []],
735
+ projectUpdates: {
736
+ ...enterTime + maxDuration > ctx.project.duration ? { duration: enterTime + maxDuration } : {},
737
+ ...projectUpdates
738
+ }
739
+ };
740
+ }
741
+ };
742
+ const __vite_glob_0_0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
743
+ __proto__: null,
744
+ template: template$9
745
+ }, Symbol.toStringTag, { value: "Module" }));
746
+ function extract(value, defaultValue) {
747
+ if (isFunction$1(value)) {
748
+ const getter = value;
749
+ const gotten = getter();
750
+ if (gotten === void 0) return defaultValue;
751
+ return gotten;
752
+ }
753
+ if (value === void 0) return defaultValue;
754
+ return value;
755
+ }
756
+ function useDebounce(callback, wait) {
757
+ let context = null;
758
+ const wait$ = derived(() => extract(wait, 250));
759
+ function debounced(...args) {
760
+ if (context) {
761
+ if (context.timeout) {
762
+ clearTimeout(context.timeout);
763
+ }
764
+ } else {
765
+ let resolve;
766
+ let reject;
767
+ const promise = new Promise((res, rej) => {
768
+ resolve = res;
769
+ reject = rej;
770
+ });
771
+ context = { timeout: null, runner: null, promise, resolve, reject };
772
+ }
773
+ context.runner = async () => {
774
+ if (!context) return;
775
+ const ctx = context;
776
+ context = null;
777
+ try {
778
+ ctx.resolve(await callback.apply(this, args));
779
+ } catch (error) {
780
+ ctx.reject(error);
781
+ }
782
+ };
783
+ context.timeout = setTimeout(context.runner, wait$());
784
+ return context.promise;
785
+ }
786
+ debounced.cancel = async () => {
787
+ if (!context || context.timeout === null) {
788
+ await new Promise((resolve) => setTimeout(resolve, 0));
789
+ if (!context || context.timeout === null) return;
790
+ }
791
+ clearTimeout(context.timeout);
792
+ context.reject("Cancelled");
793
+ context = null;
794
+ };
795
+ debounced.runScheduledNow = async () => {
796
+ if (!context || !context.timeout) {
797
+ await new Promise((resolve) => setTimeout(resolve, 0));
798
+ if (!context || !context.timeout) return;
799
+ }
800
+ clearTimeout(context.timeout);
801
+ context.timeout = null;
802
+ await context.runner?.();
803
+ };
804
+ Object.defineProperty(debounced, "pending", {
805
+ enumerable: true,
806
+ get() {
807
+ return !!context?.timeout;
808
+ }
809
+ });
810
+ return debounced;
811
+ }
812
+ class IsMounted {
813
+ #isMounted = false;
814
+ constructor() {
815
+ }
816
+ get current() {
817
+ return this.#isMounted;
818
+ }
819
+ }
820
+ function Arrow($$renderer, $$props) {
821
+ $$renderer.component(($$renderer2) => {
822
+ let {
823
+ id = useId(),
824
+ children,
825
+ child,
826
+ width = 10,
827
+ height = 5,
828
+ $$slots,
829
+ $$events,
830
+ ...restProps
831
+ } = $$props;
832
+ const mergedProps = derived(() => mergeProps(restProps, { id }));
833
+ if (child) {
834
+ $$renderer2.push("<!--[0-->");
835
+ child($$renderer2, { props: mergedProps() });
836
+ $$renderer2.push(`<!---->`);
837
+ } else {
838
+ $$renderer2.push("<!--[-1-->");
839
+ $$renderer2.push(`<span${attributes({ ...mergedProps() })}>`);
840
+ if (children) {
841
+ $$renderer2.push("<!--[0-->");
842
+ children?.($$renderer2);
843
+ $$renderer2.push(`<!---->`);
844
+ } else {
845
+ $$renderer2.push("<!--[-1-->");
846
+ $$renderer2.push(`<svg${attr("width", width)}${attr("height", height)} viewBox="0 0 30 10" preserveAspectRatio="none" data-arrow=""><polygon points="0,0 30,0 15,10" fill="currentColor"></polygon></svg>`);
847
+ }
848
+ $$renderer2.push(`<!--]--></span>`);
849
+ }
850
+ $$renderer2.push(`<!--]-->`);
851
+ });
852
+ }
853
+ function Floating_layer_arrow($$renderer, $$props) {
854
+ $$renderer.component(($$renderer2) => {
855
+ let { id = useId(), ref = null, $$slots, $$events, ...restProps } = $$props;
856
+ const arrowState = FloatingArrowState.create({
857
+ id: boxWith(() => id),
858
+ ref: boxWith(() => ref, (v) => ref = v)
859
+ });
860
+ const mergedProps = derived(() => mergeProps(restProps, arrowState.props));
861
+ Arrow($$renderer2, spread_props([mergedProps()]));
862
+ bind_props($$props, { ref });
863
+ });
864
+ }
865
+ class SvelteResizeObserver {
866
+ #node;
867
+ #onResize;
868
+ constructor(node, onResize) {
869
+ this.#node = node;
870
+ this.#onResize = onResize;
871
+ this.handler = this.handler.bind(this);
872
+ }
873
+ handler() {
874
+ let rAF = 0;
875
+ const _node = this.#node();
876
+ if (!_node) return;
877
+ const resizeObserver = new ResizeObserver(() => {
878
+ cancelAnimationFrame(rAF);
879
+ rAF = window.requestAnimationFrame(this.#onResize);
880
+ });
881
+ resizeObserver.observe(_node);
882
+ return () => {
883
+ window.cancelAnimationFrame(rAF);
884
+ resizeObserver.unobserve(_node);
885
+ };
886
+ }
887
+ }
888
+ class StateMachine {
889
+ state;
890
+ #machine;
891
+ constructor(initialState, machine) {
892
+ this.state = simpleBox(initialState);
893
+ this.#machine = machine;
894
+ this.dispatch = this.dispatch.bind(this);
895
+ }
896
+ #reducer(event) {
897
+ const nextState = this.#machine[this.state.current][event];
898
+ return nextState ?? this.state.current;
899
+ }
900
+ dispatch(event) {
901
+ this.state.current = this.#reducer(event);
902
+ }
903
+ }
904
+ const animationNameCache = /* @__PURE__ */ new WeakMap();
905
+ const ANIMATION_NAME_CACHE_TTL_MS = 16;
906
+ const presenceMachine = {
907
+ mounted: { UNMOUNT: "unmounted", ANIMATION_OUT: "unmountSuspended" },
908
+ unmountSuspended: { MOUNT: "mounted", ANIMATION_END: "unmounted" },
909
+ unmounted: { MOUNT: "mounted" }
910
+ };
911
+ class Presence {
912
+ opts;
913
+ prevAnimationNameState = "none";
914
+ styles = { display: "", animationName: "none" };
915
+ initialStatus;
916
+ previousPresent;
917
+ machine;
918
+ present;
919
+ constructor(opts) {
920
+ this.opts = opts;
921
+ this.present = this.opts.open;
922
+ this.initialStatus = opts.open.current ? "mounted" : "unmounted";
923
+ this.previousPresent = new Previous(() => this.present.current);
924
+ this.machine = new StateMachine(this.initialStatus, presenceMachine);
925
+ this.handleAnimationEnd = this.handleAnimationEnd.bind(this);
926
+ this.handleAnimationStart = this.handleAnimationStart.bind(this);
927
+ watchPresenceChange(this);
928
+ watchStatusChange(this);
929
+ watchRefChange(this);
930
+ }
931
+ /**
932
+ * Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`
933
+ * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we
934
+ * make sure we only trigger ANIMATION_END for the currently active animation.
935
+ */
936
+ handleAnimationEnd(event) {
937
+ if (!this.opts.ref.current) return;
938
+ const currAnimationName = this.styles.animationName || getAnimationName(this.opts.ref.current);
939
+ const isCurrentAnimation = currAnimationName.includes(event.animationName) || currAnimationName === "none";
940
+ if (event.target === this.opts.ref.current && isCurrentAnimation) {
941
+ this.machine.dispatch("ANIMATION_END");
942
+ }
943
+ }
944
+ handleAnimationStart(event) {
945
+ if (!this.opts.ref.current) return;
946
+ if (event.target === this.opts.ref.current) {
947
+ const animationName = getAnimationName(this.opts.ref.current, true);
948
+ this.prevAnimationNameState = animationName;
949
+ this.styles.animationName = animationName;
950
+ }
951
+ }
952
+ #isPresent = derived(() => {
953
+ return ["mounted", "unmountSuspended"].includes(this.machine.state.current);
954
+ });
955
+ get isPresent() {
956
+ return this.#isPresent();
957
+ }
958
+ set isPresent($$value) {
959
+ return this.#isPresent($$value);
960
+ }
961
+ }
962
+ function watchPresenceChange(state) {
963
+ watch$1(() => state.present.current, () => {
964
+ if (!state.opts.ref.current) return;
965
+ const hasPresentChanged = state.present.current !== state.previousPresent.current;
966
+ if (!hasPresentChanged) return;
967
+ const prevAnimationName = state.prevAnimationNameState;
968
+ const currAnimationName = getAnimationName(state.opts.ref.current, true);
969
+ state.styles.animationName = currAnimationName;
970
+ if (state.present.current) {
971
+ state.machine.dispatch("MOUNT");
972
+ } else if (currAnimationName === "none" || state.styles.display === "none") {
973
+ state.machine.dispatch("UNMOUNT");
974
+ } else {
975
+ const isAnimating = prevAnimationName !== currAnimationName;
976
+ if (state.previousPresent.current && isAnimating) {
977
+ state.machine.dispatch("ANIMATION_OUT");
978
+ } else {
979
+ state.machine.dispatch("UNMOUNT");
980
+ }
981
+ }
982
+ });
983
+ }
984
+ function watchStatusChange(state) {
985
+ watch$1(() => state.machine.state.current, () => {
986
+ if (!state.opts.ref.current) return;
987
+ const currAnimationName = state.machine.state.current === "mounted" ? getAnimationName(state.opts.ref.current, true) : "none";
988
+ state.prevAnimationNameState = currAnimationName;
989
+ state.styles.animationName = currAnimationName;
990
+ });
991
+ }
992
+ function watchRefChange(state) {
993
+ watch$1(() => state.opts.ref.current, () => {
994
+ if (!state.opts.ref.current) return;
995
+ const computed = getComputedStyle(state.opts.ref.current);
996
+ state.styles = {
997
+ display: computed.display,
998
+ animationName: computed.animationName || "none"
999
+ };
1000
+ return executeCallbacks(on(state.opts.ref.current, "animationstart", state.handleAnimationStart), on(state.opts.ref.current, "animationcancel", state.handleAnimationEnd), on(state.opts.ref.current, "animationend", state.handleAnimationEnd));
1001
+ });
1002
+ }
1003
+ function getAnimationName(node, forceRefresh = false) {
1004
+ if (!node) return "none";
1005
+ const now = performance.now();
1006
+ const cached = animationNameCache.get(node);
1007
+ if (!forceRefresh && cached && now - cached.timestamp < ANIMATION_NAME_CACHE_TTL_MS) {
1008
+ return cached.value;
1009
+ }
1010
+ const value = getComputedStyle(node).animationName || "none";
1011
+ animationNameCache.set(node, { value, timestamp: now });
1012
+ return value;
1013
+ }
1014
+ function Presence_layer($$renderer, $$props) {
1015
+ $$renderer.component(($$renderer2) => {
1016
+ let { open, forceMount, presence, ref } = $$props;
1017
+ const presenceState = new Presence({ open: boxWith(() => open), ref });
1018
+ if (forceMount || open || presenceState.isPresent) {
1019
+ $$renderer2.push("<!--[0-->");
1020
+ presence?.($$renderer2, { present: presenceState.isPresent });
1021
+ $$renderer2.push(`<!---->`);
1022
+ } else {
1023
+ $$renderer2.push("<!--[-1-->");
1024
+ }
1025
+ $$renderer2.push(`<!--]-->`);
1026
+ });
1027
+ }
1028
+ function clamp(n, min, max) {
1029
+ return Math.min(max, Math.max(min, n));
1030
+ }
1031
+ const scrollAreaAttrs = createBitsAttrs({
1032
+ component: "scroll-area",
1033
+ parts: ["root", "viewport", "corner", "thumb", "scrollbar"]
1034
+ });
1035
+ const ScrollAreaRootContext = new Context("ScrollArea.Root");
1036
+ const ScrollAreaScrollbarContext = new Context("ScrollArea.Scrollbar");
1037
+ const ScrollAreaScrollbarVisibleContext = new Context("ScrollArea.ScrollbarVisible");
1038
+ const ScrollAreaScrollbarAxisContext = new Context("ScrollArea.ScrollbarAxis");
1039
+ const ScrollAreaScrollbarSharedContext = new Context("ScrollArea.ScrollbarShared");
1040
+ class ScrollAreaRootState {
1041
+ static create(opts) {
1042
+ return ScrollAreaRootContext.set(new ScrollAreaRootState(opts));
1043
+ }
1044
+ opts;
1045
+ attachment;
1046
+ scrollAreaNode = null;
1047
+ viewportNode = null;
1048
+ contentNode = null;
1049
+ scrollbarXNode = null;
1050
+ scrollbarYNode = null;
1051
+ cornerWidth = 0;
1052
+ cornerHeight = 0;
1053
+ scrollbarXEnabled = false;
1054
+ scrollbarYEnabled = false;
1055
+ domContext;
1056
+ constructor(opts) {
1057
+ this.opts = opts;
1058
+ this.attachment = attachRef(opts.ref, (v) => this.scrollAreaNode = v);
1059
+ this.domContext = new DOMContext(opts.ref);
1060
+ }
1061
+ #props = derived(() => ({
1062
+ id: this.opts.id.current,
1063
+ dir: this.opts.dir.current,
1064
+ style: {
1065
+ position: "relative",
1066
+ "--bits-scroll-area-corner-height": `${this.cornerHeight}px`,
1067
+ "--bits-scroll-area-corner-width": `${this.cornerWidth}px`
1068
+ },
1069
+ [scrollAreaAttrs.root]: "",
1070
+ ...this.attachment
1071
+ }));
1072
+ get props() {
1073
+ return this.#props();
1074
+ }
1075
+ set props($$value) {
1076
+ return this.#props($$value);
1077
+ }
1078
+ }
1079
+ class ScrollAreaViewportState {
1080
+ static create(opts) {
1081
+ return new ScrollAreaViewportState(opts, ScrollAreaRootContext.get());
1082
+ }
1083
+ opts;
1084
+ root;
1085
+ attachment;
1086
+ #contentId = simpleBox(useId());
1087
+ #contentRef = simpleBox(null);
1088
+ contentAttachment = attachRef(this.#contentRef, (v) => this.root.contentNode = v);
1089
+ constructor(opts, root) {
1090
+ this.opts = opts;
1091
+ this.root = root;
1092
+ this.attachment = attachRef(opts.ref, (v) => this.root.viewportNode = v);
1093
+ }
1094
+ #props = derived(() => ({
1095
+ id: this.opts.id.current,
1096
+ style: {
1097
+ overflowX: this.root.scrollbarXEnabled ? "scroll" : "hidden",
1098
+ overflowY: this.root.scrollbarYEnabled ? "scroll" : "hidden"
1099
+ },
1100
+ [scrollAreaAttrs.viewport]: "",
1101
+ ...this.attachment
1102
+ }));
1103
+ get props() {
1104
+ return this.#props();
1105
+ }
1106
+ set props($$value) {
1107
+ return this.#props($$value);
1108
+ }
1109
+ #contentProps = derived(() => ({
1110
+ id: this.#contentId.current,
1111
+ "data-scroll-area-content": "",
1112
+ style: {
1113
+ minWidth: this.root.scrollbarXEnabled ? "fit-content" : void 0
1114
+ },
1115
+ ...this.contentAttachment
1116
+ }));
1117
+ get contentProps() {
1118
+ return this.#contentProps();
1119
+ }
1120
+ set contentProps($$value) {
1121
+ return this.#contentProps($$value);
1122
+ }
1123
+ }
1124
+ class ScrollAreaScrollbarState {
1125
+ static create(opts) {
1126
+ return ScrollAreaScrollbarContext.set(new ScrollAreaScrollbarState(opts, ScrollAreaRootContext.get()));
1127
+ }
1128
+ opts;
1129
+ root;
1130
+ #isHorizontal = derived(() => this.opts.orientation.current === "horizontal");
1131
+ get isHorizontal() {
1132
+ return this.#isHorizontal();
1133
+ }
1134
+ set isHorizontal($$value) {
1135
+ return this.#isHorizontal($$value);
1136
+ }
1137
+ hasThumb = false;
1138
+ constructor(opts, root) {
1139
+ this.opts = opts;
1140
+ this.root = root;
1141
+ watch$1(() => this.isHorizontal, (isHorizontal) => {
1142
+ if (isHorizontal) {
1143
+ this.root.scrollbarXEnabled = true;
1144
+ return () => {
1145
+ this.root.scrollbarXEnabled = false;
1146
+ };
1147
+ } else {
1148
+ this.root.scrollbarYEnabled = true;
1149
+ return () => {
1150
+ this.root.scrollbarYEnabled = false;
1151
+ };
1152
+ }
1153
+ });
1154
+ }
1155
+ }
1156
+ class ScrollAreaScrollbarHoverState {
1157
+ static create() {
1158
+ return new ScrollAreaScrollbarHoverState(ScrollAreaScrollbarContext.get());
1159
+ }
1160
+ scrollbar;
1161
+ root;
1162
+ isVisible = false;
1163
+ constructor(scrollbar) {
1164
+ this.scrollbar = scrollbar;
1165
+ this.root = scrollbar.root;
1166
+ }
1167
+ #props = derived(() => ({ "data-state": this.isVisible ? "visible" : "hidden" }));
1168
+ get props() {
1169
+ return this.#props();
1170
+ }
1171
+ set props($$value) {
1172
+ return this.#props($$value);
1173
+ }
1174
+ }
1175
+ class ScrollAreaScrollbarScrollState {
1176
+ static create() {
1177
+ return new ScrollAreaScrollbarScrollState(ScrollAreaScrollbarContext.get());
1178
+ }
1179
+ scrollbar;
1180
+ root;
1181
+ machine = new StateMachine("hidden", {
1182
+ hidden: { SCROLL: "scrolling" },
1183
+ scrolling: { SCROLL_END: "idle", POINTER_ENTER: "interacting" },
1184
+ interacting: { SCROLL: "interacting", POINTER_LEAVE: "idle" },
1185
+ idle: {
1186
+ HIDE: "hidden",
1187
+ SCROLL: "scrolling",
1188
+ POINTER_ENTER: "interacting"
1189
+ }
1190
+ });
1191
+ #isHidden = derived(() => this.machine.state.current === "hidden");
1192
+ get isHidden() {
1193
+ return this.#isHidden();
1194
+ }
1195
+ set isHidden($$value) {
1196
+ return this.#isHidden($$value);
1197
+ }
1198
+ constructor(scrollbar) {
1199
+ this.scrollbar = scrollbar;
1200
+ this.root = scrollbar.root;
1201
+ useDebounce(() => this.machine.dispatch("SCROLL_END"), 100);
1202
+ this.onpointerenter = this.onpointerenter.bind(this);
1203
+ this.onpointerleave = this.onpointerleave.bind(this);
1204
+ }
1205
+ onpointerenter(_) {
1206
+ this.machine.dispatch("POINTER_ENTER");
1207
+ }
1208
+ onpointerleave(_) {
1209
+ this.machine.dispatch("POINTER_LEAVE");
1210
+ }
1211
+ #props = derived(() => ({
1212
+ "data-state": this.machine.state.current === "hidden" ? "hidden" : "visible",
1213
+ onpointerenter: this.onpointerenter,
1214
+ onpointerleave: this.onpointerleave
1215
+ }));
1216
+ get props() {
1217
+ return this.#props();
1218
+ }
1219
+ set props($$value) {
1220
+ return this.#props($$value);
1221
+ }
1222
+ }
1223
+ class ScrollAreaScrollbarAutoState {
1224
+ static create() {
1225
+ return new ScrollAreaScrollbarAutoState(ScrollAreaScrollbarContext.get());
1226
+ }
1227
+ scrollbar;
1228
+ root;
1229
+ isVisible = false;
1230
+ constructor(scrollbar) {
1231
+ this.scrollbar = scrollbar;
1232
+ this.root = scrollbar.root;
1233
+ const handleResize = useDebounce(
1234
+ () => {
1235
+ const viewportNode = this.root.viewportNode;
1236
+ if (!viewportNode) return;
1237
+ const isOverflowX = viewportNode.offsetWidth < viewportNode.scrollWidth;
1238
+ const isOverflowY = viewportNode.offsetHeight < viewportNode.scrollHeight;
1239
+ this.isVisible = this.scrollbar.isHorizontal ? isOverflowX : isOverflowY;
1240
+ },
1241
+ 10
1242
+ );
1243
+ new SvelteResizeObserver(() => this.root.viewportNode, handleResize);
1244
+ new SvelteResizeObserver(() => this.root.contentNode, handleResize);
1245
+ }
1246
+ #props = derived(() => ({ "data-state": this.isVisible ? "visible" : "hidden" }));
1247
+ get props() {
1248
+ return this.#props();
1249
+ }
1250
+ set props($$value) {
1251
+ return this.#props($$value);
1252
+ }
1253
+ }
1254
+ class ScrollAreaScrollbarVisibleState {
1255
+ static create() {
1256
+ return ScrollAreaScrollbarVisibleContext.set(new ScrollAreaScrollbarVisibleState(ScrollAreaScrollbarContext.get()));
1257
+ }
1258
+ scrollbar;
1259
+ root;
1260
+ thumbNode = null;
1261
+ pointerOffset = 0;
1262
+ sizes = {
1263
+ content: 0,
1264
+ viewport: 0,
1265
+ scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }
1266
+ };
1267
+ #thumbRatio = derived(() => getThumbRatio(this.sizes.viewport, this.sizes.content));
1268
+ get thumbRatio() {
1269
+ return this.#thumbRatio();
1270
+ }
1271
+ set thumbRatio($$value) {
1272
+ return this.#thumbRatio($$value);
1273
+ }
1274
+ #hasThumb = derived(() => Boolean(this.thumbRatio > 0 && this.thumbRatio < 1));
1275
+ get hasThumb() {
1276
+ return this.#hasThumb();
1277
+ }
1278
+ set hasThumb($$value) {
1279
+ return this.#hasThumb($$value);
1280
+ }
1281
+ prevTransformStyle = "";
1282
+ constructor(scrollbar) {
1283
+ this.scrollbar = scrollbar;
1284
+ this.root = scrollbar.root;
1285
+ }
1286
+ setSizes(sizes) {
1287
+ this.sizes = sizes;
1288
+ }
1289
+ getScrollPosition(pointerPos, dir) {
1290
+ return getScrollPositionFromPointer({
1291
+ pointerPos,
1292
+ pointerOffset: this.pointerOffset,
1293
+ sizes: this.sizes,
1294
+ dir
1295
+ });
1296
+ }
1297
+ onThumbPointerUp() {
1298
+ this.pointerOffset = 0;
1299
+ }
1300
+ onThumbPointerDown(pointerPos) {
1301
+ this.pointerOffset = pointerPos;
1302
+ }
1303
+ xOnThumbPositionChange() {
1304
+ if (!(this.root.viewportNode && this.thumbNode)) return;
1305
+ const scrollPos = this.root.viewportNode.scrollLeft;
1306
+ const offset = getThumbOffsetFromScroll({
1307
+ scrollPos,
1308
+ sizes: this.sizes,
1309
+ dir: this.root.opts.dir.current
1310
+ });
1311
+ const transformStyle = `translate3d(${offset}px, 0, 0)`;
1312
+ this.thumbNode.style.transform = transformStyle;
1313
+ this.prevTransformStyle = transformStyle;
1314
+ }
1315
+ xOnWheelScroll(scrollPos) {
1316
+ if (!this.root.viewportNode) return;
1317
+ this.root.viewportNode.scrollLeft = scrollPos;
1318
+ }
1319
+ xOnDragScroll(pointerPos) {
1320
+ if (!this.root.viewportNode) return;
1321
+ this.root.viewportNode.scrollLeft = this.getScrollPosition(pointerPos, this.root.opts.dir.current);
1322
+ }
1323
+ yOnThumbPositionChange() {
1324
+ if (!(this.root.viewportNode && this.thumbNode)) return;
1325
+ const scrollPos = this.root.viewportNode.scrollTop;
1326
+ const offset = getThumbOffsetFromScroll({ scrollPos, sizes: this.sizes });
1327
+ const transformStyle = `translate3d(0, ${offset}px, 0)`;
1328
+ this.thumbNode.style.transform = transformStyle;
1329
+ this.prevTransformStyle = transformStyle;
1330
+ }
1331
+ yOnWheelScroll(scrollPos) {
1332
+ if (!this.root.viewportNode) return;
1333
+ this.root.viewportNode.scrollTop = scrollPos;
1334
+ }
1335
+ yOnDragScroll(pointerPos) {
1336
+ if (!this.root.viewportNode) return;
1337
+ this.root.viewportNode.scrollTop = this.getScrollPosition(pointerPos, this.root.opts.dir.current);
1338
+ }
1339
+ }
1340
+ class ScrollAreaScrollbarXState {
1341
+ static create(opts) {
1342
+ return ScrollAreaScrollbarAxisContext.set(new ScrollAreaScrollbarXState(opts, ScrollAreaScrollbarVisibleContext.get()));
1343
+ }
1344
+ opts;
1345
+ scrollbarVis;
1346
+ root;
1347
+ scrollbar;
1348
+ attachment;
1349
+ computedStyle;
1350
+ constructor(opts, scrollbarVis) {
1351
+ this.opts = opts;
1352
+ this.scrollbarVis = scrollbarVis;
1353
+ this.root = scrollbarVis.root;
1354
+ this.scrollbar = scrollbarVis.scrollbar;
1355
+ this.attachment = attachRef(this.scrollbar.opts.ref, (v) => this.root.scrollbarXNode = v);
1356
+ }
1357
+ onThumbPointerDown = (pointerPos) => {
1358
+ this.scrollbarVis.onThumbPointerDown(pointerPos.x);
1359
+ };
1360
+ onDragScroll = (pointerPos) => {
1361
+ this.scrollbarVis.xOnDragScroll(pointerPos.x);
1362
+ };
1363
+ onThumbPointerUp = () => {
1364
+ this.scrollbarVis.onThumbPointerUp();
1365
+ };
1366
+ onThumbPositionChange = () => {
1367
+ this.scrollbarVis.xOnThumbPositionChange();
1368
+ };
1369
+ onWheelScroll = (e, maxScrollPos) => {
1370
+ if (!this.root.viewportNode) return;
1371
+ const scrollPos = this.root.viewportNode.scrollLeft + e.deltaX;
1372
+ this.scrollbarVis.xOnWheelScroll(scrollPos);
1373
+ if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {
1374
+ e.preventDefault();
1375
+ }
1376
+ };
1377
+ onResize = () => {
1378
+ if (!(this.scrollbar.opts.ref.current && this.root.viewportNode && this.computedStyle)) return;
1379
+ this.scrollbarVis.setSizes({
1380
+ content: this.root.viewportNode.scrollWidth,
1381
+ viewport: this.root.viewportNode.offsetWidth,
1382
+ scrollbar: {
1383
+ size: this.scrollbar.opts.ref.current.clientWidth,
1384
+ paddingStart: toInt(this.computedStyle.paddingLeft),
1385
+ paddingEnd: toInt(this.computedStyle.paddingRight)
1386
+ }
1387
+ });
1388
+ };
1389
+ #thumbSize = derived(() => {
1390
+ return getThumbSize(this.scrollbarVis.sizes);
1391
+ });
1392
+ get thumbSize() {
1393
+ return this.#thumbSize();
1394
+ }
1395
+ set thumbSize($$value) {
1396
+ return this.#thumbSize($$value);
1397
+ }
1398
+ #props = derived(() => ({
1399
+ id: this.scrollbar.opts.id.current,
1400
+ "data-orientation": "horizontal",
1401
+ style: {
1402
+ bottom: 0,
1403
+ left: this.root.opts.dir.current === "rtl" ? "var(--bits-scroll-area-corner-width)" : 0,
1404
+ right: this.root.opts.dir.current === "ltr" ? "var(--bits-scroll-area-corner-width)" : 0,
1405
+ "--bits-scroll-area-thumb-width": `${this.thumbSize}px`
1406
+ },
1407
+ ...this.attachment
1408
+ }));
1409
+ get props() {
1410
+ return this.#props();
1411
+ }
1412
+ set props($$value) {
1413
+ return this.#props($$value);
1414
+ }
1415
+ }
1416
+ class ScrollAreaScrollbarYState {
1417
+ static create(opts) {
1418
+ return ScrollAreaScrollbarAxisContext.set(new ScrollAreaScrollbarYState(opts, ScrollAreaScrollbarVisibleContext.get()));
1419
+ }
1420
+ opts;
1421
+ scrollbarVis;
1422
+ root;
1423
+ scrollbar;
1424
+ attachment;
1425
+ computedStyle;
1426
+ constructor(opts, scrollbarVis) {
1427
+ this.opts = opts;
1428
+ this.scrollbarVis = scrollbarVis;
1429
+ this.root = scrollbarVis.root;
1430
+ this.scrollbar = scrollbarVis.scrollbar;
1431
+ this.attachment = attachRef(this.scrollbar.opts.ref, (v) => this.root.scrollbarYNode = v);
1432
+ this.onThumbPointerDown = this.onThumbPointerDown.bind(this);
1433
+ this.onDragScroll = this.onDragScroll.bind(this);
1434
+ this.onThumbPointerUp = this.onThumbPointerUp.bind(this);
1435
+ this.onThumbPositionChange = this.onThumbPositionChange.bind(this);
1436
+ this.onWheelScroll = this.onWheelScroll.bind(this);
1437
+ this.onResize = this.onResize.bind(this);
1438
+ }
1439
+ onThumbPointerDown(pointerPos) {
1440
+ this.scrollbarVis.onThumbPointerDown(pointerPos.y);
1441
+ }
1442
+ onDragScroll(pointerPos) {
1443
+ this.scrollbarVis.yOnDragScroll(pointerPos.y);
1444
+ }
1445
+ onThumbPointerUp() {
1446
+ this.scrollbarVis.onThumbPointerUp();
1447
+ }
1448
+ onThumbPositionChange() {
1449
+ this.scrollbarVis.yOnThumbPositionChange();
1450
+ }
1451
+ onWheelScroll(e, maxScrollPos) {
1452
+ if (!this.root.viewportNode) return;
1453
+ const scrollPos = this.root.viewportNode.scrollTop + e.deltaY;
1454
+ this.scrollbarVis.yOnWheelScroll(scrollPos);
1455
+ if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {
1456
+ e.preventDefault();
1457
+ }
1458
+ }
1459
+ onResize() {
1460
+ if (!(this.scrollbar.opts.ref.current && this.root.viewportNode && this.computedStyle)) return;
1461
+ this.scrollbarVis.setSizes({
1462
+ content: this.root.viewportNode.scrollHeight,
1463
+ viewport: this.root.viewportNode.offsetHeight,
1464
+ scrollbar: {
1465
+ size: this.scrollbar.opts.ref.current.clientHeight,
1466
+ paddingStart: toInt(this.computedStyle.paddingTop),
1467
+ paddingEnd: toInt(this.computedStyle.paddingBottom)
1468
+ }
1469
+ });
1470
+ }
1471
+ #thumbSize = derived(() => {
1472
+ return getThumbSize(this.scrollbarVis.sizes);
1473
+ });
1474
+ get thumbSize() {
1475
+ return this.#thumbSize();
1476
+ }
1477
+ set thumbSize($$value) {
1478
+ return this.#thumbSize($$value);
1479
+ }
1480
+ #props = derived(() => ({
1481
+ id: this.scrollbar.opts.id.current,
1482
+ "data-orientation": "vertical",
1483
+ style: {
1484
+ top: 0,
1485
+ right: this.root.opts.dir.current === "ltr" ? 0 : void 0,
1486
+ left: this.root.opts.dir.current === "rtl" ? 0 : void 0,
1487
+ bottom: "var(--bits-scroll-area-corner-height)",
1488
+ "--bits-scroll-area-thumb-height": `${this.thumbSize}px`
1489
+ },
1490
+ ...this.attachment
1491
+ }));
1492
+ get props() {
1493
+ return this.#props();
1494
+ }
1495
+ set props($$value) {
1496
+ return this.#props($$value);
1497
+ }
1498
+ }
1499
+ class ScrollAreaScrollbarSharedState {
1500
+ static create() {
1501
+ return ScrollAreaScrollbarSharedContext.set(new ScrollAreaScrollbarSharedState(ScrollAreaScrollbarAxisContext.get()));
1502
+ }
1503
+ scrollbarState;
1504
+ root;
1505
+ scrollbarVis;
1506
+ scrollbar;
1507
+ rect = null;
1508
+ prevWebkitUserSelect = "";
1509
+ handleResize;
1510
+ handleThumbPositionChange;
1511
+ handleWheelScroll;
1512
+ handleThumbPointerDown;
1513
+ handleThumbPointerUp;
1514
+ #maxScrollPos = derived(() => this.scrollbarVis.sizes.content - this.scrollbarVis.sizes.viewport);
1515
+ get maxScrollPos() {
1516
+ return this.#maxScrollPos();
1517
+ }
1518
+ set maxScrollPos($$value) {
1519
+ return this.#maxScrollPos($$value);
1520
+ }
1521
+ constructor(scrollbarState) {
1522
+ this.scrollbarState = scrollbarState;
1523
+ this.root = scrollbarState.root;
1524
+ this.scrollbarVis = scrollbarState.scrollbarVis;
1525
+ this.scrollbar = scrollbarState.scrollbarVis.scrollbar;
1526
+ this.handleResize = useDebounce(() => this.scrollbarState.onResize(), 10);
1527
+ this.handleThumbPositionChange = this.scrollbarState.onThumbPositionChange;
1528
+ this.handleWheelScroll = this.scrollbarState.onWheelScroll;
1529
+ this.handleThumbPointerDown = this.scrollbarState.onThumbPointerDown;
1530
+ this.handleThumbPointerUp = this.scrollbarState.onThumbPointerUp;
1531
+ new SvelteResizeObserver(() => this.scrollbar.opts.ref.current, this.handleResize);
1532
+ new SvelteResizeObserver(() => this.root.contentNode, this.handleResize);
1533
+ this.onpointerdown = this.onpointerdown.bind(this);
1534
+ this.onpointermove = this.onpointermove.bind(this);
1535
+ this.onpointerup = this.onpointerup.bind(this);
1536
+ this.onlostpointercapture = this.onlostpointercapture.bind(this);
1537
+ }
1538
+ handleDragScroll(e) {
1539
+ if (!this.rect) return;
1540
+ const x = e.clientX - this.rect.left;
1541
+ const y = e.clientY - this.rect.top;
1542
+ this.scrollbarState.onDragScroll({ x, y });
1543
+ }
1544
+ #cleanupPointerState() {
1545
+ if (this.rect === null) return;
1546
+ this.root.domContext.getDocument().body.style.webkitUserSelect = this.prevWebkitUserSelect;
1547
+ if (this.root.viewportNode) this.root.viewportNode.style.scrollBehavior = "";
1548
+ this.rect = null;
1549
+ }
1550
+ onpointerdown(e) {
1551
+ if (e.button !== 0) return;
1552
+ const target = e.target;
1553
+ target.setPointerCapture(e.pointerId);
1554
+ this.rect = this.scrollbar.opts.ref.current?.getBoundingClientRect() ?? null;
1555
+ this.prevWebkitUserSelect = this.root.domContext.getDocument().body.style.webkitUserSelect;
1556
+ this.root.domContext.getDocument().body.style.webkitUserSelect = "none";
1557
+ if (this.root.viewportNode) this.root.viewportNode.style.scrollBehavior = "auto";
1558
+ this.handleDragScroll(e);
1559
+ }
1560
+ onpointermove(e) {
1561
+ this.handleDragScroll(e);
1562
+ }
1563
+ onpointerup(e) {
1564
+ const target = e.target;
1565
+ if (target.hasPointerCapture(e.pointerId)) {
1566
+ target.releasePointerCapture(e.pointerId);
1567
+ }
1568
+ this.#cleanupPointerState();
1569
+ }
1570
+ onlostpointercapture(_) {
1571
+ this.#cleanupPointerState();
1572
+ }
1573
+ #props = derived(() => mergeProps({
1574
+ ...this.scrollbarState.props,
1575
+ style: { position: "absolute", ...this.scrollbarState.props.style },
1576
+ [scrollAreaAttrs.scrollbar]: "",
1577
+ onpointerdown: this.onpointerdown,
1578
+ onpointermove: this.onpointermove,
1579
+ onpointerup: this.onpointerup,
1580
+ onlostpointercapture: this.onlostpointercapture
1581
+ }));
1582
+ get props() {
1583
+ return this.#props();
1584
+ }
1585
+ set props($$value) {
1586
+ return this.#props($$value);
1587
+ }
1588
+ }
1589
+ class ScrollAreaThumbImplState {
1590
+ static create(opts) {
1591
+ return new ScrollAreaThumbImplState(opts, ScrollAreaScrollbarSharedContext.get());
1592
+ }
1593
+ opts;
1594
+ scrollbarState;
1595
+ attachment;
1596
+ #root;
1597
+ #removeUnlinkedScrollListener;
1598
+ #debounceScrollEnd = useDebounce(
1599
+ () => {
1600
+ if (this.#removeUnlinkedScrollListener) {
1601
+ this.#removeUnlinkedScrollListener();
1602
+ this.#removeUnlinkedScrollListener = void 0;
1603
+ }
1604
+ },
1605
+ 100
1606
+ );
1607
+ constructor(opts, scrollbarState) {
1608
+ this.opts = opts;
1609
+ this.scrollbarState = scrollbarState;
1610
+ this.#root = scrollbarState.root;
1611
+ this.attachment = attachRef(this.opts.ref, (v) => this.scrollbarState.scrollbarVis.thumbNode = v);
1612
+ this.onpointerdowncapture = this.onpointerdowncapture.bind(this);
1613
+ this.onpointerup = this.onpointerup.bind(this);
1614
+ }
1615
+ onpointerdowncapture(e) {
1616
+ const thumb = e.target;
1617
+ if (!thumb) return;
1618
+ const thumbRect = thumb.getBoundingClientRect();
1619
+ const x = e.clientX - thumbRect.left;
1620
+ const y = e.clientY - thumbRect.top;
1621
+ this.scrollbarState.handleThumbPointerDown({ x, y });
1622
+ }
1623
+ onpointerup(_) {
1624
+ this.scrollbarState.handleThumbPointerUp();
1625
+ }
1626
+ #props = derived(() => ({
1627
+ id: this.opts.id.current,
1628
+ "data-state": this.scrollbarState.scrollbarVis.hasThumb ? "visible" : "hidden",
1629
+ style: {
1630
+ width: "var(--bits-scroll-area-thumb-width)",
1631
+ height: "var(--bits-scroll-area-thumb-height)",
1632
+ transform: this.scrollbarState.scrollbarVis.prevTransformStyle
1633
+ },
1634
+ onpointerdowncapture: this.onpointerdowncapture,
1635
+ onpointerup: this.onpointerup,
1636
+ [scrollAreaAttrs.thumb]: "",
1637
+ ...this.attachment
1638
+ }));
1639
+ get props() {
1640
+ return this.#props();
1641
+ }
1642
+ set props($$value) {
1643
+ return this.#props($$value);
1644
+ }
1645
+ }
1646
+ class ScrollAreaCornerImplState {
1647
+ static create(opts) {
1648
+ return new ScrollAreaCornerImplState(opts, ScrollAreaRootContext.get());
1649
+ }
1650
+ opts;
1651
+ root;
1652
+ attachment;
1653
+ #width = 0;
1654
+ #height = 0;
1655
+ #hasSize = derived(() => Boolean(this.#width && this.#height));
1656
+ get hasSize() {
1657
+ return this.#hasSize();
1658
+ }
1659
+ set hasSize($$value) {
1660
+ return this.#hasSize($$value);
1661
+ }
1662
+ constructor(opts, root) {
1663
+ this.opts = opts;
1664
+ this.root = root;
1665
+ this.attachment = attachRef(this.opts.ref);
1666
+ new SvelteResizeObserver(() => this.root.scrollbarXNode, () => {
1667
+ const height = this.root.scrollbarXNode?.offsetHeight || 0;
1668
+ this.root.cornerHeight = height;
1669
+ this.#height = height;
1670
+ });
1671
+ new SvelteResizeObserver(() => this.root.scrollbarYNode, () => {
1672
+ const width = this.root.scrollbarYNode?.offsetWidth || 0;
1673
+ this.root.cornerWidth = width;
1674
+ this.#width = width;
1675
+ });
1676
+ }
1677
+ #props = derived(() => ({
1678
+ id: this.opts.id.current,
1679
+ style: {
1680
+ width: this.#width,
1681
+ height: this.#height,
1682
+ position: "absolute",
1683
+ right: this.root.opts.dir.current === "ltr" ? 0 : void 0,
1684
+ left: this.root.opts.dir.current === "rtl" ? 0 : void 0,
1685
+ bottom: 0
1686
+ },
1687
+ [scrollAreaAttrs.corner]: "",
1688
+ ...this.attachment
1689
+ }));
1690
+ get props() {
1691
+ return this.#props();
1692
+ }
1693
+ set props($$value) {
1694
+ return this.#props($$value);
1695
+ }
1696
+ }
1697
+ function toInt(value) {
1698
+ return value ? Number.parseInt(value, 10) : 0;
1699
+ }
1700
+ function getThumbRatio(viewportSize, contentSize) {
1701
+ const ratio = viewportSize / contentSize;
1702
+ return Number.isNaN(ratio) ? 0 : ratio;
1703
+ }
1704
+ function getThumbSize(sizes) {
1705
+ const ratio = getThumbRatio(sizes.viewport, sizes.content);
1706
+ const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;
1707
+ const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;
1708
+ return Math.max(thumbSize, 18);
1709
+ }
1710
+ function getScrollPositionFromPointer({ pointerPos, pointerOffset, sizes, dir = "ltr" }) {
1711
+ const thumbSizePx = getThumbSize(sizes);
1712
+ const thumbCenter = thumbSizePx / 2;
1713
+ const offset = pointerOffset || thumbCenter;
1714
+ const thumbOffsetFromEnd = thumbSizePx - offset;
1715
+ const minPointerPos = sizes.scrollbar.paddingStart + offset;
1716
+ const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;
1717
+ const maxScrollPos = sizes.content - sizes.viewport;
1718
+ const scrollRange = dir === "ltr" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];
1719
+ const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);
1720
+ return interpolate(pointerPos);
1721
+ }
1722
+ function getThumbOffsetFromScroll({ scrollPos, sizes, dir = "ltr" }) {
1723
+ const thumbSizePx = getThumbSize(sizes);
1724
+ const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;
1725
+ const scrollbar = sizes.scrollbar.size - scrollbarPadding;
1726
+ const maxScrollPos = sizes.content - sizes.viewport;
1727
+ const maxThumbPos = scrollbar - thumbSizePx;
1728
+ const scrollClampRange = dir === "ltr" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];
1729
+ const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange[0], scrollClampRange[1]);
1730
+ const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);
1731
+ return interpolate(scrollWithoutMomentum);
1732
+ }
1733
+ function linearScale(input, output) {
1734
+ return (value) => {
1735
+ if (input[0] === input[1] || output[0] === output[1]) return output[0];
1736
+ const ratio = (output[1] - output[0]) / (input[1] - input[0]);
1737
+ return output[0] + ratio * (value - input[0]);
1738
+ };
1739
+ }
1740
+ function isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {
1741
+ return scrollPos > 0 && scrollPos < maxScrollPos;
1742
+ }
1743
+ function Scroll_area$1($$renderer, $$props) {
1744
+ $$renderer.component(($$renderer2) => {
1745
+ const uid = props_id($$renderer2);
1746
+ let {
1747
+ ref = null,
1748
+ id = createId(uid),
1749
+ type = "hover",
1750
+ dir = "ltr",
1751
+ scrollHideDelay = 600,
1752
+ children,
1753
+ child,
1754
+ $$slots,
1755
+ $$events,
1756
+ ...restProps
1757
+ } = $$props;
1758
+ const rootState = ScrollAreaRootState.create({
1759
+ type: boxWith(() => type),
1760
+ dir: boxWith(() => dir),
1761
+ scrollHideDelay: boxWith(() => scrollHideDelay),
1762
+ id: boxWith(() => id),
1763
+ ref: boxWith(() => ref, (v) => ref = v)
1764
+ });
1765
+ const mergedProps = derived(() => mergeProps(restProps, rootState.props));
1766
+ if (child) {
1767
+ $$renderer2.push("<!--[0-->");
1768
+ child($$renderer2, { props: mergedProps() });
1769
+ $$renderer2.push(`<!---->`);
1770
+ } else {
1771
+ $$renderer2.push("<!--[-1-->");
1772
+ $$renderer2.push(`<div${attributes({ ...mergedProps() })}>`);
1773
+ children?.($$renderer2);
1774
+ $$renderer2.push(`<!----></div>`);
1775
+ }
1776
+ $$renderer2.push(`<!--]-->`);
1777
+ bind_props($$props, { ref });
1778
+ });
1779
+ }
1780
+ function Scroll_area_viewport($$renderer, $$props) {
1781
+ $$renderer.component(($$renderer2) => {
1782
+ const uid = props_id($$renderer2);
1783
+ let {
1784
+ ref = null,
1785
+ id = createId(uid),
1786
+ children,
1787
+ $$slots,
1788
+ $$events,
1789
+ ...restProps
1790
+ } = $$props;
1791
+ const viewportState = ScrollAreaViewportState.create({
1792
+ id: boxWith(() => id),
1793
+ ref: boxWith(() => ref, (v) => ref = v)
1794
+ });
1795
+ const mergedProps = derived(() => mergeProps(restProps, viewportState.props));
1796
+ const mergedContentProps = derived(() => mergeProps({}, viewportState.contentProps));
1797
+ $$renderer2.push(`<div${attributes({ ...mergedProps() })}><div${attributes({ ...mergedContentProps() })}>`);
1798
+ children?.($$renderer2);
1799
+ $$renderer2.push(`<!----></div></div>`);
1800
+ bind_props($$props, { ref });
1801
+ });
1802
+ }
1803
+ function Scroll_area_scrollbar_shared($$renderer, $$props) {
1804
+ $$renderer.component(($$renderer2) => {
1805
+ let { child, children, $$slots, $$events, ...restProps } = $$props;
1806
+ const scrollbarSharedState = ScrollAreaScrollbarSharedState.create();
1807
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarSharedState.props));
1808
+ if (child) {
1809
+ $$renderer2.push("<!--[0-->");
1810
+ child($$renderer2, { props: mergedProps() });
1811
+ $$renderer2.push(`<!---->`);
1812
+ } else {
1813
+ $$renderer2.push("<!--[-1-->");
1814
+ $$renderer2.push(`<div${attributes({ ...mergedProps() })}>`);
1815
+ children?.($$renderer2);
1816
+ $$renderer2.push(`<!----></div>`);
1817
+ }
1818
+ $$renderer2.push(`<!--]-->`);
1819
+ });
1820
+ }
1821
+ function Scroll_area_scrollbar_x($$renderer, $$props) {
1822
+ $$renderer.component(($$renderer2) => {
1823
+ let { $$slots, $$events, ...restProps } = $$props;
1824
+ const isMounted = new IsMounted();
1825
+ const scrollbarXState = ScrollAreaScrollbarXState.create({ mounted: boxWith(() => isMounted.current) });
1826
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarXState.props));
1827
+ Scroll_area_scrollbar_shared($$renderer2, spread_props([mergedProps()]));
1828
+ });
1829
+ }
1830
+ function Scroll_area_scrollbar_y($$renderer, $$props) {
1831
+ $$renderer.component(($$renderer2) => {
1832
+ let { $$slots, $$events, ...restProps } = $$props;
1833
+ const isMounted = new IsMounted();
1834
+ const scrollbarYState = ScrollAreaScrollbarYState.create({ mounted: boxWith(() => isMounted.current) });
1835
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarYState.props));
1836
+ Scroll_area_scrollbar_shared($$renderer2, spread_props([mergedProps()]));
1837
+ });
1838
+ }
1839
+ function Scroll_area_scrollbar_visible($$renderer, $$props) {
1840
+ $$renderer.component(($$renderer2) => {
1841
+ let { $$slots, $$events, ...restProps } = $$props;
1842
+ const scrollbarVisibleState = ScrollAreaScrollbarVisibleState.create();
1843
+ if (scrollbarVisibleState.scrollbar.opts.orientation.current === "horizontal") {
1844
+ $$renderer2.push("<!--[0-->");
1845
+ Scroll_area_scrollbar_x($$renderer2, spread_props([restProps]));
1846
+ } else {
1847
+ $$renderer2.push("<!--[-1-->");
1848
+ Scroll_area_scrollbar_y($$renderer2, spread_props([restProps]));
1849
+ }
1850
+ $$renderer2.push(`<!--]-->`);
1851
+ });
1852
+ }
1853
+ function Scroll_area_scrollbar_auto($$renderer, $$props) {
1854
+ $$renderer.component(($$renderer2) => {
1855
+ let { forceMount = false, $$slots, $$events, ...restProps } = $$props;
1856
+ const scrollbarAutoState = ScrollAreaScrollbarAutoState.create();
1857
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarAutoState.props));
1858
+ {
1859
+ let presence = function($$renderer3) {
1860
+ Scroll_area_scrollbar_visible($$renderer3, spread_props([mergedProps()]));
1861
+ };
1862
+ Presence_layer($$renderer2, {
1863
+ open: forceMount || scrollbarAutoState.isVisible,
1864
+ ref: scrollbarAutoState.scrollbar.opts.ref,
1865
+ presence
1866
+ });
1867
+ }
1868
+ });
1869
+ }
1870
+ function Scroll_area_scrollbar_scroll($$renderer, $$props) {
1871
+ $$renderer.component(($$renderer2) => {
1872
+ let { forceMount = false, $$slots, $$events, ...restProps } = $$props;
1873
+ const scrollbarScrollState = ScrollAreaScrollbarScrollState.create();
1874
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarScrollState.props));
1875
+ {
1876
+ let presence = function($$renderer3) {
1877
+ Scroll_area_scrollbar_visible($$renderer3, spread_props([mergedProps()]));
1878
+ };
1879
+ Presence_layer($$renderer2, spread_props([
1880
+ mergedProps(),
1881
+ {
1882
+ open: forceMount || !scrollbarScrollState.isHidden,
1883
+ ref: scrollbarScrollState.scrollbar.opts.ref,
1884
+ presence,
1885
+ $$slots: { presence: true }
1886
+ }
1887
+ ]));
1888
+ }
1889
+ });
1890
+ }
1891
+ function Scroll_area_scrollbar_hover($$renderer, $$props) {
1892
+ $$renderer.component(($$renderer2) => {
1893
+ let { forceMount = false, $$slots, $$events, ...restProps } = $$props;
1894
+ const scrollbarHoverState = ScrollAreaScrollbarHoverState.create();
1895
+ const scrollbarAutoState = ScrollAreaScrollbarAutoState.create();
1896
+ const mergedProps = derived(() => mergeProps(restProps, scrollbarHoverState.props, scrollbarAutoState.props, {
1897
+ "data-state": scrollbarHoverState.isVisible ? "visible" : "hidden"
1898
+ }));
1899
+ const open = derived(() => forceMount || scrollbarHoverState.isVisible && scrollbarAutoState.isVisible);
1900
+ {
1901
+ let presence = function($$renderer3) {
1902
+ Scroll_area_scrollbar_visible($$renderer3, spread_props([mergedProps()]));
1903
+ };
1904
+ Presence_layer($$renderer2, {
1905
+ open: open(),
1906
+ ref: scrollbarAutoState.scrollbar.opts.ref,
1907
+ presence
1908
+ });
1909
+ }
1910
+ });
1911
+ }
1912
+ function Scroll_area_scrollbar$1($$renderer, $$props) {
1913
+ $$renderer.component(($$renderer2) => {
1914
+ const uid = props_id($$renderer2);
1915
+ let {
1916
+ ref = null,
1917
+ id = createId(uid),
1918
+ orientation,
1919
+ $$slots,
1920
+ $$events,
1921
+ ...restProps
1922
+ } = $$props;
1923
+ const scrollbarState = ScrollAreaScrollbarState.create({
1924
+ orientation: boxWith(() => orientation),
1925
+ id: boxWith(() => id),
1926
+ ref: boxWith(() => ref, (v) => ref = v)
1927
+ });
1928
+ const type = derived(() => scrollbarState.root.opts.type.current);
1929
+ if (type() === "hover") {
1930
+ $$renderer2.push("<!--[0-->");
1931
+ Scroll_area_scrollbar_hover($$renderer2, spread_props([restProps, { id }]));
1932
+ } else if (type() === "scroll") {
1933
+ $$renderer2.push("<!--[1-->");
1934
+ Scroll_area_scrollbar_scroll($$renderer2, spread_props([restProps, { id }]));
1935
+ } else if (type() === "auto") {
1936
+ $$renderer2.push("<!--[2-->");
1937
+ Scroll_area_scrollbar_auto($$renderer2, spread_props([restProps, { id }]));
1938
+ } else if (type() === "always") {
1939
+ $$renderer2.push("<!--[3-->");
1940
+ Scroll_area_scrollbar_visible($$renderer2, spread_props([restProps, { id }]));
1941
+ } else {
1942
+ $$renderer2.push("<!--[-1-->");
1943
+ }
1944
+ $$renderer2.push(`<!--]-->`);
1945
+ bind_props($$props, { ref });
1946
+ });
1947
+ }
1948
+ function Scroll_area_thumb_impl($$renderer, $$props) {
1949
+ $$renderer.component(($$renderer2) => {
1950
+ let {
1951
+ ref = null,
1952
+ id,
1953
+ child,
1954
+ children,
1955
+ present,
1956
+ $$slots,
1957
+ $$events,
1958
+ ...restProps
1959
+ } = $$props;
1960
+ const isMounted = new IsMounted();
1961
+ const thumbState = ScrollAreaThumbImplState.create({
1962
+ id: boxWith(() => id),
1963
+ ref: boxWith(() => ref, (v) => ref = v),
1964
+ mounted: boxWith(() => isMounted.current)
1965
+ });
1966
+ const mergedProps = derived(() => mergeProps(restProps, thumbState.props, { style: { hidden: !present } }));
1967
+ if (child) {
1968
+ $$renderer2.push("<!--[0-->");
1969
+ child($$renderer2, { props: mergedProps() });
1970
+ $$renderer2.push(`<!---->`);
1971
+ } else {
1972
+ $$renderer2.push("<!--[-1-->");
1973
+ $$renderer2.push(`<div${attributes({ ...mergedProps() })}>`);
1974
+ children?.($$renderer2);
1975
+ $$renderer2.push(`<!----></div>`);
1976
+ }
1977
+ $$renderer2.push(`<!--]-->`);
1978
+ bind_props($$props, { ref });
1979
+ });
1980
+ }
1981
+ function Scroll_area_thumb($$renderer, $$props) {
1982
+ $$renderer.component(($$renderer2) => {
1983
+ const uid = props_id($$renderer2);
1984
+ let {
1985
+ id = createId(uid),
1986
+ ref = null,
1987
+ forceMount = false,
1988
+ $$slots,
1989
+ $$events,
1990
+ ...restProps
1991
+ } = $$props;
1992
+ const scrollbarState = ScrollAreaScrollbarVisibleContext.get();
1993
+ let $$settled = true;
1994
+ let $$inner_renderer;
1995
+ function $$render_inner($$renderer3) {
1996
+ {
1997
+ let presence = function($$renderer4, { present }) {
1998
+ Scroll_area_thumb_impl($$renderer4, spread_props([
1999
+ restProps,
2000
+ {
2001
+ id,
2002
+ present,
2003
+ get ref() {
2004
+ return ref;
2005
+ },
2006
+ set ref($$value) {
2007
+ ref = $$value;
2008
+ $$settled = false;
2009
+ }
2010
+ }
2011
+ ]));
2012
+ };
2013
+ Presence_layer($$renderer3, {
2014
+ open: forceMount || scrollbarState.hasThumb,
2015
+ ref: scrollbarState.scrollbar.opts.ref,
2016
+ presence
2017
+ });
2018
+ }
2019
+ }
2020
+ do {
2021
+ $$settled = true;
2022
+ $$inner_renderer = $$renderer2.copy();
2023
+ $$render_inner($$inner_renderer);
2024
+ } while (!$$settled);
2025
+ $$renderer2.subsume($$inner_renderer);
2026
+ bind_props($$props, { ref });
2027
+ });
2028
+ }
2029
+ function Scroll_area_corner_impl($$renderer, $$props) {
2030
+ $$renderer.component(($$renderer2) => {
2031
+ let {
2032
+ ref = null,
2033
+ id,
2034
+ children,
2035
+ child,
2036
+ $$slots,
2037
+ $$events,
2038
+ ...restProps
2039
+ } = $$props;
2040
+ const cornerState = ScrollAreaCornerImplState.create({
2041
+ id: boxWith(() => id),
2042
+ ref: boxWith(() => ref, (v) => ref = v)
2043
+ });
2044
+ const mergedProps = derived(() => mergeProps(restProps, cornerState.props));
2045
+ if (child) {
2046
+ $$renderer2.push("<!--[0-->");
2047
+ child($$renderer2, { props: mergedProps() });
2048
+ $$renderer2.push(`<!---->`);
2049
+ } else {
2050
+ $$renderer2.push("<!--[-1-->");
2051
+ $$renderer2.push(`<div${attributes({ ...mergedProps() })}>`);
2052
+ children?.($$renderer2);
2053
+ $$renderer2.push(`<!----></div>`);
2054
+ }
2055
+ $$renderer2.push(`<!--]-->`);
2056
+ bind_props($$props, { ref });
2057
+ });
2058
+ }
2059
+ function Scroll_area_corner($$renderer, $$props) {
2060
+ $$renderer.component(($$renderer2) => {
2061
+ const uid = props_id($$renderer2);
2062
+ let {
2063
+ ref = null,
2064
+ id = createId(uid),
2065
+ $$slots,
2066
+ $$events,
2067
+ ...restProps
2068
+ } = $$props;
2069
+ const scrollAreaState = ScrollAreaRootContext.get();
2070
+ const hasBothScrollbarsVisible = derived(() => Boolean(scrollAreaState.scrollbarXNode && scrollAreaState.scrollbarYNode));
2071
+ const hasCorner = derived(() => scrollAreaState.opts.type.current !== "scroll" && hasBothScrollbarsVisible());
2072
+ let $$settled = true;
2073
+ let $$inner_renderer;
2074
+ function $$render_inner($$renderer3) {
2075
+ if (hasCorner()) {
2076
+ $$renderer3.push("<!--[0-->");
2077
+ Scroll_area_corner_impl($$renderer3, spread_props([
2078
+ restProps,
2079
+ {
2080
+ id,
2081
+ get ref() {
2082
+ return ref;
2083
+ },
2084
+ set ref($$value) {
2085
+ ref = $$value;
2086
+ $$settled = false;
2087
+ }
2088
+ }
2089
+ ]));
2090
+ } else {
2091
+ $$renderer3.push("<!--[-1-->");
2092
+ }
2093
+ $$renderer3.push(`<!--]-->`);
2094
+ }
2095
+ do {
2096
+ $$settled = true;
2097
+ $$inner_renderer = $$renderer2.copy();
2098
+ $$render_inner($$inner_renderer);
2099
+ } while (!$$settled);
2100
+ $$renderer2.subsume($$inner_renderer);
2101
+ bind_props($$props, { ref });
2102
+ });
2103
+ }
2104
+ function Tooltip$1($$renderer, $$props) {
2105
+ $$renderer.component(($$renderer2) => {
2106
+ let {
2107
+ open = false,
2108
+ triggerId = null,
2109
+ onOpenChange = noop$1,
2110
+ onOpenChangeComplete = noop$1,
2111
+ disabled,
2112
+ delayDuration,
2113
+ disableCloseOnTriggerClick,
2114
+ disableHoverableContent,
2115
+ ignoreNonKeyboardFocus,
2116
+ tether,
2117
+ children
2118
+ } = $$props;
2119
+ const rootState = TooltipRootState.create({
2120
+ open: boxWith(() => open, (v) => {
2121
+ open = v;
2122
+ onOpenChange(v);
2123
+ }),
2124
+ triggerId: boxWith(() => triggerId, (v) => {
2125
+ triggerId = v;
2126
+ }),
2127
+ delayDuration: boxWith(() => delayDuration),
2128
+ disableCloseOnTriggerClick: boxWith(() => disableCloseOnTriggerClick),
2129
+ disableHoverableContent: boxWith(() => disableHoverableContent),
2130
+ ignoreNonKeyboardFocus: boxWith(() => ignoreNonKeyboardFocus),
2131
+ disabled: boxWith(() => disabled),
2132
+ onOpenChangeComplete: boxWith(() => onOpenChangeComplete),
2133
+ tether: boxWith(() => tether)
2134
+ });
2135
+ Floating_layer($$renderer2, {
2136
+ tooltip: true,
2137
+ children: ($$renderer3) => {
2138
+ children?.($$renderer3, {
2139
+ open: rootState.opts.open.current,
2140
+ triggerId: rootState.activeTriggerId,
2141
+ payload: rootState.activePayload
2142
+ });
2143
+ $$renderer3.push(`<!---->`);
2144
+ }
2145
+ });
2146
+ bind_props($$props, { open, triggerId });
2147
+ });
2148
+ }
2149
+ function Tooltip_content$1($$renderer, $$props) {
2150
+ $$renderer.component(($$renderer2) => {
2151
+ const uid = props_id($$renderer2);
2152
+ let {
2153
+ children,
2154
+ child,
2155
+ id = createId(uid),
2156
+ ref = null,
2157
+ side = "top",
2158
+ sideOffset = 0,
2159
+ align = "center",
2160
+ avoidCollisions = true,
2161
+ arrowPadding = 0,
2162
+ sticky = "partial",
2163
+ strategy,
2164
+ hideWhenDetached = false,
2165
+ customAnchor,
2166
+ collisionPadding = 0,
2167
+ onInteractOutside = noop$1,
2168
+ onEscapeKeydown = noop$1,
2169
+ forceMount = false,
2170
+ style,
2171
+ $$slots,
2172
+ $$events,
2173
+ ...restProps
2174
+ } = $$props;
2175
+ const contentState = TooltipContentState.create({
2176
+ id: boxWith(() => id),
2177
+ ref: boxWith(() => ref, (v) => ref = v),
2178
+ onInteractOutside: boxWith(() => onInteractOutside),
2179
+ onEscapeKeydown: boxWith(() => onEscapeKeydown)
2180
+ });
2181
+ const floatingProps = derived(() => ({
2182
+ side,
2183
+ sideOffset,
2184
+ align,
2185
+ avoidCollisions,
2186
+ arrowPadding,
2187
+ sticky,
2188
+ hideWhenDetached,
2189
+ collisionPadding,
2190
+ strategy,
2191
+ customAnchor: customAnchor ?? contentState.root.triggerNode
2192
+ }));
2193
+ const mergedProps = derived(() => mergeProps(restProps, floatingProps(), contentState.props));
2194
+ if (forceMount) {
2195
+ $$renderer2.push("<!--[0-->");
2196
+ {
2197
+ let popper = function($$renderer3, { props, wrapperProps }) {
2198
+ const finalProps = mergeProps(props, { style: getFloatingContentCSSVars("tooltip") }, { style });
2199
+ if (child) {
2200
+ $$renderer3.push("<!--[0-->");
2201
+ child($$renderer3, {
2202
+ props: finalProps,
2203
+ wrapperProps,
2204
+ ...contentState.snippetProps
2205
+ });
2206
+ $$renderer3.push(`<!---->`);
2207
+ } else {
2208
+ $$renderer3.push("<!--[-1-->");
2209
+ $$renderer3.push(`<div${attributes({ ...wrapperProps })}><div${attributes({ ...finalProps })}>`);
2210
+ children?.($$renderer3);
2211
+ $$renderer3.push(`<!----></div></div>`);
2212
+ }
2213
+ $$renderer3.push(`<!--]-->`);
2214
+ };
2215
+ Popper_layer_force_mount($$renderer2, spread_props([
2216
+ mergedProps(),
2217
+ contentState.popperProps,
2218
+ {
2219
+ enabled: contentState.root.opts.open.current,
2220
+ id,
2221
+ trapFocus: false,
2222
+ loop: false,
2223
+ preventScroll: false,
2224
+ forceMount: true,
2225
+ ref: contentState.opts.ref,
2226
+ tooltip: true,
2227
+ shouldRender: contentState.shouldRender,
2228
+ contentPointerEvents: contentState.root.disableHoverableContent ? "none" : "auto",
2229
+ popper,
2230
+ $$slots: { popper: true }
2231
+ }
2232
+ ]));
2233
+ }
2234
+ } else if (!forceMount) {
2235
+ $$renderer2.push("<!--[1-->");
2236
+ {
2237
+ let popper = function($$renderer3, { props, wrapperProps }) {
2238
+ const finalProps = mergeProps(props, { style: getFloatingContentCSSVars("tooltip") }, { style });
2239
+ if (child) {
2240
+ $$renderer3.push("<!--[0-->");
2241
+ child($$renderer3, {
2242
+ props: finalProps,
2243
+ wrapperProps,
2244
+ ...contentState.snippetProps
2245
+ });
2246
+ $$renderer3.push(`<!---->`);
2247
+ } else {
2248
+ $$renderer3.push("<!--[-1-->");
2249
+ $$renderer3.push(`<div${attributes({ ...wrapperProps })}><div${attributes({ ...finalProps })}>`);
2250
+ children?.($$renderer3);
2251
+ $$renderer3.push(`<!----></div></div>`);
2252
+ }
2253
+ $$renderer3.push(`<!--]-->`);
2254
+ };
2255
+ Popper_layer($$renderer2, spread_props([
2256
+ mergedProps(),
2257
+ contentState.popperProps,
2258
+ {
2259
+ open: contentState.root.opts.open.current,
2260
+ id,
2261
+ trapFocus: false,
2262
+ loop: false,
2263
+ preventScroll: false,
2264
+ forceMount: false,
2265
+ ref: contentState.opts.ref,
2266
+ tooltip: true,
2267
+ shouldRender: contentState.shouldRender,
2268
+ contentPointerEvents: contentState.root.disableHoverableContent ? "none" : "auto",
2269
+ popper,
2270
+ $$slots: { popper: true }
2271
+ }
2272
+ ]));
2273
+ }
2274
+ } else {
2275
+ $$renderer2.push("<!--[-1-->");
2276
+ }
2277
+ $$renderer2.push(`<!--]-->`);
2278
+ bind_props($$props, { ref });
2279
+ });
2280
+ }
2281
+ function Tooltip_trigger$1($$renderer, $$props) {
2282
+ $$renderer.component(($$renderer2) => {
2283
+ const uid = props_id($$renderer2);
2284
+ let {
2285
+ children,
2286
+ child,
2287
+ id = createId(uid),
2288
+ disabled = false,
2289
+ payload,
2290
+ tether,
2291
+ type = "button",
2292
+ tabindex = 0,
2293
+ ref = null,
2294
+ $$slots,
2295
+ $$events,
2296
+ ...restProps
2297
+ } = $$props;
2298
+ const triggerState = TooltipTriggerState.create({
2299
+ id: boxWith(() => id),
2300
+ disabled: boxWith(() => disabled ?? false),
2301
+ tabindex: boxWith(() => tabindex ?? 0),
2302
+ payload: boxWith(() => payload),
2303
+ tether: boxWith(() => tether),
2304
+ ref: boxWith(() => ref, (v) => ref = v)
2305
+ });
2306
+ const mergedProps = derived(() => mergeProps(restProps, triggerState.props, { type }));
2307
+ if (child) {
2308
+ $$renderer2.push("<!--[0-->");
2309
+ child($$renderer2, { props: mergedProps() });
2310
+ $$renderer2.push(`<!---->`);
2311
+ } else {
2312
+ $$renderer2.push("<!--[-1-->");
2313
+ $$renderer2.push(`<button${attributes({ ...mergedProps() })}>`);
2314
+ children?.($$renderer2);
2315
+ $$renderer2.push(`<!----></button>`);
2316
+ }
2317
+ $$renderer2.push(`<!--]-->`);
2318
+ bind_props($$props, { ref });
2319
+ });
2320
+ }
2321
+ function Tooltip_arrow($$renderer, $$props) {
2322
+ $$renderer.component(($$renderer2) => {
2323
+ let { ref = null, $$slots, $$events, ...restProps } = $$props;
2324
+ let $$settled = true;
2325
+ let $$inner_renderer;
2326
+ function $$render_inner($$renderer3) {
2327
+ Floating_layer_arrow($$renderer3, spread_props([
2328
+ restProps,
2329
+ {
2330
+ get ref() {
2331
+ return ref;
2332
+ },
2333
+ set ref($$value) {
2334
+ ref = $$value;
2335
+ $$settled = false;
2336
+ }
2337
+ }
2338
+ ]));
2339
+ }
2340
+ do {
2341
+ $$settled = true;
2342
+ $$inner_renderer = $$renderer2.copy();
2343
+ $$render_inner($$inner_renderer);
2344
+ } while (!$$settled);
2345
+ $$renderer2.subsume($$inner_renderer);
2346
+ bind_props($$props, { ref });
2347
+ });
2348
+ }
2349
+ function AudioRecorder($$renderer, $$props) {
2350
+ $$renderer.component(($$renderer2) => {
2351
+ let { onRecordingComplete, maxSizeBytes } = $$props;
2352
+ const editorState = derived(getEditorState);
2353
+ let isRecording = false;
2354
+ let recordingError = "";
2355
+ let mediaRecorder = null;
2356
+ let mediaStream = null;
2357
+ let audioChunks = [];
2358
+ let displayDuration = 0;
2359
+ let currentSizeBytes = 0;
2360
+ let recordingInterval = null;
2361
+ let recordingStartTime = 0;
2362
+ let sizeWarning = derived(() => {
2363
+ if (!maxSizeBytes || currentSizeBytes === 0) return false;
2364
+ return currentSizeBytes >= maxSizeBytes * RECORDER_STOP_THRESHOLD * 0.75;
2365
+ });
2366
+ async function startRecording() {
2367
+ try {
2368
+ recordingError = "";
2369
+ mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
2370
+ const mimeType = "audio/mp4";
2371
+ if (!MediaRecorder.isTypeSupported(mimeType)) {
2372
+ throw new Error("Your browser does not support M4A recording. Please use Safari.");
2373
+ }
2374
+ mediaRecorder = new MediaRecorder(mediaStream, { mimeType });
2375
+ audioChunks = [];
2376
+ displayDuration = 0;
2377
+ currentSizeBytes = 0;
2378
+ recordingStartTime = Date.now();
2379
+ mediaRecorder.ondataavailable = (event) => {
2380
+ if (event.data.size > 0) {
2381
+ audioChunks.push(event.data);
2382
+ currentSizeBytes += event.data.size;
2383
+ if (maxSizeBytes && currentSizeBytes >= maxSizeBytes * RECORDER_STOP_THRESHOLD) {
2384
+ stopRecording();
2385
+ }
2386
+ }
2387
+ };
2388
+ mediaRecorder.onstop = async () => {
2389
+ stopMediaStream(mediaStream);
2390
+ mediaStream = null;
2391
+ finalizeRecording();
2392
+ };
2393
+ mediaRecorder.start(1e3);
2394
+ isRecording = true;
2395
+ recordingInterval = setInterval(
2396
+ () => {
2397
+ displayDuration = (Date.now() - recordingStartTime) / 1e3;
2398
+ },
2399
+ 100
2400
+ );
2401
+ } catch (err) {
2402
+ recordingError = handleMediaError(err).message;
2403
+ console.error("Recording error:", err);
2404
+ stopMediaStream(mediaStream);
2405
+ mediaStream = null;
2406
+ }
2407
+ }
2408
+ function stopRecording() {
2409
+ if (mediaRecorder && isRecording) {
2410
+ mediaRecorder.stop();
2411
+ isRecording = false;
2412
+ if (recordingInterval) {
2413
+ clearInterval(recordingInterval);
2414
+ recordingInterval = null;
2415
+ }
2416
+ }
2417
+ }
2418
+ async function finalizeRecording() {
2419
+ const blob = new Blob(audioChunks, { type: "audio/mp4" });
2420
+ const fileName = generateTimestampedFileName("recording", "m4a");
2421
+ let duration = displayDuration;
2422
+ try {
2423
+ duration = await getBlobDuration(blob);
2424
+ } catch {
2425
+ }
2426
+ onRecordingComplete({ blob, fileName, duration, mediaType: "audio" });
2427
+ }
2428
+ function getBlobDuration(blob) {
2429
+ return new Promise((resolve) => {
2430
+ const url = URL.createObjectURL(blob);
2431
+ const audio = document.createElement("audio");
2432
+ audio.preload = "metadata";
2433
+ audio.onloadedmetadata = () => {
2434
+ URL.revokeObjectURL(url);
2435
+ resolve(isFinite(audio.duration) && audio.duration > 0 ? audio.duration : 1);
2436
+ };
2437
+ audio.onerror = () => {
2438
+ URL.revokeObjectURL(url);
2439
+ resolve(1);
2440
+ };
2441
+ audio.src = url;
2442
+ });
2443
+ }
2444
+ async function handleStartRecording() {
2445
+ await uiStore.requireLogin("save your project", () => {
2446
+ uiStore.requireCreateProject(editorState(), startRecording);
2447
+ });
2448
+ }
2449
+ $$renderer2.push(`<div class="space-y-2">`);
2450
+ if (isRecording) {
2451
+ $$renderer2.push("<!--[0-->");
2452
+ $$renderer2.push(`<div class="rounded border-2 border-destructive bg-destructive/10 p-3 text-center"><div class="mb-2 flex items-center justify-center gap-2"><div class="h-2 w-2 animate-pulse rounded-full bg-destructive"></div> <span class="text-sm font-medium">Recording...</span></div> <div class="mb-2 font-mono text-2xl tabular-nums">${escape_html(formatDuration(Math.floor(displayDuration)))}</div> `);
2453
+ Button($$renderer2, {
2454
+ variant: "destructive",
2455
+ size: "sm",
2456
+ onclick: stopRecording,
2457
+ children: ($$renderer3) => {
2458
+ Square($$renderer3, { class: "mr-1 size-3" });
2459
+ $$renderer3.push(`<!----> Stop Recording`);
2460
+ },
2461
+ $$slots: { default: true }
2462
+ });
2463
+ $$renderer2.push(`<!----> `);
2464
+ if (sizeWarning()) {
2465
+ $$renderer2.push("<!--[0-->");
2466
+ $$renderer2.push(`<p class="mt-1 text-center text-xs text-destructive">Approaching size limit — recording will stop automatically</p>`);
2467
+ } else {
2468
+ $$renderer2.push("<!--[-1-->");
2469
+ }
2470
+ $$renderer2.push(`<!--]--></div>`);
2471
+ } else {
2472
+ $$renderer2.push("<!--[-1-->");
2473
+ Button($$renderer2, {
2474
+ variant: "default",
2475
+ size: "sm",
2476
+ class: "w-full text-xs",
2477
+ onclick: handleStartRecording,
2478
+ children: ($$renderer3) => {
2479
+ Mic($$renderer3, { class: "mr-1 size-3" });
2480
+ $$renderer3.push(`<!----> Record Audio`);
2481
+ },
2482
+ $$slots: { default: true }
2483
+ });
2484
+ }
2485
+ $$renderer2.push(`<!--]--> `);
2486
+ if (recordingError) {
2487
+ $$renderer2.push("<!--[0-->");
2488
+ $$renderer2.push(`<p class="text-xs text-destructive">${escape_html(recordingError)}</p>`);
2489
+ } else {
2490
+ $$renderer2.push("<!--[-1-->");
2491
+ }
2492
+ $$renderer2.push(`<!--]--></div>`);
2493
+ });
2494
+ }
2495
+ function VideoRecorder($$renderer, $$props) {
2496
+ $$renderer.component(($$renderer2) => {
2497
+ let { onRecordingComplete, audioEnabled = true, maxSizeBytes } = $$props;
2498
+ const editorState = derived(getEditorState);
2499
+ let isRecording = false;
2500
+ let recordingError = "";
2501
+ let mediaRecorder = null;
2502
+ let mediaStream = null;
2503
+ let videoChunks = [];
2504
+ let facingMode = "user";
2505
+ let recordingMode = "camera";
2506
+ const MAX_DURATION = 300;
2507
+ let displayDuration = 0;
2508
+ let currentSizeBytes = 0;
2509
+ let recordingInterval = null;
2510
+ let recordingStartTime = 0;
2511
+ let sizeWarning = derived(() => {
2512
+ if (!maxSizeBytes || currentSizeBytes === 0) return false;
2513
+ return currentSizeBytes >= maxSizeBytes * RECORDER_STOP_THRESHOLD * 0.9;
2514
+ });
2515
+ async function handleStartRecording() {
2516
+ await uiStore.requireLogin("save your project", () => {
2517
+ uiStore.requireCreateProject(editorState(), startRecording);
2518
+ });
2519
+ }
2520
+ async function startRecording() {
2521
+ try {
2522
+ recordingError = "";
2523
+ if (recordingMode === "screen") ;
2524
+ else {
2525
+ mediaStream = await navigator.mediaDevices.getUserMedia({
2526
+ video: { width: { ideal: 1280 }, height: { ideal: 720 }, facingMode },
2527
+ audio: audioEnabled
2528
+ });
2529
+ }
2530
+ const mimeType = "video/mp4";
2531
+ if (!MediaRecorder.isTypeSupported(mimeType)) {
2532
+ throw new Error("Your browser does not support MP4 recording. Please use Safari.");
2533
+ }
2534
+ mediaRecorder = new MediaRecorder(mediaStream, {
2535
+ mimeType,
2536
+ videoBitsPerSecond: recordingMode === "screen" ? 5e6 : 25e5
2537
+ });
2538
+ videoChunks = [];
2539
+ displayDuration = 0;
2540
+ currentSizeBytes = 0;
2541
+ recordingStartTime = Date.now();
2542
+ mediaRecorder.ondataavailable = (event) => {
2543
+ if (event.data.size > 0) {
2544
+ videoChunks.push(event.data);
2545
+ currentSizeBytes += event.data.size;
2546
+ if (maxSizeBytes && currentSizeBytes >= maxSizeBytes * RECORDER_STOP_THRESHOLD) {
2547
+ stopRecording();
2548
+ }
2549
+ }
2550
+ };
2551
+ mediaRecorder.onstop = async () => {
2552
+ stopMediaStream(mediaStream);
2553
+ mediaStream = null;
2554
+ finalizeRecording();
2555
+ };
2556
+ mediaRecorder.start(1e3);
2557
+ isRecording = true;
2558
+ recordingInterval = setInterval(
2559
+ () => {
2560
+ displayDuration = (Date.now() - recordingStartTime) / 1e3;
2561
+ if (displayDuration >= MAX_DURATION) {
2562
+ stopRecording();
2563
+ }
2564
+ },
2565
+ 100
2566
+ );
2567
+ } catch (err) {
2568
+ recordingError = handleMediaError(err).message;
2569
+ console.error("Recording error:", err);
2570
+ stopMediaStream(mediaStream);
2571
+ mediaStream = null;
2572
+ }
2573
+ }
2574
+ function stopRecording() {
2575
+ if (mediaRecorder && isRecording) {
2576
+ mediaRecorder.stop();
2577
+ isRecording = false;
2578
+ if (recordingInterval) {
2579
+ clearInterval(recordingInterval);
2580
+ recordingInterval = null;
2581
+ }
2582
+ }
2583
+ }
2584
+ async function finalizeRecording() {
2585
+ const blob = new Blob(videoChunks, { type: "video/mp4" });
2586
+ const fileName = generateTimestampedFileName("video", "mp4");
2587
+ let duration = displayDuration;
2588
+ try {
2589
+ duration = await getBlobDuration(blob);
2590
+ } catch {
2591
+ }
2592
+ onRecordingComplete({ blob, fileName, duration, mediaType: "video" });
2593
+ }
2594
+ function getBlobDuration(blob) {
2595
+ return new Promise((resolve) => {
2596
+ const url = URL.createObjectURL(blob);
2597
+ const video = document.createElement("video");
2598
+ video.preload = "metadata";
2599
+ video.onloadedmetadata = () => {
2600
+ URL.revokeObjectURL(url);
2601
+ resolve(isFinite(video.duration) && video.duration > 0 ? video.duration : 1);
2602
+ };
2603
+ video.onerror = () => {
2604
+ URL.revokeObjectURL(url);
2605
+ resolve(1);
2606
+ };
2607
+ video.src = url;
2608
+ });
2609
+ }
2610
+ $$renderer2.push(`<div class="space-y-2">`);
2611
+ if (isRecording) {
2612
+ $$renderer2.push("<!--[0-->");
2613
+ $$renderer2.push(`<div class="rounded border-2 border-destructive bg-destructive/10 p-3"><div class="relative mb-2 overflow-hidden rounded bg-black"><video autoplay="" muted="" playsinline="" class="h-auto w-full" style="max-height: 180px; aspect-ratio: 16/9;"></video> <div class="absolute top-2 left-2 flex items-center gap-2 rounded bg-black/50 px-2 py-1"><div class="h-2 w-2 animate-pulse rounded-full bg-destructive"></div> <span class="text-xs font-medium text-white">Recording ${escape_html("Camera")}</span></div> <div class="absolute top-2 right-2 rounded bg-black/50 px-2 py-1"><span class="font-mono text-xs text-white tabular-nums">${escape_html(formatDuration(Math.floor(displayDuration)))}</span></div> `);
2614
+ {
2615
+ $$renderer2.push("<!--[0-->");
2616
+ $$renderer2.push(`<button type="button" class="absolute right-2 bottom-2 rounded-full bg-black/50 p-2 text-white hover:bg-black/70" title="Switch camera">`);
2617
+ Rotate_cw($$renderer2, { class: "size-4" });
2618
+ $$renderer2.push(`<!----></button>`);
2619
+ }
2620
+ $$renderer2.push(`<!--]--></div> `);
2621
+ Button($$renderer2, {
2622
+ variant: "destructive",
2623
+ size: "sm",
2624
+ class: "w-full",
2625
+ onclick: stopRecording,
2626
+ children: ($$renderer3) => {
2627
+ Square($$renderer3, { class: "mr-1 size-3" });
2628
+ $$renderer3.push(`<!----> Stop Recording`);
2629
+ },
2630
+ $$slots: { default: true }
2631
+ });
2632
+ $$renderer2.push(`<!----> `);
2633
+ if (sizeWarning()) {
2634
+ $$renderer2.push("<!--[0-->");
2635
+ $$renderer2.push(`<p class="mt-1 text-center text-xs text-destructive">Approaching size limit — recording will stop automatically</p>`);
2636
+ } else if (displayDuration >= MAX_DURATION - 10) {
2637
+ $$renderer2.push("<!--[1-->");
2638
+ $$renderer2.push(`<p class="mt-1 text-center text-xs text-destructive">${escape_html(Math.ceil(MAX_DURATION - displayDuration))}s remaining</p>`);
2639
+ } else {
2640
+ $$renderer2.push("<!--[-1-->");
2641
+ }
2642
+ $$renderer2.push(`<!--]--></div>`);
2643
+ } else {
2644
+ $$renderer2.push("<!--[-1-->");
2645
+ $$renderer2.push(`<div class="flex gap-1 rounded border bg-muted/30 p-1"><button type="button"${attr_class(`flex flex-1 items-center justify-center gap-1 rounded px-2 py-1.5 text-xs transition-colors ${stringify("bg-background shadow-sm")}`)}>`);
2646
+ Camera($$renderer2, { class: "size-3" });
2647
+ $$renderer2.push(`<!----> Camera</button> <button type="button"${attr_class(`flex flex-1 items-center justify-center gap-1 rounded px-2 py-1.5 text-xs transition-colors ${stringify("hover:bg-background/50")}`)}>`);
2648
+ Monitor($$renderer2, { class: "size-3" });
2649
+ $$renderer2.push(`<!----> Screen</button></div> `);
2650
+ Button($$renderer2, {
2651
+ variant: "default",
2652
+ size: "sm",
2653
+ class: "w-full text-xs",
2654
+ onclick: handleStartRecording,
2655
+ children: ($$renderer3) => {
2656
+ {
2657
+ $$renderer3.push("<!--[-1-->");
2658
+ Video($$renderer3, { class: "mr-1 size-3" });
2659
+ $$renderer3.push(`<!----> Record Camera`);
2660
+ }
2661
+ $$renderer3.push(`<!--]-->`);
2662
+ },
2663
+ $$slots: { default: true }
2664
+ });
2665
+ $$renderer2.push(`<!---->`);
2666
+ }
2667
+ $$renderer2.push(`<!--]--> `);
2668
+ if (recordingError) {
2669
+ $$renderer2.push("<!--[0-->");
2670
+ $$renderer2.push(`<p class="text-xs text-destructive">${escape_html(recordingError)}</p>`);
2671
+ } else {
2672
+ $$renderer2.push("<!--[-1-->");
2673
+ }
2674
+ $$renderer2.push(`<!--]--></div>`);
2675
+ });
2676
+ }
2677
+ function CameraCapture($$renderer, $$props) {
2678
+ $$renderer.component(($$renderer2) => {
2679
+ let { onCaptureComplete, projectId } = $$props;
2680
+ const editorState = derived(getEditorState);
2681
+ let cameraState = "idle";
2682
+ let captureError = "";
2683
+ let mediaStream = null;
2684
+ let facingMode = "user";
2685
+ let capturedImageUrl = "";
2686
+ async function startPreview() {
2687
+ try {
2688
+ captureError = "";
2689
+ mediaStream = await navigator.mediaDevices.getUserMedia({
2690
+ video: { width: { ideal: 1920 }, height: { ideal: 1080 }, facingMode },
2691
+ audio: false
2692
+ });
2693
+ cameraState = "preview";
2694
+ } catch (err) {
2695
+ const error = handleMediaError(err);
2696
+ captureError = error.message;
2697
+ console.error("Camera error:", err);
2698
+ cameraState = "idle";
2699
+ }
2700
+ }
2701
+ function capturePhoto() {
2702
+ return;
2703
+ }
2704
+ async function handleStartPreview() {
2705
+ await uiStore.requireLogin("save your project", () => {
2706
+ uiStore.requireCreateProject(editorState(), startPreview);
2707
+ });
2708
+ }
2709
+ async function usePhoto() {
2710
+ return;
2711
+ }
2712
+ function retakePhoto() {
2713
+ capturedImageUrl = "";
2714
+ cameraState = "idle";
2715
+ startPreview();
2716
+ }
2717
+ function cancelPreview() {
2718
+ stopMediaStream(mediaStream);
2719
+ mediaStream = null;
2720
+ cameraState = "idle";
2721
+ }
2722
+ $$renderer2.push(`<div class="space-y-2">`);
2723
+ if (
2724
+ // Cleanup on unmount
2725
+ cameraState === "idle"
2726
+ ) {
2727
+ $$renderer2.push("<!--[0-->");
2728
+ Button($$renderer2, {
2729
+ variant: "default",
2730
+ size: "sm",
2731
+ class: "w-full text-xs",
2732
+ onclick: handleStartPreview,
2733
+ children: ($$renderer3) => {
2734
+ Camera($$renderer3, { class: "mr-1 size-3" });
2735
+ $$renderer3.push(`<!----> Take Photo`);
2736
+ },
2737
+ $$slots: { default: true }
2738
+ });
2739
+ } else if (cameraState === "preview") {
2740
+ $$renderer2.push("<!--[1-->");
2741
+ $$renderer2.push(`<div class="rounded border-2 border-primary bg-black p-2"><div class="relative mb-2 overflow-hidden rounded"><video autoplay="" playsinline="" muted="" class="h-auto w-full" style="max-height: 240px;"></video> <button type="button" class="absolute top-2 right-2 rounded-full bg-black/50 p-2 text-white hover:bg-black/70" title="Switch camera">`);
2742
+ Rotate_cw($$renderer2, { class: "size-4" });
2743
+ $$renderer2.push(`<!----></button></div> <div class="flex gap-2">`);
2744
+ Button($$renderer2, {
2745
+ variant: "outline",
2746
+ size: "sm",
2747
+ class: "flex-1 text-xs",
2748
+ onclick: cancelPreview,
2749
+ children: ($$renderer3) => {
2750
+ X($$renderer3, { class: "mr-1 size-3" });
2751
+ $$renderer3.push(`<!----> Cancel`);
2752
+ },
2753
+ $$slots: { default: true }
2754
+ });
2755
+ $$renderer2.push(`<!----> `);
2756
+ Button($$renderer2, {
2757
+ variant: "default",
2758
+ size: "sm",
2759
+ class: "flex-1 text-xs",
2760
+ onclick: capturePhoto,
2761
+ children: ($$renderer3) => {
2762
+ Camera($$renderer3, { class: "mr-1 size-3" });
2763
+ $$renderer3.push(`<!----> Capture`);
2764
+ },
2765
+ $$slots: { default: true }
2766
+ });
2767
+ $$renderer2.push(`<!----></div></div>`);
2768
+ } else if (cameraState === "review") {
2769
+ $$renderer2.push("<!--[2-->");
2770
+ $$renderer2.push(`<div class="rounded border-2 border-primary bg-black p-2"><div class="relative mb-2 overflow-hidden rounded"><img${attr("src", capturedImageUrl)} alt="Captured" class="h-auto w-full" style="max-height: 240px;"/></div> <div class="flex gap-2">`);
2771
+ Button($$renderer2, {
2772
+ variant: "outline",
2773
+ size: "sm",
2774
+ class: "flex-1 text-xs",
2775
+ onclick: retakePhoto,
2776
+ children: ($$renderer3) => {
2777
+ Rotate_cw($$renderer3, { class: "mr-1 size-3" });
2778
+ $$renderer3.push(`<!----> Retake`);
2779
+ },
2780
+ $$slots: { default: true }
2781
+ });
2782
+ $$renderer2.push(`<!----> `);
2783
+ Button($$renderer2, {
2784
+ variant: "default",
2785
+ size: "sm",
2786
+ class: "flex-1 text-xs",
2787
+ onclick: usePhoto,
2788
+ children: ($$renderer3) => {
2789
+ Check($$renderer3, { class: "mr-1 size-3" });
2790
+ $$renderer3.push(`<!----> Use Photo`);
2791
+ },
2792
+ $$slots: { default: true }
2793
+ });
2794
+ $$renderer2.push(`<!----></div></div>`);
2795
+ } else if (cameraState === "uploading") {
2796
+ $$renderer2.push("<!--[3-->");
2797
+ $$renderer2.push(`<div class="rounded border bg-muted/30 p-3 text-center">`);
2798
+ Loader_circle($$renderer2, { class: "mx-auto mb-2 size-6 animate-spin text-primary" });
2799
+ $$renderer2.push(`<!----> <span class="text-sm">Uploading photo...</span></div>`);
2800
+ } else {
2801
+ $$renderer2.push("<!--[-1-->");
2802
+ }
2803
+ $$renderer2.push(`<!--]--> <canvas class="hidden"></canvas> `);
2804
+ if (captureError) {
2805
+ $$renderer2.push("<!--[0-->");
2806
+ $$renderer2.push(`<p class="text-xs text-destructive">${escape_html(captureError)}</p>`);
2807
+ } else {
2808
+ $$renderer2.push("<!--[-1-->");
2809
+ }
2810
+ $$renderer2.push(`<!--]--></div>`);
2811
+ });
2812
+ }
2813
+ function Scroll_area_scrollbar($$renderer, $$props) {
2814
+ $$renderer.component(($$renderer2) => {
2815
+ let {
2816
+ ref = null,
2817
+ class: className,
2818
+ orientation = "vertical",
2819
+ children,
2820
+ $$slots,
2821
+ $$events,
2822
+ ...restProps
2823
+ } = $$props;
2824
+ let $$settled = true;
2825
+ let $$inner_renderer;
2826
+ function $$render_inner($$renderer3) {
2827
+ if (Scroll_area_scrollbar$1) {
2828
+ $$renderer3.push("<!--[-->");
2829
+ Scroll_area_scrollbar$1($$renderer3, spread_props([
2830
+ {
2831
+ "data-slot": "scroll-area-scrollbar",
2832
+ orientation,
2833
+ class: cn("flex touch-none p-px transition-colors select-none", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", className)
2834
+ },
2835
+ restProps,
2836
+ {
2837
+ get ref() {
2838
+ return ref;
2839
+ },
2840
+ set ref($$value) {
2841
+ ref = $$value;
2842
+ $$settled = false;
2843
+ },
2844
+ children: ($$renderer4) => {
2845
+ children?.($$renderer4);
2846
+ $$renderer4.push(`<!----> `);
2847
+ if (Scroll_area_thumb) {
2848
+ $$renderer4.push("<!--[-->");
2849
+ Scroll_area_thumb($$renderer4, {
2850
+ "data-slot": "scroll-area-thumb",
2851
+ class: "relative flex-1 rounded-full bg-border"
2852
+ });
2853
+ $$renderer4.push("<!--]-->");
2854
+ } else {
2855
+ $$renderer4.push("<!--[!-->");
2856
+ $$renderer4.push("<!--]-->");
2857
+ }
2858
+ },
2859
+ $$slots: { default: true }
2860
+ }
2861
+ ]));
2862
+ $$renderer3.push("<!--]-->");
2863
+ } else {
2864
+ $$renderer3.push("<!--[!-->");
2865
+ $$renderer3.push("<!--]-->");
2866
+ }
2867
+ }
2868
+ do {
2869
+ $$settled = true;
2870
+ $$inner_renderer = $$renderer2.copy();
2871
+ $$render_inner($$inner_renderer);
2872
+ } while (!$$settled);
2873
+ $$renderer2.subsume($$inner_renderer);
2874
+ bind_props($$props, { ref });
2875
+ });
2876
+ }
2877
+ function Scroll_area($$renderer, $$props) {
2878
+ $$renderer.component(($$renderer2) => {
2879
+ let {
2880
+ ref = null,
2881
+ class: className,
2882
+ orientation = "vertical",
2883
+ scrollbarXClasses = "",
2884
+ scrollbarYClasses = "",
2885
+ viewportClass = "",
2886
+ children,
2887
+ $$slots,
2888
+ $$events,
2889
+ ...restProps
2890
+ } = $$props;
2891
+ let $$settled = true;
2892
+ let $$inner_renderer;
2893
+ function $$render_inner($$renderer3) {
2894
+ if (Scroll_area$1) {
2895
+ $$renderer3.push("<!--[-->");
2896
+ Scroll_area$1($$renderer3, spread_props([
2897
+ {
2898
+ "data-slot": "scroll-area",
2899
+ class: cn("relative min-h-0", className)
2900
+ },
2901
+ restProps,
2902
+ {
2903
+ children: ($$renderer4) => {
2904
+ if (Scroll_area_viewport) {
2905
+ $$renderer4.push("<!--[-->");
2906
+ Scroll_area_viewport($$renderer4, {
2907
+ "data-slot": "scroll-area-viewport",
2908
+ class: cn("size-full rounded-[inherit] ring-ring/10 outline-ring/50 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 dark:ring-ring/20 dark:outline-ring/40", viewportClass),
2909
+ get ref() {
2910
+ return ref;
2911
+ },
2912
+ set ref($$value) {
2913
+ ref = $$value;
2914
+ $$settled = false;
2915
+ },
2916
+ children: ($$renderer5) => {
2917
+ children?.($$renderer5);
2918
+ $$renderer5.push(`<!---->`);
2919
+ },
2920
+ $$slots: { default: true }
2921
+ });
2922
+ $$renderer4.push("<!--]-->");
2923
+ } else {
2924
+ $$renderer4.push("<!--[!-->");
2925
+ $$renderer4.push("<!--]-->");
2926
+ }
2927
+ $$renderer4.push(` `);
2928
+ if (orientation === "vertical" || orientation === "both") {
2929
+ $$renderer4.push("<!--[0-->");
2930
+ Scroll_area_scrollbar($$renderer4, { orientation: "vertical", class: scrollbarYClasses });
2931
+ } else {
2932
+ $$renderer4.push("<!--[-1-->");
2933
+ }
2934
+ $$renderer4.push(`<!--]--> `);
2935
+ if (orientation === "horizontal" || orientation === "both") {
2936
+ $$renderer4.push("<!--[0-->");
2937
+ Scroll_area_scrollbar($$renderer4, { orientation: "horizontal", class: scrollbarXClasses });
2938
+ } else {
2939
+ $$renderer4.push("<!--[-1-->");
2940
+ }
2941
+ $$renderer4.push(`<!--]--> `);
2942
+ if (Scroll_area_corner) {
2943
+ $$renderer4.push("<!--[-->");
2944
+ Scroll_area_corner($$renderer4, {});
2945
+ $$renderer4.push("<!--]-->");
2946
+ } else {
2947
+ $$renderer4.push("<!--[!-->");
2948
+ $$renderer4.push("<!--]-->");
2949
+ }
2950
+ },
2951
+ $$slots: { default: true }
2952
+ }
2953
+ ]));
2954
+ $$renderer3.push("<!--]-->");
2955
+ } else {
2956
+ $$renderer3.push("<!--[!-->");
2957
+ $$renderer3.push("<!--]-->");
2958
+ }
2959
+ }
2960
+ do {
2961
+ $$settled = true;
2962
+ $$inner_renderer = $$renderer2.copy();
2963
+ $$render_inner($$inner_renderer);
2964
+ } while (!$$settled);
2965
+ $$renderer2.subsume($$inner_renderer);
2966
+ bind_props($$props, { ref });
2967
+ });
2968
+ }
2969
+ function Tooltip($$renderer, $$props) {
2970
+ $$renderer.component(($$renderer2) => {
2971
+ let { open = false, $$slots, $$events, ...restProps } = $$props;
2972
+ let $$settled = true;
2973
+ let $$inner_renderer;
2974
+ function $$render_inner($$renderer3) {
2975
+ if (Tooltip$1) {
2976
+ $$renderer3.push("<!--[-->");
2977
+ Tooltip$1($$renderer3, spread_props([
2978
+ restProps,
2979
+ {
2980
+ get open() {
2981
+ return open;
2982
+ },
2983
+ set open($$value) {
2984
+ open = $$value;
2985
+ $$settled = false;
2986
+ }
2987
+ }
2988
+ ]));
2989
+ $$renderer3.push("<!--]-->");
2990
+ } else {
2991
+ $$renderer3.push("<!--[!-->");
2992
+ $$renderer3.push("<!--]-->");
2993
+ }
2994
+ }
2995
+ do {
2996
+ $$settled = true;
2997
+ $$inner_renderer = $$renderer2.copy();
2998
+ $$render_inner($$inner_renderer);
2999
+ } while (!$$settled);
3000
+ $$renderer2.subsume($$inner_renderer);
3001
+ bind_props($$props, { open });
3002
+ });
3003
+ }
3004
+ function Tooltip_trigger($$renderer, $$props) {
3005
+ $$renderer.component(($$renderer2) => {
3006
+ let { ref = null, $$slots, $$events, ...restProps } = $$props;
3007
+ let $$settled = true;
3008
+ let $$inner_renderer;
3009
+ function $$render_inner($$renderer3) {
3010
+ if (Tooltip_trigger$1) {
3011
+ $$renderer3.push("<!--[-->");
3012
+ Tooltip_trigger$1($$renderer3, spread_props([
3013
+ { "data-slot": "tooltip-trigger" },
3014
+ restProps,
3015
+ {
3016
+ get ref() {
3017
+ return ref;
3018
+ },
3019
+ set ref($$value) {
3020
+ ref = $$value;
3021
+ $$settled = false;
3022
+ }
3023
+ }
3024
+ ]));
3025
+ $$renderer3.push("<!--]-->");
3026
+ } else {
3027
+ $$renderer3.push("<!--[!-->");
3028
+ $$renderer3.push("<!--]-->");
3029
+ }
3030
+ }
3031
+ do {
3032
+ $$settled = true;
3033
+ $$inner_renderer = $$renderer2.copy();
3034
+ $$render_inner($$inner_renderer);
3035
+ } while (!$$settled);
3036
+ $$renderer2.subsume($$inner_renderer);
3037
+ bind_props($$props, { ref });
3038
+ });
3039
+ }
3040
+ function Tooltip_portal($$renderer, $$props) {
3041
+ let { $$slots, $$events, ...restProps } = $$props;
3042
+ if (Portal$1) {
3043
+ $$renderer.push("<!--[-->");
3044
+ Portal$1($$renderer, spread_props([restProps]));
3045
+ $$renderer.push("<!--]-->");
3046
+ } else {
3047
+ $$renderer.push("<!--[!-->");
3048
+ $$renderer.push("<!--]-->");
3049
+ }
3050
+ }
3051
+ function Tooltip_content($$renderer, $$props) {
3052
+ $$renderer.component(($$renderer2) => {
3053
+ let {
3054
+ ref = null,
3055
+ class: className,
3056
+ sideOffset = 0,
3057
+ side = "top",
3058
+ children,
3059
+ arrowClasses,
3060
+ portalProps,
3061
+ $$slots,
3062
+ $$events,
3063
+ ...restProps
3064
+ } = $$props;
3065
+ let $$settled = true;
3066
+ let $$inner_renderer;
3067
+ function $$render_inner($$renderer3) {
3068
+ Tooltip_portal($$renderer3, spread_props([
3069
+ portalProps,
3070
+ {
3071
+ children: ($$renderer4) => {
3072
+ if (Tooltip_content$1) {
3073
+ $$renderer4.push("<!--[-->");
3074
+ Tooltip_content$1($$renderer4, spread_props([
3075
+ {
3076
+ "data-slot": "tooltip-content",
3077
+ sideOffset,
3078
+ side,
3079
+ class: cn("z-50 w-fit origin-(--bits-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", className)
3080
+ },
3081
+ restProps,
3082
+ {
3083
+ get ref() {
3084
+ return ref;
3085
+ },
3086
+ set ref($$value) {
3087
+ ref = $$value;
3088
+ $$settled = false;
3089
+ },
3090
+ children: ($$renderer5) => {
3091
+ children?.($$renderer5);
3092
+ $$renderer5.push(`<!----> `);
3093
+ {
3094
+ let child = function($$renderer6, { props }) {
3095
+ $$renderer6.push(`<div${attributes({
3096
+ class: clsx(cn("z-50 size-2.5 rotate-45 rounded-[2px] bg-foreground", "data-[side=top]:translate-x-1/2 data-[side=top]:translate-y-[calc(-50%_+_2px)]", "data-[side=bottom]:-translate-x-1/2 data-[side=bottom]:-translate-y-[calc(-50%_+_1px)]", "data-[side=right]:translate-x-[calc(50%_+_2px)] data-[side=right]:translate-y-1/2", "data-[side=left]:-translate-y-[calc(50%_-_3px)]", arrowClasses)),
3097
+ ...props
3098
+ })}></div>`);
3099
+ };
3100
+ if (Tooltip_arrow) {
3101
+ $$renderer5.push("<!--[-->");
3102
+ Tooltip_arrow($$renderer5, { child, $$slots: { child: true } });
3103
+ $$renderer5.push("<!--]-->");
3104
+ } else {
3105
+ $$renderer5.push("<!--[!-->");
3106
+ $$renderer5.push("<!--]-->");
3107
+ }
3108
+ }
3109
+ },
3110
+ $$slots: { default: true }
3111
+ }
3112
+ ]));
3113
+ $$renderer4.push("<!--]-->");
3114
+ } else {
3115
+ $$renderer4.push("<!--[!-->");
3116
+ $$renderer4.push("<!--]-->");
3117
+ }
3118
+ },
3119
+ $$slots: { default: true }
3120
+ }
3121
+ ]));
3122
+ }
3123
+ do {
3124
+ $$settled = true;
3125
+ $$inner_renderer = $$renderer2.copy();
3126
+ $$render_inner($$inner_renderer);
3127
+ } while (!$$settled);
3128
+ $$renderer2.subsume($$inner_renderer);
3129
+ bind_props($$props, { ref });
3130
+ });
3131
+ }
3132
+ function LummiImagePicker($$renderer, $$props) {
3133
+ $$renderer.component(($$renderer2) => {
3134
+ let searchQuery = "";
3135
+ let isSearching = false;
3136
+ let searchError = "";
3137
+ let images = [];
3138
+ let currentPage = 1;
3139
+ let totalCount = 0;
3140
+ let imageType = void 0;
3141
+ let orientation = void 0;
3142
+ const hasMore = derived(() => images.length < totalCount);
3143
+ async function performSearch(page = 1) {
3144
+ if (!searchQuery.trim()) {
3145
+ searchError = "Please enter a search term";
3146
+ return;
3147
+ }
3148
+ isSearching = true;
3149
+ searchError = "";
3150
+ try {
3151
+ const params = { query: searchQuery, page, perPage: 20 };
3152
+ if (imageType) params.imageType = imageType;
3153
+ if (orientation) params.orientation = orientation;
3154
+ const result = await searchLummiImages(params);
3155
+ if (page === 1) {
3156
+ images = result.images;
3157
+ } else {
3158
+ images = [...images, ...result.images];
3159
+ }
3160
+ totalCount = result.totalCount;
3161
+ currentPage = page;
3162
+ } catch (err) {
3163
+ searchError = err instanceof Error ? err.message : "Search failed";
3164
+ } finally {
3165
+ isSearching = false;
3166
+ }
3167
+ }
3168
+ function handleSearch() {
3169
+ performSearch(1);
3170
+ }
3171
+ function loadMore() {
3172
+ if (!isSearching && hasMore()) {
3173
+ performSearch(currentPage + 1);
3174
+ }
3175
+ }
3176
+ let $$settled = true;
3177
+ let $$inner_renderer;
3178
+ function $$render_inner($$renderer3) {
3179
+ $$renderer3.push(`<div class="flex flex-col gap-3"><div class="flex gap-2"><div class="flex-1">`);
3180
+ Input($$renderer3, {
3181
+ placeholder: "Search Lummi images...",
3182
+ onkeydown: (e) => e.key === "Enter" && handleSearch(),
3183
+ get value() {
3184
+ return searchQuery;
3185
+ },
3186
+ set value($$value) {
3187
+ searchQuery = $$value;
3188
+ $$settled = false;
3189
+ }
3190
+ });
3191
+ $$renderer3.push(`<!----></div> `);
3192
+ Button($$renderer3, {
3193
+ variant: "default",
3194
+ size: "sm",
3195
+ onclick: handleSearch,
3196
+ disabled: isSearching,
3197
+ loading: isSearching,
3198
+ icon: Search,
3199
+ children: ($$renderer4) => {
3200
+ $$renderer4.push(`<!---->Search`);
3201
+ },
3202
+ $$slots: { default: true }
3203
+ });
3204
+ $$renderer3.push(`<!----></div> <div class="flex gap-2">`);
3205
+ Select_1($$renderer3, {
3206
+ placeholder: "Type",
3207
+ options: [
3208
+ { value: "", label: "All types" },
3209
+ { value: "photo", label: "Photo" },
3210
+ { value: "illustration", label: "Illustration" },
3211
+ { value: "3d", label: "3D" }
3212
+ ],
3213
+ trigger: { class: "w-[120px] text-xs" },
3214
+ get value() {
3215
+ return imageType;
3216
+ },
3217
+ set value($$value) {
3218
+ imageType = $$value;
3219
+ $$settled = false;
3220
+ }
3221
+ });
3222
+ $$renderer3.push(`<!----> `);
3223
+ Select_1($$renderer3, {
3224
+ placeholder: "Orientation",
3225
+ options: [
3226
+ { value: "", label: "All" },
3227
+ { value: "horizontal", label: "Horizontal" },
3228
+ { value: "vertical", label: "Vertical" },
3229
+ { value: "square", label: "Square" }
3230
+ ],
3231
+ trigger: { class: "w-[120px] text-xs" },
3232
+ get value() {
3233
+ return orientation;
3234
+ },
3235
+ set value($$value) {
3236
+ orientation = $$value;
3237
+ $$settled = false;
3238
+ }
3239
+ });
3240
+ $$renderer3.push(`<!----></div> <div class="flex items-start gap-2 rounded border border-blue-500/20 bg-blue-500/10 px-3 py-2">`);
3241
+ Info($$renderer3, { class: "mt-0.5 size-3 shrink-0 text-blue-400" });
3242
+ $$renderer3.push(`<!----> <p class="text-[10px] leading-tight text-blue-200">Images from Lummi require attribution. The author credit will be displayed automatically on
3243
+ your layer.</p></div> `);
3244
+ if (searchError) {
3245
+ $$renderer3.push("<!--[0-->");
3246
+ $$renderer3.push(`<p class="text-xs text-destructive">${escape_html(searchError)}</p>`);
3247
+ } else {
3248
+ $$renderer3.push("<!--[-1-->");
3249
+ }
3250
+ $$renderer3.push(`<!--]--> `);
3251
+ if (images.length > 0) {
3252
+ $$renderer3.push("<!--[0-->");
3253
+ Scroll_area($$renderer3, {
3254
+ viewportClass: "max-h-[400px]",
3255
+ children: ($$renderer4) => {
3256
+ $$renderer4.push(`<div class="grid grid-cols-2 gap-2 pr-2"><!--[-->`);
3257
+ const each_array = ensure_array_like(images);
3258
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
3259
+ let image = each_array[$$index];
3260
+ $$renderer4.push(`<button class="group relative overflow-hidden rounded border bg-black transition-all hover:border-primary hover:ring-1 hover:ring-primary"><img${attr("src", image.url)} alt="" class="aspect-square w-full object-cover transition-transform group-hover:scale-105"/> <div class="absolute inset-0 flex flex-col justify-end bg-gradient-to-t from-black/80 to-transparent p-2 opacity-0 transition-opacity group-hover:opacity-100"><p class="truncate text-[10px] text-white">by ${escape_html(image.author.name ?? image.author.username)}</p> <div class="mt-1 flex items-center gap-1 text-[9px] text-gray-300"><span>${escape_html(image.width)}×${escape_html(image.height)}</span> <span>•</span> <span class="capitalize">${escape_html(image.imageType)}</span> `);
3261
+ if (image.pro) {
3262
+ $$renderer4.push("<!--[0-->");
3263
+ $$renderer4.push(`<span>•</span> <span class="text-yellow-400">PRO</span>`);
3264
+ } else {
3265
+ $$renderer4.push("<!--[-1-->");
3266
+ }
3267
+ $$renderer4.push(`<!--]--></div></div> `);
3268
+ if (Tooltip) {
3269
+ $$renderer4.push("<!--[-->");
3270
+ Tooltip($$renderer4, {
3271
+ children: ($$renderer5) => {
3272
+ if (Tooltip_trigger) {
3273
+ $$renderer5.push("<!--[-->");
3274
+ Tooltip_trigger($$renderer5, {
3275
+ class: "absolute top-1 right-1",
3276
+ children: ($$renderer6) => {
3277
+ $$renderer6.push(`<div class="rounded bg-black/60 p-1 opacity-0 transition-opacity group-hover:opacity-100">`);
3278
+ External_link($$renderer6, { class: "size-3 text-white" });
3279
+ $$renderer6.push(`<!----></div>`);
3280
+ },
3281
+ $$slots: { default: true }
3282
+ });
3283
+ $$renderer5.push("<!--]-->");
3284
+ } else {
3285
+ $$renderer5.push("<!--[!-->");
3286
+ $$renderer5.push("<!--]-->");
3287
+ }
3288
+ $$renderer5.push(` `);
3289
+ if (Tooltip_content) {
3290
+ $$renderer5.push("<!--[-->");
3291
+ Tooltip_content($$renderer5, {
3292
+ children: ($$renderer6) => {
3293
+ $$renderer6.push(`<p class="text-xs">Click to use this image</p>`);
3294
+ },
3295
+ $$slots: { default: true }
3296
+ });
3297
+ $$renderer5.push("<!--]-->");
3298
+ } else {
3299
+ $$renderer5.push("<!--[!-->");
3300
+ $$renderer5.push("<!--]-->");
3301
+ }
3302
+ },
3303
+ $$slots: { default: true }
3304
+ });
3305
+ $$renderer4.push("<!--]-->");
3306
+ } else {
3307
+ $$renderer4.push("<!--[!-->");
3308
+ $$renderer4.push("<!--]-->");
3309
+ }
3310
+ $$renderer4.push(`</button>`);
3311
+ }
3312
+ $$renderer4.push(`<!--]--></div> `);
3313
+ if (hasMore()) {
3314
+ $$renderer4.push("<!--[0-->");
3315
+ $$renderer4.push(`<div class="mt-3 flex justify-center">`);
3316
+ Button($$renderer4, {
3317
+ variant: "outline",
3318
+ size: "sm",
3319
+ onclick: loadMore,
3320
+ disabled: isSearching,
3321
+ loading: isSearching,
3322
+ children: ($$renderer5) => {
3323
+ $$renderer5.push(`<!---->Load more`);
3324
+ },
3325
+ $$slots: { default: true }
3326
+ });
3327
+ $$renderer4.push(`<!----></div>`);
3328
+ } else {
3329
+ $$renderer4.push("<!--[-1-->");
3330
+ }
3331
+ $$renderer4.push(`<!--]-->`);
3332
+ },
3333
+ $$slots: { default: true }
3334
+ });
3335
+ } else if (!isSearching && searchQuery) {
3336
+ $$renderer3.push("<!--[1-->");
3337
+ $$renderer3.push(`<div class="py-8 text-center text-sm text-muted-foreground">No images found. Try a different search term.</div>`);
3338
+ } else if (!searchQuery) {
3339
+ $$renderer3.push("<!--[2-->");
3340
+ $$renderer3.push(`<div class="py-8 text-center text-sm text-muted-foreground">Search for free stock images from Lummi</div>`);
3341
+ } else {
3342
+ $$renderer3.push("<!--[-1-->");
3343
+ }
3344
+ $$renderer3.push(`<!--]--> `);
3345
+ if (isSearching && images.length === 0) {
3346
+ $$renderer3.push("<!--[0-->");
3347
+ $$renderer3.push(`<div class="flex items-center justify-center py-8">`);
3348
+ Loader_circle($$renderer3, { class: "size-6 animate-spin text-muted-foreground" });
3349
+ $$renderer3.push(`<!----></div>`);
3350
+ } else {
3351
+ $$renderer3.push("<!--[-1-->");
3352
+ }
3353
+ $$renderer3.push(`<!--]--></div>`);
3354
+ }
3355
+ do {
3356
+ $$settled = true;
3357
+ $$inner_renderer = $$renderer2.copy();
3358
+ $$render_inner($$inner_renderer);
3359
+ } while (!$$settled);
3360
+ $$renderer2.subsume($$inner_renderer);
3361
+ });
3362
+ }
3363
+ function AssetCard($$renderer, $$props) {
3364
+ $$renderer.component(($$renderer2) => {
3365
+ let { asset, selected = false, actions } = $$props;
3366
+ function getMediaIcon(mediaType) {
3367
+ switch (mediaType) {
3368
+ case "image":
3369
+ return Image;
3370
+ case "video":
3371
+ return Video;
3372
+ case "audio":
3373
+ return Music;
3374
+ default:
3375
+ return File;
3376
+ }
3377
+ }
3378
+ const Icon2 = derived(() => getMediaIcon(asset.mediaType));
3379
+ const createdAt = derived(() => new Date(asset.createdAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" }));
3380
+ $$renderer2.push(`<button type="button"${attr_class(`group flex w-full items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-muted/50 ${stringify(selected ? "bg-primary/10 ring-1 ring-primary/30" : "")}`)}><div class="relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded bg-muted" role="img"${attr("aria-label", asset.originalName)}>`);
3381
+ if (asset.mediaType === "image") {
3382
+ $$renderer2.push("<!--[1-->");
3383
+ $$renderer2.push(`<img${attr("src", asset.url)}${attr("alt", asset.originalName)} class="size-full object-cover" loading="lazy" onerror="this.__e=event"/>`);
3384
+ } else if (asset.mediaType === "video") {
3385
+ $$renderer2.push("<!--[2-->");
3386
+ $$renderer2.push(`<video${attr("data-src", asset.url)} class="size-full object-cover" loop="" preload="metadata"></video>`);
3387
+ } else if (asset.mediaType === "audio") {
3388
+ $$renderer2.push("<!--[3-->");
3389
+ $$renderer2.push(`<audio${attr("data-src", asset.url)} preload="metadata" loop=""></audio> `);
3390
+ if (Icon2()) {
3391
+ $$renderer2.push("<!--[-->");
3392
+ Icon2()($$renderer2, { class: "size-4 text-muted-foreground" });
3393
+ $$renderer2.push("<!--]-->");
3394
+ } else {
3395
+ $$renderer2.push("<!--[!-->");
3396
+ $$renderer2.push("<!--]-->");
3397
+ }
3398
+ } else {
3399
+ $$renderer2.push("<!--[-1-->");
3400
+ if (Icon2()) {
3401
+ $$renderer2.push("<!--[-->");
3402
+ Icon2()($$renderer2, { class: "size-4 text-muted-foreground" });
3403
+ $$renderer2.push("<!--]-->");
3404
+ } else {
3405
+ $$renderer2.push("<!--[!-->");
3406
+ $$renderer2.push("<!--]-->");
3407
+ }
3408
+ }
3409
+ $$renderer2.push(`<!--]--> `);
3410
+ if (asset.duration) {
3411
+ $$renderer2.push("<!--[0-->");
3412
+ $$renderer2.push(`<span class="absolute right-0 bottom-0 left-0 bg-black/60 px-0.5 py-px text-center text-[8px] leading-tight text-white">${escape_html(formatDuration$1(asset.duration))}</span>`);
3413
+ } else {
3414
+ $$renderer2.push("<!--[-1-->");
3415
+ }
3416
+ $$renderer2.push(`<!--]--></div> <div class="min-w-0 flex-1"><p class="truncate text-xs font-medium">${escape_html(asset.originalName)}</p> <div class="mt-0.5 flex flex-wrap items-center gap-x-1.5 gap-y-0 text-[10px] text-muted-foreground"><span>${escape_html(formatFileSize(asset.size))}</span> <span class="text-muted-foreground/40">·</span> <span class="capitalize">${escape_html(asset.mediaType)}</span> <span class="text-muted-foreground/40">·</span> <span>${escape_html(createdAt())}</span></div></div> `);
3417
+ if (actions) {
3418
+ $$renderer2.push("<!--[0-->");
3419
+ $$renderer2.push(`<div class="shrink-0 opacity-0 transition-opacity group-hover:opacity-100">`);
3420
+ actions($$renderer2);
3421
+ $$renderer2.push(`<!----></div>`);
3422
+ } else {
3423
+ $$renderer2.push("<!--[-1-->");
3424
+ }
3425
+ $$renderer2.push(`<!--]--></button>`);
3426
+ });
3427
+ }
3428
+ function AssetPicker($$renderer, $$props) {
3429
+ $$renderer.component(($$renderer2) => {
3430
+ let { mediaType, selectedUrl } = $$props;
3431
+ const PAGE_SIZE = 20;
3432
+ let searchQuery = "";
3433
+ let debouncedSearch = new Debounced(() => searchQuery, 300);
3434
+ let currentPage = 1;
3435
+ watch(() => [debouncedSearch.current], () => {
3436
+ currentPage = 1;
3437
+ });
3438
+ const assets = derived(() => getUserAssets({
3439
+ mediaType,
3440
+ search: debouncedSearch.current || void 0,
3441
+ page: currentPage,
3442
+ pageSize: PAGE_SIZE
3443
+ }));
3444
+ const assetList = derived(() => assets().current?.assets ?? []);
3445
+ const totalPages = derived(() => Math.ceil((assets().current?.total ?? 0) / PAGE_SIZE));
3446
+ let $$settled = true;
3447
+ let $$inner_renderer;
3448
+ function $$render_inner($$renderer3) {
3449
+ $$renderer3.push(`<div class="flex flex-col"><div class="border-b px-3 py-2"><div class="relative">`);
3450
+ Search($$renderer3, {
3451
+ class: "absolute top-1/2 left-2 size-3 -translate-y-1/2 text-muted-foreground"
3452
+ });
3453
+ $$renderer3.push(`<!----> `);
3454
+ Input($$renderer3, {
3455
+ type: "text",
3456
+ placeholder: "Search assets...",
3457
+ class: "h-7 pl-6 text-xs",
3458
+ get value() {
3459
+ return searchQuery;
3460
+ },
3461
+ set value($$value) {
3462
+ searchQuery = $$value;
3463
+ $$settled = false;
3464
+ }
3465
+ });
3466
+ $$renderer3.push(`<!----></div></div> `);
3467
+ Scroll_area($$renderer3, {
3468
+ viewportClass: "max-h-[calc(50vh)]",
3469
+ children: ($$renderer4) => {
3470
+ if (assets().loading && !assets().current) {
3471
+ $$renderer4.push("<!--[0-->");
3472
+ $$renderer4.push(`<div class="flex items-center justify-center py-6">`);
3473
+ Loader_circle($$renderer4, { class: "size-4 animate-spin text-muted-foreground" });
3474
+ $$renderer4.push(`<!----></div>`);
3475
+ } else if (assetList().length === 0) {
3476
+ $$renderer4.push("<!--[1-->");
3477
+ $$renderer4.push(`<div class="px-3 py-6 text-center text-xs text-muted-foreground">`);
3478
+ if (debouncedSearch.current) {
3479
+ $$renderer4.push("<!--[0-->");
3480
+ $$renderer4.push(`No assets match "${escape_html(debouncedSearch.current)}".`);
3481
+ } else {
3482
+ $$renderer4.push("<!--[-1-->");
3483
+ $$renderer4.push(`${escape_html(mediaType ? `No ${mediaType} assets found` : "No assets found")}`);
3484
+ }
3485
+ $$renderer4.push(`<!--]--></div>`);
3486
+ } else {
3487
+ $$renderer4.push("<!--[-1-->");
3488
+ $$renderer4.push(`<div class="divide-y"><!--[-->`);
3489
+ const each_array = ensure_array_like(assetList());
3490
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
3491
+ let asset = each_array[$$index];
3492
+ AssetCard($$renderer4, {
3493
+ asset,
3494
+ selected: asset.url === selectedUrl
3495
+ });
3496
+ }
3497
+ $$renderer4.push(`<!--]--></div>`);
3498
+ }
3499
+ $$renderer4.push(`<!--]-->`);
3500
+ },
3501
+ $$slots: { default: true }
3502
+ });
3503
+ $$renderer3.push(`<!----> `);
3504
+ if (totalPages() > 1) {
3505
+ $$renderer3.push("<!--[0-->");
3506
+ $$renderer3.push(`<div class="flex items-center justify-between border-t px-3 py-2 text-xs text-muted-foreground">`);
3507
+ Button($$renderer3, {
3508
+ variant: "ghost",
3509
+ size: "icon-xs",
3510
+ disabled: currentPage === 1,
3511
+ onclick: () => currentPage--,
3512
+ icon: Chevron_left
3513
+ });
3514
+ $$renderer3.push(`<!----> <span>${escape_html(currentPage)} / ${escape_html(totalPages())}</span> `);
3515
+ Button($$renderer3, {
3516
+ variant: "ghost",
3517
+ size: "icon-xs",
3518
+ disabled: currentPage >= totalPages(),
3519
+ onclick: () => currentPage++,
3520
+ icon: Chevron_right
3521
+ });
3522
+ $$renderer3.push(`<!----></div>`);
3523
+ } else {
3524
+ $$renderer3.push("<!--[-1-->");
3525
+ }
3526
+ $$renderer3.push(`<!--]--></div>`);
3527
+ }
3528
+ do {
3529
+ $$settled = true;
3530
+ $$inner_renderer = $$renderer2.copy();
3531
+ $$render_inner($$inner_renderer);
3532
+ } while (!$$settled);
3533
+ $$renderer2.subsume($$inner_renderer);
3534
+ });
3535
+ }
3536
+ function FileUpload($$renderer, $$props) {
3537
+ $$renderer.component(($$renderer2) => {
3538
+ let {
3539
+ value = "",
3540
+ currentFileName = "",
3541
+ mediaType,
3542
+ onUpload,
3543
+ projectId
3544
+ } = $$props;
3545
+ let uploadError = "";
3546
+ let displayNameOverride = "";
3547
+ let displayName = derived(() => displayNameOverride || currentFileName || "");
3548
+ let isUploading = false;
3549
+ let assetPickerOpen = false;
3550
+ let lummiPickerOpen = false;
3551
+ let recordOpen = false;
3552
+ let pendingRecording = null;
3553
+ async function handleRecordingComplete(result) {
3554
+ const localUrl = URL.createObjectURL(result.blob);
3555
+ value = localUrl;
3556
+ displayNameOverride = result.fileName;
3557
+ recordOpen = false;
3558
+ uploadError = "";
3559
+ isUploading = true;
3560
+ pendingRecording = result;
3561
+ try {
3562
+ const uploadResult = await uploadMediaBlob(result.blob, result.fileName, result.mediaType, projectId, result.duration);
3563
+ pendingRecording = null;
3564
+ onUpload({
3565
+ url: uploadResult.url,
3566
+ key: uploadResult.key,
3567
+ fileName: uploadResult.fileName,
3568
+ duration: result.duration,
3569
+ ...result.mediaType === "video" && mediaType === "media" ? { detectedType: "video" } : {}
3570
+ });
3571
+ URL.revokeObjectURL(localUrl);
3572
+ displayNameOverride = "";
3573
+ } catch (err) {
3574
+ uploadError = err instanceof Error ? err.message : "Upload failed";
3575
+ } finally {
3576
+ isUploading = false;
3577
+ }
3578
+ }
3579
+ const acceptPatterns = {
3580
+ image: "image/jpeg,image/png,image/gif,image/webp,image/svg+xml",
3581
+ video: "video/mp4",
3582
+ audio: "audio/mp3",
3583
+ media: "image/jpeg,image/png,image/gif,image/webp,image/svg+xml,video/mp4"
3584
+ };
3585
+ let maxSizeBytes = derived(() => MAX_FILE_SIZES[mediaType === "media" ? "video" : mediaType]);
3586
+ let maxSizeLabel = derived(() => formatStorage(maxSizeBytes()));
3587
+ const mediaTypeLabel = {
3588
+ image: "image",
3589
+ video: "video",
3590
+ audio: "audio",
3591
+ media: "image or video"
3592
+ };
3593
+ const mediaTypeFormats = {
3594
+ image: "JPG, PNG, GIF, WEBP, SVG",
3595
+ video: "MP4",
3596
+ audio: "MP3",
3597
+ media: "JPG, PNG, MP4"
3598
+ };
3599
+ const showCapture = derived(() => mediaType === "image" || mediaType === "video" || mediaType === "audio" || mediaType === "media");
3600
+ let $$settled = true;
3601
+ let $$inner_renderer;
3602
+ function $$render_inner($$renderer3) {
3603
+ $$renderer3.push(`<div class="flex flex-col gap-2"><div${attr_class(`group relative flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed px-4 py-5 transition-colors ${stringify(isUploading && pendingRecording ? "cursor-default" : "cursor-pointer")} ${stringify("border-border hover:border-primary/50 hover:bg-muted/40")}`)} role="button"${attr("tabindex", isUploading && pendingRecording ? -1 : 0)}>`);
3604
+ if (isUploading && !value) {
3605
+ $$renderer3.push("<!--[0-->");
3606
+ Loader_circle($$renderer3, { class: "h-8 w-8 animate-spin text-primary" });
3607
+ $$renderer3.push(`<!----> <p class="text-xs font-medium">Uploading...</p>`);
3608
+ } else if (value && (mediaType === "image" || mediaType === "video" || mediaType === "media" || mediaType === "audio")) {
3609
+ $$renderer3.push("<!--[1-->");
3610
+ $$renderer3.push(`<div class="relative w-full overflow-hidden rounded">`);
3611
+ if (mediaType === "audio") {
3612
+ $$renderer3.push("<!--[0-->");
3613
+ $$renderer3.push(`<audio${attr("src", value)} controls="" class="w-full" preload="metadata"></audio>`);
3614
+ } else if (mediaType === "image" || mediaType === "media" && !value.endsWith(".mp4")) {
3615
+ $$renderer3.push("<!--[1-->");
3616
+ $$renderer3.push(`<img${attr("src", value)}${attr("alt", displayName())} class="h-auto w-full rounded" style="max-height: 140px; object-fit: contain;"/>`);
3617
+ } else {
3618
+ $$renderer3.push("<!--[-1-->");
3619
+ $$renderer3.push(`<video${attr("src", value)} class="h-auto w-full rounded" style="max-height: 140px; object-fit: contain;" controls="" preload="metadata"></video>`);
3620
+ }
3621
+ $$renderer3.push(`<!--]--> `);
3622
+ if (isUploading && pendingRecording) {
3623
+ $$renderer3.push("<!--[0-->");
3624
+ $$renderer3.push(`<div${attr_class(`absolute inset-0 z-10 flex items-center justify-center rounded ${stringify(mediaType === "audio" ? "bg-background/40" : "bg-black/40")}`)}>`);
3625
+ Loader_circle($$renderer3, { class: "h-6 w-6 animate-spin text-primary" });
3626
+ $$renderer3.push(`<!----></div>`);
3627
+ } else {
3628
+ $$renderer3.push("<!--[-1-->");
3629
+ }
3630
+ $$renderer3.push(`<!--]--></div> <p class="text-[10px] text-muted-foreground">${escape_html(isUploading && pendingRecording ? "Uploading... " : "Click or drop to replace ")}
3631
+ · ${escape_html(displayName())}</p> `);
3632
+ if (pendingRecording && uploadError) {
3633
+ $$renderer3.push("<!--[0-->");
3634
+ $$renderer3.push(`<button type="button" class="mt-1 flex items-center gap-1 rounded border border-destructive/40 bg-destructive/10 px-2 py-1 text-[11px] text-destructive hover:bg-destructive/20">`);
3635
+ Refresh_cw($$renderer3, { class: "size-3" });
3636
+ $$renderer3.push(`<!----> Retry upload</button>`);
3637
+ } else {
3638
+ $$renderer3.push("<!--[-1-->");
3639
+ }
3640
+ $$renderer3.push(`<!--]-->`);
3641
+ } else {
3642
+ $$renderer3.push("<!--[-1-->");
3643
+ $$renderer3.push(`<div class="flex h-10 w-10 items-center justify-center rounded-full bg-muted transition-colors group-hover:bg-muted/80">`);
3644
+ if (mediaType === "image") {
3645
+ $$renderer3.push("<!--[0-->");
3646
+ Image($$renderer3, { class: "h-5 w-5 text-muted-foreground" });
3647
+ } else if (mediaType === "audio") {
3648
+ $$renderer3.push("<!--[1-->");
3649
+ Mic($$renderer3, { class: "h-5 w-5 text-muted-foreground" });
3650
+ } else {
3651
+ $$renderer3.push("<!--[-1-->");
3652
+ Video($$renderer3, { class: "h-5 w-5 text-muted-foreground" });
3653
+ }
3654
+ $$renderer3.push(`<!--]--></div> <div class="text-center"><p class="text-xs font-medium">${escape_html(`Drop ${mediaTypeLabel[mediaType]} here`)}</p> <p class="mt-0.5 text-[10px] text-muted-foreground">${escape_html(mediaTypeFormats[mediaType])} · up to ${escape_html(maxSizeLabel())}</p></div> <span class="rounded border border-border bg-background px-2.5 py-1 text-[11px] text-muted-foreground transition-colors group-hover:border-primary/40 group-hover:text-foreground">Browse file</span>`);
3655
+ }
3656
+ $$renderer3.push(`<!--]--></div> <div class="flex gap-1.5">`);
3657
+ if (Popover) {
3658
+ $$renderer3.push("<!--[-->");
3659
+ Popover($$renderer3, {
3660
+ get open() {
3661
+ return assetPickerOpen;
3662
+ },
3663
+ set open($$value) {
3664
+ assetPickerOpen = $$value;
3665
+ $$settled = false;
3666
+ },
3667
+ children: ($$renderer4) => {
3668
+ {
3669
+ let child = function($$renderer5, { props }) {
3670
+ Button($$renderer5, spread_props([
3671
+ props,
3672
+ {
3673
+ variant: "outline",
3674
+ size: "sm",
3675
+ icon: Folder_open,
3676
+ class: "flex-1 justify-start text-xs",
3677
+ title: "Pick from project assets",
3678
+ children: ($$renderer6) => {
3679
+ $$renderer6.push(`<!---->Assets`);
3680
+ },
3681
+ $$slots: { default: true }
3682
+ }
3683
+ ]));
3684
+ };
3685
+ if (Popover_trigger) {
3686
+ $$renderer4.push("<!--[-->");
3687
+ Popover_trigger($$renderer4, { child, $$slots: { child: true } });
3688
+ $$renderer4.push("<!--]-->");
3689
+ } else {
3690
+ $$renderer4.push("<!--[!-->");
3691
+ $$renderer4.push("<!--]-->");
3692
+ }
3693
+ }
3694
+ $$renderer4.push(` `);
3695
+ if (Popover_content) {
3696
+ $$renderer4.push("<!--[-->");
3697
+ Popover_content($$renderer4, {
3698
+ class: "w-72 p-0",
3699
+ align: "start",
3700
+ children: ($$renderer5) => {
3701
+ AssetPicker($$renderer5, {
3702
+ mediaType: mediaType === "media" ? void 0 : mediaType,
3703
+ selectedUrl: value
3704
+ });
3705
+ },
3706
+ $$slots: { default: true }
3707
+ });
3708
+ $$renderer4.push("<!--]-->");
3709
+ } else {
3710
+ $$renderer4.push("<!--[!-->");
3711
+ $$renderer4.push("<!--]-->");
3712
+ }
3713
+ },
3714
+ $$slots: { default: true }
3715
+ });
3716
+ $$renderer3.push("<!--]-->");
3717
+ } else {
3718
+ $$renderer3.push("<!--[!-->");
3719
+ $$renderer3.push("<!--]-->");
3720
+ }
3721
+ $$renderer3.push(` `);
3722
+ if (mediaType === "image" || mediaType === "media") {
3723
+ $$renderer3.push("<!--[0-->");
3724
+ if (Popover) {
3725
+ $$renderer3.push("<!--[-->");
3726
+ Popover($$renderer3, {
3727
+ get open() {
3728
+ return lummiPickerOpen;
3729
+ },
3730
+ set open($$value) {
3731
+ lummiPickerOpen = $$value;
3732
+ $$settled = false;
3733
+ },
3734
+ children: ($$renderer4) => {
3735
+ {
3736
+ let child = function($$renderer5, { props }) {
3737
+ Button($$renderer5, spread_props([
3738
+ props,
3739
+ {
3740
+ variant: "outline",
3741
+ size: "sm",
3742
+ icon: Image,
3743
+ class: "flex-1 justify-start text-xs",
3744
+ title: "Browse Lummi stock images",
3745
+ children: ($$renderer6) => {
3746
+ $$renderer6.push(`<!---->Lummi`);
3747
+ },
3748
+ $$slots: { default: true }
3749
+ }
3750
+ ]));
3751
+ };
3752
+ if (Popover_trigger) {
3753
+ $$renderer4.push("<!--[-->");
3754
+ Popover_trigger($$renderer4, { child, $$slots: { child: true } });
3755
+ $$renderer4.push("<!--]-->");
3756
+ } else {
3757
+ $$renderer4.push("<!--[!-->");
3758
+ $$renderer4.push("<!--]-->");
3759
+ }
3760
+ }
3761
+ $$renderer4.push(` `);
3762
+ if (Popover_content) {
3763
+ $$renderer4.push("<!--[-->");
3764
+ Popover_content($$renderer4, {
3765
+ class: "w-[400px] p-4",
3766
+ align: "start",
3767
+ children: ($$renderer5) => {
3768
+ LummiImagePicker($$renderer5);
3769
+ },
3770
+ $$slots: { default: true }
3771
+ });
3772
+ $$renderer4.push("<!--]-->");
3773
+ } else {
3774
+ $$renderer4.push("<!--[!-->");
3775
+ $$renderer4.push("<!--]-->");
3776
+ }
3777
+ },
3778
+ $$slots: { default: true }
3779
+ });
3780
+ $$renderer3.push("<!--]-->");
3781
+ } else {
3782
+ $$renderer3.push("<!--[!-->");
3783
+ $$renderer3.push("<!--]-->");
3784
+ }
3785
+ } else {
3786
+ $$renderer3.push("<!--[-1-->");
3787
+ }
3788
+ $$renderer3.push(`<!--]--> `);
3789
+ if (showCapture()) {
3790
+ $$renderer3.push("<!--[0-->");
3791
+ if (Popover) {
3792
+ $$renderer3.push("<!--[-->");
3793
+ Popover($$renderer3, {
3794
+ get open() {
3795
+ return recordOpen;
3796
+ },
3797
+ set open($$value) {
3798
+ recordOpen = $$value;
3799
+ $$settled = false;
3800
+ },
3801
+ children: ($$renderer4) => {
3802
+ {
3803
+ let child = function($$renderer5, { props }) {
3804
+ Button($$renderer5, spread_props([
3805
+ props,
3806
+ {
3807
+ variant: "outline",
3808
+ size: "sm",
3809
+ icon: mediaType === "audio" ? Mic : mediaType === "image" ? Camera : Video,
3810
+ class: "flex-1 justify-start text-xs",
3811
+ title: mediaType === "audio" ? "Record audio" : mediaType === "image" ? "Capture photo" : "Record video",
3812
+ children: ($$renderer6) => {
3813
+ $$renderer6.push(`<!---->${escape_html(mediaType === "audio" ? "Record" : mediaType === "image" ? "Capture" : "Record")}`);
3814
+ },
3815
+ $$slots: { default: true }
3816
+ }
3817
+ ]));
3818
+ };
3819
+ if (Popover_trigger) {
3820
+ $$renderer4.push("<!--[-->");
3821
+ Popover_trigger($$renderer4, { child, $$slots: { child: true } });
3822
+ $$renderer4.push("<!--]-->");
3823
+ } else {
3824
+ $$renderer4.push("<!--[!-->");
3825
+ $$renderer4.push("<!--]-->");
3826
+ }
3827
+ }
3828
+ $$renderer4.push(` `);
3829
+ if (Popover_content) {
3830
+ $$renderer4.push("<!--[-->");
3831
+ Popover_content($$renderer4, {
3832
+ class: "w-80 p-3",
3833
+ align: "end",
3834
+ children: ($$renderer5) => {
3835
+ $$renderer5.push(`<div class="flex flex-col gap-3">`);
3836
+ if (mediaType === "audio") {
3837
+ $$renderer5.push("<!--[0-->");
3838
+ AudioRecorder($$renderer5, {
3839
+ maxSizeBytes: maxSizeBytes(),
3840
+ onRecordingComplete: handleRecordingComplete
3841
+ });
3842
+ } else if (mediaType === "video") {
3843
+ $$renderer5.push("<!--[1-->");
3844
+ VideoRecorder($$renderer5, {
3845
+ maxSizeBytes: maxSizeBytes(),
3846
+ onRecordingComplete: handleRecordingComplete
3847
+ });
3848
+ } else if (mediaType === "image") {
3849
+ $$renderer5.push("<!--[2-->");
3850
+ CameraCapture($$renderer5, {
3851
+ projectId,
3852
+ onCaptureComplete: (result) => {
3853
+ onUpload(result);
3854
+ recordOpen = false;
3855
+ }
3856
+ });
3857
+ } else if (mediaType === "media") {
3858
+ $$renderer5.push("<!--[3-->");
3859
+ $$renderer5.push(`<p class="text-xs font-medium text-muted-foreground">Record video</p> `);
3860
+ VideoRecorder($$renderer5, {
3861
+ maxSizeBytes: maxSizeBytes(),
3862
+ onRecordingComplete: handleRecordingComplete
3863
+ });
3864
+ $$renderer5.push(`<!----> <p class="text-xs font-medium text-muted-foreground">Capture photo</p> `);
3865
+ CameraCapture($$renderer5, {
3866
+ projectId,
3867
+ onCaptureComplete: (result) => {
3868
+ onUpload({ ...result, detectedType: "image" });
3869
+ recordOpen = false;
3870
+ }
3871
+ });
3872
+ $$renderer5.push(`<!---->`);
3873
+ } else {
3874
+ $$renderer5.push("<!--[-1-->");
3875
+ }
3876
+ $$renderer5.push(`<!--]--></div>`);
3877
+ },
3878
+ $$slots: { default: true }
3879
+ });
3880
+ $$renderer4.push("<!--]-->");
3881
+ } else {
3882
+ $$renderer4.push("<!--[!-->");
3883
+ $$renderer4.push("<!--]-->");
3884
+ }
3885
+ },
3886
+ $$slots: { default: true }
3887
+ });
3888
+ $$renderer3.push("<!--]-->");
3889
+ } else {
3890
+ $$renderer3.push("<!--[!-->");
3891
+ $$renderer3.push("<!--]-->");
3892
+ }
3893
+ } else {
3894
+ $$renderer3.push("<!--[-1-->");
3895
+ }
3896
+ $$renderer3.push(`<!--]--></div> <input type="file" class="hidden"${attr("accept", acceptPatterns[mediaType])}/> `);
3897
+ if (uploadError) {
3898
+ $$renderer3.push("<!--[0-->");
3899
+ $$renderer3.push(`<p class="text-xs text-destructive">${escape_html(uploadError)}</p>`);
3900
+ } else {
3901
+ $$renderer3.push("<!--[-1-->");
3902
+ }
3903
+ $$renderer3.push(`<!--]--></div>`);
3904
+ }
3905
+ do {
3906
+ $$settled = true;
3907
+ $$inner_renderer = $$renderer2.copy();
3908
+ $$render_inner($$inner_renderer);
3909
+ } while (!$$settled);
3910
+ $$renderer2.subsume($$inner_renderer);
3911
+ });
3912
+ }
3913
+ function Media_upload_step($$renderer, $$props) {
3914
+ $$renderer.component(($$renderer2) => {
3915
+ const {
3916
+ values: _values,
3917
+ ctx: _ctx,
3918
+ onUpdate,
3919
+ onComplete,
3920
+ mediaType = "video"
3921
+ } = $$props;
3922
+ FileUpload($$renderer2, {
3923
+ mediaType,
3924
+ onUpload: (result) => {
3925
+ const stepValues = {
3926
+ src: result.url,
3927
+ fileKey: result.key,
3928
+ fileName: result.fileName,
3929
+ duration: result.duration,
3930
+ detectedType: result.detectedType
3931
+ };
3932
+ onUpdate(stepValues);
3933
+ onComplete(stepValues);
3934
+ }
3935
+ });
3936
+ });
3937
+ }
3938
+ const configSchema$6 = z.object({
3939
+ background: BackgroundValueSchema.default(defaultBackground).register(fieldRegistry, {
3940
+ label: "Background",
3941
+ widget: "background"
3942
+ })
3943
+ });
3944
+ const template$8 = {
3945
+ id: "video-beautifier",
3946
+ name: "Video Beautifier",
3947
+ description: "Add a beautiful background and frame to any video in seconds",
3948
+ thumbnail: "/templates/video-beautifier.svg",
3949
+ icon: Sparkles,
3950
+ category: "media",
3951
+ seoTitle: "Free Video Beautifier — Add Background & Frame to Videos",
3952
+ seoDescription: "Instantly add a polished background and rounded frame to your video. Perfect for sharing on social media, presentations, and portfolios. Free tool.",
3953
+ keywords: [
3954
+ "video beautifier",
3955
+ "video background",
3956
+ "video frame",
3957
+ "video mockup",
3958
+ "video presenter",
3959
+ "social media video"
3960
+ ],
3961
+ steps: [
3962
+ {
3963
+ title: "Upload Your Video",
3964
+ description: "Select the video you want to beautify",
3965
+ component: Media_upload_step,
3966
+ componentProps: { mediaType: "video" }
3967
+ },
3968
+ {
3969
+ title: "Style It",
3970
+ description: "Choose a background and corner radius for the frame",
3971
+ schema: configSchema$6
3972
+ }
3973
+ ],
3974
+ apply(values, ctx) {
3975
+ const { src, fileKey, duration: mediaDuration, background } = values;
3976
+ const { width, height } = ctx.project;
3977
+ const ar = height / width;
3978
+ const enterTime = ctx.currentTime;
3979
+ const duration = mediaDuration ?? 5;
3980
+ const exitTime = enterTime + duration;
3981
+ const paddingPct = Math.min(1, ar) * 7;
3982
+ const videoLayer = createLayer("video", {
3983
+ props: {
3984
+ src,
3985
+ fileKey,
3986
+ width: round1(100 - paddingPct * 2),
3987
+ height: round1(toPct(ar) - paddingPct * 2),
3988
+ objectFit: "cover",
3989
+ frame: "arc",
3990
+ frameWidth: 8
3991
+ },
3992
+ projectDimensions: { width, height },
3993
+ layer: { name: "Video", enterTime, exitTime, contentDuration: mediaDuration }
3994
+ });
3995
+ return {
3996
+ projectUpdates: {
3997
+ ...ctx.inProject ? {} : { background, duration: exitTime },
3998
+ ...exitTime > ctx.project.duration ? { duration: exitTime } : {}
3999
+ },
4000
+ layersToAdd: [
4001
+ {
4002
+ layer: videoLayer,
4003
+ presets: [{ id: "fade-in", startTime: enterTime, duration: 0.4 }]
4004
+ }
4005
+ ]
4006
+ };
4007
+ }
4008
+ };
4009
+ const __vite_glob_0_1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4010
+ __proto__: null,
4011
+ template: template$8
4012
+ }, Symbol.toStringTag, { value: "Module" }));
4013
+ const stepSchema = z.object({
4014
+ url: z.url().default("/demo/skeleton.html").register(fieldRegistry, { label: "Website URL" }),
4015
+ background: BackgroundValueSchema.default(defaultBackground).register(fieldRegistry, {
4016
+ label: "Background",
4017
+ widget: "background"
4018
+ }),
4019
+ laptopColor: z.string().default("#2d2d2d").register(fieldRegistry, { label: "Laptop color", widget: "color" })
4020
+ });
4021
+ const template$7 = {
4022
+ id: "laptop-3d-intro",
4023
+ name: "Laptop 3D Intro",
4024
+ description: "Animate any website inside a 3D laptop with a cinematic opening effect",
4025
+ thumbnail: "/templates/laptop-3d-intro.svg",
4026
+ icon: Laptop,
4027
+ category: "composite",
4028
+ seoTitle: "Free 3D Laptop Intro Maker — Animate Any Website",
4029
+ seoDescription: "Drop any URL into a cinematic 3D laptop animation. Perfect for product launches, app showcases, and SaaS demos. Free online tool.",
4030
+ keywords: [
4031
+ "laptop mockup",
4032
+ "3d laptop animation",
4033
+ "website mockup video",
4034
+ "product demo animation",
4035
+ "saas intro video",
4036
+ "app showcase"
4037
+ ],
4038
+ steps: [
4039
+ {
4040
+ title: "Configure Laptop",
4041
+ description: "Enter the URL to display and customize the look",
4042
+ schema: stepSchema
4043
+ }
4044
+ ],
4045
+ apply(values, ctx) {
4046
+ const { url, laptopColor } = values;
4047
+ const { width, height } = ctx.project;
4048
+ const background = values.background;
4049
+ const enterTime = ctx.currentTime;
4050
+ const duration = 7;
4051
+ const exitTime = enterTime + duration;
4052
+ const ar = height / width;
4053
+ const lapZ0 = 448;
4054
+ const lapZ1 = -2e3;
4055
+ const lapZ2 = -840;
4056
+ const lapY0 = round1(ar * 60);
4057
+ const lapY1 = round1(ar * 50);
4058
+ const keyframes = [
4059
+ // t=0: Far away, fully open, flat perspective
4060
+ { time: enterTime, property: "position.y", value: lapY0 },
4061
+ { time: enterTime, property: "position.z", value: lapZ0 },
4062
+ { time: enterTime, property: "props.openAngle", value: 180 },
4063
+ { time: enterTime, property: "rotation.x", value: 0 },
4064
+ { time: enterTime, property: "rotation.y", value: 0 },
4065
+ // t=2.5s: Rotate into 3D view, close partially
4066
+ { time: enterTime + 2.5, property: "rotation.y", value: 0 },
4067
+ { time: enterTime + 2.5, property: "rotation.x", value: 1.45 },
4068
+ { time: enterTime + 2.5, property: "props.openAngle", value: 106 },
4069
+ { time: enterTime + 2.5, property: "position.z", value: lapZ1 },
4070
+ { time: enterTime + 2.5, property: "position.y", value: lapY1 },
4071
+ // t=4.5s: Continue closing
4072
+ { time: enterTime + 4.5, property: "props.openAngle", value: 64 },
4073
+ { time: enterTime + 4.5, property: "rotation.x", value: 1.1 },
4074
+ // t=5.5s: Final resting position — readable angle
4075
+ { time: enterTime + 5.5, property: "position.z", value: lapZ2 },
4076
+ { time: enterTime + 5.5, property: "position.y", value: lapY1 },
4077
+ { time: enterTime + 5.5, property: "props.openAngle", value: 73 }
4078
+ ];
4079
+ const keyframesWithEasing = keyframes.map(
4080
+ (kf) => ({
4081
+ ...kf,
4082
+ id: nanoid(),
4083
+ interpolation: {
4084
+ family: "continuous",
4085
+ strategy: "ease-in-out"
4086
+ }
4087
+ })
4088
+ );
4089
+ const dev = deviceSize({ width, height }, "laptop");
4090
+ const laptopLayer = createLayer("laptop", {
4091
+ props: {
4092
+ url,
4093
+ ...dev,
4094
+ baseColor: laptopColor,
4095
+ screenColor: laptopColor,
4096
+ openAngle: 180,
4097
+ _aspectRatio: 1,
4098
+ _aspectRatioLocked: false
4099
+ },
4100
+ transform: {
4101
+ position: { x: 0, y: lapY0, z: lapZ0 },
4102
+ rotation: { x: 0, y: 0, z: 0 },
4103
+ scale: { x: 1, y: 1 },
4104
+ anchor: "center"
4105
+ },
4106
+ projectDimensions: { width, height },
4107
+ layer: {
4108
+ name: "Laptop",
4109
+ enterTime,
4110
+ exitTime
4111
+ },
4112
+ keyframes: keyframesWithEasing
4113
+ });
4114
+ return {
4115
+ projectUpdates: {
4116
+ ...ctx.inProject ? {} : { background },
4117
+ ...exitTime > ctx.project.duration ? { duration: exitTime } : {}
4118
+ },
4119
+ layersToAdd: [
4120
+ {
4121
+ layer: laptopLayer
4122
+ }
4123
+ ]
4124
+ };
4125
+ }
4126
+ };
4127
+ const __vite_glob_0_2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4128
+ __proto__: null,
4129
+ template: template$7
4130
+ }, Symbol.toStringTag, { value: "Module" }));
4131
+ const configSchema$5 = meta$d.schema.pick({
4132
+ fontFamily: true,
4133
+ fontWeight: true,
4134
+ fontSize: true,
4135
+ textColor: true,
4136
+ bgColor: true
4137
+ }).extend({
4138
+ position: z.enum(["bottom", "top", "middle"]).default("bottom").register(fieldRegistry, { label: "Position" })
4139
+ });
4140
+ const template$6 = {
4141
+ id: "add-captions",
4142
+ name: "Auto Captions Generator",
4143
+ description: "Upload a video and get accurate auto-generated captions in seconds",
4144
+ thumbnail: "/templates/add-captions.svg",
4145
+ icon: Captions,
4146
+ category: "media",
4147
+ seoTitle: "Free Auto Captions Generator — Add Subtitles to Any Video",
4148
+ seoDescription: "Upload your video and generate accurate subtitles automatically with AI. Free online tool — no registration required to try.",
4149
+ keywords: [
4150
+ "auto captions",
4151
+ "subtitle generator",
4152
+ "add captions to video",
4153
+ "video transcription",
4154
+ "automatic subtitles",
4155
+ "free caption maker"
4156
+ ],
4157
+ steps: [
4158
+ {
4159
+ title: "Upload Your Video",
4160
+ description: "Select a video file to add captions to",
4161
+ component: Media_upload_step,
4162
+ componentProps: { mediaType: "video" }
4163
+ },
4164
+ {
4165
+ title: "Caption Style",
4166
+ description: "Customize how your captions look",
4167
+ schema: configSchema$5
4168
+ }
4169
+ ],
4170
+ async apply(values, ctx) {
4171
+ const { src, fileKey, duration, ...captionsProps } = values;
4172
+ const { width, height } = ctx.project;
4173
+ const enterTime = ctx.currentTime;
4174
+ const exitTime = enterTime + duration;
4175
+ const videoLayer = createLayer("video", {
4176
+ props: {
4177
+ src,
4178
+ fileKey,
4179
+ width: 100,
4180
+ height: toPct(height / width),
4181
+ objectFit: "cover",
4182
+ borderRadius: 0,
4183
+ frame: "none",
4184
+ frameWidth: 0
4185
+ },
4186
+ projectDimensions: { width, height },
4187
+ layer: { name: "Video", enterTime, exitTime, contentDuration: duration }
4188
+ });
4189
+ const input = createFromSchema(generateCaptionsAction.inputSchema, captionsProps);
4190
+ const { layersToAdd, layersToUpdate } = await runAction({
4191
+ action: generateCaptionsAction,
4192
+ input,
4193
+ project: ctx.project,
4194
+ sourceLayer: videoLayer
4195
+ });
4196
+ return {
4197
+ layersToAdd: [{ layer: videoLayer }, ...layersToAdd ?? []],
4198
+ layersToUpdate: [...layersToUpdate ?? []],
4199
+ projectUpdates: { ...ctx.project.duration < exitTime && { duration: exitTime } }
4200
+ };
4201
+ }
4202
+ };
4203
+ const __vite_glob_0_3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4204
+ __proto__: null,
4205
+ template: template$6
4206
+ }, Symbol.toStringTag, { value: "Module" }));
4207
+ const configSchema$4 = z.object({
4208
+ browserUrl: z.string().default("https://yoursite.com").register(fieldRegistry, { label: "URL shown in browser bar" }),
4209
+ background: BackgroundValueSchema.default(defaultBackground).register(fieldRegistry, {
4210
+ label: "Background",
4211
+ widget: "background"
4212
+ })
4213
+ });
4214
+ const template$5 = {
4215
+ id: "video-to-browser",
4216
+ name: "Browser Mockup Video",
4217
+ description: "Wrap a screen recording inside an animated browser window",
4218
+ thumbnail: "/templates/video-to-browser.svg",
4219
+ icon: Globe,
4220
+ category: "composite",
4221
+ seoTitle: "Free Browser Mockup Video Maker — Wrap Screen Recordings",
4222
+ seoDescription: "Instantly wrap your screen recording in a realistic browser window mockup. Perfect for SaaS demos, tutorials, and product videos. Free tool.",
4223
+ keywords: [
4224
+ "browser mockup",
4225
+ "screen recording mockup",
4226
+ "browser frame video",
4227
+ "saas demo video",
4228
+ "product walkthrough",
4229
+ "website mockup video"
4230
+ ],
4231
+ steps: [
4232
+ {
4233
+ title: "Upload Screen Recording",
4234
+ description: "Select a screen recording or screenshot to wrap in a browser",
4235
+ component: Media_upload_step,
4236
+ componentProps: { mediaType: "media" }
4237
+ },
4238
+ {
4239
+ title: "Browser Settings",
4240
+ description: "Customize the browser appearance and background",
4241
+ schema: configSchema$4
4242
+ }
4243
+ ],
4244
+ apply(values, ctx) {
4245
+ const { src, fileKey, detectedType, duration: mediaDuration, browserUrl, background } = values;
4246
+ const isVideo = detectedType === "video";
4247
+ const { width, height } = ctx.project;
4248
+ const ar = height / width;
4249
+ const enterTime = ctx.currentTime;
4250
+ const duration = isVideo ? mediaDuration ?? 5 : 5;
4251
+ const exitTime = enterTime + duration;
4252
+ const browserW = 88;
4253
+ const browserH = round1(ar * 82);
4254
+ const browserLayer = createLayer("browser", {
4255
+ props: { url: browserUrl, width: browserW, height: browserH },
4256
+ projectDimensions: ctx.project,
4257
+ style: {
4258
+ opacity: 1,
4259
+ blur: 0,
4260
+ brightness: 1,
4261
+ contrast: 1,
4262
+ saturate: 1,
4263
+ dropShadowX: 0,
4264
+ dropShadowY: 16,
4265
+ dropShadowBlur: 48,
4266
+ dropShadowColor: "rgba(0,0,0,0.4)"
4267
+ },
4268
+ layer: { name: "Browser", enterTime, exitTime }
4269
+ });
4270
+ const contentH = round1(browserH - pxToPct({ width }, 40));
4271
+ const contentLayer = isVideo ? createLayer("video", {
4272
+ props: {
4273
+ src,
4274
+ fileKey,
4275
+ width: browserW,
4276
+ height: contentH,
4277
+ objectFit: "cover",
4278
+ borderRadius: 0,
4279
+ frame: "none",
4280
+ frameWidth: 0
4281
+ },
4282
+ projectDimensions: { width, height },
4283
+ layer: { name: "Screen Recording", enterTime, exitTime, contentDuration: mediaDuration }
4284
+ }) : createLayer("image", {
4285
+ props: {
4286
+ src,
4287
+ fileKey,
4288
+ width: browserW,
4289
+ height: contentH,
4290
+ objectFit: "cover"
4291
+ },
4292
+ projectDimensions: { width, height },
4293
+ layer: { name: "Screenshot", enterTime, exitTime }
4294
+ });
4295
+ contentLayer.parentId = browserLayer.id;
4296
+ return {
4297
+ projectUpdates: {
4298
+ ...ctx.inProject ? {} : { background },
4299
+ ...exitTime > ctx.project.duration ? { duration: exitTime } : {}
4300
+ },
4301
+ layersToAdd: [
4302
+ {
4303
+ layer: browserLayer,
4304
+ presets: [{ id: "zoom-in", startTime: enterTime, duration: 0.5 }]
4305
+ },
4306
+ {
4307
+ layer: contentLayer,
4308
+ presets: [{ id: "fade-in", startTime: enterTime + 0.2, duration: 0.35 }]
4309
+ }
4310
+ ]
4311
+ };
4312
+ }
4313
+ };
4314
+ const __vite_glob_0_4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4315
+ __proto__: null,
4316
+ template: template$5
4317
+ }, Symbol.toStringTag, { value: "Module" }));
4318
+ const dubLanguageOptions = dubLanguages.map((l) => ({ value: l.value, label: l.label }));
4319
+ const dubLanguageCodes = dubLanguages.map((l) => l.value);
4320
+ const configSchema$3 = z.object({
4321
+ targetLang: z.enum(dubLanguageCodes).default("en").register(fieldRegistry, {
4322
+ label: "Target language",
4323
+ widget: "select",
4324
+ options: dubLanguageOptions
4325
+ })
4326
+ });
4327
+ const template$4 = {
4328
+ id: "translate-video",
4329
+ name: "Video Translator",
4330
+ description: "Dub your video into another language using AI voice cloning",
4331
+ thumbnail: "/templates/translate-video.svg",
4332
+ icon: Languages,
4333
+ category: "media",
4334
+ isPro: true,
4335
+ seoTitle: "Free AI Video Translator — Dub Video to Any Language",
4336
+ seoDescription: "Translate your video into 12+ languages with AI-powered voice dubbing. Keep original lip sync and tone. Free to try — no login required.",
4337
+ keywords: [
4338
+ "video translator",
4339
+ "ai dubbing",
4340
+ "video dubbing",
4341
+ "translate video",
4342
+ "voice cloning",
4343
+ "multilingual video",
4344
+ "video localization"
4345
+ ],
4346
+ steps: [
4347
+ {
4348
+ title: "Upload Your Video",
4349
+ description: "Upload the video you want to translate",
4350
+ component: Media_upload_step,
4351
+ componentProps: { mediaType: "video" }
4352
+ },
4353
+ {
4354
+ title: "Choose Target Language",
4355
+ description: "Select the language you want to dub your video into",
4356
+ schema: configSchema$3
4357
+ }
4358
+ ],
4359
+ async apply(values, ctx) {
4360
+ const { src, fileKey, duration } = values;
4361
+ const { width, height } = ctx.project;
4362
+ const enterTime = ctx.currentTime;
4363
+ const exitTime = enterTime + duration;
4364
+ const videoLayer = createLayer("video", {
4365
+ props: {
4366
+ src,
4367
+ fileKey,
4368
+ width: 100,
4369
+ height: toPct(height / width),
4370
+ objectFit: "cover",
4371
+ // Mute original audio — dubbed audio layer will replace it
4372
+ volume: 0,
4373
+ borderRadius: 0,
4374
+ frame: "none",
4375
+ frameWidth: 0
4376
+ },
4377
+ projectDimensions: { width, height },
4378
+ layer: { name: "Original Video", enterTime, exitTime, contentDuration: duration }
4379
+ });
4380
+ const { layersToAdd, layersToUpdate } = await runAction({
4381
+ action: dubAudioAction,
4382
+ input: createFromSchema(dubAudioAction.inputSchema, {
4383
+ targetLang: values.targetLang
4384
+ }),
4385
+ sourceLayer: videoLayer,
4386
+ project: ctx.project
4387
+ });
4388
+ return {
4389
+ layersToAdd: [{ layer: videoLayer }, ...layersToAdd ?? []],
4390
+ layersToUpdate,
4391
+ projectUpdates: { ...exitTime > ctx.project.duration ? { duration: exitTime } : {} }
4392
+ };
4393
+ }
4394
+ };
4395
+ const __vite_glob_0_5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4396
+ __proto__: null,
4397
+ template: template$4
4398
+ }, Symbol.toStringTag, { value: "Module" }));
4399
+ const configSchema$2 = z.object({
4400
+ aggressiveness: z.enum(["light", "balanced", "aggressive"]).default("balanced").register(fieldRegistry, { label: "Cut aggressiveness" })
4401
+ });
4402
+ const template$3 = {
4403
+ id: "auto-cut",
4404
+ name: "Silence Remover",
4405
+ description: "Automatically detect and remove silent/boring parts from your video",
4406
+ thumbnail: "/templates/auto-cut.svg",
4407
+ icon: Scissors,
4408
+ category: "media",
4409
+ isPro: true,
4410
+ seoTitle: "Free Silence Remover — Auto-Cut Dead Air from Videos",
4411
+ seoDescription: "Upload your video and let AI automatically detect and remove silences, pauses, and boring sections. Free online silence remover.",
4412
+ keywords: [
4413
+ "silence remover",
4414
+ "auto cut video",
4415
+ "remove silence from video",
4416
+ "jump cut editor",
4417
+ "video trimmer",
4418
+ "podcast editor",
4419
+ "youtube editor"
4420
+ ],
4421
+ steps: [
4422
+ {
4423
+ title: "Upload Your Video",
4424
+ description: "Upload the video you want to trim",
4425
+ component: Media_upload_step,
4426
+ componentProps: { mediaType: "video" }
4427
+ },
4428
+ {
4429
+ title: "Cut Settings",
4430
+ description: "Choose how aggressively to remove silences",
4431
+ schema: configSchema$2
4432
+ },
4433
+ {
4434
+ title: "Analyzing Video",
4435
+ description: "AI is detecting silences and boring sections...",
4436
+ async execute(values, _ctx, onProgress) {
4437
+ const fileKey = values.fileKey;
4438
+ const duration = values.duration;
4439
+ const aggressiveness = values.aggressiveness ?? "balanced";
4440
+ onProgress(0.1);
4441
+ const result = await analyzeMediaAsset({ fileKey });
4442
+ onProgress(0.8);
4443
+ let segments;
4444
+ const analysisData = result.success ? result.data : null;
4445
+ const annotation = analysisData?.success ? analysisData.annotation : null;
4446
+ if (annotation) {
4447
+ const typesToCut = aggressiveness === "light" ? ["dead-space"] : aggressiveness === "balanced" ? ["dead-space", "tangent"] : ["dead-space", "tangent", "outro"];
4448
+ segments = annotation.segments.filter((s) => !typesToCut.includes(s.type)).map((s) => ({ start: s.start, end: s.end }));
4449
+ } else {
4450
+ const segmentLength = aggressiveness === "light" ? 30 : aggressiveness === "balanced" ? 20 : 10;
4451
+ segments = [];
4452
+ for (let start = 0; start < duration; start += segmentLength + 1) {
4453
+ segments.push({ start, end: Math.min(start + segmentLength, duration) });
4454
+ }
4455
+ }
4456
+ if (segments.length === 0) {
4457
+ segments.push({ start: 0, end: duration });
4458
+ }
4459
+ onProgress(1);
4460
+ return { segments, fileKey, src: values.src };
4461
+ }
4462
+ }
4463
+ ],
4464
+ apply(values, ctx) {
4465
+ const { src, fileKey, duration, segments } = values;
4466
+ const { width, height } = ctx.project;
4467
+ const enterTime = ctx.currentTime;
4468
+ const allSegments = segments ?? [{ start: 0, end: duration }];
4469
+ const layers = [];
4470
+ let cursor = enterTime;
4471
+ for (const seg of allSegments) {
4472
+ const segDuration = seg.end - seg.start;
4473
+ const layer = createLayer("video", {
4474
+ props: {
4475
+ src,
4476
+ fileKey,
4477
+ width: 100,
4478
+ height: toPct(height / width),
4479
+ objectFit: "cover",
4480
+ borderRadius: 0,
4481
+ frame: "none",
4482
+ frameWidth: 0
4483
+ },
4484
+ projectDimensions: { width, height },
4485
+ layer: {
4486
+ name: `Clip ${Math.round(seg.start)}s–${Math.round(seg.end)}s`,
4487
+ enterTime: cursor,
4488
+ exitTime: cursor + segDuration,
4489
+ contentDuration: duration,
4490
+ contentOffset: seg.start
4491
+ }
4492
+ });
4493
+ layers.push({ layer });
4494
+ cursor += segDuration;
4495
+ }
4496
+ return {
4497
+ layersToAdd: layers,
4498
+ projectUpdates: { ...cursor > ctx.project.duration ? { duration: cursor } : {} }
4499
+ };
4500
+ }
4501
+ };
4502
+ const __vite_glob_0_6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4503
+ __proto__: null,
4504
+ template: template$3
4505
+ }, Symbol.toStringTag, { value: "Module" }));
4506
+ const configSchema$1 = z.object({
4507
+ headline: z.string().default("").register(fieldRegistry, { label: "Headline text" }),
4508
+ subtext: z.string().default("").register(fieldRegistry, { label: "Subtext (optional)" }),
4509
+ background: BackgroundValueSchema.default({
4510
+ type: "linear",
4511
+ angle: 135,
4512
+ stops: [
4513
+ { color: "#667eea", position: 0 },
4514
+ { color: "#764ba2", position: 100 }
4515
+ ]
4516
+ }).register(fieldRegistry, { label: "Background", widget: "background" }),
4517
+ animateIn: z.boolean().default(true).register(fieldRegistry, { label: "Animate screenshot in" })
4518
+ });
4519
+ const template$2 = {
4520
+ id: "screenshot-to-social",
4521
+ name: "Screenshot to Social Card",
4522
+ description: "Turn any screenshot into an animated social media card with text and branding",
4523
+ thumbnail: "/templates/screenshot-to-social.svg",
4524
+ icon: Image_play,
4525
+ category: "composite",
4526
+ seoTitle: "Free Screenshot to Social Card Maker — Animated Video",
4527
+ seoDescription: "Drop a screenshot and turn it into a polished animated social card with gradient background, headline, and smooth reveal animation. Free.",
4528
+ keywords: [
4529
+ "screenshot to video",
4530
+ "social media card maker",
4531
+ "animated social post",
4532
+ "product screenshot",
4533
+ "marketing video maker",
4534
+ "twitter card video"
4535
+ ],
4536
+ steps: [
4537
+ {
4538
+ title: "Upload Media",
4539
+ description: "Upload a screenshot, image, or video to showcase",
4540
+ component: Media_upload_step,
4541
+ componentProps: { mediaType: "media" }
4542
+ },
4543
+ {
4544
+ title: "Card Content",
4545
+ description: "Add your headline, subtext, and choose a background color",
4546
+ schema: configSchema$1
4547
+ }
4548
+ ],
4549
+ apply(values, ctx) {
4550
+ const {
4551
+ src,
4552
+ fileKey,
4553
+ detectedType,
4554
+ duration: mediaDuration,
4555
+ headline,
4556
+ subtext,
4557
+ background,
4558
+ animateIn
4559
+ } = values;
4560
+ const isVideo = detectedType === "video";
4561
+ const { width, height } = ctx.project;
4562
+ const ar = height / width;
4563
+ const enterTime = ctx.currentTime;
4564
+ const duration = mediaDuration ?? 5;
4565
+ const exitTime = enterTime + duration;
4566
+ const layers = [];
4567
+ const bgLayer = createLayer("shape", {
4568
+ props: { shapeType: "rectangle", background, width: 100, height: toPct(ar), borderRadius: 0 },
4569
+ projectDimensions: { width, height },
4570
+ layer: { name: "Background", enterTime, exitTime }
4571
+ });
4572
+ layers.push({ layer: bgLayer });
4573
+ const mediaWidthPct = 75;
4574
+ const mediaHeightPct = round1(mediaWidthPct * 0.56);
4575
+ const hasText = headline || subtext;
4576
+ const sharedStyle = {
4577
+ opacity: 1,
4578
+ blur: 0,
4579
+ brightness: 1,
4580
+ contrast: 1,
4581
+ saturate: 1,
4582
+ dropShadowX: 0,
4583
+ dropShadowY: 12,
4584
+ dropShadowBlur: 40,
4585
+ dropShadowColor: "rgba(0,0,0,0.35)"
4586
+ };
4587
+ const sharedTransform = {
4588
+ position: { x: 0, y: hasText ? -round1(ar * 8) : 0, z: 0 },
4589
+ rotation: { x: 0, y: 0, z: 0 },
4590
+ scale: { x: 1, y: 1 },
4591
+ anchor: "center"
4592
+ };
4593
+ const mediaLayer = isVideo ? createLayer("video", {
4594
+ props: {
4595
+ src,
4596
+ fileKey,
4597
+ width: mediaWidthPct,
4598
+ height: mediaHeightPct,
4599
+ borderRadius: 12,
4600
+ objectFit: "cover"
4601
+ },
4602
+ transform: sharedTransform,
4603
+ style: sharedStyle,
4604
+ layer: { name: "Video", enterTime, exitTime, contentDuration: mediaDuration }
4605
+ }) : createLayer("image", {
4606
+ props: {
4607
+ src,
4608
+ fileKey,
4609
+ width: mediaWidthPct,
4610
+ height: mediaHeightPct,
4611
+ objectFit: "cover"
4612
+ },
4613
+ transform: sharedTransform,
4614
+ style: sharedStyle,
4615
+ layer: { name: "Screenshot", enterTime, exitTime }
4616
+ });
4617
+ layers.push({
4618
+ layer: mediaLayer,
4619
+ presets: animateIn ? [{ id: "zoom-in", startTime: enterTime, duration: 0.6 }] : void 0
4620
+ });
4621
+ if (headline) {
4622
+ const headlineLayer = createLayer("text", {
4623
+ props: {
4624
+ content: headline,
4625
+ fontSize: 42,
4626
+ fontWeight: "700",
4627
+ color: "#ffffff",
4628
+ textAlign: "center",
4629
+ letterSpacing: -0.5
4630
+ },
4631
+ transform: {
4632
+ position: { x: 0, y: round1(ar * 50 - pxToPct({ width }, 72)), z: 0 },
4633
+ rotation: { x: 0, y: 0, z: 0 },
4634
+ scale: { x: 1, y: 1 },
4635
+ anchor: "center"
4636
+ },
4637
+ layer: { name: "Headline", enterTime, exitTime }
4638
+ });
4639
+ layers.push({
4640
+ layer: headlineLayer,
4641
+ presets: [{ id: "slide-in-bottom", startTime: enterTime + 0.25, duration: 0.5 }]
4642
+ });
4643
+ }
4644
+ if (subtext) {
4645
+ const subtextLayer = createLayer("text", {
4646
+ props: {
4647
+ content: subtext,
4648
+ fontSize: 22,
4649
+ fontWeight: "400",
4650
+ color: "rgba(255,255,255,0.7)",
4651
+ textAlign: "center",
4652
+ letterSpacing: 0.2
4653
+ },
4654
+ transform: {
4655
+ position: { x: 0, y: round1(ar * 50 - pxToPct({ width }, 30)), z: 0 },
4656
+ rotation: { x: 0, y: 0, z: 0 },
4657
+ scale: { x: 1, y: 1 },
4658
+ anchor: "center"
4659
+ },
4660
+ layer: { name: "Subtext", enterTime, exitTime }
4661
+ });
4662
+ layers.push({
4663
+ layer: subtextLayer,
4664
+ presets: [{ id: "slide-in-bottom", startTime: enterTime + 0.4, duration: 0.5 }]
4665
+ });
4666
+ }
4667
+ return {
4668
+ layersToAdd: layers,
4669
+ projectUpdates: {
4670
+ ...exitTime > ctx.project.duration ? { duration: Math.ceil(exitTime) } : {}
4671
+ }
4672
+ };
4673
+ }
4674
+ };
4675
+ const __vite_glob_0_7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4676
+ __proto__: null,
4677
+ template: template$2
4678
+ }, Symbol.toStringTag, { value: "Module" }));
4679
+ const template$1 = {
4680
+ id: "generate-video",
4681
+ name: "AI Video Generator",
4682
+ description: "Generate a video from a text prompt using Seedance 2.0 AI",
4683
+ thumbnail: "/templates/generate-video.svg",
4684
+ icon: Sparkles,
4685
+ category: "media",
4686
+ isPro: true,
4687
+ seoTitle: "Free AI Video Generator — Text to Video in Seconds",
4688
+ seoDescription: "Generate stunning AI videos from text prompts using state-of-the-art Seedance 2.0 model. Native audio, any aspect ratio. Free to try.",
4689
+ keywords: [
4690
+ "ai video generator",
4691
+ "text to video",
4692
+ "ai video creation",
4693
+ "seedance",
4694
+ "video generation",
4695
+ "generative ai video"
4696
+ ],
4697
+ steps: [
4698
+ {
4699
+ title: "Describe Your Video",
4700
+ description: "Write a prompt and choose generation settings",
4701
+ schema: GenerateVideoSchema
4702
+ }
4703
+ ],
4704
+ async apply(values, ctx) {
4705
+ const { layersToAdd, layersToUpdate, projectUpdates } = await runAction({
4706
+ action: generateVideoAction,
4707
+ input: createFromSchema(generateVideoAction.inputSchema, values),
4708
+ project: ctx.project
4709
+ });
4710
+ return {
4711
+ layersToAdd,
4712
+ layersToUpdate,
4713
+ projectUpdates
4714
+ };
4715
+ }
4716
+ };
4717
+ const __vite_glob_0_8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4718
+ __proto__: null,
4719
+ template: template$1
4720
+ }, Symbol.toStringTag, { value: "Module" }));
4721
+ const configSchema = z.object({
4722
+ phoneColor: z.string().default("#1f2937").register(fieldRegistry, { label: "Phone Frame Color", widget: "color" }),
4723
+ background: BackgroundValueSchema.default(defaultBackground).register(fieldRegistry, {
4724
+ label: "Background",
4725
+ widget: "background"
4726
+ })
4727
+ });
4728
+ const template = {
4729
+ id: "video-to-phone",
4730
+ name: "Phone Mockup Video",
4731
+ description: "Wrap your video or screenshot inside an animated phone frame",
4732
+ thumbnail: "/templates/video-to-phone.svg",
4733
+ icon: Smartphone,
4734
+ category: "composite",
4735
+ seoTitle: "Free Phone Mockup Video Maker — Wrap Videos in a Phone Frame",
4736
+ seoDescription: "Instantly wrap your video or screenshot in a realistic phone mockup. Perfect for app demos, social media content, and product showcases. Free tool.",
4737
+ keywords: [
4738
+ "phone mockup",
4739
+ "mobile mockup video",
4740
+ "app demo video",
4741
+ "smartphone frame",
4742
+ "iphone mockup",
4743
+ "social media mockup"
4744
+ ],
4745
+ steps: [
4746
+ {
4747
+ title: "Upload Your Video",
4748
+ description: "Select a video or screenshot to display inside the phone",
4749
+ component: Media_upload_step,
4750
+ componentProps: { mediaType: "media" }
4751
+ },
4752
+ {
4753
+ title: "Phone Settings",
4754
+ description: "Customize the phone frame color and background",
4755
+ schema: configSchema
4756
+ }
4757
+ ],
4758
+ apply(values, ctx) {
4759
+ const { src, fileKey, detectedType, duration: mediaDuration, phoneColor, background } = values;
4760
+ const isVideo = detectedType === "video";
4761
+ const { width, height } = ctx.project;
4762
+ const enterTime = ctx.currentTime;
4763
+ const duration = isVideo ? mediaDuration ?? 5 : 5;
4764
+ const exitTime = enterTime + duration;
4765
+ const phoneW = round1(Math.min(45, pxToPct({ width }, 375)));
4766
+ const phoneH = round1(phoneW * (667 / 375));
4767
+ const bezelWidth = pxToPct({ width }, 12);
4768
+ const notchHeight = pxToPct({ width }, 28);
4769
+ const phoneLayer = createLayer("phone", {
4770
+ props: {
4771
+ width: phoneW,
4772
+ height: phoneH,
4773
+ phoneColor,
4774
+ borderRadius: pxToPct({ width }, 40),
4775
+ bezelWidth,
4776
+ notchHeight,
4777
+ showNotch: true
4778
+ },
4779
+ projectDimensions: ctx.project,
4780
+ style: {
4781
+ opacity: 1,
4782
+ blur: 0,
4783
+ brightness: 1,
4784
+ contrast: 1,
4785
+ saturate: 1,
4786
+ dropShadowX: 0,
4787
+ dropShadowY: 20,
4788
+ dropShadowBlur: 60,
4789
+ dropShadowColor: "rgba(0,0,0,0.45)"
4790
+ },
4791
+ layer: { name: "Phone Frame", enterTime, exitTime }
4792
+ });
4793
+ const contentW = phoneW - bezelWidth * 2;
4794
+ const contentH = phoneH - bezelWidth * 2 - notchHeight;
4795
+ const contentLayer = isVideo ? createLayer("video", {
4796
+ props: {
4797
+ src,
4798
+ fileKey,
4799
+ width: contentW,
4800
+ height: contentH,
4801
+ objectFit: "cover",
4802
+ borderRadius: 0,
4803
+ frame: "none",
4804
+ frameWidth: 0
4805
+ },
4806
+ projectDimensions: { width, height },
4807
+ layer: { name: "Video", enterTime, exitTime, contentDuration: mediaDuration }
4808
+ }) : createLayer("image", {
4809
+ props: {
4810
+ src,
4811
+ fileKey,
4812
+ width: contentW,
4813
+ height: contentH,
4814
+ objectFit: "cover"
4815
+ },
4816
+ projectDimensions: { width, height },
4817
+ layer: { name: "Screenshot", enterTime, exitTime }
4818
+ });
4819
+ contentLayer.parentId = phoneLayer.id;
4820
+ return {
4821
+ projectUpdates: {
4822
+ ...ctx.inProject ? {} : { background, duration: exitTime },
4823
+ ...exitTime > ctx.project.duration ? { duration: exitTime } : {}
4824
+ },
4825
+ layersToAdd: [
4826
+ {
4827
+ layer: phoneLayer,
4828
+ presets: [{ id: "zoom-in", startTime: enterTime, duration: 0.5 }]
4829
+ },
4830
+ {
4831
+ layer: contentLayer,
4832
+ presets: [{ id: "fade-in", startTime: enterTime + 0.2, duration: 0.35 }]
4833
+ }
4834
+ ]
4835
+ };
4836
+ }
4837
+ };
4838
+ const __vite_glob_0_9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4839
+ __proto__: null,
4840
+ template
4841
+ }, Symbol.toStringTag, { value: "Module" }));
4842
+ const templateModules = /* @__PURE__ */ Object.assign({ "./templates/1-screen-webcam-demo.ts": __vite_glob_0_0, "./templates/10-video-beautifier.ts": __vite_glob_0_1, "./templates/2-laptop-3d-intro.ts": __vite_glob_0_2, "./templates/3-add-captions.ts": __vite_glob_0_3, "./templates/4-video-to-browser.ts": __vite_glob_0_4, "./templates/5-translate-video.ts": __vite_glob_0_5, "./templates/6-auto-cut.ts": __vite_glob_0_6, "./templates/7-screenshot-to-social.ts": __vite_glob_0_7, "./templates/8-generate-video.ts": __vite_glob_0_8, "./templates/9-video-to-phone.ts": __vite_glob_0_9 });
4843
+ const templateRegistry = Object.values(templateModules).map(
4844
+ (m) => m.template
4845
+ );
4846
+ function getTemplateById(id) {
4847
+ return templateRegistry.find((t) => t.id === id);
4848
+ }
4849
+
4850
+ export { FileUpload as F, Monitor_play as M, Rotate_cw as R, Scroll_area as S, Tooltip as T, Tooltip_trigger as a, Tooltip_content as b, Tooltip$1 as c, Tooltip_trigger$1 as d, Monitor as e, Scissors as f, getTemplateById as g, templateRegistry as t };
4851
+ //# sourceMappingURL=registry2-DJC1cBxe.js.map