@jackuait/blok 0.16.1 → 0.18.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 (609) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +4 -4
  3. package/dist/blok.mjs +2 -2
  4. package/dist/blok.umd.js +4 -4
  5. package/dist/chunks/APEv2Parser-4KTzNuV0.cjs +1 -0
  6. package/dist/chunks/APEv2Parser-WvRvu4zL.mjs +187 -0
  7. package/dist/chunks/AbstractID3Parser-DM9acVTg.mjs +34 -0
  8. package/dist/chunks/AbstractID3Parser-o6LG6Iyj.cjs +1 -0
  9. package/dist/chunks/AiffParser-C_VaWeb5.mjs +109 -0
  10. package/dist/chunks/AiffParser-DVmZ6jG0.cjs +1 -0
  11. package/dist/chunks/AsfParser-CH5F_9Wp.mjs +419 -0
  12. package/dist/chunks/AsfParser-Dwm_MRPg.cjs +1 -0
  13. package/dist/chunks/BasicParser-BFTgNkp-.mjs +743 -0
  14. package/dist/chunks/BasicParser-CLAKKNEs.cjs +1 -0
  15. package/dist/chunks/DsdiffParser-BAdYwB7y.mjs +108 -0
  16. package/dist/chunks/DsdiffParser-DRFw1wX0.cjs +1 -0
  17. package/dist/chunks/DsfParser-DWMLfBH1.mjs +61 -0
  18. package/dist/chunks/DsfParser-DjS_tBuv.cjs +1 -0
  19. package/dist/chunks/FlacParser-BdKXrY7L.mjs +255 -0
  20. package/dist/chunks/FlacParser-CPQ0VqXv.cjs +1 -0
  21. package/dist/chunks/ID3v1Parser-CPjEHype.cjs +1 -0
  22. package/dist/chunks/ID3v1Parser-DoxlznrE.mjs +75 -0
  23. package/dist/chunks/ID3v2Parser-BIrxzjBm.mjs +518 -0
  24. package/dist/chunks/ID3v2Parser-CMd_Ayt7.cjs +1 -0
  25. package/dist/chunks/ID3v2Token-Cc901eYL.cjs +1 -0
  26. package/dist/chunks/ID3v2Token-D5v9lCfb.mjs +107 -0
  27. package/dist/chunks/MP4Parser-0KMJ-q2k.mjs +811 -0
  28. package/dist/chunks/MP4Parser-B8kU67Xi.cjs +1 -0
  29. package/dist/chunks/MatroskaParser-CzZTyUP-.cjs +1 -0
  30. package/dist/chunks/MatroskaParser-fxFuCddu.mjs +814 -0
  31. package/dist/chunks/MpegParser-DX5r4iE7.cjs +1 -0
  32. package/dist/chunks/MpegParser-R-6QiuhU.mjs +513 -0
  33. package/dist/chunks/MusepackParser-DFLoF47O.mjs +187 -0
  34. package/dist/chunks/MusepackParser-OgeWmD5G.cjs +1 -0
  35. package/dist/chunks/OggParser-C1qP2qC7.mjs +251 -0
  36. package/dist/chunks/OggParser-DjscM3J-.cjs +1 -0
  37. package/dist/chunks/Util-BL3wIJcu.cjs +1 -0
  38. package/dist/chunks/Util-DiBcLCh8.mjs +109 -0
  39. package/dist/chunks/WavPackParser-3J7J92gh.cjs +1 -0
  40. package/dist/chunks/WavPackParser-Ck8xXsNf.mjs +116 -0
  41. package/dist/chunks/WaveParser-CiNJ-5JL.cjs +1 -0
  42. package/dist/chunks/WaveParser-hxQlWijT.mjs +187 -0
  43. package/dist/chunks/{blok-DEVVs3xk.cjs → blok-B7IRrvgX.cjs} +11 -11
  44. package/dist/chunks/{blok-D1e9swtF.mjs → blok-BoAuTqli.mjs} +776 -780
  45. package/dist/chunks/{constants-DfGAwzgk.mjs → constants-BO6zLfL2.mjs} +274 -274
  46. package/dist/chunks/constants-BWoyU4yv.cjs +606 -0
  47. package/dist/chunks/core-CqiEzfU3.mjs +292 -0
  48. package/dist/chunks/core-DdDpt2u7.mjs +3931 -0
  49. package/dist/chunks/core-YGVcFb_q.cjs +1 -0
  50. package/dist/chunks/core-uWDvHWK7.cjs +6 -0
  51. package/dist/chunks/{i18next-loader-BID4jAFG.cjs → i18next-loader-BBPMegxc.cjs} +1 -1
  52. package/dist/chunks/{i18next-loader-BH_a6G9t.mjs → i18next-loader-K-ir8UKk.mjs} +1 -1
  53. package/dist/chunks/{lightweight-i18n-B0VO8Rft.mjs → lightweight-i18n-DJpMke7a.mjs} +59 -0
  54. package/dist/chunks/lightweight-i18n-LFW8S8u-.cjs +1 -0
  55. package/dist/{messages-Ck7HWiG_.mjs → chunks/messages-3jkCmB_A.mjs} +60 -1
  56. package/dist/{messages-6RcfJ59a.mjs → chunks/messages-5339ApgH.mjs} +60 -1
  57. package/dist/{messages-CWdh59uz2.mjs → chunks/messages-7LWW3BVh.mjs} +60 -1
  58. package/dist/chunks/messages-9B1F-k48.cjs +1 -0
  59. package/dist/chunks/messages-Au1UpgkX.cjs +1 -0
  60. package/dist/chunks/messages-B-u5B7tY.cjs +1 -0
  61. package/dist/chunks/{messages-Bz_fTG46.mjs → messages-B01D7aHY.mjs} +60 -1
  62. package/dist/chunks/{messages-CEslBsO62.mjs → messages-B2iaIrIu.mjs} +60 -1
  63. package/dist/chunks/messages-B6794_2J.cjs +1 -0
  64. package/dist/chunks/{messages-BDNdC6-X.cjs → messages-B6dbtt1c.cjs} +1 -1
  65. package/dist/chunks/{messages-CVHSfosB.cjs → messages-B6yMdb3B.cjs} +1 -1
  66. package/dist/chunks/{messages-f1NcMMTR2.cjs → messages-B7st3eF_.cjs} +1 -1
  67. package/dist/chunks/{messages-D2nTfhRa2.cjs → messages-BHCepNsI.cjs} +1 -1
  68. package/dist/chunks/{messages-DB6z9ybS.cjs → messages-BHdKd7pH.cjs} +1 -1
  69. package/dist/{messages-C-XKbE2c.mjs → chunks/messages-BO-L5oN9.mjs} +60 -1
  70. package/dist/chunks/{messages-DDnB1EFE2.mjs → messages-BRTWvTAP.mjs} +60 -1
  71. package/dist/{messages-CUsdyCrN2.mjs → chunks/messages-BUvlOqll.mjs} +60 -1
  72. package/dist/chunks/messages-BV22YIZ_.cjs +1 -0
  73. package/dist/chunks/messages-BXp_U3uS.cjs +1 -0
  74. package/dist/{messages-BfGAGIg-2.mjs → chunks/messages-BYCHzM7F.mjs} +60 -1
  75. package/dist/chunks/messages-B_cHWyWC.cjs +1 -0
  76. package/dist/{messages-BbFJ2r9p.mjs → chunks/messages-B_d857cA.mjs} +60 -1
  77. package/dist/chunks/messages-BaVZgTrw.cjs +1 -0
  78. package/dist/{messages-DaoTSrJW.mjs → chunks/messages-Bb80Csl3.mjs} +60 -1
  79. package/dist/{messages-C1d7I7f_2.mjs → chunks/messages-BbZz_Anm.mjs} +60 -1
  80. package/dist/{messages-kb2GSl-V.mjs → chunks/messages-BdL8bmTL.mjs} +60 -1
  81. package/dist/chunks/{messages-CcvcAZOt.mjs → messages-BeS9EOEO.mjs} +60 -1
  82. package/dist/chunks/{messages-BG1Tn41d.cjs → messages-BjYhwRk7.cjs} +1 -1
  83. package/dist/chunks/{messages-CUxk6xrQ.cjs → messages-BkgBVEiE.cjs} +1 -1
  84. package/dist/chunks/{messages-BhTV7PCN.mjs → messages-Bmq--WTx.mjs} +60 -1
  85. package/dist/{messages-Z8HMjhe9.mjs → chunks/messages-Bp0LdGKj.mjs} +60 -1
  86. package/dist/chunks/{messages-Bq7pLz_h2.mjs → messages-BpMWMH9_.mjs} +60 -1
  87. package/dist/chunks/{messages-C-N1XBvh2.cjs → messages-BsTzdfZF.cjs} +1 -1
  88. package/dist/chunks/{messages-p5w1kuc5.cjs → messages-BveiGA2x.cjs} +1 -1
  89. package/dist/{messages-CSVEbRhT.mjs → chunks/messages-BwOUSDJR.mjs} +60 -1
  90. package/dist/chunks/messages-ByNR9m9W.cjs +1 -0
  91. package/dist/{messages-B8BXCJBA.mjs → chunks/messages-Byn9-dhb2.mjs} +60 -1
  92. package/dist/chunks/{messages-DaqNOQ8p.mjs → messages-C0swL9CY.mjs} +60 -1
  93. package/dist/chunks/{messages-CO_hj1x6.cjs → messages-C2ptZOWh.cjs} +1 -1
  94. package/dist/chunks/{messages-Dp5C7vWz.mjs → messages-C3rGCBi_.mjs} +60 -1
  95. package/dist/{messages-BytEaMMs.mjs → chunks/messages-C8_r3iTR2.mjs} +60 -1
  96. package/dist/chunks/{messages-Dp5SW9D-.mjs → messages-CATH_uz1.mjs} +60 -1
  97. package/dist/chunks/{messages-Bi3snvmH2.cjs → messages-CBbgEXuO.cjs} +1 -1
  98. package/dist/chunks/messages-CEySIig9.cjs +1 -0
  99. package/dist/chunks/messages-CGdCpNZ62.cjs +1 -0
  100. package/dist/chunks/{messages-CpJW0LBR.cjs → messages-CH9SBR-i.cjs} +1 -1
  101. package/dist/{messages-2pXizYBd.mjs → chunks/messages-CI2W7P-j.mjs} +60 -1
  102. package/dist/chunks/{messages-CHizzxUv.mjs → messages-CIBYzzFy.mjs} +60 -1
  103. package/dist/chunks/{messages-Cz7AbEFm.cjs → messages-CJFSq8Fl.cjs} +1 -1
  104. package/dist/chunks/{messages-DG8Lmqf52.cjs → messages-CM8uUnPx.cjs} +1 -1
  105. package/dist/chunks/{messages-Cf5mu1AT.cjs → messages-COx3hDcP.cjs} +1 -1
  106. package/dist/chunks/messages-CQT8TtiF.cjs +1 -0
  107. package/dist/chunks/{messages-DubJ63UL.mjs → messages-CRUb9o5k.mjs} +60 -1
  108. package/dist/chunks/messages-CT8djlV6.cjs +1 -0
  109. package/dist/{messages-BYyRYlTQ2.mjs → chunks/messages-CUPup5e3.mjs} +60 -1
  110. package/dist/chunks/{messages-BSyXBvUi2.cjs → messages-CVrOxu3J.cjs} +1 -1
  111. package/dist/chunks/messages-CWFSMzug2.cjs +1 -0
  112. package/dist/{messages-BXgGBpmY.mjs → chunks/messages-CX0tJpOb.mjs} +60 -1
  113. package/dist/chunks/{messages-xMrks-Gg.mjs → messages-CXk-iM-i.mjs} +60 -1
  114. package/dist/chunks/{messages-B-3_M44j.cjs → messages-CZJZ-au3.cjs} +1 -1
  115. package/dist/chunks/messages-CZddldga.cjs +1 -0
  116. package/dist/{messages-BmKhZE7I.mjs → chunks/messages-Ca9zIrBo.mjs} +60 -1
  117. package/dist/{messages-D1jUHOKr.mjs → chunks/messages-CbyVDo8y.mjs} +60 -1
  118. package/dist/chunks/{messages-CZQuqbNz2.cjs → messages-CcsM8Q7g.cjs} +1 -1
  119. package/dist/chunks/{messages-B3xnntgx2.mjs → messages-CeIzWL_4.mjs} +60 -1
  120. package/dist/{messages-DPZsygzY.mjs → chunks/messages-CeLv1whu2.mjs} +60 -1
  121. package/dist/chunks/messages-Ciq5_PsP.cjs +1 -0
  122. package/dist/{messages-qjir1Zx9.mjs → chunks/messages-CjCn5IsF.mjs} +60 -1
  123. package/dist/chunks/messages-CjfEt9bg.cjs +1 -0
  124. package/dist/{messages-S8uz2_bw2.mjs → chunks/messages-Ck1-ddbo.mjs} +60 -1
  125. package/dist/{messages-zoHZbvbe.mjs → chunks/messages-CkosWGGH.mjs} +60 -1
  126. package/dist/chunks/{messages-Bh3E53-f2.mjs → messages-Cl_pM31G.mjs} +60 -1
  127. package/dist/chunks/messages-CmsAbu_A.cjs +1 -0
  128. package/dist/chunks/messages-CqRtDVFO.cjs +1 -0
  129. package/dist/chunks/{messages-jAgR8EPP.cjs → messages-CuMtymEs.cjs} +1 -1
  130. package/dist/chunks/{messages-CSc7Lh_3.mjs → messages-Cvg_uTfy.mjs} +60 -1
  131. package/dist/chunks/messages-Cy-2_lIA.cjs +1 -0
  132. package/dist/{messages-B_XoP1A3.mjs → chunks/messages-D-QWtvWg.mjs} +60 -1
  133. package/dist/{messages-TfPmsrxh.mjs → chunks/messages-D-p-omWy.mjs} +60 -1
  134. package/dist/{messages-Bj8K6_bv.mjs → chunks/messages-D-s4_vnU.mjs} +60 -1
  135. package/dist/chunks/messages-D41fO84y.cjs +1 -0
  136. package/dist/{messages-BXs-Zwhx.mjs → chunks/messages-D4u2PSQw.mjs} +60 -1
  137. package/dist/chunks/messages-D7H9JUDr.cjs +1 -0
  138. package/dist/chunks/{messages-Bttb4o0k.cjs → messages-D7sU-NqL.cjs} +1 -1
  139. package/dist/chunks/{messages-Dml6u25s2.cjs → messages-DCwrXfck.cjs} +1 -1
  140. package/dist/{messages-CS6vG53A.mjs → chunks/messages-DDJkNbJy.mjs} +60 -1
  141. package/dist/{messages-BWzRZ5Un.mjs → chunks/messages-DDX6I6MX.mjs} +60 -1
  142. package/dist/chunks/messages-DEg5FAg1.cjs +1 -0
  143. package/dist/chunks/{messages-Bs9JOJDc.cjs → messages-DFHNw6PQ.cjs} +1 -1
  144. package/dist/chunks/{messages-M2lNlKhI2.mjs → messages-DHv7knYB.mjs} +60 -1
  145. package/dist/chunks/{messages-BxRX_hY12.cjs → messages-DIFwztFo.cjs} +1 -1
  146. package/dist/chunks/{messages-UoKgx7_8.cjs → messages-DIetNXTx.cjs} +1 -1
  147. package/dist/{messages-CdmaH2dA2.mjs → chunks/messages-DNtAzacv.mjs} +60 -1
  148. package/dist/chunks/messages-DOqJ6ogK.cjs +1 -0
  149. package/dist/chunks/messages-DQJcAz4s.cjs +1 -0
  150. package/dist/{messages-CzabNeP5.mjs → chunks/messages-DQfi2DoY.mjs} +60 -1
  151. package/dist/chunks/{messages-De0Fkl0K.mjs → messages-DQr7bXMD.mjs} +60 -1
  152. package/dist/chunks/messages-DT-JnTnw.cjs +1 -0
  153. package/dist/chunks/{messages-C2-v6HdR.cjs → messages-DUWCkLYR.cjs} +1 -1
  154. package/dist/chunks/{messages-BItPVbHx.cjs → messages-Da8yFc7l.cjs} +1 -1
  155. package/dist/chunks/{messages-BzC8TVYC.mjs → messages-DgF8OkNr.mjs} +60 -1
  156. package/dist/{messages-Dw7P8bMa2.mjs → chunks/messages-DiODNXET.mjs} +60 -1
  157. package/dist/{messages-CJsMZvUv.mjs → chunks/messages-DjZoCJ00.mjs} +60 -1
  158. package/dist/chunks/messages-DjrfovG0.cjs +1 -0
  159. package/dist/chunks/messages-DmjccFHq.cjs +1 -0
  160. package/dist/chunks/{messages-Vbqmvxs1.cjs → messages-DpNmnBjK.cjs} +1 -1
  161. package/dist/chunks/messages-DtaPHADA.cjs +1 -0
  162. package/dist/{messages-DFKu1WGX2.mjs → chunks/messages-DuD4ut1b.mjs} +60 -1
  163. package/dist/chunks/{messages-BqM6l_JM2.mjs → messages-DuHFGMCJ.mjs} +60 -1
  164. package/dist/{messages-tcfLP2b2.mjs → chunks/messages-Dwl878eS.mjs} +60 -1
  165. package/dist/chunks/{messages-BVuodJIJ.cjs → messages-ETJ7tQ9O.cjs} +1 -1
  166. package/dist/chunks/messages-EsX3eikv.cjs +1 -0
  167. package/dist/{messages-B4cc5O5K.mjs → chunks/messages-HJnG9r2l.mjs} +60 -1
  168. package/dist/chunks/{messages-Ckej-nnJ.cjs → messages-Hfo6uCIC.cjs} +1 -1
  169. package/dist/chunks/{messages-CT025FgD2.cjs → messages-IqNWRaNS.cjs} +1 -1
  170. package/dist/chunks/{messages-Cd-FaIr_2.mjs → messages-MPe9FjYe.mjs} +60 -1
  171. package/dist/chunks/messages-NJAjMFXd.cjs +1 -0
  172. package/dist/{messages-B0n-WDK72.mjs → chunks/messages-QCaF3d92.mjs} +60 -1
  173. package/dist/chunks/messages-SozFksSf.cjs +1 -0
  174. package/dist/chunks/messages-UXS3zL9A2.cjs +1 -0
  175. package/dist/chunks/{messages-5tb-mSXS.cjs → messages-VeyvtTce.cjs} +1 -1
  176. package/dist/chunks/{messages-BGoPxZ5n.mjs → messages-Xh-c7d4C.mjs} +60 -1
  177. package/dist/chunks/{messages-BfYWRC3o.cjs → messages-Z4LYgfWc.cjs} +1 -1
  178. package/dist/{messages-BCGyLzFB2.mjs → chunks/messages-ZMG7qQ3D.mjs} +60 -1
  179. package/dist/chunks/{messages-LWyC-1ol.mjs → messages-cSBZ5qVe.mjs} +60 -1
  180. package/dist/chunks/{messages-XM0y9kXy2.cjs → messages-gh5G15J1.cjs} +1 -1
  181. package/dist/{messages-DGwIRpOH2.mjs → chunks/messages-jEbEE90_.mjs} +60 -1
  182. package/dist/{messages-Cg3w36Bc.mjs → chunks/messages-kqnzps-X.mjs} +60 -1
  183. package/dist/chunks/{messages-S_Bmo_Qc.mjs → messages-m-A6ArIM.mjs} +60 -1
  184. package/dist/chunks/{messages-BHE1mg5A2.mjs → messages-t26x8wxB.mjs} +60 -1
  185. package/dist/chunks/{messages-s9I-JHCa.cjs → messages-tR0BdeVG.cjs} +1 -1
  186. package/dist/chunks/{messages-CxVi9cnz.mjs → messages-typO_i_k.mjs} +60 -1
  187. package/dist/chunks/{messages-Beh905t72.mjs → messages-ypIHI9Fr.mjs} +60 -1
  188. package/dist/{messages-ChivLKDg2.mjs → chunks/messages-zPUQsksJ.mjs} +60 -1
  189. package/dist/chunks/{tools-vX3wCW3a.mjs → tools-DRwLS-6t.mjs} +4223 -2323
  190. package/dist/chunks/tools-DXagFf6I.cjs +208 -0
  191. package/dist/chunks/types-BNsalfLy.cjs +1 -0
  192. package/dist/chunks/types-gj36fzRQ.mjs +28 -0
  193. package/dist/chunks/webm-muxer-BEeYNPIp.cjs +5 -0
  194. package/dist/chunks/webm-muxer-Doy8JtlV.mjs +864 -0
  195. package/dist/full.cjs +1 -1
  196. package/dist/full.mjs +10 -10
  197. package/dist/locales.mjs +126 -67
  198. package/dist/{chunks/messages-14GzwdH92.mjs → messages-4drvqPN8.mjs} +60 -1
  199. package/dist/{chunks/messages-CZfG1cmA2.mjs → messages-8__-vX3U.mjs} +60 -1
  200. package/dist/{chunks/messages-DyuKfskv.mjs → messages-Ao2vCNAH2.mjs} +60 -1
  201. package/dist/{messages-eFz25q1T.mjs → messages-B13GEFFu.mjs} +60 -1
  202. package/dist/{messages-C5sc4wjR.mjs → messages-B2YnZIU2.mjs} +60 -1
  203. package/dist/{chunks/messages-dZdV8VYV.mjs → messages-BI5B9bxE.mjs} +60 -1
  204. package/dist/{chunks/messages-Cc56SxY7.mjs → messages-BIgvPd6I2.mjs} +60 -1
  205. package/dist/{messages-Bd2Q-tnQ.mjs → messages-BKG0QHVl.mjs} +60 -1
  206. package/dist/{messages-DvSC5JGC2.mjs → messages-BKGg4XYm2.mjs} +60 -1
  207. package/dist/{chunks/messages-Bnm45Rmp.mjs → messages-BOWDzfkH.mjs} +60 -1
  208. package/dist/{messages-BOEP2ly_.mjs → messages-BQaiScU1.mjs} +60 -1
  209. package/dist/{chunks/messages-GXQbRrHa2.mjs → messages-BQhHthxq2.mjs} +60 -1
  210. package/dist/{chunks/messages-Cx_kyYnf2.mjs → messages-BRLWpOnP.mjs} +60 -1
  211. package/dist/{chunks/messages-CdOX6JHb2.mjs → messages-BarhGl2S2.mjs} +60 -1
  212. package/dist/{chunks/messages-PtDEkfSR2.mjs → messages-BgPDPIkO.mjs} +60 -1
  213. package/dist/{chunks/messages-BQKWm9xB.mjs → messages-BlvF3pot.mjs} +60 -1
  214. package/dist/{chunks/messages-C4Wacagz.mjs → messages-Bmu3rJwO.mjs} +60 -1
  215. package/dist/{chunks/messages-C62iC79d2.mjs → messages-BpwhHkFb2.mjs} +60 -1
  216. package/dist/{messages-DSmNNjPb.mjs → messages-BvutXmgt.mjs} +60 -1
  217. package/dist/{chunks/messages-DwU7qOBO2.mjs → messages-BwCgJUdq.mjs} +60 -1
  218. package/dist/{messages-BCeeFrNO.mjs → messages-C5IE9mXm.mjs} +60 -1
  219. package/dist/{chunks/messages-EI0ZLMIG.mjs → messages-C6R0bzW5.mjs} +60 -1
  220. package/dist/{chunks/messages-CZ4Jcn6y.mjs → messages-C9Kq8259.mjs} +60 -1
  221. package/dist/{messages-Nbssq1-N.mjs → messages-CAnOyxrm.mjs} +60 -1
  222. package/dist/{chunks/messages-DQb9YRoO2.mjs → messages-CDueJTe8.mjs} +60 -1
  223. package/dist/{chunks/messages-CpC5Cv_s.mjs → messages-CEGqNXnP.mjs} +60 -1
  224. package/dist/{messages-CWWIbebM2.mjs → messages-CF5MeYEt2.mjs} +60 -1
  225. package/dist/{chunks/messages-ID7kZQyc.mjs → messages-CGiVoFTi.mjs} +60 -1
  226. package/dist/{chunks/messages-B5eo-pGw.mjs → messages-CQzOV7VE2.mjs} +60 -1
  227. package/dist/{chunks/messages-DwAl9zoh2.mjs → messages-CUFac9Qe.mjs} +60 -1
  228. package/dist/{messages-DMH0zRig2.mjs → messages-CUcUO5bC2.mjs} +60 -1
  229. package/dist/{messages-CGZPFOEr.mjs → messages-CcF4SO9W.mjs} +60 -1
  230. package/dist/{messages-gJWgJtGo.mjs → messages-CeqpzGl9.mjs} +60 -1
  231. package/dist/{messages-BEnINcno2.mjs → messages-Cg6a88Bb2.mjs} +60 -1
  232. package/dist/{chunks/messages-BxhJFFrR.mjs → messages-Ch-SytN8.mjs} +60 -1
  233. package/dist/{chunks/messages-DzZZDveu.mjs → messages-Cn3uvFq3.mjs} +60 -1
  234. package/dist/{messages-CoSj68Ef2.mjs → messages-CqZgsrVP2.mjs} +60 -1
  235. package/dist/{messages-BrkXHD2D2.mjs → messages-CskLLTiG2.mjs} +60 -1
  236. package/dist/{chunks/messages-BSstxb1m2.mjs → messages-CusWGsl42.mjs} +60 -1
  237. package/dist/{messages-BInBVzW42.mjs → messages-Cvq2EFPT2.mjs} +60 -1
  238. package/dist/{messages-DfnSbN512.mjs → messages-CwvHO8gp2.mjs} +60 -1
  239. package/dist/{chunks/messages-DjSuzS2m2.mjs → messages-D4dovFzY2.mjs} +60 -1
  240. package/dist/{messages-BkNVOuvO2.mjs → messages-D9qgYMU82.mjs} +60 -1
  241. package/dist/{chunks/messages-D8qYNZ_T.mjs → messages-DGAWjKQZ.mjs} +60 -1
  242. package/dist/{messages-GUgmAfdB.mjs → messages-DR2JBU-H.mjs} +60 -1
  243. package/dist/{messages-iJKNW8hW2.mjs → messages-Da1woCgt2.mjs} +60 -1
  244. package/dist/{chunks/messages-DgSRzW-Y.mjs → messages-DbE-riR52.mjs} +60 -1
  245. package/dist/{chunks/messages-8vGF8iWb.mjs → messages-DcQNeoPB.mjs} +60 -1
  246. package/dist/{messages-C2pz0mJs2.mjs → messages-Dq_RdEny2.mjs} +60 -1
  247. package/dist/{chunks/messages-Vdmc6CaN.mjs → messages-Grhv5SE_.mjs} +60 -1
  248. package/dist/{messages-CX2ioEBc2.mjs → messages-HVgCKIww2.mjs} +60 -1
  249. package/dist/{messages-C9XTx39w2.mjs → messages-KyJQtOkh2.mjs} +60 -1
  250. package/dist/{messages-DPzZM5FG.mjs → messages-L4sYfXpM.mjs} +60 -1
  251. package/dist/{chunks/messages-Ced9OY9X.mjs → messages-P5B61L1J2.mjs} +60 -1
  252. package/dist/{chunks/messages-m_zk_AR3.mjs → messages-RXQKVFCJ.mjs} +60 -1
  253. package/dist/{chunks/messages-B94JmzMj.mjs → messages-UJx6PvCL.mjs} +60 -1
  254. package/dist/{chunks/messages-D1gz17wt.mjs → messages-VIQ8vjvS.mjs} +60 -1
  255. package/dist/{chunks/messages-BClegbPD.mjs → messages-bN4Zmk2m.mjs} +60 -1
  256. package/dist/{chunks/messages-DuOkV5T_.mjs → messages-fAEKzdUq.mjs} +60 -1
  257. package/dist/{chunks/messages-Cn0B5LU1.mjs → messages-gTUy3xjb.mjs} +60 -1
  258. package/dist/{chunks/messages-n1T_9w-Z.mjs → messages-hGop1gbF.mjs} +60 -1
  259. package/dist/{chunks/messages-DFUn1PHK2.mjs → messages-jQsl7cga2.mjs} +60 -1
  260. package/dist/{chunks/messages-h43rfIyt2.mjs → messages-jsrzDVZy2.mjs} +60 -1
  261. package/dist/{chunks/messages-BXmg4Rer2.mjs → messages-lnxRz5rM.mjs} +60 -1
  262. package/dist/{chunks/messages-CkRbSW3z2.mjs → messages-wmS6Z2m82.mjs} +60 -1
  263. package/dist/{messages-2jeEK-EB.mjs → messages-yuNINyS1.mjs} +60 -1
  264. package/dist/{messages-CsHwUgSZ.mjs → messages-zOl6jpOa.mjs} +60 -1
  265. package/dist/react.cjs +1 -1
  266. package/dist/react.mjs +1 -1
  267. package/dist/tools.cjs +1 -1
  268. package/dist/tools.mjs +3 -3
  269. package/dist/vendor.LICENSE.txt +395 -1
  270. package/package.json +3 -1
  271. package/src/components/i18n/locales/am/messages.json +60 -1
  272. package/src/components/i18n/locales/ar/messages.json +60 -1
  273. package/src/components/i18n/locales/az/messages.json +60 -1
  274. package/src/components/i18n/locales/bg/messages.json +60 -1
  275. package/src/components/i18n/locales/bn/messages.json +60 -1
  276. package/src/components/i18n/locales/bs/messages.json +60 -1
  277. package/src/components/i18n/locales/cs/messages.json +60 -1
  278. package/src/components/i18n/locales/da/messages.json +60 -1
  279. package/src/components/i18n/locales/de/messages.json +60 -1
  280. package/src/components/i18n/locales/dv/messages.json +60 -1
  281. package/src/components/i18n/locales/el/messages.json +60 -1
  282. package/src/components/i18n/locales/en/messages.json +59 -0
  283. package/src/components/i18n/locales/es/messages.json +60 -1
  284. package/src/components/i18n/locales/et/messages.json +60 -1
  285. package/src/components/i18n/locales/fa/messages.json +60 -1
  286. package/src/components/i18n/locales/fi/messages.json +60 -1
  287. package/src/components/i18n/locales/fil/messages.json +60 -1
  288. package/src/components/i18n/locales/fr/messages.json +60 -1
  289. package/src/components/i18n/locales/gu/messages.json +60 -1
  290. package/src/components/i18n/locales/he/messages.json +60 -1
  291. package/src/components/i18n/locales/hi/messages.json +60 -1
  292. package/src/components/i18n/locales/hr/messages.json +60 -1
  293. package/src/components/i18n/locales/hu/messages.json +60 -1
  294. package/src/components/i18n/locales/hy/messages.json +60 -1
  295. package/src/components/i18n/locales/id/messages.json +60 -1
  296. package/src/components/i18n/locales/it/messages.json +60 -1
  297. package/src/components/i18n/locales/ja/messages.json +60 -1
  298. package/src/components/i18n/locales/ka/messages.json +60 -1
  299. package/src/components/i18n/locales/km/messages.json +60 -1
  300. package/src/components/i18n/locales/kn/messages.json +60 -1
  301. package/src/components/i18n/locales/ko/messages.json +60 -1
  302. package/src/components/i18n/locales/ku/messages.json +60 -1
  303. package/src/components/i18n/locales/lo/messages.json +60 -1
  304. package/src/components/i18n/locales/lt/messages.json +60 -1
  305. package/src/components/i18n/locales/lv/messages.json +60 -1
  306. package/src/components/i18n/locales/mk/messages.json +60 -1
  307. package/src/components/i18n/locales/ml/messages.json +60 -1
  308. package/src/components/i18n/locales/mn/messages.json +60 -1
  309. package/src/components/i18n/locales/mr/messages.json +60 -1
  310. package/src/components/i18n/locales/ms/messages.json +60 -1
  311. package/src/components/i18n/locales/my/messages.json +60 -1
  312. package/src/components/i18n/locales/ne/messages.json +60 -1
  313. package/src/components/i18n/locales/nl/messages.json +60 -1
  314. package/src/components/i18n/locales/no/messages.json +60 -1
  315. package/src/components/i18n/locales/pa/messages.json +60 -1
  316. package/src/components/i18n/locales/pl/messages.json +60 -1
  317. package/src/components/i18n/locales/ps/messages.json +60 -1
  318. package/src/components/i18n/locales/pt/messages.json +60 -1
  319. package/src/components/i18n/locales/ro/messages.json +60 -1
  320. package/src/components/i18n/locales/ru/messages.json +60 -1
  321. package/src/components/i18n/locales/sd/messages.json +60 -1
  322. package/src/components/i18n/locales/si/messages.json +60 -1
  323. package/src/components/i18n/locales/sk/messages.json +60 -1
  324. package/src/components/i18n/locales/sl/messages.json +60 -1
  325. package/src/components/i18n/locales/sq/messages.json +60 -1
  326. package/src/components/i18n/locales/sr/messages.json +60 -1
  327. package/src/components/i18n/locales/sv/messages.json +60 -1
  328. package/src/components/i18n/locales/sw/messages.json +60 -1
  329. package/src/components/i18n/locales/ta/messages.json +60 -1
  330. package/src/components/i18n/locales/te/messages.json +60 -1
  331. package/src/components/i18n/locales/th/messages.json +60 -1
  332. package/src/components/i18n/locales/tr/messages.json +60 -1
  333. package/src/components/i18n/locales/ug/messages.json +60 -1
  334. package/src/components/i18n/locales/uk/messages.json +60 -1
  335. package/src/components/i18n/locales/ur/messages.json +60 -1
  336. package/src/components/i18n/locales/vi/messages.json +60 -1
  337. package/src/components/i18n/locales/yi/messages.json +60 -1
  338. package/src/components/i18n/locales/zh/messages.json +60 -1
  339. package/src/components/icons/index.ts +106 -0
  340. package/src/components/modules/paste/handlers/pattern-handler.ts +4 -7
  341. package/src/components/utils/format-bytes.ts +15 -0
  342. package/src/components/utils/max-size.ts +36 -0
  343. package/src/components/utils/media-empty-state.ts +4 -13
  344. package/src/components/utils/mime-match.ts +22 -0
  345. package/src/components/utils/upload-error-message.ts +43 -0
  346. package/src/styles/audio.css +528 -0
  347. package/src/styles/colors.css +31 -0
  348. package/src/styles/keyframes.css +8 -0
  349. package/src/styles/main.css +3 -0
  350. package/src/styles/resize-cue.css +26 -0
  351. package/src/styles/video.css +1221 -0
  352. package/src/tools/audio/constants.ts +21 -0
  353. package/src/tools/audio/controls.ts +416 -0
  354. package/src/tools/audio/empty-state.ts +45 -0
  355. package/src/tools/audio/i18n.ts +13 -0
  356. package/src/tools/audio/index.ts +482 -0
  357. package/src/tools/audio/metadata.ts +56 -0
  358. package/src/tools/audio/ui.ts +104 -0
  359. package/src/tools/audio/uploader.ts +76 -0
  360. package/src/tools/audio/waveform.ts +171 -0
  361. package/src/tools/file/constants.ts +5 -3
  362. package/src/tools/file/index.ts +45 -4
  363. package/src/tools/file/uploader.ts +5 -2
  364. package/src/tools/image/constants.ts +3 -8
  365. package/src/tools/image/converted-uploader.ts +30 -0
  366. package/src/tools/image/gif-to-webm.ts +170 -0
  367. package/src/tools/image/index.ts +125 -3
  368. package/src/tools/image/resizer.ts +39 -6
  369. package/src/tools/image/uploader.ts +4 -2
  370. package/src/tools/image/uploading-state.ts +2 -1
  371. package/src/tools/index.ts +4 -0
  372. package/src/tools/video/constants.ts +19 -0
  373. package/src/tools/video/controls.ts +1448 -0
  374. package/src/tools/video/empty-state.ts +45 -0
  375. package/src/tools/video/i18n.ts +13 -0
  376. package/src/tools/video/index.ts +521 -0
  377. package/src/tools/video/ui.ts +83 -0
  378. package/src/tools/video/uploader.ts +76 -0
  379. package/types/configs/blok-config.d.ts +2 -9
  380. package/types/tools/audio.d.ts +40 -0
  381. package/types/tools/file.d.ts +9 -3
  382. package/types/tools/image.d.ts +15 -3
  383. package/types/tools/max-size.d.ts +12 -0
  384. package/types/tools/video.d.ts +75 -0
  385. package/types/tools-entry.d.ts +9 -0
  386. package/dist/chunks/constants-B2Lcd7Kk.cjs +0 -539
  387. package/dist/chunks/lightweight-i18n-Clk37huC.cjs +0 -1
  388. package/dist/chunks/messages-04T5j1ww2.cjs +0 -1
  389. package/dist/chunks/messages-0OyEWZDW.cjs +0 -1
  390. package/dist/chunks/messages-3iHkF7Vy.cjs +0 -1
  391. package/dist/chunks/messages-98gouyMa.cjs +0 -1
  392. package/dist/chunks/messages-BAgSlZpS.cjs +0 -1
  393. package/dist/chunks/messages-BJ7clJXu2.cjs +0 -1
  394. package/dist/chunks/messages-BPYQEADI.cjs +0 -1
  395. package/dist/chunks/messages-BSxgqWqe.cjs +0 -1
  396. package/dist/chunks/messages-BdjiMHzU2.cjs +0 -1
  397. package/dist/chunks/messages-Br3ERe172.cjs +0 -1
  398. package/dist/chunks/messages-BtEDKVO7.cjs +0 -1
  399. package/dist/chunks/messages-BtevAuQS2.cjs +0 -1
  400. package/dist/chunks/messages-C6Xc3L-B2.cjs +0 -1
  401. package/dist/chunks/messages-CEquPedm.cjs +0 -1
  402. package/dist/chunks/messages-CFo-pG-t2.cjs +0 -1
  403. package/dist/chunks/messages-CXlSU8cQ2.cjs +0 -1
  404. package/dist/chunks/messages-Cf8u0aln2.cjs +0 -1
  405. package/dist/chunks/messages-Cg6qicee.cjs +0 -1
  406. package/dist/chunks/messages-CgGwGZs22.cjs +0 -1
  407. package/dist/chunks/messages-Cgg1HHSo.cjs +0 -1
  408. package/dist/chunks/messages-Ck6jEhXV.cjs +0 -1
  409. package/dist/chunks/messages-Cx1kdFH_2.cjs +0 -1
  410. package/dist/chunks/messages-DNYtMplL2.cjs +0 -1
  411. package/dist/chunks/messages-DOBcfgRF.cjs +0 -1
  412. package/dist/chunks/messages-DWeyV2N3.cjs +0 -1
  413. package/dist/chunks/messages-DkINYHo4.cjs +0 -1
  414. package/dist/chunks/messages-DsWTIuli2.cjs +0 -1
  415. package/dist/chunks/messages-JLj0J5so.cjs +0 -1
  416. package/dist/chunks/messages-o3omNKfH.cjs +0 -1
  417. package/dist/chunks/messages-p-1X5oFM2.cjs +0 -1
  418. package/dist/chunks/messages-poLdFEEs2.cjs +0 -1
  419. package/dist/chunks/messages-px_8gpHT.cjs +0 -1
  420. package/dist/chunks/messages-vdupz5T0.cjs +0 -1
  421. package/dist/chunks/tools-DiTb45BS.cjs +0 -208
  422. /package/dist/chunks/{am-B37aLxvu.cjs → am-Dc8fykoi.cjs} +0 -0
  423. /package/dist/chunks/{am-D7yfVqJS.mjs → am-DyT_H_W5.mjs} +0 -0
  424. /package/dist/chunks/{ar-ySo_KDqd.cjs → ar-B4htcHv2.cjs} +0 -0
  425. /package/dist/chunks/{ar-D00SixXA.mjs → ar-DxcVoX26.mjs} +0 -0
  426. /package/dist/chunks/{az-nCoWuGBd.cjs → az-CddDVVCC.cjs} +0 -0
  427. /package/dist/chunks/{az-BmIwKcoq.mjs → az-Ck_jWtwp.mjs} +0 -0
  428. /package/dist/chunks/{bg-BKB8_J3v.cjs → bg-BExJFlqx.cjs} +0 -0
  429. /package/dist/chunks/{bg-BTZaB21W.mjs → bg-C4_DlJ7m.mjs} +0 -0
  430. /package/dist/chunks/{bn-BQiBKtpR.cjs → bn-B3CWOlDr.cjs} +0 -0
  431. /package/dist/chunks/{bn-BVpf0XL6.mjs → bn-D0PWjX6h.mjs} +0 -0
  432. /package/dist/chunks/{bs-BSz4cPth.mjs → bs-BjqCqh8B.mjs} +0 -0
  433. /package/dist/chunks/{bs-D_lekdEb.cjs → bs-BylFYMjB.cjs} +0 -0
  434. /package/dist/chunks/{cs-Dv8Jg_Fa.cjs → cs-BzXww59F.cjs} +0 -0
  435. /package/dist/chunks/{cs-p5s4GudH.mjs → cs-R_vXAqRw.mjs} +0 -0
  436. /package/dist/chunks/{da-D33rjz-t.cjs → da-Be_YGjP-.cjs} +0 -0
  437. /package/dist/chunks/{da-BqJa8BMd.mjs → da-BuzQWEfl.mjs} +0 -0
  438. /package/dist/chunks/{de-BDDktkfI.mjs → de-BuXrJCQB.mjs} +0 -0
  439. /package/dist/chunks/{de-I8YFq0Ej.cjs → de-CuXVxRU3.cjs} +0 -0
  440. /package/dist/chunks/{el-BInM0nQo.cjs → el-CkLmGPX-.cjs} +0 -0
  441. /package/dist/chunks/{el-R63G08P0.mjs → el-d_XP5H44.mjs} +0 -0
  442. /package/dist/chunks/{es-Cj_AHhb9.cjs → es-CpevBSzX.cjs} +0 -0
  443. /package/dist/chunks/{es-BleH_dHg.mjs → es-D79FXk9q.mjs} +0 -0
  444. /package/dist/chunks/{et-BuISCVFl.mjs → et-BmawyEOM.mjs} +0 -0
  445. /package/dist/chunks/{et-BkMzN_qG.cjs → et-Dm53D0Mw.cjs} +0 -0
  446. /package/dist/chunks/{fa-C3VQIfEJ.cjs → fa-BLZQhg44.cjs} +0 -0
  447. /package/dist/chunks/{fa-CI9f3My0.mjs → fa-Cyzee-uD.mjs} +0 -0
  448. /package/dist/chunks/{fi-p8xxtchQ.cjs → fi-CktzJP0P.cjs} +0 -0
  449. /package/dist/chunks/{fi-C0_Jyps9.mjs → fi-zVk232gP.mjs} +0 -0
  450. /package/dist/chunks/{fil-DC8VTmfd.cjs → fil-BGEDSfA3.cjs} +0 -0
  451. /package/dist/chunks/{fil-BZsJ4YZG.mjs → fil-DQcS9VcY.mjs} +0 -0
  452. /package/dist/chunks/{fr-BjeioA2N.mjs → fr-CUoxzxMy.mjs} +0 -0
  453. /package/dist/chunks/{fr-Cbstr5ii.cjs → fr-DRFIW1vC.cjs} +0 -0
  454. /package/dist/chunks/{gu-CNi9WnhQ.mjs → gu-BSL13JVA.mjs} +0 -0
  455. /package/dist/chunks/{gu-DpPoUPem.cjs → gu-DCZgQPh1.cjs} +0 -0
  456. /package/dist/chunks/{he-bU_Id5XQ.mjs → he-B4fsDXlD.mjs} +0 -0
  457. /package/dist/chunks/{he-Rlv-PVKK.cjs → he-CrJki_kT.cjs} +0 -0
  458. /package/dist/chunks/{hi-CfLaLKZL.cjs → hi-B7MYHNXb.cjs} +0 -0
  459. /package/dist/chunks/{hi-CYYjJgoQ.mjs → hi-Df_jRvP-.mjs} +0 -0
  460. /package/dist/chunks/{hr-B6eFd_4M.cjs → hr-CHeiPUjb.cjs} +0 -0
  461. /package/dist/chunks/{hr-CerKCstu.mjs → hr-DC4ZNI8T.mjs} +0 -0
  462. /package/dist/chunks/{hu-DNYoHMic.mjs → hu-ClC3NxqC.mjs} +0 -0
  463. /package/dist/chunks/{hu-DQcisouf.cjs → hu-x4Ga7znM.cjs} +0 -0
  464. /package/dist/chunks/{hy-x9QOWTT6.cjs → hy-dXGxcAjA.cjs} +0 -0
  465. /package/dist/chunks/{hy-N0XBqVv_.mjs → hy-fpToCZeQ.mjs} +0 -0
  466. /package/dist/chunks/{id-G7ASv812.cjs → id-BETj6SOy.cjs} +0 -0
  467. /package/dist/chunks/{id-dmUIQB07.mjs → id-zXVZ_-tD.mjs} +0 -0
  468. /package/dist/chunks/{it-DXDwm7Aj.cjs → it-CblE5NNx.cjs} +0 -0
  469. /package/dist/chunks/{it-G9Rg2LaN.mjs → it-Cp7EdTdT.mjs} +0 -0
  470. /package/dist/chunks/{ja-DHMurrnk.cjs → ja-D4CP2G3w.cjs} +0 -0
  471. /package/dist/chunks/{ja-C1Nou_k5.mjs → ja-DoaPxTyV.mjs} +0 -0
  472. /package/dist/chunks/{ka-P0_q1_oW.cjs → ka-C6DxbxxH.cjs} +0 -0
  473. /package/dist/chunks/{ka-9rtmTdhq.mjs → ka-CwoyhuWu.mjs} +0 -0
  474. /package/dist/chunks/{km-DedsOdPY.cjs → km-BdZJI-qn.cjs} +0 -0
  475. /package/dist/chunks/{km-T8J0lGcC.mjs → km-D8jrJ9sv.mjs} +0 -0
  476. /package/dist/chunks/{kn-CAGP6H3x.cjs → kn-DsGMDyW7.cjs} +0 -0
  477. /package/dist/chunks/{kn-CMb5Cv2d.mjs → kn-IsuZc30u.mjs} +0 -0
  478. /package/dist/chunks/{ko-3D0kPtnu.cjs → ko-CFVvGmVE.cjs} +0 -0
  479. /package/dist/chunks/{ko-DulVmkjC.mjs → ko-DxAtBe72.mjs} +0 -0
  480. /package/dist/chunks/{ku-BYzD3GnU.cjs → ku-B-43xPpS.cjs} +0 -0
  481. /package/dist/chunks/{ku-C5mlSVfC.mjs → ku-Da-1BcEg.mjs} +0 -0
  482. /package/dist/chunks/{lo-D9ixPNJD.cjs → lo-DtVyNkq4.cjs} +0 -0
  483. /package/dist/chunks/{lo-Cw2hfj84.mjs → lo-p9PUOxXA.mjs} +0 -0
  484. /package/dist/chunks/{lt-CzfEJdVd.cjs → lt-BaHJn9M4.cjs} +0 -0
  485. /package/dist/chunks/{lt-Ceg9NAdI.mjs → lt-C4lGuzQq.mjs} +0 -0
  486. /package/dist/chunks/{lv-3CXzQoic.mjs → lv-B5Cp4JEf.mjs} +0 -0
  487. /package/dist/chunks/{lv-DWyBbTHI.cjs → lv-BHXmLxXV.cjs} +0 -0
  488. /package/dist/chunks/{mk-CEbNT0Oe.mjs → mk-B5rDdPUj.mjs} +0 -0
  489. /package/dist/chunks/{mk-Anl5AUSU.cjs → mk-BhwKijB_.cjs} +0 -0
  490. /package/dist/chunks/{ml-B1QmnbTX.cjs → ml-DxZv3Mzc.cjs} +0 -0
  491. /package/dist/chunks/{ml-DaF_zn1h.mjs → ml-gamedfCk.mjs} +0 -0
  492. /package/dist/chunks/{mn-DLpgZmIl.mjs → mn-BbhhPusH.mjs} +0 -0
  493. /package/dist/chunks/{mn-DM3AWPQI.cjs → mn-Bzi4YTMA.cjs} +0 -0
  494. /package/dist/chunks/{mr-CPCMiBsx.cjs → mr-BENatxZg.cjs} +0 -0
  495. /package/dist/chunks/{mr-C-d3CWSD.mjs → mr-DO_kNyu7.mjs} +0 -0
  496. /package/dist/chunks/{ms-BKg5zJ6g.cjs → ms-BVop2DJc.cjs} +0 -0
  497. /package/dist/chunks/{ms-D3Zil5Dz.mjs → ms-eIjFVRpo.mjs} +0 -0
  498. /package/dist/chunks/{my-HzQdQq6H.mjs → my-nf0gvOOX.mjs} +0 -0
  499. /package/dist/chunks/{my-BhrbZPAE.cjs → my-qLePPAWv.cjs} +0 -0
  500. /package/dist/chunks/{ne-Dw6kUPkS.mjs → ne-DOaubYly.mjs} +0 -0
  501. /package/dist/chunks/{ne-BsEUv3Vp.cjs → ne-DfryA0M8.cjs} +0 -0
  502. /package/dist/chunks/{nl-C1jFx32v.cjs → nl-BehqWHBh.cjs} +0 -0
  503. /package/dist/chunks/{nl-D8QQ6wmJ.mjs → nl-VHkGK6MK.mjs} +0 -0
  504. /package/dist/chunks/{no-BWEOGeAo.cjs → no-CR9Fxz1X.cjs} +0 -0
  505. /package/dist/chunks/{no-Rg2uuKdV.mjs → no-CdtSCHJr.mjs} +0 -0
  506. /package/dist/chunks/{notifier-BOB8o7IG.cjs → notifier-CFYHvVe5.cjs} +0 -0
  507. /package/dist/chunks/{notifier-CEnelp-K.mjs → notifier-DJ3Shryh.mjs} +0 -0
  508. /package/dist/chunks/{pa-BitCteAA.cjs → pa-DgC4LF8q.cjs} +0 -0
  509. /package/dist/chunks/{pa-BSwIZvA0.mjs → pa-TMcUvGQV.mjs} +0 -0
  510. /package/dist/chunks/{pl-FhXomIGp.mjs → pl-BfQYJ9y_.mjs} +0 -0
  511. /package/dist/chunks/{pl-CbCrHaA6.cjs → pl-a2nheY_J.cjs} +0 -0
  512. /package/dist/chunks/{prism-bash-CZ6DBzIk.mjs → prism-bash-D4zr_u8t.mjs} +0 -0
  513. /package/dist/chunks/{prism-bash-qitAYJtY.cjs → prism-bash-DDQ2u01V.cjs} +0 -0
  514. /package/dist/chunks/{prism-c-nnJdAhPL.mjs → prism-c-CVyw1BOu.mjs} +0 -0
  515. /package/dist/chunks/{prism-c-BLyB6e2K.cjs → prism-c-DfVjTtJG.cjs} +0 -0
  516. /package/dist/chunks/{prism-cpp-DYNCFS3K.mjs → prism-cpp-CrBJjuu5.mjs} +0 -0
  517. /package/dist/chunks/{prism-cpp-OSmmdLuG.cjs → prism-cpp-DqxJDZfM.cjs} +0 -0
  518. /package/dist/chunks/{prism-csharp-16T9Ewqf.cjs → prism-csharp-BbJ6Sp-b.cjs} +0 -0
  519. /package/dist/chunks/{prism-csharp-Dxs2I4ua.mjs → prism-csharp-lrMxvYpL.mjs} +0 -0
  520. /package/dist/chunks/{prism-css-DwTbu-Ar.mjs → prism-css-VQTID_HR.mjs} +0 -0
  521. /package/dist/chunks/{prism-css-CMFNwvrI.cjs → prism-css-w2kan9uc.cjs} +0 -0
  522. /package/dist/chunks/{prism-dart-DX2YtTGt.cjs → prism-dart-B374T6OY.cjs} +0 -0
  523. /package/dist/chunks/{prism-dart-Cqhjl8Zt.mjs → prism-dart-Q-9Z_W9B.mjs} +0 -0
  524. /package/dist/chunks/{prism-docker-CF7dhvYh.mjs → prism-docker-DWAQ3dDD.mjs} +0 -0
  525. /package/dist/chunks/{prism-docker-CR4lKITl.cjs → prism-docker-DsFNc9i3.cjs} +0 -0
  526. /package/dist/chunks/{prism-go-DUV4QMTT.cjs → prism-go-C4e52XbO.cjs} +0 -0
  527. /package/dist/chunks/{prism-go-h9KLdAE9.mjs → prism-go-CrXe2RS9.mjs} +0 -0
  528. /package/dist/chunks/{prism-graphql-CaH0gD6e.mjs → prism-graphql-BG5mfdhd.mjs} +0 -0
  529. /package/dist/chunks/{prism-graphql-Cw4U0rOD.cjs → prism-graphql-DzWE15JS.cjs} +0 -0
  530. /package/dist/chunks/{prism-java-BpQ0ReAC.cjs → prism-java-Bth7ny8U.cjs} +0 -0
  531. /package/dist/chunks/{prism-java-DvKEtgSw.mjs → prism-java-_m72Vn1f.mjs} +0 -0
  532. /package/dist/chunks/{prism-javascript-D2ecWeeN.mjs → prism-javascript-B74it_3Q.mjs} +0 -0
  533. /package/dist/chunks/{prism-javascript-ELk9U7yv.cjs → prism-javascript-CZHuhUqG.cjs} +0 -0
  534. /package/dist/chunks/{prism-json-BdNUnMGb.cjs → prism-json-C7yjuPaa.cjs} +0 -0
  535. /package/dist/chunks/{prism-json-eqh92QZC.mjs → prism-json-CFsf0S_6.mjs} +0 -0
  536. /package/dist/chunks/{prism-kotlin-22Gr2SxK.mjs → prism-kotlin-BTT9anu1.mjs} +0 -0
  537. /package/dist/chunks/{prism-kotlin-WNUAhuoa.cjs → prism-kotlin-BwlhXHxp.cjs} +0 -0
  538. /package/dist/chunks/{prism-latex-DKge5vOJ.mjs → prism-latex-CL8zDJwm.mjs} +0 -0
  539. /package/dist/chunks/{prism-latex-BtyYjHKE.cjs → prism-latex-dRhujmiF.cjs} +0 -0
  540. /package/dist/chunks/{prism-lua-DhVb-IBs.cjs → prism-lua-CC8iHZy0.cjs} +0 -0
  541. /package/dist/chunks/{prism-lua-BySMQWvB.mjs → prism-lua-D6JJ7p-A.mjs} +0 -0
  542. /package/dist/chunks/{prism-markdown-Bvv1_ifb.mjs → prism-markdown-D6D8BprH.mjs} +0 -0
  543. /package/dist/chunks/{prism-markdown-DonI20ta.cjs → prism-markdown-DMW4QHo8.cjs} +0 -0
  544. /package/dist/chunks/{prism-markup-DaGlO8wQ.cjs → prism-markup-DmQlWhRx.cjs} +0 -0
  545. /package/dist/chunks/{prism-markup-DPDFrSBO.mjs → prism-markup-fK-1ADZ0.mjs} +0 -0
  546. /package/dist/chunks/{prism-markup-templating-DKZ_F63l.cjs → prism-markup-templating-CKDQaPgk.cjs} +0 -0
  547. /package/dist/chunks/{prism-markup-templating-B1u1wroF.mjs → prism-markup-templating-DfRjv0mn.mjs} +0 -0
  548. /package/dist/chunks/{prism-php-V_A4SMVC.cjs → prism-php-BJVLLh_W.cjs} +0 -0
  549. /package/dist/chunks/{prism-php-CjjweiQK.mjs → prism-php-DffX-wRi.mjs} +0 -0
  550. /package/dist/chunks/{prism-python-6eBEySe7.mjs → prism-python-2BrUkjbB.mjs} +0 -0
  551. /package/dist/chunks/{prism-python-DLqiSiAQ.cjs → prism-python-Bhf5rXub.cjs} +0 -0
  552. /package/dist/chunks/{prism-r-uOZv1a7d.mjs → prism-r-CU9se1Na.mjs} +0 -0
  553. /package/dist/chunks/{prism-r-zh9-I3-j.cjs → prism-r-ChFoLzAP.cjs} +0 -0
  554. /package/dist/chunks/{prism-ruby-M4mhoFF5.cjs → prism-ruby-BvGZJs6t.cjs} +0 -0
  555. /package/dist/chunks/{prism-ruby-Cr-3Y89S.mjs → prism-ruby-DuQ4syPd.mjs} +0 -0
  556. /package/dist/chunks/{prism-rust-g2dmV4wL.cjs → prism-rust-6eFXbDzh.cjs} +0 -0
  557. /package/dist/chunks/{prism-rust-DxlMe9N8.mjs → prism-rust-DRurCx4W.mjs} +0 -0
  558. /package/dist/chunks/{prism-scala-byYaK-Hs.mjs → prism-scala-CU8N2Vpe.mjs} +0 -0
  559. /package/dist/chunks/{prism-scala-DdSRpf_v.cjs → prism-scala-De4Tbjij.cjs} +0 -0
  560. /package/dist/chunks/{prism-sql-W4S9Ag3H.mjs → prism-sql-Au3VVcw1.mjs} +0 -0
  561. /package/dist/chunks/{prism-sql-BjDuRopl.cjs → prism-sql-_JMPMWu-.cjs} +0 -0
  562. /package/dist/chunks/{prism-swift-KjqbhTlS.mjs → prism-swift-B-r5qNUT.mjs} +0 -0
  563. /package/dist/chunks/{prism-swift-CqOmCgZp.cjs → prism-swift-DdWKYFH_.cjs} +0 -0
  564. /package/dist/chunks/{prism-typescript-CjqcJxVT.mjs → prism-typescript-BKj96rmj.mjs} +0 -0
  565. /package/dist/chunks/{prism-typescript-DGlZWX5K.cjs → prism-typescript-DYxN8s4t.cjs} +0 -0
  566. /package/dist/chunks/{prism-yaml-W11WcDBZ.mjs → prism-yaml-Bk31kvSd.mjs} +0 -0
  567. /package/dist/chunks/{prism-yaml-HqOYDhYZ.cjs → prism-yaml-CAlRa1Lr.cjs} +0 -0
  568. /package/dist/chunks/{ps-BoBtbrB6.mjs → ps-Dv4lWz5A.mjs} +0 -0
  569. /package/dist/chunks/{ps-4sPZuv3g.cjs → ps-f5JFPQUh.cjs} +0 -0
  570. /package/dist/chunks/{pt-BYA5NOw_.mjs → pt-CtgGcY6X.mjs} +0 -0
  571. /package/dist/chunks/{pt-CSzjho-V.cjs → pt-I7qQ_R8a.cjs} +0 -0
  572. /package/dist/chunks/{ro-C9tN3AFF.cjs → ro-BNo9EVkV.cjs} +0 -0
  573. /package/dist/chunks/{ro-mtobtMpD.mjs → ro-Dxs4TSRR.mjs} +0 -0
  574. /package/dist/chunks/{ru-B791LPq3.mjs → ru-B5A2vGqQ.mjs} +0 -0
  575. /package/dist/chunks/{ru-BYPO5wNO.cjs → ru-Q0YDL_7B.cjs} +0 -0
  576. /package/dist/chunks/{sd-BWuglgs_.cjs → sd-56aE3AgX.cjs} +0 -0
  577. /package/dist/chunks/{sd-C8ngG92I.mjs → sd-DcBvM0yY.mjs} +0 -0
  578. /package/dist/chunks/{si-IX2P_DGB.cjs → si-B1k5DPe9.cjs} +0 -0
  579. /package/dist/chunks/{si-C_q8DxVt.mjs → si-JTOFsZCj.mjs} +0 -0
  580. /package/dist/chunks/{sk-HJJlM9uq.mjs → sk-B0LtwsAp.mjs} +0 -0
  581. /package/dist/chunks/{sk-CxtyIOlr.cjs → sk-DKWs0Fly.cjs} +0 -0
  582. /package/dist/chunks/{sl-CPjYG80u.cjs → sl-3aOunask.cjs} +0 -0
  583. /package/dist/chunks/{sl-kB1f5rPn.mjs → sl-CE_B7j6P.mjs} +0 -0
  584. /package/dist/chunks/{sq-Do6UyHn9.cjs → sq-BjtxgRqp.cjs} +0 -0
  585. /package/dist/chunks/{sq-CD0W0D6z.mjs → sq-DG9X-8jF.mjs} +0 -0
  586. /package/dist/chunks/{sr-BcyT-MWS.cjs → sr-DLHLW9qM.cjs} +0 -0
  587. /package/dist/chunks/{sr-lLJu9TsT.mjs → sr-LJKaTtNM.mjs} +0 -0
  588. /package/dist/chunks/{sv-C3GL-a0k.mjs → sv-Cm3jSTt-.mjs} +0 -0
  589. /package/dist/chunks/{sv-Bsz7ersx.cjs → sv-DJ6Kywac.cjs} +0 -0
  590. /package/dist/chunks/{sw-CUElHZxL.cjs → sw-BnvydNkI.cjs} +0 -0
  591. /package/dist/chunks/{sw-D6-DZ14-.mjs → sw-C2rm3bwF.mjs} +0 -0
  592. /package/dist/chunks/{ta-BZy78kBk.mjs → ta-5k36G0kU.mjs} +0 -0
  593. /package/dist/chunks/{ta-D0DQba-y.cjs → ta-e_T5Y_TH.cjs} +0 -0
  594. /package/dist/chunks/{te-DPMvJyXg.cjs → te-DJd9mdke.cjs} +0 -0
  595. /package/dist/chunks/{te-vigCVKdg.mjs → te-Qw6ZgfXC.mjs} +0 -0
  596. /package/dist/chunks/{th-DtcrIt9J.cjs → th-BFvK-kez.cjs} +0 -0
  597. /package/dist/chunks/{th-CGc0RLWB.mjs → th-DFCnkeU5.mjs} +0 -0
  598. /package/dist/chunks/{tr-BrEFaVNA.cjs → tr-Bio2iyuW.cjs} +0 -0
  599. /package/dist/chunks/{tr-Cgkf5aJo.mjs → tr-QoYDqZZE.mjs} +0 -0
  600. /package/dist/chunks/{ug-BVK7qBs4.mjs → ug-CYVvHjDo.mjs} +0 -0
  601. /package/dist/chunks/{ug-CqZXfhXi.cjs → ug-_E9uEBC5.cjs} +0 -0
  602. /package/dist/chunks/{uk-DgReWEge.cjs → uk-CiihPsrk.cjs} +0 -0
  603. /package/dist/chunks/{uk-CSPaCalw.mjs → uk-KrD9Hdx7.mjs} +0 -0
  604. /package/dist/chunks/{ur-ByrwJnY1.cjs → ur-B9A13pT4.cjs} +0 -0
  605. /package/dist/chunks/{ur-VpFFsATs.mjs → ur-Bgtl4YGa.mjs} +0 -0
  606. /package/dist/chunks/{vi-CWQtvATS.mjs → vi-CwW9u4Ww.mjs} +0 -0
  607. /package/dist/chunks/{vi-lUD3w7gP.cjs → vi-l243K5Tb.cjs} +0 -0
  608. /package/dist/chunks/{zh-akJj2cdF.mjs → zh-BdCF4Hao.mjs} +0 -0
  609. /package/dist/chunks/{zh-fSp1qOne.cjs → zh-DPZR_81P.cjs} +0 -0
@@ -0,0 +1,76 @@
1
+ import type { AudioConfig } from '../../../types/tools/audio';
2
+ import { resolveMaxSize } from '../../components/utils/max-size';
3
+ import { matchesMime } from '../../components/utils/mime-match';
4
+ import { DEFAULT_MAX_SIZE, DEFAULT_MIME_TYPES } from './constants';
5
+
6
+ export interface UploadResult {
7
+ url: string;
8
+ fileName?: string;
9
+ }
10
+
11
+ export interface UploadOptions {
12
+ onProgress?: (percent: number) => void;
13
+ }
14
+
15
+ export class AudioUploadError extends Error {
16
+ public readonly detail?: string;
17
+
18
+ constructor(public readonly code: string, detail?: string) {
19
+ super(detail ? `${code}: ${detail}` : code);
20
+ this.name = 'AudioUploadError';
21
+ this.detail = detail;
22
+ }
23
+ }
24
+
25
+ function parseUrl(raw: string): URL | null {
26
+ try {
27
+ return new URL(raw);
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
32
+
33
+ export class Uploader {
34
+ constructor(private readonly config: AudioConfig) {}
35
+
36
+ public async handleUrl(raw: string, options: UploadOptions = {}): Promise<UploadResult> {
37
+ this.validateUrl(raw);
38
+ if (this.config.uploader?.uploadByUrl) {
39
+ return this.config.uploader.uploadByUrl(raw, { onProgress: options.onProgress });
40
+ }
41
+
42
+ return { url: raw };
43
+ }
44
+
45
+ public async handleFile(file: File, options: UploadOptions = {}): Promise<UploadResult> {
46
+ this.validateFile(file);
47
+ if (this.config.uploader?.uploadByFile) {
48
+ return this.config.uploader.uploadByFile(file, { onProgress: options.onProgress });
49
+ }
50
+
51
+ return { url: URL.createObjectURL(file), fileName: file.name };
52
+ }
53
+
54
+ private validateUrl(raw: string): void {
55
+ const parsed = parseUrl(raw);
56
+
57
+ if (!parsed) {
58
+ throw new AudioUploadError('INVALID_URL', raw);
59
+ }
60
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
61
+ throw new AudioUploadError('INVALID_URL', parsed.protocol);
62
+ }
63
+ }
64
+
65
+ private validateFile(file: File): void {
66
+ const types = this.config.types ?? [...DEFAULT_MIME_TYPES];
67
+ const maxSize = resolveMaxSize(this.config.maxSize, file.type, DEFAULT_MAX_SIZE);
68
+
69
+ if (file.type && !matchesMime(file.type, types)) {
70
+ throw new AudioUploadError('UNSUPPORTED_TYPE', file.type);
71
+ }
72
+ if (file.size > maxSize) {
73
+ throw new AudioUploadError('FILE_TOO_LARGE', `${file.size} > ${maxSize}`);
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,171 @@
1
+ import { WAVEFORM_BUCKETS } from './constants';
2
+
3
+ /**
4
+ * Reduce raw mono samples to `buckets` peak values normalized to 0..1.
5
+ * Each bucket holds the max absolute amplitude across its slice; the whole
6
+ * array is then divided by the global max so the loudest bucket is 1.
7
+ */
8
+
9
+ function bucketPeak(channel: Float32Array, start: number, end: number): number {
10
+ return channel.slice(start, end).reduce((max, v) => Math.max(max, Math.abs(v)), 0);
11
+ }
12
+
13
+ export function computePeaks(channel: Float32Array, buckets = WAVEFORM_BUCKETS): number[] {
14
+ if (channel.length === 0) return new Array<number>(buckets).fill(0);
15
+
16
+ const step = channel.length / buckets;
17
+ const out = Array.from({ length: buckets }, (_, b) => {
18
+ const start = Math.floor(b * step);
19
+ const end = Math.min(channel.length, Math.floor((b + 1) * step));
20
+ return bucketPeak(channel, start, end);
21
+ });
22
+
23
+ const globalMax = Math.max(0, ...out);
24
+ if (globalMax <= 0) return out;
25
+ return out.map((v) => v / globalMax);
26
+ }
27
+
28
+ interface ChannelSource {
29
+ numberOfChannels: number;
30
+ length: number;
31
+ getChannelData(ch: number): Float32Array;
32
+ }
33
+
34
+ /** Average all channels into one mono track, then reduce to peaks. */
35
+ export function peaksFromAudioBuffer(buffer: ChannelSource, buckets = WAVEFORM_BUCKETS): number[] {
36
+ const { numberOfChannels, length } = buffer;
37
+ if (numberOfChannels <= 1) return computePeaks(buffer.getChannelData(0), buckets);
38
+
39
+ const mono = new Float32Array(length);
40
+ Array.from({ length: numberOfChannels }, (_, ch) => buffer.getChannelData(ch)).forEach((data) => {
41
+ data.forEach((v, i) => { mono[i] += v / numberOfChannels; });
42
+ });
43
+ return computePeaks(mono, buckets);
44
+ }
45
+
46
+ export function ratioFromPointer(clientX: number, rect: { left: number; width: number }): number {
47
+ if (rect.width <= 0) return 0;
48
+ const r = (clientX - rect.left) / rect.width;
49
+ return Math.min(1, Math.max(0, r));
50
+ }
51
+
52
+ type AudioContextCtor = typeof AudioContext;
53
+
54
+ function getAudioContextCtor(): AudioContextCtor | null {
55
+ const w = globalThis as unknown as {
56
+ AudioContext?: AudioContextCtor;
57
+ webkitAudioContext?: AudioContextCtor;
58
+ };
59
+ return w.AudioContext ?? w.webkitAudioContext ?? null;
60
+ }
61
+
62
+ export interface DecodedAudio {
63
+ peaks: number[];
64
+ duration: number;
65
+ }
66
+
67
+ export async function decodePeaks(file: File): Promise<DecodedAudio | null> {
68
+ const Ctor = getAudioContextCtor();
69
+ if (!Ctor) return null;
70
+ try {
71
+ const ctx = new Ctor();
72
+ try {
73
+ const buffer = await ctx.decodeAudioData(await file.arrayBuffer());
74
+ return { peaks: peaksFromAudioBuffer(buffer), duration: buffer.duration };
75
+ } finally {
76
+ void ctx.close();
77
+ }
78
+ } catch {
79
+ return null;
80
+ }
81
+ }
82
+
83
+ export interface WaveformHandle {
84
+ destroy(): void;
85
+ }
86
+
87
+ export function attachWaveform(opts: {
88
+ mount: HTMLElement;
89
+ media: HTMLAudioElement;
90
+ peaks: number[];
91
+ }): WaveformHandle {
92
+ const { mount, media, peaks } = opts;
93
+ const canvas = document.createElement('canvas');
94
+ canvas.setAttribute('data-role', 'audio-waveform-canvas');
95
+ canvas.className = 'blok-audio-waveform__canvas';
96
+ mount.appendChild(canvas);
97
+
98
+ const draw = (): void => {
99
+ const rect = canvas.getBoundingClientRect();
100
+ if (rect.width <= 0 || rect.height <= 0) return;
101
+ const dpr = globalThis.devicePixelRatio || 1;
102
+ canvas.width = Math.round(rect.width * dpr);
103
+ canvas.height = Math.round(rect.height * dpr);
104
+ const ctx = canvas.getContext('2d');
105
+ if (!ctx) return;
106
+ ctx.scale(dpr, dpr);
107
+ const played = media.duration ? media.currentTime / media.duration : 0;
108
+ const slot = rect.width / peaks.length;
109
+ const gap = Math.min(2, slot * 0.34);
110
+ const barW = Math.max(1, slot - gap);
111
+ const radius = Math.min(barW / 2, 2);
112
+ const styles = getComputedStyle(canvas);
113
+ const playedColor = styles.getPropertyValue('--blok-audio-bar-played').trim() || '#222';
114
+ const baseColor = styles.getPropertyValue('--blok-audio-bar').trim() || '#ccc';
115
+ peaks.forEach((peak, i) => {
116
+ const h = Math.max(2, peak * rect.height * 0.92);
117
+ const x = i * slot;
118
+ const y = (rect.height - h) / 2;
119
+ ctx.fillStyle = i / peaks.length < played ? playedColor : baseColor;
120
+ if (typeof ctx.roundRect === 'function') {
121
+ ctx.beginPath();
122
+ ctx.roundRect(x, y, barW, h, radius);
123
+ ctx.fill();
124
+ } else {
125
+ ctx.fillRect(x, y, barW, h);
126
+ }
127
+ });
128
+ };
129
+
130
+ const rafState = { id: 0 };
131
+ const onTime = (): void => {
132
+ if (rafState.id) return;
133
+ rafState.id = requestAnimationFrame(() => {
134
+ rafState.id = 0;
135
+ mount.style.setProperty(
136
+ '--blok-audio-seek-pct',
137
+ String(media.duration ? (media.currentTime / media.duration) * 100 : 0),
138
+ );
139
+ draw();
140
+ });
141
+ };
142
+
143
+ const seek = (clientX: number): void => {
144
+ if (!media.duration) return;
145
+ media.currentTime = ratioFromPointer(clientX, canvas.getBoundingClientRect()) * media.duration;
146
+ draw();
147
+ };
148
+ const drag = { active: false };
149
+ const onDown = (e: PointerEvent): void => { drag.active = true; seek(e.clientX); };
150
+ const onMove = (e: PointerEvent): void => { if (drag.active) seek(e.clientX); };
151
+ const onUp = (): void => { drag.active = false; };
152
+
153
+ canvas.addEventListener('pointerdown', onDown);
154
+ globalThis.addEventListener('pointermove', onMove);
155
+ globalThis.addEventListener('pointerup', onUp);
156
+ media.addEventListener('timeupdate', onTime);
157
+ media.addEventListener('loadedmetadata', draw);
158
+ draw();
159
+
160
+ return {
161
+ destroy(): void {
162
+ if (rafState.id) cancelAnimationFrame(rafState.id);
163
+ canvas.removeEventListener('pointerdown', onDown);
164
+ globalThis.removeEventListener('pointermove', onMove);
165
+ globalThis.removeEventListener('pointerup', onUp);
166
+ media.removeEventListener('timeupdate', onTime);
167
+ media.removeEventListener('loadedmetadata', draw);
168
+ canvas.remove();
169
+ },
170
+ };
171
+ }
@@ -1,8 +1,7 @@
1
- /** Non-image MIME prefixes claimed for paste/drop routing. Image files stay with the Image tool. */
1
+ /** Non-image MIME prefixes claimed for paste/drop routing. Image files stay with the Image tool. Audio files route to the Audio tool. */
2
2
  export const PASTE_MIME_TYPES = [
3
3
  'application/*',
4
4
  'text/*',
5
- 'audio/*',
6
5
  'video/*',
7
6
  'font/*',
8
7
  'model/*',
@@ -13,7 +12,10 @@ export const PASTE_EXTENSIONS = [
13
12
  'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
14
13
  'zip', 'rar', '7z', 'gz', 'tar',
15
14
  'csv', 'txt', 'rtf', 'md', 'json',
16
- 'mp3', 'wav', 'ogg', 'mp4', 'mov', 'avi', 'mkv',
15
+ 'mp4', 'mov', 'avi', 'mkv',
17
16
  ] as const;
18
17
 
18
+ /** Default upload ceiling (bytes) when the consumer does not configure `maxSize`. */
19
+ export const DEFAULT_MAX_SIZE = 30 * 1024 * 1024; // 30 MiB
20
+
19
21
  export const DEFAULT_CAPTION_PLACEHOLDER = 'Write a caption…';
@@ -11,12 +11,15 @@ import type {
11
11
  import type { MenuConfig } from '../../../types/tools/menu-config';
12
12
  import type { FileConfig, FileData, FileUploadResult } from '../../../types/tools/file';
13
13
  import type { ImageData } from '../../../types/tools/image';
14
+ import type { VideoData } from '../../../types/tools/video';
14
15
  import { IconCaption, IconCopy, IconDownload, IconFile, IconReplace } from '../../components/icons';
15
16
  import { DEFAULT_CAPTION_PLACEHOLDER, PASTE_EXTENSIONS, PASTE_MIME_TYPES } from './constants';
16
17
  import { renderEmptyState, type EmptyStateElement } from './empty-state';
17
18
  import { renderUploadingState, type UploadingStateElement } from './uploading-state';
18
19
  import { renderCaptionRow, renderFileCard } from './ui';
19
20
  import { Uploader } from './uploader';
21
+ import { FileToolError } from './errors';
22
+ import { uploadErrorMessage } from '../../components/utils/upload-error-message';
20
23
  import { safeHttpHref } from './url';
21
24
  import { isPreviewable } from './preview';
22
25
  import { openFilePreview } from './preview-modal';
@@ -26,6 +29,9 @@ type ToolState = 'EMPTY' | 'LOADING' | 'RENDERED' | 'ERROR';
26
29
  /** Image filenames/URLs that should auto-convert the File block into an Image. */
27
30
  const IMAGE_EXTENSION_RE = /\.(png|jpe?g|gif|webp|svg)(?:[?#]|$)/i;
28
31
 
32
+ /** Video filenames/URLs that should auto-convert the File block into a Video. */
33
+ const VIDEO_EXTENSION_RE = /\.(mp4|webm|ogg|mov|m4v)(?:[?#]|$)/i;
34
+
29
35
  export class FileTool implements BlockTool {
30
36
  private readonly api: API;
31
37
  private readonly block: BlockAPI;
@@ -37,9 +43,12 @@ export class FileTool implements BlockTool {
37
43
  private state: ToolState;
38
44
  private uploadingEl: UploadingStateElement | null = null;
39
45
  private lastFileName: string | null = null;
46
+ private errorMessage: string | null = null;
40
47
  private previewTeardown: (() => void) | null = null;
41
48
  /** When the pending upload is an image, the result converts to an Image block. */
42
49
  private pendingImageConversion = false;
50
+ /** When the pending upload is a video, the result converts to a Video block. */
51
+ private pendingVideoConversion = false;
43
52
 
44
53
  constructor(options: BlockToolConstructorOptions<FileData, FileConfig>) {
45
54
  this.api = options.api;
@@ -153,26 +162,29 @@ export class FileTool implements BlockTool {
153
162
  private startUpload(file: File): void {
154
163
  this.lastFileName = file.name;
155
164
  this.pendingImageConversion = file.type.startsWith('image/') || IMAGE_EXTENSION_RE.test(file.name);
165
+ this.pendingVideoConversion = file.type.startsWith('video/') || VIDEO_EXTENSION_RE.test(file.name);
156
166
  this.state = 'LOADING';
157
167
  this.renderState();
158
168
  void this.uploader
159
169
  .handleFile(file, { onProgress: (p) => this.uploadingEl?.setProgress(p) })
160
170
  .then((result) => this.applyResult(result))
161
- .catch(() => this.applyError());
171
+ .catch((err) => this.applyError(err));
162
172
  }
163
173
 
164
174
  private startUrl(url: string): void {
165
175
  this.lastFileName = null;
166
176
  this.pendingImageConversion = IMAGE_EXTENSION_RE.test(url);
177
+ this.pendingVideoConversion = VIDEO_EXTENSION_RE.test(url);
167
178
  this.state = 'LOADING';
168
179
  this.renderState();
169
180
  void this.uploader
170
181
  .handleUrl(url, { onProgress: (p) => this.uploadingEl?.setProgress(p) })
171
182
  .then((result) => this.applyResult(result))
172
- .catch(() => this.applyError());
183
+ .catch((err) => this.applyError(err));
173
184
  }
174
185
 
175
186
  private applyResult(result: FileUploadResult): void {
187
+ this.errorMessage = null;
176
188
  this.data = {
177
189
  ...this.data,
178
190
  url: result.url,
@@ -180,6 +192,9 @@ export class FileTool implements BlockTool {
180
192
  size: result.size ?? this.data.size,
181
193
  mimeType: result.mimeType ?? this.data.mimeType,
182
194
  };
195
+ if (this.pendingVideoConversion && this.convertToVideo()) {
196
+ return;
197
+ }
183
198
  if (this.pendingImageConversion && this.convertToImage()) {
184
199
  return;
185
200
  }
@@ -207,7 +222,33 @@ export class FileTool implements BlockTool {
207
222
  return true;
208
223
  }
209
224
 
210
- private applyError(): void {
225
+ /**
226
+ * Swap this File block for a Video block carrying the just-uploaded url.
227
+ * Mirrors {@link convertToImage}: File and Video declare no conversionConfig,
228
+ * so we replace in place. Returns false (keep the file card) when the block
229
+ * can no longer be located.
230
+ */
231
+ private convertToVideo(): boolean {
232
+ const index = this.api.blocks.getBlockIndex(this.block.id);
233
+ if (index === undefined) {
234
+ return false;
235
+ }
236
+ const videoData: VideoData = { url: this.data.url };
237
+ if (this.data.fileName !== undefined) videoData.fileName = this.data.fileName;
238
+ if (this.data.mimeType !== undefined) videoData.mimeType = this.data.mimeType;
239
+ if ((this.data.caption ?? '') !== '') videoData.caption = this.data.caption;
240
+ if (this.data.captionVisible !== undefined) videoData.captionVisible = this.data.captionVisible;
241
+ this.api.blocks.insert('video', videoData, {}, index, false, true);
242
+ return true;
243
+ }
244
+
245
+ private applyError(err?: unknown): void {
246
+ this.errorMessage = err instanceof FileToolError
247
+ ? uploadErrorMessage(err, (key) => this.api.i18n.t(key), {
248
+ tooLarge: 'tools.file.errorFileTooLarge',
249
+ generic: 'tools.file.errorUploadFailed',
250
+ })
251
+ : null;
211
252
  this.state = 'ERROR';
212
253
  this.renderState();
213
254
  }
@@ -331,7 +372,7 @@ export class FileTool implements BlockTool {
331
372
  wrap.setAttribute('data-role', 'file-error');
332
373
 
333
374
  const message = document.createElement('span');
334
- message.textContent = i18n.t('tools.file.errorUploadFailed');
375
+ message.textContent = this.errorMessage ?? i18n.t('tools.file.errorUploadFailed');
335
376
 
336
377
  const retry = document.createElement('button');
337
378
  retry.type = 'button';
@@ -1,4 +1,6 @@
1
1
  import type { FileConfig, FileUploadResult } from '../../../types/tools/file';
2
+ import { resolveMaxSize } from '../../components/utils/max-size';
3
+ import { DEFAULT_MAX_SIZE } from './constants';
2
4
  import { FileToolError } from './errors';
3
5
 
4
6
  export interface UploadOptions {
@@ -120,12 +122,13 @@ export class Uploader {
120
122
  }
121
123
 
122
124
  private validateFile(file: File): void {
123
- const { types, maxSize } = this.config;
125
+ const { types } = this.config;
126
+ const maxSize = resolveMaxSize(this.config.maxSize, file.type, DEFAULT_MAX_SIZE);
124
127
 
125
128
  if (types !== undefined && !types.includes(file.type)) {
126
129
  throw new FileToolError('UNSUPPORTED_TYPE', file.type || 'unknown');
127
130
  }
128
- if (maxSize !== undefined && file.size > maxSize) {
131
+ if (file.size > maxSize) {
129
132
  throw new FileToolError('FILE_TOO_LARGE', `${file.size} > ${maxSize}`);
130
133
  }
131
134
  }
@@ -1,12 +1,7 @@
1
- export const DEFAULT_MIME_TYPES = [
2
- 'image/jpeg',
3
- 'image/png',
4
- 'image/gif',
5
- 'image/webp',
6
- 'image/svg+xml',
7
- ] as const;
1
+ // Accept any image type by default; consumers restrict via the `types` config.
2
+ export const DEFAULT_MIME_TYPES = ['image/*'] as const;
8
3
 
9
- export const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10 MiB
4
+ export const DEFAULT_MAX_SIZE = 30 * 1024 * 1024; // 30 MiB
10
5
 
11
6
  export const DEFAULT_CAPTION_PLACEHOLDER = 'Write a caption…';
12
7
 
@@ -0,0 +1,30 @@
1
+ import type { API } from '../../../types';
2
+ import type { ImageConfig } from '../../../types/tools/image';
3
+
4
+ export type ConvertedUploadFn = (
5
+ file: File,
6
+ ctx?: { onProgress?: (percent: number) => void },
7
+ ) => Promise<{ url: string; fileName?: string }>;
8
+
9
+ interface UploaderHolder { uploader?: { uploadByFile?: ConvertedUploadFn } }
10
+
11
+ function asUploaderHolder(value: unknown): UploaderHolder | undefined {
12
+ return typeof value === 'object' && value !== null ? (value as UploaderHolder) : undefined;
13
+ }
14
+
15
+ /**
16
+ * Resolve which `uploadByFile` to use for a converted WebM file:
17
+ * the video tool's uploader (if registered under the `video` key), else the
18
+ * image tool's own uploader, else undefined (caller uses a blob URL).
19
+ */
20
+ export function resolveConvertedUploader(
21
+ api: API,
22
+ imageConfig: ImageConfig,
23
+ ): ConvertedUploadFn | undefined {
24
+ const videoEntry = asUploaderHolder(api.tools.getToolsConfig().tools?.video);
25
+ // Tool settings carry the config under `.config`; support a flat shape too.
26
+ const videoConfig = asUploaderHolder((videoEntry as { config?: unknown })?.config) ?? videoEntry;
27
+ const videoUpload = videoConfig?.uploader?.uploadByFile;
28
+
29
+ return videoUpload ?? imageConfig.uploader?.uploadByFile;
30
+ }
@@ -0,0 +1,170 @@
1
+ // Minimal structural types for the WebCodecs surface we use (avoids relying on
2
+ // lib.dom types that may not be present in the project's TS target).
3
+ interface DecodedFrame {
4
+ displayWidth: number;
5
+ displayHeight: number;
6
+ duration: number | null;
7
+ timestamp: number;
8
+ close(): void;
9
+ }
10
+
11
+ interface ImageDecoderLike {
12
+ tracks: { ready: Promise<void>; selectedTrack?: { frameCount: number } };
13
+ decode(opts: { frameIndex: number }): Promise<{ image: DecodedFrame; complete: boolean }>;
14
+ close(): void;
15
+ }
16
+
17
+ interface EncodedChunk { type: string; }
18
+
19
+ interface VideoEncoderLike {
20
+ configure(config: Record<string, unknown>): void;
21
+ encode(frame: DecodedFrame, opts?: { keyFrame?: boolean }): void;
22
+ flush(): Promise<void>;
23
+ close(): void;
24
+ }
25
+
26
+ interface VideoEncoderCtor {
27
+ new (init: {
28
+ output: (chunk: EncodedChunk, meta: unknown) => void;
29
+ error: (err: unknown) => void;
30
+ }): VideoEncoderLike;
31
+ isConfigSupported(config: Record<string, unknown>): Promise<{ supported?: boolean }>;
32
+ }
33
+
34
+ const KEYFRAME_INTERVAL = 30;
35
+
36
+ function hasWebCodecs(): boolean {
37
+ const g = globalThis as Record<string, unknown>;
38
+ return typeof g.ImageDecoder !== 'undefined' && typeof g.VideoEncoder !== 'undefined';
39
+ }
40
+
41
+ async function pickCodec(
42
+ Encoder: VideoEncoderCtor,
43
+ width: number,
44
+ height: number,
45
+ ): Promise<{ encoderCodec: string; muxerCodec: 'V_VP9' | 'V_VP8' } | null> {
46
+ const candidates: Array<{ encoderCodec: string; muxerCodec: 'V_VP9' | 'V_VP8' }> = [
47
+ { encoderCodec: 'vp09.00.10.08', muxerCodec: 'V_VP9' },
48
+ { encoderCodec: 'vp8', muxerCodec: 'V_VP8' },
49
+ ];
50
+ for (const c of candidates) {
51
+ const probe = await Encoder.isConfigSupported({ codec: c.encoderCodec, width, height });
52
+ if (probe.supported) return c;
53
+ }
54
+ return null;
55
+ }
56
+
57
+ /**
58
+ * Convert an animated GIF (raw bytes) into a WebM Blob using WebCodecs.
59
+ * Returns null whenever the caller should keep the original GIF: WebCodecs
60
+ * unavailable, a static/single-frame GIF, an unsupported codec, or any error.
61
+ */
62
+ export async function convertGifToWebm(
63
+ data: ArrayBuffer,
64
+ opts: { onProgress?: (percent: number) => void } = {},
65
+ ): Promise<Blob | null> {
66
+ if (!hasWebCodecs()) return null;
67
+
68
+ const g = globalThis as Record<string, unknown>;
69
+ const DecoderCtor = g.ImageDecoder as new (init: { data: ArrayBuffer; type: string }) => ImageDecoderLike;
70
+ const EncoderCtor = g.VideoEncoder as VideoEncoderCtor;
71
+
72
+ const resources: { decoder?: ImageDecoderLike; encoder?: VideoEncoderLike } = {};
73
+ const openFrames: DecodedFrame[] = [];
74
+
75
+ try {
76
+ const decoder = new DecoderCtor({ data, type: 'image/gif' });
77
+ resources.decoder = decoder;
78
+ await decoder.tracks.ready;
79
+ const frameCount = decoder.tracks.selectedTrack?.frameCount ?? 0;
80
+ if (frameCount <= 1) return null;
81
+
82
+ const first = await decoder.decode({ frameIndex: 0 });
83
+ openFrames.push(first.image);
84
+ const width = first.image.displayWidth;
85
+ const height = first.image.displayHeight;
86
+
87
+ const codec = await pickCodec(EncoderCtor, width, height);
88
+ if (!codec) return null;
89
+
90
+ const { Muxer, ArrayBufferTarget } = await import('webm-muxer');
91
+ const target = new ArrayBufferTarget();
92
+ const muxer = new Muxer({
93
+ target,
94
+ video: { codec: codec.muxerCodec, width, height },
95
+ firstTimestampBehavior: 'offset',
96
+ });
97
+
98
+ const encoder = new EncoderCtor({
99
+ output: (chunk, meta) => muxer.addVideoChunk(chunk as never, meta as never),
100
+ error: () => undefined,
101
+ });
102
+ resources.encoder = encoder;
103
+ encoder.configure({
104
+ codec: codec.encoderCodec,
105
+ width,
106
+ height,
107
+ bitrate: Math.max(200_000, width * height * 4),
108
+ });
109
+
110
+ const indices = Array.from({ length: frameCount }, (_unused, i) => i);
111
+ // Running timestamp held in a const cursor so each frame is re-stamped to be
112
+ // monotonic from the accumulated GIF delays (µs) without a mutable `let`.
113
+ const cursor = { timestamp: 0 };
114
+ for (const i of indices) {
115
+ const frame = await getFrame(i, first.image, decoder);
116
+ cursor.timestamp = encodeFrame(encoder, frame, i, cursor.timestamp);
117
+ collectFrame(openFrames, frame, i);
118
+ opts.onProgress?.(Math.round(((i + 1) / frameCount) * 100));
119
+ }
120
+
121
+ await encoder.flush();
122
+ muxer.finalize();
123
+ return new Blob([target.buffer], { type: 'video/webm' });
124
+ } catch {
125
+ return null;
126
+ } finally {
127
+ openFrames.forEach((f) => {
128
+ try { f.close(); } catch { /* already closed */ }
129
+ });
130
+ try { resources.encoder?.close(); } catch { /* noop */ }
131
+ try { resources.decoder?.close(); } catch { /* noop */ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Resolve a decoded frame for the given index. Frame 0 reuses the already
137
+ * decoded first image; later frames are decoded on demand.
138
+ */
139
+ async function getFrame(
140
+ index: number,
141
+ first: DecodedFrame,
142
+ decoder: ImageDecoderLike,
143
+ ): Promise<DecodedFrame> {
144
+ if (index === 0) return first;
145
+ return (await decoder.decode({ frameIndex: index })).image;
146
+ }
147
+
148
+ /**
149
+ * Encode one frame at the given timestamp and return the timestamp for the
150
+ * next frame (current + this frame's GIF delay, in µs).
151
+ */
152
+ function encodeFrame(
153
+ encoder: VideoEncoderLike,
154
+ frame: DecodedFrame,
155
+ index: number,
156
+ timestamp: number,
157
+ ): number {
158
+ const stamped = frame as DecodedFrame & { timestamp: number };
159
+ stamped.timestamp = timestamp;
160
+ encoder.encode(frame, { keyFrame: index % KEYFRAME_INTERVAL === 0 });
161
+ return timestamp + (frame.duration ?? 100_000);
162
+ }
163
+
164
+ /**
165
+ * Track later frames so they can be closed in the finally block. Frame 0 is
166
+ * already tracked by the caller.
167
+ */
168
+ function collectFrame(openFrames: DecodedFrame[], frame: DecodedFrame, index: number): void {
169
+ if (index !== 0) openFrames.push(frame);
170
+ }